From 242798ae46270e31135faa8e06dab34652480686 Mon Sep 17 00:00:00 2001
From: fluxgen <fluxgen>
Date: Mon, 11 Aug 2003 15:28:33 +0000
Subject: gui container

---
 src/Container.cc | 186 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/Container.hh |  78 +++++++++++++++++++++++
 2 files changed, 264 insertions(+)
 create mode 100644 src/Container.cc
 create mode 100644 src/Container.hh

diff --git a/src/Container.cc b/src/Container.cc
new file mode 100644
index 0000000..0fff44a
--- /dev/null
+++ b/src/Container.cc
@@ -0,0 +1,186 @@
+// Container.cc
+// Copyright (c) 2003 Henrik Kinnunen (fluxgen at users.sourceforge.net)
+//                and Simon Bowden    (rathnor at users.sourceforge.net)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+// $Id: Container.cc,v 1.1 2003/08/11 15:28:33 fluxgen Exp $
+
+#include "FbTk/Button.hh"
+#include "Container.hh"
+
+#include "FbTk/EventManager.hh"
+
+Container::Container(const FbTk::FbWindow &parent):
+    FbTk::FbWindow(parent, 0, 0, 1, 1, ExposureMask), m_selected(0) {
+
+    FbTk::EventManager::instance()->add(*this, *this);
+}
+
+Container::~Container() {
+
+}
+
+void Container::resize(unsigned int width, unsigned int height) {
+    // do we need to resize?
+    if (FbTk::FbWindow::width() == width &&
+        FbTk::FbWindow::height() == height)
+        return;
+
+    FbTk::FbWindow::resize(width, height);
+    repositionItems();
+}
+
+void Container::moveResize(int x, int y,
+                           unsigned int width, unsigned int height) {
+    FbTk::FbWindow::moveResize(x, y, width, height);
+    repositionItems();
+}
+
+void Container::insertItems(ItemList &item_list, int pos) {
+
+    // make sure all items have parent == this
+    ItemList::iterator it = m_item_list.begin();
+    ItemList::iterator it_end = m_item_list.end();
+    for (; it != it_end; ++it) {
+        if ((*it)->window().parent() != this)
+            return;
+    }
+
+    if (pos > size() || pos < 0) {
+        // insert last
+        m_item_list.splice(m_item_list.end(), item_list);
+    } else if (pos == 0) {
+        // insert first
+        m_item_list.splice(m_item_list.begin(), item_list);
+    } else {
+        // find insert point
+        for (it = m_item_list.begin(); pos != 0; ++it, --pos)
+            continue;
+        m_item_list.splice(it, item_list);
+    }
+
+    m_item_list.unique();
+
+    // update position
+    repositionItems();
+}
+
+void Container::insertItem(Item item, int pos) {
+    if (find(item) != -1)
+        return;
+
+    // it must be a child of this window
+    if (item->window().parent() != this)
+        return;
+
+    if (pos >= size() || pos < 0) {
+        m_item_list.push_back(item);
+    } else if (pos == 0) {
+        m_item_list.push_front(item);
+    } else {
+        ItemList::iterator it = m_item_list.begin();
+        for (; pos != 0; ++it, --pos)
+            continue;
+
+        m_item_list.insert(it, item);
+    }
+
+    // make sure we dont have duplicate items
+    m_item_list.unique();
+
+    repositionItems();
+}
+
+void Container::removeItem(int index) {    
+    if (index < 0 || index > size())
+        return;
+
+    ItemList::iterator it = m_item_list.begin();
+    for (; index != 0; ++it, --index)
+        continue;
+
+    if (*it == selected())
+        m_selected = 0;
+
+    m_item_list.erase(it);
+
+    repositionItems();
+}
+
+void Container::removeAll() {
+    m_selected = 0;
+    m_item_list.clear();
+    clear();
+
+}
+
+int Container::find(Item item) {
+    ItemList::iterator it = m_item_list.begin();
+    ItemList::iterator it_end = m_item_list.end();
+    int index = 0;
+    for (; it != it_end; ++it, ++index) {
+        if ((*it) == item)
+            break;
+    }
+
+    if (it == it_end)
+        return -1;
+
+    return index;
+}
+
+void Container::setSelected(int pos) {
+    if (pos < 0 || pos >= size())
+        m_selected = 0;
+    else {
+        ItemList::iterator it = m_item_list.begin();
+        for (; pos != 0; --pos, ++it)
+            continue;
+        m_selected = *it;
+        if (m_selected)
+            m_selected->clear();
+    }
+        
+}
+
+void Container::exposeEvent(XExposeEvent &event) {
+    clear();
+}
+
+void Container::repositionItems() {
+    if (size() == 0)
+        return;
+
+    //!! TODO vertical position
+
+    const int max_width_per_client = maxWidthPerClient();
+
+    ItemList::iterator it = m_item_list.begin();
+    const ItemList::iterator it_end = m_item_list.end();
+    int next_x = 0;
+    for (; it != it_end; ++it, next_x += max_width_per_client) {
+        // resize each clients including border in size
+        (*it)->moveResize(next_x - (*it)->window().borderWidth(),
+                          (*it)->window().borderWidth(), 
+                          max_width_per_client - (*it)->window().borderWidth(),
+                          height() + (*it)->window().borderWidth());
+        (*it)->clear();
+    }
+}
diff --git a/src/Container.hh b/src/Container.hh
new file mode 100644
index 0000000..474e55b
--- /dev/null
+++ b/src/Container.hh
@@ -0,0 +1,78 @@
+// Container.hh
+// Copyright (c) 2003 Henrik Kinnunen (fluxgen at users.sourceforge.net)
+//                and Simon Bowden    (rathnor at users.sourceforge.net)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+// $Id: Container.hh,v 1.1 2003/08/11 15:28:33 fluxgen Exp $
+
+#ifndef CONTAINER_HH
+#define CONTAINER_HH
+
+#include "FbTk/FbWindow.hh"
+#include "FbTk/EventHandler.hh"
+#include "FbTk/NotCopyable.hh"
+
+#include <list>
+
+class ContainerTheme;
+
+namespace FbTk {
+class Button;
+};
+
+class Container:public FbTk::FbWindow, public FbTk::EventHandler, private FbTk::NotCopyable {
+public:
+    typedef FbTk::Button * Item;
+    typedef std::list<Item> ItemList;
+
+    explicit Container(const FbTk::FbWindow &parent);
+    virtual ~Container();
+    
+    // manipulators
+
+    void resize(unsigned int width, unsigned int height);
+    void moveResize(int x, int y,
+                    unsigned int width, unsigned int height);
+
+    void insertItems(ItemList &list, int position=-1);
+    void insertItem(Item item, int pos = -1);
+    void removeItem(int item);
+    void removeAll();
+    int find(Item item);
+    void setSelected(int index);
+
+    // event handler
+    void exposeEvent(XExposeEvent &event);
+
+    // accessors
+    int size() const { return m_item_list.size(); }
+    const Item selected() const { return m_selected; }
+    Item selected() { return m_selected; }
+    unsigned int maxWidthPerClient() const { return (size() == 0 ? width() : width()/size()); }
+    unsigned int maxHeightPerClient() const { return (size() == 0 ? height() : height()/size()); }
+private:
+    void repositionItems();
+
+    ItemList m_item_list;
+    Item m_selected;
+};
+
+#endif // CONTAINER_HH
+
-- 
cgit v0.11.2