[Commits] r381 - in sandbox/opengeo/geoexplorer: examples lib/GeoExt/widgets/tree
commits at geoext.org
commits at geoext.org
Tue Apr 14 20:50:41 CEST 2009
Author: tschaub
Date: 2009-04-14 20:50:41 +0200 (Tue, 14 Apr 2009)
New Revision: 381
Modified:
sandbox/opengeo/geoexplorer/examples/treenodes.js
sandbox/opengeo/geoexplorer/lib/GeoExt/widgets/tree/LayerContainer.js
Log:
Support drag-drop reordering of layer nodes in a layer container.
Modified: sandbox/opengeo/geoexplorer/examples/treenodes.js
===================================================================
--- sandbox/opengeo/geoexplorer/examples/treenodes.js 2009-04-14 18:49:55 UTC (rev 380)
+++ sandbox/opengeo/geoexplorer/examples/treenodes.js 2009-04-14 18:50:41 UTC (rev 381)
@@ -73,6 +73,7 @@
leaf: false,
expanded: true
}),
+ enableDD: true,
width: 170,
height: 300,
floating: true,
Modified: sandbox/opengeo/geoexplorer/lib/GeoExt/widgets/tree/LayerContainer.js
===================================================================
--- sandbox/opengeo/geoexplorer/lib/GeoExt/widgets/tree/LayerContainer.js 2009-04-14 18:49:55 UTC (rev 380)
+++ sandbox/opengeo/geoexplorer/lib/GeoExt/widgets/tree/LayerContainer.js 2009-04-14 18:50:41 UTC (rev 381)
@@ -59,15 +59,8 @@
this.addLayerNode(record);
}, this);
this.layerStore.on({
- "add": function(store, records, index) {
- var nodeIndex = this.recordIndexToNodeIndex(index);
- for(var i=0; i<records.length; ++i) {
- this.addLayerNode(records[i], nodeIndex);
- }
- },
- "remove": function(store, record, index) {
- this.removeLayerNode(record);
- },
+ "add": this.onStoreAdd,
+ "remove": this.onStoreRemove,
scope: this
});
}
@@ -75,6 +68,50 @@
},
/**
+ * Method: onStoreAdd
+ * Listener for the store's add event.
+ *
+ * Parameters:
+ * store - {Ext.data.Store}
+ * records - {Array(Ext.data.Record)}
+ * index - {Number}
+ */
+ onStoreAdd: function(store, records, index) {
+ if(!this._reordering) {
+ var nodeIndex = this.recordIndexToNodeIndex(index);
+ for(var i=0; i<records.length; ++i) {
+ this.addLayerNode(records[i], nodeIndex);
+ }
+ }
+ },
+
+ /**
+ * Method: onStoreRemove
+ * Listener for the store's remove event.
+ *
+ * Parameters:
+ * store - {Ext.data.Store}
+ * record - {Ext.data.Record}
+ * index - {Number}
+ */
+ onStoreRemove: function(store, record, index) {
+ if(!this._reordering) {
+ this.removeLayerNode(record);
+ }
+ },
+
+ /**
+ * Method: destroy
+ */
+ destroy: function() {
+ if(this.layerStore) {
+ this.layerStore.un("add", this.onStoreAdd, this);
+ this.layerStore.un("remove", this.onStoreRemove, this);
+ }
+ GeoExt.tree.LayerContainer.superclass.render.apply(this, arguments);
+ },
+
+ /**
* Method: recordIndexToNodeIndex
* Convert a record index into a child node index.
*
@@ -100,6 +137,31 @@
},
/**
+ * Method: nodeIndexToRecordIndex
+ * Convert a child node index to a record index.
+ *
+ * Parameters:
+ * index - {Number} The child node index.
+ *
+ * Returns:
+ * {Number} The appropriate record index for the node.
+ */
+ nodeIndexToRecordIndex: function(index) {
+ var store = this.layerStore;
+ var count = store.getCount();
+ var nodeIndex = -1;
+ for(var i=count-1; i>=0; --i) {
+ if(store.getAt(i).get("layer").displayInLayerSwitcher) {
+ ++nodeIndex;
+ if(index === nodeIndex) {
+ break;
+ }
+ }
+ }
+ return i;
+ },
+
+ /**
* Method: addLayerNode
* Adds a child node representing a layer of the map
*
@@ -122,6 +184,7 @@
} else {
this.appendChild(node);
}
+ node.on("move", this.onChildMove, this);
}
},
@@ -139,10 +202,40 @@
return node.layer == layer;
});
if(node) {
+ node.un("move", this.onChildMove, this);
node.remove();
}
}
+ },
+
+ /**
+ * Method: onChildMove
+ * Listener for child node "move" events. This updates the order of
+ * records in the store based on new node order if the node has not
+ * changed parents.
+ *
+ * Parameters:
+ * tree - {Ext.data.Tree}
+ * node - {Ext.tree.TreeNode}
+ * oldParent - {Ext.tree.TreeNode}
+ * newParent - {Ext.tree.TreeNode}
+ * index {Number}
+ */
+ onChildMove: function(tree, node, oldParent, newParent, index) {
+ if(oldParent === newParent) {
+ var newRecordIndex = this.nodeIndexToRecordIndex(index);
+ var oldRecordIndex = this.layerStore.findBy(function(record) {
+ return record.get("layer") === node.layer;
+ });
+ // remove the record and re-insert it at the correct index
+ var record = this.layerStore.getAt(oldRecordIndex);
+ this._reordering = true;
+ this.layerStore.remove(record);
+ this.layerStore.insert(newRecordIndex, [record]);
+ delete this._reordering;
+ }
}
+
});
/**
More information about the Commits
mailing list