[Commits] r1391 - in core/trunk/geoext: examples lib lib/GeoExt/widgets/tree tests tests/lib/GeoExt/widgets/tree
commits at geoext.org
commits at geoext.org
Thu Oct 8 15:56:45 CEST 2009
Author: ahocevar
Date: 2009-10-08 15:56:45 +0200 (Thu, 08 Oct 2009)
New Revision: 1391
Added:
core/trunk/geoext/lib/GeoExt/widgets/tree/LayerParamLoader.js
core/trunk/geoext/lib/GeoExt/widgets/tree/LayerParamNode.js
core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerParamLoader.html
core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerParamNode.html
Modified:
core/trunk/geoext/examples/tree.js
core/trunk/geoext/lib/GeoExt.js
core/trunk/geoext/lib/GeoExt/widgets/tree/LayerNode.js
core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerNode.html
core/trunk/geoext/tests/list-tests.html
Log:
Created LayerParamNode and LayerParamLoader. r=tschaub (closes #127)
Modified: core/trunk/geoext/examples/tree.js
===================================================================
--- core/trunk/geoext/examples/tree.js 2009-10-08 05:26:12 UTC (rev 1390)
+++ core/trunk/geoext/examples/tree.js 2009-10-08 13:56:45 UTC (rev 1391)
@@ -14,6 +14,7 @@
nodeType: "gx_baselayercontainer"
}, {
nodeType: "gx_overlaylayercontainer",
+ expanded: true,
// render the nodes inside this container with a radio button,
// and assign them the group "foo"
loader: {
@@ -21,7 +22,12 @@
}
}, {
nodeType: "gx_layer",
- layer: "Tasmania Roads"
+ layer: "Tasmania (Group Layer)",
+ isLeaf: false,
+ // create subnodes for the layers in the LAYERS param
+ loader: {
+ param: "LAYERS"
+ }
}], true);
mapPanel = new GeoExt.MapPanel({
@@ -70,9 +76,19 @@
format: "image/gif"
}, {
isBaseLayer: false,
+ buffer: 0
+ }),
+ new OpenLayers.Layer.WMS("Tasmania (Group Layer)",
+ "http://demo.opengeo.org/geoserver/wms", {
+ layers: "topp:tasmania_state_boundaries,topp:tasmania_water_bodies,topp:tasmania_cities,topp:tasmania_roads",
+ transparent: true,
+ format: "image/gif"
+ }, {
+ isBaseLayer: false,
buffer: 0,
// exclude this layer from layer container nodes
- displayInLayerSwitcher: false
+ displayInLayerSwitcher: false,
+ visibility: false
})
]
});
Modified: core/trunk/geoext/lib/GeoExt/widgets/tree/LayerNode.js
===================================================================
--- core/trunk/geoext/lib/GeoExt/widgets/tree/LayerNode.js 2009-10-08 05:26:12 UTC (rev 1390)
+++ core/trunk/geoext/lib/GeoExt/widgets/tree/LayerNode.js 2009-10-08 13:56:45 UTC (rev 1391)
@@ -192,7 +192,7 @@
* To use this node type in a ``TreePanel`` config, set ``nodeType`` to
* "gx_layer".
*/
-GeoExt.tree.LayerNode = Ext.extend(Ext.tree.TreeNode, {
+GeoExt.tree.LayerNode = Ext.extend(Ext.tree.AsyncTreeNode, {
/** api: config[layer]
* ``OpenLayers.Layer or String``
@@ -218,23 +218,28 @@
*/
layerStore: null,
- /** api: config[childNodeType]
- * ``Ext.tree.Node or String``
- * Node class or nodeType of childnodes for this node. A node type provided
- * here needs to have an add method, with a scope argument. This method
- * will be run by this node in the context of this node, to create child nodes.
+ /** api: config[loader]
+ * ``Ext.tree.TreeLoader|Object`` If provided, subnodes will be added to
+ * this LayerNode. Obviously, only loaders that process an
+ * ``OpenLayers.Layer`` or :class:`GeoExt.data.LayerRecord` (like
+ * :class:`GeoExt.tree.LayerParamsLoader`) will actually generate child
+ * nodes here. If provided as ``Object``, a
+ * :class:`GeoExt.tree.LayerParamLoader` instance will be created, with
+ * the provided object as configuration.
*/
- childNodeType: null,
/** private: method[constructor]
* Private constructor override.
*/
constructor: function(config) {
- config.leaf = config.leaf || !config.children;
+ config.leaf = config.leaf || !(config.children || config.loader);
if(!config.iconCls && !config.children) {
config.iconCls = "gx-tree-layer-icon";
}
+ if(config.loader && !(config.loader instanceof Ext.tree.TreeLoader)) {
+ config.loader = new GeoExt.tree.LayerParamLoader(config.loader);
+ }
this.defaultUI = this.defaultUI || GeoExt.tree.LayerNodeUI;
this.addEvents(
@@ -247,8 +252,7 @@
Ext.apply(this, {
layer: config.layer,
- layerStore: config.layerStore,
- childNodeType: config.childNodeType
+ layerStore: config.layerStore
});
GeoExt.tree.LayerNode.superclass.constructor.apply(this, arguments);
},
@@ -289,10 +293,6 @@
this.text = layer.name;
}
- if(this.childNodeType) {
- this.addChildNodes();
- }
-
ui.show();
this.addVisibilityEventHandlers();
} else {
@@ -410,18 +410,6 @@
}
},
- /** private: method[addChildNodes]
- * Calls the add method of a node type configured as ``childNodeType``
- * to add children.
- */
- addChildNodes: function() {
- if(typeof this.childNodeType == "string") {
- Ext.tree.TreePanel.nodeTypes[this.childNodeType].add(this);
- } else if(typeof this.childNodeType.add === "function") {
- this.childNodeType.add(this);
- }
- },
-
/** private: method[destroy]
*/
destroy: function() {
Added: core/trunk/geoext/lib/GeoExt/widgets/tree/LayerParamLoader.js
===================================================================
--- core/trunk/geoext/lib/GeoExt/widgets/tree/LayerParamLoader.js (rev 0)
+++ core/trunk/geoext/lib/GeoExt/widgets/tree/LayerParamLoader.js 2009-10-08 13:56:45 UTC (rev 1391)
@@ -0,0 +1,145 @@
+/**
+ * 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.
+ */
+Ext.namespace("GeoExt.tree");
+
+/** api: (define)
+ * module = GeoExt.tree
+ * class = LayerParamLoader
+ * base_link = `Ext.util.Observable <http://extjs.com/deploy/dev/docs/?class=Ext.util.Observable>`_
+ */
+
+/** api: constructor
+ * .. class:: LayerParamLoader
+ *
+ * A loader that creates children from its node's layer
+ * (``OpenLayers.Layer.HTTPRequest``) by items in one of the values in
+ * the layer's params object.
+ */
+GeoExt.tree.LayerParamLoader = 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 were 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.LayerParamLoader, Ext.util.Observable, {
+
+ /** api: config[param]
+ * ``String`` Key for a param (key-value pair in the params object of the
+ * layer) that this loader uses to create childnodes from its items. The
+ * value can either be an ``Array`` or a ``String``, delimited by the
+ * character (or string) provided as ``delimiter`` config option.
+ */
+
+ /** private: property[param]
+ * ``String``
+ */
+ param: null,
+
+ /** api: config[delimiter]
+ * ``String`` Delimiter of the ``param``'s value's items. Default is
+ * ``,`` (comma). If the ``param``'s value is an array, this property has
+ * no effect.
+ */
+
+ /** private: property[delimiter]
+ * ``String``
+ */
+ delimiter: ",",
+
+ /** 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)) {
+ while (node.firstChild) {
+ node.removeChild(node.firstChild);
+ }
+
+ var paramValue =
+ (node.layer instanceof OpenLayers.Layer.HTTPRequest) &&
+ node.layer.params[this.param];
+ if(paramValue) {
+ var items = (paramValue instanceof Array) ?
+ paramValue :
+ paramValue.split(this.delimiter);
+
+ Ext.each(items, function(item) {
+ this.addParamNode(item, node);
+ }, this);
+ }
+
+ if(typeof callback == "function"){
+ callback();
+ }
+
+ this.fireEvent("load", this, node);
+ }
+ },
+
+ /** private: method[addParamNode]
+ * :param paramItem: ``String`` The param item that the child node will
+ * represent.
+ * :param node: :class:`GeoExt.tree.LayerNode`` The node that the param
+ * node will be added to as child.
+ *
+ * Adds a child node representing a param value of the layer
+ */
+ addParamNode: function(paramItem, node) {
+ var child = this.createNode({
+ layer: node.layer,
+ param: this.param,
+ item: paramItem,
+ delimiter: this.delimiter
+ });
+ var sibling = node.item(0);
+ if(sibling) {
+ node.insertBefore(child, sibling);
+ } else {
+ node.appendChild(child);
+ }
+ },
+
+ /** 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_layerparam";
+
+ return new Ext.tree.TreePanel.nodeTypes[attr.nodeType](attr);
+ }
+});
\ No newline at end of file
Property changes on: core/trunk/geoext/lib/GeoExt/widgets/tree/LayerParamLoader.js
___________________________________________________________________
Name: svn:keywords
+ Id Author Date Revision
Name: svn:eol-style
+ native
Added: core/trunk/geoext/lib/GeoExt/widgets/tree/LayerParamNode.js
===================================================================
--- core/trunk/geoext/lib/GeoExt/widgets/tree/LayerParamNode.js (rev 0)
+++ core/trunk/geoext/lib/GeoExt/widgets/tree/LayerParamNode.js 2009-10-08 13:56:45 UTC (rev 1391)
@@ -0,0 +1,232 @@
+/**
+ * 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.
+ */
+Ext.namespace("GeoExt.tree");
+
+/** api: (define)
+ * module = GeoExt.tree
+ * class = LayerParamNode
+ * base_link = `Ext.util.Observable <http://extjs.com/deploy/dev/docs/?class=Ext.tree.TreeNode>`_
+ */
+
+/** api: constructor
+ * .. class:: LayerParamNode
+ *
+ * A subclass of ``Ext.tree.TreeNode`` that represents a value of a list of
+ * values provided as one of an ``OpenLayers.Layer.HTTPRequest``'s params.
+ * The default iconCls for this node's icon is "gx-tree-layerparam-icon".
+ *
+ * To use this node type in a ``TreePanel`` config, set ``nodeType`` to
+ * "gx_layerparam".
+ */
+GeoExt.tree.LayerParamNode = Ext.extend(Ext.tree.TreeNode, {
+
+ /** api: config[layer]
+ * ``OpenLayers.Layer.HTTPRequest|String`` The layer that this node
+ * represents a subnode of. If provided as string, the string has to
+ * match the title of one of the records in the ``layerStore``.
+ */
+
+ /** private: property[layer]
+ * ``OpenLayers.Layer.HTTPRequest``
+ */
+ layer: null,
+
+ /** api: config[layerStore]
+ * :class:`GeoExt.data.LayerStore` Only used if layer is provided as
+ * string. The store where we can find the layer. If not provided, the
+ * store of a map panel found by ``GeoExt.MapPanel::guess`` will be used.
+ */
+
+ /** api: config[param]
+ * ``String`` Key for a param (key-value pair in the params object of the
+ * layer) that this node represents an item of. The value can either be an
+ * ``Array`` or a ``String``, delimited by the character (or string)
+ * provided as ``delimiter`` config option.
+ */
+
+ /** private: property[param]
+ * ``String``
+ */
+ param: null,
+
+ /** api: config[item]
+ * ``String`` The param's value's item that this node represents.
+ */
+
+ /** private: property[item]
+ * ``String``
+ */
+ item: null,
+
+ /** api: config[delimiter]
+ * ``String`` Delimiter of the ``param``'s value's items. Default is
+ * ``,`` (comma). If the ``param``'s value is an array, this property
+ * has no effect.
+ */
+
+ /** private: property[delimiter]
+ * ``String``
+ */
+ delimiter: null,
+
+ /** private: property[allItems]
+ * ``Array`` All items in the param value.
+ */
+ allItems: null,
+
+ /** private: method[constructor]
+ * Private constructor override.
+ */
+ constructor: function(attributes) {
+ var config = attributes || {};
+ config.iconCls = config.iconCls || "gx-tree-layerparam-icon";
+ config.text = config.text || config.item;
+ typeof config.layer == "string" ? false :
+ config.layer.getVisibility();
+
+ this.param = config.param;
+ this.item = config.item;
+ this.delimiter = config.delimiter || ",";
+
+ GeoExt.tree.LayerParamNode.superclass.constructor.apply(this, arguments);
+ },
+
+ /** private: method[render]
+ * Private override.
+ */
+ render: function(bulkRender) {
+ var layer = this.attributes.layer;
+ if(typeof layer == "string") {
+ var store = this.attributes.layerStore || GeoExt.MapPanel.guess().layers;
+ var i = store.findBy(function(o) {
+ return o.get("title") == layer;
+ });
+ layer = store.getAt(i).get("layer");
+ }
+ this.layer = layer;
+ this.allItems = this.getItems();
+ this.attributes.checked = layer.getVisibility();
+
+ this.addVisibilityEventHandlers();
+ GeoExt.tree.LayerParamNode.superclass.render.apply(this, arguments);
+ },
+
+ /** private: method[getItems]
+ * :return: ``Array`` the items of this node's layer's param
+ */
+ getItems: function() {
+ var paramValue = this.layer.params[this.param];
+ return paramValue instanceof Array ?
+ paramValue :
+ (paramValue ? paramValue.split(this.delimiter) : []);
+ },
+
+ /** private: method[createParams]
+ * :param items: ``Array``
+ * :return: ``Object`` The params object to pass to mergeNewParams
+ */
+ createParams: function(items) {
+ var params = {};
+ params[this.param] = this.layer.params[this.param] instanceof Array ?
+ items :
+ items.join(this.delimiter);
+ return params;
+ },
+
+ /** private: method[addVisibilityHandlers]
+ * Adds handlers that sync the checkbox state with the layer's visibility
+ * state
+ */
+ addVisibilityEventHandlers: function() {
+ this.layer.events.on({
+ "visibilitychanged": this.onLayerVisibilityChanged,
+ scope: this
+ });
+ this.on({
+ "checkchange": this.onCheckChange,
+ scope: this
+ });
+ },
+
+ /** private: method[onLayerVisibilityChanged]
+ * Handler for visibilitychanged events on the layer.
+ */
+ onLayerVisibilityChanged: function() {
+ if(this.getItems().length === 0) {
+ this.layer.mergeNewParams(this.createParams(this.allItems));
+ }
+ var visible = this.layer.getVisibility();
+ if(visible && this.getItems().indexOf(this.item) !== -1) {
+ this.getUI().toggleCheck(true);
+ }
+ if(!visible) {
+ this.layer.mergeNewParams(this.createParams([]));
+ this.getUI().toggleCheck(false);
+ }
+ },
+
+ /** private: method[onCheckChange]
+ * :param node: :class:`GeoExt.tree.LayerParamNode``
+ * :param checked: ``Boolean``
+ *
+ * Handler for checkchange events.
+ */
+ onCheckChange: function(node, checked) {
+ var layer = this.layer;
+
+ var newItems = [];
+ var curItems = this.getItems();
+ // if the layer is invisible, and a subnode is checked for the first
+ // time, we need to pretend that no subnode param items are set.
+ if(checked === true && layer.getVisibility() === false &&
+ curItems.length === this.allItems.length) {
+ curItems = [];
+
+ }
+ Ext.each(this.allItems, function(item) {
+ if((item !== this.item && curItems.indexOf(item) !== -1) ||
+ (checked === true && item === this.item)) {
+ newItems.push(item);
+ }
+ }, this);
+
+ var visible = (newItems.length > 0);
+ // if there is something to display, we want to update the params
+ // before the layer is turned on
+ visible && layer.mergeNewParams(this.createParams(newItems));
+ if(visible !== layer.getVisibility()) {
+ layer.setVisibility(visible);
+ }
+ // if there is nothing to display, we want to update the params
+ // when the layer is turned off, so we don't fire illegal requests
+ // (i.e. param value being empty)
+ (!visible) && layer.mergeNewParams(this.createParams([]));
+ },
+
+ /** private: method[destroy]
+ */
+ destroy: function() {
+ var layer = this.layer;
+ if (layer instanceof OpenLayers.Layer) {
+ layer.events.un({
+ "visibilitychanged": this.onLayerVisibilityChanged,
+ scope: this
+ });
+ }
+ delete this.layer;
+
+ this.un("checkchange", this.onCheckChange, this);
+
+ GeoExt.tree.LayerNode.superclass.destroy.apply(this, arguments);
+ }
+});
+
+/**
+ * NodeType: gx_layerparam
+ */
+Ext.tree.TreePanel.nodeTypes.gx_layerparam = GeoExt.tree.LayerParamNode;
Property changes on: core/trunk/geoext/lib/GeoExt/widgets/tree/LayerParamNode.js
___________________________________________________________________
Name: svn:keywords
+ Id Author Date Revision
Name: svn:eol-style
+ native
Modified: core/trunk/geoext/lib/GeoExt.js
===================================================================
--- core/trunk/geoext/lib/GeoExt.js 2009-10-08 05:26:12 UTC (rev 1390)
+++ core/trunk/geoext/lib/GeoExt.js 2009-10-08 13:56:45 UTC (rev 1391)
@@ -95,6 +95,8 @@
"GeoExt/widgets/tree/LayerContainer.js",
"GeoExt/widgets/tree/BaseLayerContainer.js",
"GeoExt/widgets/tree/OverlayLayerContainer.js",
+ "GeoExt/widgets/tree/LayerParamNode.js",
+ "GeoExt/widgets/tree/LayerParamLoader.js",
"GeoExt/widgets/LayerOpacitySlider.js",
"GeoExt/widgets/LegendImage.js",
"GeoExt/widgets/LegendWMS.js",
Modified: core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerNode.html
===================================================================
--- core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerNode.html 2009-10-08 05:26:12 UTC (rev 1390)
+++ core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerNode.html 2009-10-08 13:56:45 UTC (rev 1391)
@@ -9,16 +9,20 @@
function test_constructor(t) {
- t.plan(1);
+ t.plan(2);
var store = new GeoExt.data.LayerStore();
var node = new GeoExt.tree.LayerNode({
layer: "foo",
- layerStore: store
+ layerStore: store,
+ loader: {
+ param: "foo"
+ }
});
t.ok(node.layerStore === store, "layerStore set");
+ t.ok(node.attributes.loader instanceof GeoExt.tree.LayerParamLoader, "LayerParamLoader created from object.");
node.destroy();
@@ -26,7 +30,7 @@
function test_render(t) {
- t.plan(9);
+ t.plan(8);
var layer = new OpenLayers.Layer("foo");
@@ -38,12 +42,7 @@
var node = new GeoExt.tree.LayerNode({
layer: "foo",
radioGroup: "group",
- checkedGroup: "check",
- childNodeType: {
- add: function() {
- t.ok(true, "add function of childNodeType called");
- }
- }
+ checkedGroup: "check"
});
node.on("radiochange", function() {
Added: core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerParamLoader.html
===================================================================
--- core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerParamLoader.html (rev 0)
+++ core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerParamLoader.html 2009-10-08 13:56:45 UTC (rev 1391)
@@ -0,0 +1,75 @@
+<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 setupTree() {
+ var layer = new OpenLayers.Layer.WMS("Group", "http://localhost/wms", {
+ "LAYERS": ["layer1", "layer2"]
+ });
+
+ return new Ext.tree.TreePanel({
+ renderTo: "tree",
+ loader: {
+ applyLoader: false
+ },
+ root: {
+ text: "Layers",
+ expanded: true,
+ children: [{
+ nodeType: "gx_layer",
+ expanded: true,
+ layer: layer,
+ loader: {
+ param: "LAYERS"
+ }
+ }]
+ }
+ });
+ }
+
+ function test_constructor(t) {
+ t.plan(4);
+
+ var loader = new GeoExt.tree.LayerParamLoader({
+ param: "bar"
+ });
+
+ t.ok(loader instanceof GeoExt.tree.LayerParamLoader, "instance created.");
+ t.eq(loader.param, "bar", "param set.");
+ t.eq(loader.delimiter, ",", "default delimiter set.");
+
+ loader = new GeoExt.tree.LayerParamLoader({
+ param: "bar",
+ delimiter: ";"
+ });
+
+ t.eq(loader.delimiter, ";", "custom delimiter set.");
+ }
+
+ function test_load(t) {
+ t.plan(4);
+
+ var panel = setupTree();
+ var nodes = panel.getRootNode().childNodes[0].childNodes;
+ var layer = nodes[0].layer;
+
+ t.eq(nodes.length, 2, "2 child nodes created.");
+ t.eq(nodes[0].param, "LAYERS", "param for 1st node set.");
+ t.eq(nodes[0].item, "layer2", "item for 1st node set.");
+ t.eq(nodes[1].item, "layer1", "item for 2nd node set.");
+
+ panel.destroy();
+ layer.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/LayerParamLoader.html
___________________________________________________________________
Name: svn:keywords
+ Id Author Date Revision
Name: svn:eol-style
+ native
Added: core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerParamNode.html
===================================================================
--- core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerParamNode.html (rev 0)
+++ core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerParamNode.html 2009-10-08 13:56:45 UTC (rev 1391)
@@ -0,0 +1,171 @@
+<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 setupTree() {
+ var layer = new OpenLayers.Layer.WMS("Group", "http://localhost/wms", {
+ "LAYERS": ["layer1", "layer2"],
+ "CQL_FILTER": "city='Vienna' OR city='Graz'"
+ }, {
+ visibility: false
+ });
+
+ var store = new GeoExt.data.LayerStore({
+ layers: [layer]
+ });
+
+ return new Ext.tree.TreePanel({
+ renderTo: "tree",
+ loader: new Ext.tree.TreeLoader({
+ baseAttrs: {
+ layerStore: store
+ }
+ }),
+ root: {
+ text: "Layers",
+ expanded: true,
+ children: [{
+ nodeType: "gx_layerparam",
+ layer: layer,
+ param: "LAYERS",
+ item: "layer1"
+ }, {
+ nodeType: "gx_layerparam",
+ layer: layer,
+ param: "LAYERS",
+ item: "layer2",
+ delimiter: ";"
+ }, {
+ nodeType: "gx_layerparam",
+ // provide this layer as string to see if the layer can
+ // be configured from the store provided in baseParams
+ layer: "Group",
+ param: "CQL_FILTER",
+ item: "city='Vienna'",
+ delimiter: " OR "
+ }]
+ }
+ });
+ }
+
+ function test_constructor(t) {
+ t.plan(4);
+
+ var layer = {
+ params: {bar: ["before", "foobar", "after"]},
+ getVisibility: function(){}
+ };
+
+ var node = new GeoExt.tree.LayerParamNode({
+ layer: layer,
+ param: "bar",
+ item: "foobar"
+ });
+
+ t.eq(node.param, "bar", "param set.");
+ t.eq(node.item, "foobar", "item set.");
+ t.eq(node.delimiter, ",", "default delimiter set.");
+
+ node.destroy();
+
+ node = new GeoExt.tree.LayerParamNode({
+ layer: layer,
+ param: "bar",
+ item: "foobar",
+ delimiter: ";"
+ });
+
+ t.eq(node.delimiter, ";", "custom delimiter set.");
+
+ node.destroy();
+ }
+
+ function test_render(t) {
+ t.plan(3);
+
+ var panel = setupTree();
+ var nodes = panel.getRootNode().childNodes;
+ var layer = nodes[0].layer;
+
+ t.ok(nodes[2].layer instanceof OpenLayers.Layer, "layer set from store.");
+ t.eq(nodes[0].allItems, ["layer1", "layer2"], "allItems with set from array");
+ t.eq(nodes[2].allItems, ["city='Vienna'", "city='Graz'"], "allItems with custom delimiter set");
+
+ panel.destroy();
+ nodes[2].attributes.layerStore.destroy();
+ layer.destroy();
+ }
+
+ function test_onLayerVisibilityChanged(t) {
+ t.plan(6);
+
+ var panel = setupTree();
+ var nodes = panel.getRootNode().childNodes;
+ var layer = nodes[0].layer;
+
+ t.eq(nodes[0].attributes.checked, false, "node for layer1 is unchecked.");
+ t.eq(nodes[1].attributes.checked, false, "node for layer2 is unchecked.");
+
+ layer.setVisibility(true);
+ t.eq(nodes[0].attributes.checked, true, "node for layer1 is checked.");
+ t.eq(nodes[1].attributes.checked, true, "node for layer2 is checked.");
+
+ layer.setVisibility(false);
+ t.eq(nodes[0].attributes.checked, false, "node for layer1 is unchecked again.");
+ t.eq(nodes[1].attributes.checked, false, "node for layer2 is unchecked again.");
+
+ panel.destroy();
+ nodes[2].attributes.layerStore.destroy();
+ layer.destroy();
+ }
+
+ function test_onCheckChange(t) {
+ t.plan(9);
+
+ var panel = setupTree();
+ var nodes = panel.getRootNode().childNodes;
+ var layer = nodes[0].layer;
+
+ layer.setVisibility(false);
+
+ // now all nodes are unchecked, but the layer has all params set
+
+ t.eq(nodes[1].attributes.checked, false, "node unchecked because layer is invisible.");
+
+ nodes[1].getUI().toggleCheck(true);
+
+ // now the layer has just the param item of nodes[0] set, and is visible
+
+ t.eq(layer.getVisibility(), true, "layer is visible after checking a subnode.");
+ t.eq(layer.params.LAYERS, ["layer2"], "correct sublayer is set after checking it.");
+
+ nodes[1].getUI().toggleCheck(false);
+ t.eq(layer.params.LAYERS, [], "layer2 invisible again after unchecking.");
+ t.eq(layer.getVisibility(), false, "layer hidden if no sublayers are visible");
+
+ nodes[0].getUI().toggleCheck(true);
+ t.eq(layer.params.LAYERS, ["layer1"], "only checked sublayer is visible.");
+ t.eq(layer.getVisibility(), true, "layer set to visible with checked sublayer.");
+
+ // now check if split and join with custom delimiter works
+ nodes[2].getUI().toggleCheck(false);
+ t.eq(layer.params.CQL_FILTER, "city='Graz'", "param with custom delimiter removed.");
+ nodes[2].getUI().toggleCheck(true);
+ t.eq(layer.params.CQL_FILTER, "city='Vienna' OR city='Graz'", "param with custom delimiter re-added.");
+
+ panel.destroy();
+ nodes[2].attributes.layerStore.destroy();
+ layer.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/LayerParamNode.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-10-08 05:26:12 UTC (rev 1390)
+++ core/trunk/geoext/tests/list-tests.html 2009-10-08 13:56:45 UTC (rev 1391)
@@ -24,6 +24,8 @@
<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/tree/LayerParamLoader.html</li>
+ <li>lib/GeoExt/widgets/tree/LayerParamNode.html</li>
<li>lib/GeoExt/widgets/LegendImage.html</li>
<li>lib/GeoExt/widgets/LegendPanel.html</li>
<li>lib/GeoExt/widgets/LegendWMS.html</li>
More information about the Commits
mailing list