[Commits] r1288 - in core/trunk/geoext: examples lib lib/GeoExt/widgets/tree tests tests/lib/GeoExt/widgets/tree
commits at geoext.org
commits at geoext.org
Sun Jul 26 23:32:34 CEST 2009
Author: ahocevar
Date: 2009-07-26 23:32:34 +0200 (Sun, 26 Jul 2009)
New Revision: 1288
Added:
core/trunk/geoext/lib/GeoExt/widgets/tree/LayerLoader.js
core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerLoader.html
Modified:
core/trunk/geoext/examples/tree.js
core/trunk/geoext/lib/GeoExt.js
core/trunk/geoext/lib/GeoExt/widgets/tree/BaseLayerContainer.js
core/trunk/geoext/lib/GeoExt/widgets/tree/LayerContainer.js
core/trunk/geoext/lib/GeoExt/widgets/tree/OverlayLayerContainer.js
core/trunk/geoext/tests/lib/GeoExt/widgets/tree/BaseLayerContainer.html
core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerContainer.html
core/trunk/geoext/tests/list-tests.html
Log:
Created a LayerLoader to popuplate LayerContainers; enhanced DD support
to drag/drop layers from one container to another. Thanks Eric for the
great collaboration on this. r=elemoine (closes #122)
Modified: core/trunk/geoext/examples/tree.js
===================================================================
--- core/trunk/geoext/examples/tree.js 2009-07-24 21:51:55 UTC (rev 1287)
+++ core/trunk/geoext/examples/tree.js 2009-07-26 21:32:34 UTC (rev 1288)
@@ -16,8 +16,8 @@
nodeType: "gx_overlaylayercontainer",
// render the nodes inside this container with a radio button,
// and assign them the group "foo"
- defaults: {
- radioGroup: "foo"
+ loader: {
+ baseAttrs: {radioGroup: "foo"}
}
}, {
nodeType: "gx_layer",
@@ -136,7 +136,7 @@
collapseMode: "mini",
autoScroll: true,
loader: new Ext.tree.TreeLoader({
- clearOnLoad: true
+ applyLoader: false
}),
root: {
nodeType: "async",
Modified: core/trunk/geoext/lib/GeoExt/widgets/tree/BaseLayerContainer.js
===================================================================
--- core/trunk/geoext/lib/GeoExt/widgets/tree/BaseLayerContainer.js 2009-07-24 21:51:55 UTC (rev 1287)
+++ core/trunk/geoext/lib/GeoExt/widgets/tree/BaseLayerContainer.js 2009-07-26 21:32:34 UTC (rev 1288)
@@ -39,43 +39,24 @@
* Private constructor override.
*/
constructor: function(config) {
- config.text = config.text || "Base Layer";
- config.defaults = Ext.apply({
- iconCls: 'gx-tree-baselayer-icon',
- checkedGroup: 'baselayer'
- }, config.defaults);
- GeoExt.tree.BaseLayerContainer.superclass.constructor.apply(this, arguments);
- },
+ config = Ext.applyIf(config || {}, {
+ text: "Base Layer",
+ loader: {}
+ });
+ config.loader = Ext.applyIf(config.loader, {
+ baseAttrs: Ext.applyIf(config.loader.baseAttrs || {}, {
+ iconCls: 'gx-tree-baselayer-icon',
+ checkedGroup: 'baselayer'
+ }),
+ filter: function(record) {
+ var layer = record.get("layer");
+ return layer.displayInLayerSwitcher === true &&
+ layer.isBaseLayer === true;
+ }
+ });
- /** private: method[addLayerNode]
- * :param layerRecord: ``Ext.data.Record`` The layer record containing the
- * layer to be added.
- * :param index: ``Number`` Optional index for the new layer. Default is 0.
- *
- * Adds a child node representing a base layer of the map
- */
- addLayerNode: function(layerRecord, index) {
- var layer = layerRecord.get("layer");
- if (layer.isBaseLayer == true) {
- GeoExt.tree.BaseLayerContainer.superclass.addLayerNode.apply(
- this, arguments
- );
- }
- },
-
- /** private: method[removeLayerNode]
- * :param layerRecord: ``Ext.data.Record`` the layer record to remove the
- * node for
- *
- * Removes a child node representing a base layer of the map.
- */
- removeLayerNode: function(layerRecord) {
- var layer = layerRecord.get("layer");
- if (layer.isBaseLayer == true) {
- GeoExt.tree.BaseLayerContainer.superclass.removeLayerNode.apply(
- this, arguments
- );
- }
+ GeoExt.tree.BaseLayerContainer.superclass.constructor.call(this,
+ config);
}
});
Modified: core/trunk/geoext/lib/GeoExt/widgets/tree/LayerContainer.js
===================================================================
--- core/trunk/geoext/lib/GeoExt/widgets/tree/LayerContainer.js 2009-07-24 21:51:55 UTC (rev 1287)
+++ core/trunk/geoext/lib/GeoExt/widgets/tree/LayerContainer.js 2009-07-26 21:32:34 UTC (rev 1288)
@@ -7,14 +7,14 @@
*/
/**
- * @include GeoExt/widgets/tree/LayerNode.js
+ * @include GeoExt/widgets/tree/LayerLoader.js
*/
Ext.namespace("GeoExt.tree");
/** api: (define)
* module = GeoExt.tree
* class = LayerContainer
- * base_link = `Ext.tree.TreeNode <http://extjs.com/deploy/dev/docs/?class=Ext.tree.TreeNode>`_
+ * base_link = `Ext.tree.AsyncTreeNode <http://extjs.com/deploy/dev/docs/?class=Ext.tree.AsyncTreeNode>`_
*/
/** api: constructor
@@ -24,208 +24,76 @@
* OpenLayers map. Only layers that have displayInLayerSwitcher set to true
* will be included. The childrens' iconCls defaults to
* "gx-tree-layer-icon".
+ *
+ * Note: if this conatiner is loaded by an ``Ext.tree.TreeLoader``, the
+ * ``applyLoader`` config option of that loader needs to be set to
+ * "false". Also note that the list of available uiProviders will be
+ * taken from the ownerTree if this container's loader is configured
+ * without one.
*
* To use this node type in ``TreePanel`` config, set nodeType to
* "gx_layercontainer".
*/
-GeoExt.tree.LayerContainer = Ext.extend(Ext.tree.TreeNode, {
+GeoExt.tree.LayerContainer = Ext.extend(Ext.tree.AsyncTreeNode, {
- /** api: config[layerStore]
- * :class:`GeoExt.data.LayerStore`
- * The layer store containing layers to be displayed in the container.
+ /** api: config[loader]
+ * :class:`GeoExt.tree.LayerLoader` or ``Object`` The loader to use with
+ * this container. If an ``Object`` is provided, a
+ * :class:`GeoExt.tree.LayerLoader`, configured with the the properties
+ * from the provided object, will be created.
*/
- layerStore: null,
- /** api: config[defaults]
- * ``Object``
- * A configuration object passed to all nodes that this container creates.
+ /** api: config[layerStore]
+ * :class:`GeoExt.data.LayerStore` The layer store containing layers to be
+ * displayed in the container. If loader is not provided or provided as
+ * ``Object``, this property will be set as the store option of the
+ * loader. Otherwise it will be ignored.
*/
- defaults: null,
-
+
/** private: method[constructor]
* Private constructor override.
*/
constructor: function(config) {
- this.layerStore = config.layerStore;
- this.defaults = config.defaults;
- GeoExt.tree.LayerContainer.superclass.constructor.apply(this, arguments);
+ config = Ext.applyIf(config || {}, {
+ text: "Layers"
+ });
+ this.loader = config.loader instanceof GeoExt.tree.LayerLoader ?
+ config.loader :
+ new GeoExt.tree.LayerLoader(Ext.applyIf(config.loader, {
+ store: config.layerStore
+ }));
+
+ GeoExt.tree.LayerContainer.superclass.constructor.call(this, config);
},
-
- /** private: method[render]
- * :param bulkRender: ``Boolean``
- */
- render: function(bulkRender) {
- if (!this.rendered) {
- if(!this.layerStore) {
- this.layerStore = GeoExt.MapPanel.guess().layers;
- }
- this.layerStore.each(function(record) {
- this.addLayerNode(record);
- }, this);
- this.layerStore.on({
- "add": this.onStoreAdd,
- "remove": this.onStoreRemove,
- scope: this
- });
- }
- GeoExt.tree.LayerContainer.superclass.render.call(this, bulkRender);
- },
- /** private: method[onStoreAdd]
- * :param store: ``Ext.data.Store``
- * :param records: ``Array(Ext.data.Record)``
- * :param index: ``Number``
- *
- * Listener for the store's add event.
- */
- onStoreAdd: function(store, records, index) {
- if(!this._reordering) {
- var nodeIndex = this.recordIndexToNodeIndex(index+records.length-1);
- for(var i=0; i<records.length; ++i) {
- this.addLayerNode(records[i], nodeIndex);
- }
- }
- },
-
- /** private: method[onStoreRemove]
- * :param store: ``Ext.data.Store``
- * :param record: ``Ext.data.Record``
- * :param index: ``Number``
- *
- * Listener for the store's remove event.
- */
- onStoreRemove: function(store, record, index) {
- if(!this._reordering) {
- this.removeLayerNode(record);
- }
- },
-
/** private: method[recordIndexToNodeIndex]
* :param index: ``Number`` The record index in the layer store.
* :return: ``Number`` The appropriate child node index for the record.
*/
recordIndexToNodeIndex: function(index) {
- var store = this.layerStore;
+ var store = this.loader.store;
var count = store.getCount();
var nodeCount = this.childNodes.length;
var nodeIndex = -1;
for(var i=count-1; i>=0; --i) {
- if(store.getAt(i).get("layer").displayInLayerSwitcher) {
+ if(this.loader.filter(store.getAt(i)) === true) {
++nodeIndex;
if(index === i || nodeIndex > nodeCount-1) {
break;
}
}
- };
+ }
return nodeIndex;
},
- /** private: method[nodeIndexToRecordIndex]
- * :param index: ``Number`` The child node index.
- * :return: ``Number`` The appropriate record index for the node.
- *
- * Convert a child node index to a record index.
- */
- 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;
- },
-
- /** private: method[addLayerNode]
- * :param layerRecord: ``Ext.data.Record`` The layer record containing the
- * layer to be added.
- * :param index: ``Number`` Optional index for the new layer. Default is 0.
- *
- * Adds a child node representing a layer of the map
- */
- addLayerNode: function(layerRecord, index) {
- index = index || 0;
- var layer = layerRecord.get("layer");
- if (layer.displayInLayerSwitcher === true) {
- var Node = (this.defaults && this.defaults.nodeType) ?
- Ext.tree.TreePanel.nodeTypes[this.defaults.nodeType] :
- GeoExt.tree.LayerNode;
- var node = new Node(Ext.apply({
- iconCls: 'gx-tree-layer-icon',
- layer: layer,
- layerStore: this.layerStore
- }, this.defaults));
- var sibling = this.item(index);
- if(sibling) {
- this.insertBefore(node, sibling);
- } else {
- this.appendChild(node);
- }
- node.on("move", this.onChildMove, this);
- }
- },
-
- /** private: method[removeLayerNode]
- * :param layerRecord: ``Ext.data.Record`` The layer record containing the
- * layer to be removed.
- *
- * Removes a child node representing a layer of the map
- */
- removeLayerNode: function(layerRecord) {
- var layer = layerRecord.get("layer");
- if (layer.displayInLayerSwitcher == true) {
- var node = this.findChildBy(function(node) {
- return node.layer == layer;
- });
- if(node) {
- node.un("move", this.onChildMove, this);
- node.remove();
- }
- }
- },
-
- /** private: method[onChildMove]
- * :param tree: ``Ext.data.Tree``
- * :param node: ``Ext.tree.TreeNode``
- * :param oldParent: ``Ext.tree.TreeNode``
- * :param newParent: ``Ext.tree.TreeNode``
- * :param index: ``Number``
- *
- * 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.
- */
- 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;
- }
- },
-
/** private: method[destroy]
*/
destroy: function() {
- if(this.layerStore) {
- this.layerStore.un("add", this.onStoreAdd, this);
- this.layerStore.un("remove", this.onStoreRemove, this);
- }
+ delete this.layerStore;
GeoExt.tree.LayerContainer.superclass.destroy.apply(this, arguments);
}
});
-
+
/**
* NodeType: gx_layercontainer
*/
Added: core/trunk/geoext/lib/GeoExt/widgets/tree/LayerLoader.js
===================================================================
--- core/trunk/geoext/lib/GeoExt/widgets/tree/LayerLoader.js (rev 0)
+++ core/trunk/geoext/lib/GeoExt/widgets/tree/LayerLoader.js 2009-07-26 21:32:34 UTC (rev 1288)
@@ -0,0 +1,317 @@
+/**
+ * Copyright (c) 2008-2009 The Open Source Geospatial Foundation
+ *
+ * Published under the BSD license.
+ * See http://svn.geoext.org/core/trunk/geoext/license.txt for the full text
+ * of the license.
+ */
+
+/**
+ * @include GeoExt/widgets/tree/LayerNode.js
+ */
+Ext.namespace("GeoExt.tree");
+
+/** api: (define)
+ * module = GeoExt.tree
+ * class = LayerLoader
+ * base_link = `Ext.util.Observable <http://extjs.com/deploy/dev/docs/?class=Ext.util.Observable>`_
+ */
+
+/** api: constructor
+ * .. class:: LayerLoader
+ *
+ * A loader that will load all layers of a :class:`GeoExt.data.LayerStore`
+ * By default, only layers that have displayInLayerSwitcher set to true
+ * will be included. The childrens' iconCls defaults to
+ * "gx-tree-layer-icon".
+ */
+GeoExt.tree.LayerLoader = function(config) {
+ Ext.apply(this, config);
+ this.addEvents(
+
+ /** api: events[beforeload]
+ * Triggered before loading children. Return false to avoid
+ * loading children.
+ *
+ * Listener arguments:
+ * * loader - :class:`GeoExt.tree.LayerLoader` this loader
+ * * node - ``Ex.tree.TreeNode`` the node that this loader is
+ * configured with
+ */
+ "beforeload",
+
+ /** api: events[load]
+ * Triggered after children wer loaded.
+ *
+ * Listener arguments:
+ * * loader - :class:`GeoExt.tree.LayerLoader` this loader
+ * * node - ``Ex.tree.TreeNode`` the node that this loader is
+ * configured with
+ */
+ "load"
+ );
+
+ GeoExt.tree.LayerLoader.superclass.constructor.call(this);
+};
+
+Ext.extend(GeoExt.tree.LayerLoader, Ext.util.Observable, {
+
+ /** api: config[store]
+ * :class:`GeoExt.data.LayerStore`
+ * The layer store containing layers to be added by this loader.
+ */
+ store: null,
+
+ /** api: config[filter]
+ * ``Function``
+ * A function, called in the scope of this loader, with a layer record
+ * as argument. Is expected to return true for layers to be loaded, false
+ * otherwise. By default, the filter checks for displayInLayerSwitcher:
+ *
+ * .. code-block:: javascript
+ *
+ * filter: function(record) {
+ * return record.get("layer").displayInLayerSwitcher == true
+ * }
+ */
+ filter: function(record) {
+ return record.get("layer").displayInLayerSwitcher == true;
+ },
+
+ /** api: config[uiProviders]
+ * ``Object``
+ * An optional object containing properties which specify custom
+ * GeoExt.tree.LayerNodeUI implementations. If the optional uiProvider
+ * attribute for child nodes is a string rather than a reference to a
+ * TreeNodeUI implementation, then that string value is used as a
+ * property name in the uiProviders object. If not provided, the
+ * uiProviders object will be taken from the ownerTree.
+ */
+ uiProviders: null,
+
+ /** private: method[load]
+ * :param node: ``Ext.tree.TreeNode`` The node to add children to.
+ * :param callback: ``Function``
+ */
+ load: function(node, callback) {
+ if(this.fireEvent("beforeload", this, node)) {
+ this.removeStoreHandlers();
+ while (node.firstChild) {
+ node.removeChild(node.firstChild);
+ }
+
+ if(!this.uiProviders) {
+ this.uiProviders = node.getOwnerTree().getLoader().uiProviders;
+ }
+
+ if(!this.store) {
+ this.store = GeoExt.MapPanel.guess().layers;
+ }
+ this.store.each(function(record) {
+ this.addLayerNode(node, record);
+ }, this);
+ this.addStoreHandlers(node);
+
+ if(typeof callback == "function"){
+ callback();
+ }
+
+ this.fireEvent("load", this, node);
+ }
+ },
+
+ /** private: method[onStoreAdd]
+ * :param store: ``Ext.data.Store``
+ * :param records: ``Array(Ext.data.Record)``
+ * :param index: ``Number``
+ * :param node: ``Ext.tree.TreeNode``
+ *
+ * Listener for the store's add event.
+ */
+ onStoreAdd: function(store, records, index, node) {
+ if(!this._reordering) {
+ var nodeIndex = node.recordIndexToNodeIndex(index+records.length-1);
+ for(var i=0; i<records.length; ++i) {
+ this.addLayerNode(node, records[i], nodeIndex);
+ }
+ }
+ },
+
+ /** private: method[onStoreRemove]
+ * :param store: ``Ext.data.Store``
+ * :param record: ``Ext.data.Record``
+ * :param index: ``Number``
+ * :param node: ``Ext.tree.TreeNode``
+ *
+ * Listener for the store's remove event.
+ */
+ onStoreRemove: function(store, record, index, node) {
+ if(!this._reordering) {
+ this.removeLayerNode(node, record);
+ }
+ },
+
+ /** private: method[addLayerNode]
+ * :param node: ``Ext.tree.TreeNode`` The node that the layer node will
+ * be added to as child.
+ * :param layerRecord: ``Ext.data.Record`` The layer record containing the
+ * layer to be added.
+ * :param index: ``Number`` Optional index for the new layer. Default is 0.
+ *
+ * Adds a child node representing a layer of the map
+ */
+ addLayerNode: function(node, layerRecord, index) {
+ index = index || 0;
+ if (this.filter(layerRecord) === true) {
+ var child = this.createNode({
+ nodeType: 'gx_layer',
+ layer: layerRecord.get("layer"),
+ layerStore: this.store
+ });
+ var sibling = node.item(index);
+ if(sibling) {
+ node.insertBefore(child, sibling);
+ } else {
+ node.appendChild(child);
+ }
+ child.on("move", this.onChildMove, this);
+ }
+ },
+
+ /** private: method[removeLayerNode]
+ * :param node: ``Ext.tree.TreeNode`` The node that the layer node will
+ * be removed from as child.
+ * :param layerRecord: ``Ext.data.Record`` The layer record containing the
+ * layer to be removed.
+ *
+ * Removes a child node representing a layer of the map
+ */
+ removeLayerNode: function(node, layerRecord) {
+ if (this.filter(layerRecord) === true) {
+ var child = node.findChildBy(function(node) {
+ return node.layer == layerRecord.get("layer");
+ });
+ if(child) {
+ child.un("move", this.onChildMove, this);
+ child.remove();
+ node.reload();
+ }
+ }
+ },
+
+ /** private: method[onChildMove]
+ * :param tree: ``Ext.data.Tree``
+ * :param node: ``Ext.tree.TreeNode``
+ * :param oldParent: ``Ext.tree.TreeNode``
+ * :param newParent: ``Ext.tree.TreeNode``
+ * :param index: ``Number``
+ *
+ * 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.
+ */
+ onChildMove: function(tree, node, oldParent, newParent, index) {
+ this._reordering = true;
+ var oldRecordIndex = this.store.findBy(function(record) {
+ return record.get("layer") === node.layer;
+ });
+ // remove the record and re-insert it at the correct index
+ var record = this.store.getAt(oldRecordIndex);
+
+ if(newParent instanceof GeoExt.tree.LayerContainer &&
+ this.store === newParent.loader.store) {
+ newParent.loader._reordering = true;
+ this.store.remove(record);
+ var newRecordIndex;
+ if(newParent.childNodes.length > 1) {
+ // find index by neighboring node in the same container
+ var searchIndex = (index === 0) ? index + 1 : index - 1;
+ newRecordIndex = this.store.findBy(function(r) {
+ return newParent.childNodes[searchIndex].layer === r.get("layer");
+ });
+ index === 0 && newRecordIndex++;
+ } else if(oldParent.parentNode === newParent.parentNode){
+ // find index by last node of a container above
+ var prev = newParent;
+ do {
+ prev = prev.previousSibling;
+ } while (prev && !(prev instanceof GeoExt.tree.LayerContainer && prev.lastChild));
+ if(prev) {
+ newRecordIndex = this.store.findBy(function(r) {
+ return prev.lastChild.layer === r.get("layer");
+ });
+ } else {
+ // find indext by first node of a container below
+ var next = newParent;
+ do {
+ next = next.nextSibling;
+ } while (next && !(next instanceof GeoExt.tree.LayerContainer && next.firstChild));
+ if(next) {
+ newRecordIndex = this.store.findBy(function(r) {
+ return next.firstChild.layer === r.get("layer");
+ });
+ }
+ newRecordIndex++;
+ }
+ }
+ if(newRecordIndex !== undefined) {
+ this.store.insert(newRecordIndex, [record]);
+ window.setTimeout(function() {
+ newParent.reload();
+ oldParent.reload();
+ });
+ } else {
+ this.store.insert(oldRecordIndex, [record]);
+ }
+ delete newParent.loader._reordering;
+ }
+ delete this._reordering;
+ },
+
+ /** private: method[addStoreHandlers]
+ * :param node: :class:`GeoExt.tree.LayerNode`
+ */
+ addStoreHandlers: function(node) {
+ if(!this._storeHandlers) {
+ this._storeHandlers = {
+ "add": this.onStoreAdd.createDelegate(this, [node], true),
+ "remove": this.onStoreRemove.createDelegate(this, [node], true)
+ };
+ for(evt in this._storeHandlers) {
+ this.store.on(evt, this._storeHandlers[evt], this);
+ }
+ }
+ },
+
+ /** private: method[removeStoreHandlers]
+ */
+ removeStoreHandlers: function() {
+ if(this._storeHandlers) {
+ for(evt in this._storeHandlers) {
+ this.store.un(evt, this._storeHandlers[evt], this);
+ }
+ delete this._storeHandlers;
+ }
+ },
+
+ /** private: method[createNode]
+ * :param attr: ``Object`` attributes for the new node
+ */
+ createNode: function(attr){
+ if(this.baseAttrs){
+ Ext.apply(attr, this.baseAttrs);
+ }
+ if(typeof attr.uiProvider == 'string'){
+ attr.uiProvider = this.uiProviders[attr.uiProvider] || eval(attr.uiProvider);
+ }
+ attr.nodeType = attr.nodeType || "gx_layer";
+
+ return new Ext.tree.TreePanel.nodeTypes[attr.nodeType](attr);
+ },
+
+ /** private: method[destroy]
+ */
+ destroy: function() {
+ this.removeStoreHandlers();
+ }
+});
\ No newline at end of file
Property changes on: core/trunk/geoext/lib/GeoExt/widgets/tree/LayerLoader.js
___________________________________________________________________
Name: svn:keywords
+ Id Author Date Revision
Name: svn:eol-style
+ native
Modified: core/trunk/geoext/lib/GeoExt/widgets/tree/OverlayLayerContainer.js
===================================================================
--- core/trunk/geoext/lib/GeoExt/widgets/tree/OverlayLayerContainer.js 2009-07-24 21:51:55 UTC (rev 1287)
+++ core/trunk/geoext/lib/GeoExt/widgets/tree/OverlayLayerContainer.js 2009-07-26 21:32:34 UTC (rev 1288)
@@ -36,40 +36,19 @@
* Private constructor override.
*/
constructor: function(config) {
- config.text = config.text || "Overlays";
- GeoExt.tree.OverlayLayerContainer.superclass.constructor.apply(this,
- arguments);
- },
-
- /** private: method[addLayerNode]
- * :param layerRecord: ``Ext.data.Record`` The layer record containing the
- * layer to be added.
- * :param index: ``Number`` Optional index for the new layer. Default is 0.
- *
- * Adds a child node representing a overlay layer of the map.
- */
- addLayerNode: function(layerRecord, index) {
- var layer = layerRecord.get("layer");
- if (layer.isBaseLayer == false) {
- GeoExt.tree.OverlayLayerContainer.superclass.addLayerNode.apply(
- this, arguments
- );
- }
- },
-
- /** private: method[removeLayerNode]
- * :param layerRecord: ``Ext.data.Record`` the layer record to remove the
- * node for
- *
- * Removes a child node representing an overlay layer of the map.
- */
- removeLayerNode: function(layerRecord) {
- var layer = layerRecord.get("layer");
- if (layer.isBaseLayer == false) {
- GeoExt.tree.OverlayLayerContainer.superclass.removeLayerNode.apply(
- this, arguments
- );
- }
+ config = Ext.applyIf(config || {}, {
+ text: "Overlays"
+ });
+ config.loader = Ext.applyIf(config.loader || {}, {
+ filter: function(record){
+ var layer = record.get("layer");
+ return layer.displayInLayerSwitcher === true &&
+ layer.isBaseLayer === false;
+ }
+ });
+
+ GeoExt.tree.OverlayLayerContainer.superclass.constructor.call(this,
+ config);
}
});
Modified: core/trunk/geoext/lib/GeoExt.js
===================================================================
--- core/trunk/geoext/lib/GeoExt.js 2009-07-24 21:51:55 UTC (rev 1287)
+++ core/trunk/geoext/lib/GeoExt.js 2009-07-26 21:32:34 UTC (rev 1288)
@@ -87,6 +87,7 @@
"GeoExt/widgets/tips/LayerOpacitySliderTip.js",
"GeoExt/widgets/tips/ZoomSliderTip.js",
"GeoExt/widgets/tree/LayerNode.js",
+ "GeoExt/widgets/tree/LayerLoader.js",
"GeoExt/widgets/tree/LayerContainer.js",
"GeoExt/widgets/tree/BaseLayerContainer.js",
"GeoExt/widgets/tree/OverlayLayerContainer.js",
Modified: core/trunk/geoext/tests/lib/GeoExt/widgets/tree/BaseLayerContainer.html
===================================================================
--- core/trunk/geoext/tests/lib/GeoExt/widgets/tree/BaseLayerContainer.html 2009-07-24 21:51:55 UTC (rev 1287)
+++ core/trunk/geoext/tests/lib/GeoExt/widgets/tree/BaseLayerContainer.html 2009-07-26 21:32:34 UTC (rev 1288)
@@ -25,7 +25,8 @@
});
var node = new GeoExt.tree.BaseLayerContainer({
- layerStore: store
+ layerStore: store,
+ expanded: true
});
var panel = new Ext.tree.TreePanel({
Modified: core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerContainer.html
===================================================================
--- core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerContainer.html 2009-07-24 21:51:55 UTC (rev 1287)
+++ core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerContainer.html 2009-07-26 21:32:34 UTC (rev 1288)
@@ -12,15 +12,17 @@
t.plan(2);
var store = new GeoExt.data.LayerStore();
- var defaults = {};
+ var defaults = {foo: "bar"};
var node = new GeoExt.tree.LayerContainer({
layerStore: store,
- defaults: defaults
+ loader: {
+ baseAttrs: defaults
+ }
});
- t.ok(node.layerStore === store, "layerStore set");
- t.ok(node.defaults === defaults, "defaults set");
+ t.ok(node.loader.store === store, "layerStore set");
+ t.eq(node.loader.baseAttrs.foo, "bar", "baseAttrs set");
node.destroy();
@@ -42,7 +44,8 @@
});
var node = new GeoExt.tree.LayerContainer({
- layerStore: store
+ layerStore: store,
+ expanded: true
});
var panel = new Ext.tree.TreePanel({
@@ -73,7 +76,8 @@
});
var root = new GeoExt.tree.LayerContainer({
- layerStore: store
+ layerStore: store,
+ expanded: true
});
var panel = new Ext.tree.TreePanel({
@@ -122,6 +126,96 @@
}
+ function test_group_move(t) {
+ t.plan(8);
+
+ var map = new OpenLayers.Map({
+ div: "map",
+ allOverlays: true
+ });
+
+ map.addLayers([
+ new OpenLayers.Layer("a"),
+ new OpenLayers.Layer("b"),
+ new OpenLayers.Layer("c", {displayInLayerSwitcher: false}),
+ new OpenLayers.Layer("d", {displayInLayerSwitcher: false})
+ ]);
+
+ var store = new GeoExt.data.LayerStore({
+ map: map
+ });
+
+ var root = new Ext.tree.TreeNode({
+ expanded: true
+ });
+
+ var panel = new Ext.tree.TreePanel({
+ renderTo: document.body,
+ root: root,
+ listeners: {
+ beforemovenode: function(tree, node, oldParent, newParent, index){
+ // change the group when moving to a new container
+ if (oldParent !== newParent) {
+ var index = store.findBy(function(r){
+ return r.get("layer") === node.layer;
+ });
+ var layer = store.getAt(index).get("layer");
+ layer.displayInLayerSwitcher = !layer.displayInLayerSwitcher;
+ }
+ },
+ scope: this
+ }
+ });
+
+ var container1 = new GeoExt.tree.LayerContainer({
+ loader: {
+ store: store,
+ filter: function(record) {
+ return !record.get("layer").displayInLayerSwitcher
+ }
+ },
+ expanded: true
+ });
+ root.appendChild(container1);
+ var container2 = new GeoExt.tree.LayerContainer({
+ loader: {
+ store: store,
+ filter: function(record) {
+ return record.get("layer").displayInLayerSwitcher
+ }
+ },
+ expanded: true
+ });
+ root.appendChild(container2);
+
+ // testing if layers get grouped by filter properly
+ t.eq(container1.childNodes[0].text, "d", "d is 1st node on container1");
+ t.eq(container1.childNodes[1].text, "c", "c is 2nd node on container1");
+ t.eq(container2.childNodes[0].text, "b", "b is 1st node on container2");
+ t.eq(container2.childNodes[1].text, "a", "a is 2nd node on container2");
+
+ // testing if indices are determined correctly from previous node in container
+ container2.appendChild(container1.childNodes[0]);
+ t.eq(map.getLayerIndex(container2.childNodes[2].layer), 0, "[c, b, a, d] d moved to the bottom");
+
+ // testing if indices are determined correctly from next layer in container
+ container2.insertBefore(container1.childNodes[0], container2.childNodes[1]);
+ t.eq(map.getLayerIndex(container2.childNodes[0].layer), 3, "[b, a, d, c] c is now the 4th layer on the map");
+
+ // testing if indices are determined correctly from container below
+ container1.appendChild(container2.childNodes[0]);
+ t.eq(map.getLayerIndex(container1.childNodes[0].layer), 3, "[b, a, d, c] c is still the 4th layer on the map");
+
+ for(var i=0; i<3; ++i) {
+ container1.appendChild(container2.childNodes[0]);
+ }
+
+ // testing if indices are determined correctly from container above
+ container2.appendChild(container1.childNodes[0]);
+ t.eq(map.getLayerIndex(container2.childNodes[0].layer), 0, "[a,d,c,b] b moved to the bottom");
+
+ }
+
</script>
</head>
<body>
Added: core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerLoader.html
===================================================================
--- core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerLoader.html (rev 0)
+++ core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerLoader.html 2009-07-26 21:32:34 UTC (rev 1288)
@@ -0,0 +1,76 @@
+<html>
+ <head>
+ <script src="../../../../../../openlayers/lib/OpenLayers.js"></script>
+ <script src="../../../../../../ext/adapter/ext/ext-base.js"></script>
+ <script src="../../../../../../ext/ext-all-debug.js"></script>
+ <script src="../../../../../lib/GeoExt.js"></script>
+
+ <script>
+
+ function test_constructor(t) {
+
+ t.plan(2);
+
+ var loader = new GeoExt.tree.LayerLoader({
+ store: "foo",
+ filter: "bar"
+ });
+
+ t.eq(loader.store, "foo", "store set");
+ t.eq(loader.filter, "bar", "filter set");
+ }
+
+ function test_load(t) {
+
+ t.plan(3);
+
+ var args;
+
+ var loader = new GeoExt.tree.LayerLoader({
+ store: new GeoExt.data.LayerStore(),
+ listeners: {
+ "beforeload": function(loader, node) {
+ return node.attributes.load;
+ },
+ "load": function(loader, node) {
+ args = {
+ loader: loader,
+ node: node
+ };
+ }
+ }
+ });
+
+ var node = new Ext.tree.AsyncTreeNode({
+ loader: loader,
+ load: false,
+ expanded: true
+ });
+ var tree = new Ext.tree.TreePanel({root: node});
+ tree.render("tree");
+ t.ok(!args, "loading aborted by beforeload event");
+
+ tree.destroy();
+ node.destroy();
+
+ node = new Ext.tree.AsyncTreeNode({
+ loader: loader,
+ load: true,
+ expanded: true
+ });
+ tree = new Ext.tree.TreePanel({root: node});
+ tree.render("tree");
+ t.ok(args.loader == loader, "loader passed correctly to 'load' handler");
+ t.ok(args.node == node, "node passed correctly to 'node' handler");
+
+ tree.destroy();
+ node.destroy();
+ loader.destroy();
+ }
+
+ </script>
+ </head>
+ <body>
+ <div id="tree" style="width: 100px; height: 100px;"></div>
+ </body>
+</html>
Property changes on: core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerLoader.html
___________________________________________________________________
Name: svn:keywords
+ Id Author Date Revision
Name: svn:eol-style
+ native
Modified: core/trunk/geoext/tests/list-tests.html
===================================================================
--- core/trunk/geoext/tests/list-tests.html 2009-07-24 21:51:55 UTC (rev 1287)
+++ core/trunk/geoext/tests/list-tests.html 2009-07-26 21:32:34 UTC (rev 1288)
@@ -20,6 +20,7 @@
<li>lib/GeoExt/widgets/form/FormPanel.html</li>
<li>lib/GeoExt/widgets/tree/BaseLayerContainer.html</li>
<li>lib/GeoExt/widgets/tree/LayerContainer.html</li>
+ <li>lib/GeoExt/widgets/tree/LayerLoader.html</li>
<li>lib/GeoExt/widgets/tree/LayerNode.html</li>
<li>lib/GeoExt/widgets/LegendImage.html</li>
<li>lib/GeoExt/widgets/LegendPanel.html</li>
More information about the Commits
mailing list