From 76d490dcbb6156d44fce9986e9c557cb67f36e69 Mon Sep 17 00:00:00 2001
From: fluxgen <fluxgen>
Date: Mon, 3 Feb 2003 13:46:13 +0000
Subject: needs cleaning

---
 src/FbTk/MultLayers.cc | 131 ++++++++++++++++++++++++-------------------------
 1 file changed, 64 insertions(+), 67 deletions(-)

diff --git a/src/FbTk/MultLayers.cc b/src/FbTk/MultLayers.cc
index 7f8f584..b552b5c 100644
--- a/src/FbTk/MultLayers.cc
+++ b/src/FbTk/MultLayers.cc
@@ -20,46 +20,51 @@
 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 // DEALINGS IN THE SOFTWARE.
 
-// $Id: MultLayers.cc,v 1.3 2003/02/02 16:32:41 rathnor Exp $
+// $Id: MultLayers.cc,v 1.4 2003/02/03 13:46:13 fluxgen Exp $
 
 #include "MultLayers.hh"
 #include "XLayer.hh"
 #include "XLayerItem.hh"
 #include "App.hh"
 
+#include <iostream>
+using namespace std;
+
 using namespace FbTk;
 
-MultLayers::MultLayers(int numlayers) :
-    m_numlayers(numlayers), m_layers(numlayers) {
-    for (int i=0; i < numlayers; i++) {
-        m_layers[i] = new XLayer(*this, i);
-    }
+MultLayers::MultLayers(int numlayers) {
+    for (int i=0; i < numlayers; ++i) 
+        m_layers.push_back(new XLayer(*this, i));
 }
 
 MultLayers::~MultLayers() {
-    // TODO delete all the layers
+    while (!m_layers.empty()) {
+        delete m_layers.back();
+        m_layers.pop_back();
+    }
 }
 
 
 XLayerItem *MultLayers::getLowestItemAboveLayer(int layernum) {
-    if (layernum >= (m_numlayers) || layernum <= 0) 
+    if (layernum >= m_layers.size() || layernum <= 0) 
         return 0;
 
     layernum--; // next one up
     XLayerItem *item = 0;
-    while (layernum >= 0 && (item = m_layers[layernum]->getLowestItem()) == 0) layernum--;
+    while (layernum >= 0 && (item = m_layers[layernum]->getLowestItem()) == 0)
+        layernum--;
     return item;
 
 }    
 
 XLayerItem *MultLayers::getItemBelow(XLayerItem &item) {
-    XLayer *curr_layer = item.getLayer();
-    cerr<<"getItemBelow xlayer = "<<hex<<curr_layer<<endl;
+    XLayer &curr_layer = item.getLayer();
+
     // assume that the LayerItem does exist in a layer.
-    XLayerItem *ret = curr_layer->getItemBelow(item);
+    XLayerItem *ret = curr_layer.getItemBelow(item);
 
-    if (!ret) {
-        int num = curr_layer->getLayerNum()-1;
+    if (ret == 0) {
+        int num = curr_layer.getLayerNum()-1;
         while (num >= 0 && !ret) {
             ret = m_layers[num]->getItemBelow(item);
             num--;
@@ -70,14 +75,14 @@ XLayerItem *MultLayers::getItemBelow(XLayerItem &item) {
 }    
 
 XLayerItem *MultLayers::getItemAbove(XLayerItem &item) {
-    XLayer *curr_layer = item.getLayer();
+    XLayer &curr_layer = item.getLayer();
     
     // assume that the LayerItem does exist in a layer.
-    XLayerItem *ret = curr_layer->getItemAbove(item);
+    XLayerItem *ret = curr_layer.getItemAbove(item);
 
     if (!ret) {
-        ret = getLowestItemAboveLayer(curr_layer->getLayerNum());
-    }
+        ret = getLowestItemAboveLayer(curr_layer.getLayerNum());
+    }    
 
     return ret;
 }    
@@ -85,84 +90,76 @@ XLayerItem *MultLayers::getItemAbove(XLayerItem &item) {
 void MultLayers::addToTop(XLayerItem &item, int layernum) {
     if (layernum < 0) 
         layernum = 0; 
-    else if (layernum >= m_numlayers) 
-        layernum = m_numlayers-1;
+    else if (layernum >= m_layers.size())
+        layernum = m_layers.size()-1;
 
     m_layers[layernum]->insert(item);
     restack();
 }
 
-void MultLayers::remove(XLayerItem &item) {
-    XLayer *curr_layer = item.getLayer();
-    if (!curr_layer || curr_layer->getLayerNum() < 0 || curr_layer->getLayerNum() >= m_numlayers) {
-        // do nothing
-        return;
-    }
-    curr_layer->remove(item);
-}
-
 /* raise the item one level */
 void MultLayers::raise(XLayerItem &item) {
     // get the layer it is in
-    XLayer *curr_layer = item.getLayer();
-    moveToLayer(item, curr_layer->getLayerNum()-1);
-}
-
-/* lower the item one level */
-void MultLayers::lower(XLayerItem &item) {
-    // get the layer it is in
-    XLayer *curr_layer = item.getLayer();
-    moveToLayer(item, curr_layer->getLayerNum()+1);
+    XLayer &curr_layer = item.getLayer();
+    moveToLayer(item, curr_layer.getLayerNum()-1);
 }
 
 void MultLayers::moveToLayer(XLayerItem &item, int layernum) {
     // get the layer it is in
-    XLayer *curr_layer = item.getLayer();
-    if (!curr_layer) {
-        addToTop(item, layernum);
-        return;
-    }
-    if (curr_layer->getLayerNum() == layernum )
-        // do nothing
+    XLayer &curr_layer = item.getLayer();
+
+    // do nothing if the item already is in the requested layer
+    if (curr_layer.getLayerNum() == layernum)
         return;
-    
+
+    // clamp layer number
     if (layernum < 0) 
         layernum = 0; 
-    else if (layernum >= m_numlayers) 
-        layernum = m_numlayers-1;
-    
-    curr_layer->remove(item);
+    else if (layernum >= m_layers.size()) 
+        layernum = m_layers.size()-1;
+    // remove item from old layer and insert it into the 
+    item.setLayer(*m_layers[layernum]);
+    curr_layer.remove(item);
     m_layers[layernum]->insert(item);
 }
 
 void MultLayers::restack() {
-    int i=0, j=0, size=0;
-    for (; i < m_numlayers; i++) {
-        size += m_layers[i]->countWindows();
+    size_t winlist_size=0;
+    for (size_t layer=0; layer < m_layers.size(); layer++) {
+        winlist_size += m_layers[layer]->countWindows();
     }
 
-    Window *winlist = new Window[size];
-    for (i=0; i < m_numlayers; i++) {
+    Window *winlist = new Window[winlist_size];
+    for (size_t layer=0, window=0; layer < m_layers.size(); layer++) {
 
-        XLayer::ItemList::iterator it = m_layers[i]->getItemList().begin();
-        XLayer::ItemList::iterator it_end = m_layers[i]->getItemList().end();
-
-        for (; it != it_end; ++it) {
-            XLayerItem::Windows::const_iterator wit = (*it)->getWindows().begin();
-            XLayerItem::Windows::const_iterator wit_end = (*it)->getWindows().end();
-            for (; wit != wit_end; ++wit, j++) {
-                winlist[j] = (*wit);
-            }
-        }
+        XLayer::ItemList::iterator item_it = m_layers[layer]->getItemList().begin();
+        XLayer::ItemList::iterator item_it_end = m_layers[layer]->getItemList().end();
+        for (; item_it != item_it_end; ++item_it, window++)
+            winlist[window] = (*item_it)->window();
     }
 
-    XRestackWindows(FbTk::App::instance()->display(), winlist, size);
+    XRestackWindows(FbTk::App::instance()->display(), winlist, winlist_size);
+
+    delete[] winlist;
 }
 
 int MultLayers::size() {
     int i = 0, num = 0;
-    for (; i < m_numlayers; i++) {
+    for (; i < m_layers.size(); i++) {
         num += m_layers[i]->countWindows();
     }
     return num;
 }
+
+XLayer *MultLayers::getLayer(size_t num) {
+    if (num >= m_layers.size())
+        return 0;
+    return m_layers[num];
+}
+
+const XLayer *MultLayers::getLayer(size_t num) const {
+    if (num >= m_layers.size())
+        return 0;
+    return m_layers[num];
+}
+
-- 
cgit v0.11.2