[Commits] r378 - in core/trunk/geoext: build/apidoc_config examples examples/data lib lib/GeoExt/data tests tests/lib/GeoExt/data
commits at geoext.org
commits at geoext.org
Tue Apr 14 17:00:11 CEST 2009
Author: elemoine
Date: 2009-04-14 17:00:11 +0200 (Tue, 14 Apr 2009)
New Revision: 378
Added:
core/trunk/geoext/examples/data/
core/trunk/geoext/examples/data/summits.json
core/trunk/geoext/examples/feature-grid.html
core/trunk/geoext/examples/feature-grid.js
core/trunk/geoext/lib/GeoExt/data/FeatureStore.js
core/trunk/geoext/tests/lib/GeoExt/data/FeatureStore.html
Removed:
core/trunk/geoext/lib/GeoExt/data/FeatureStoreMediator.js
core/trunk/geoext/lib/GeoExt/data/LayerStoreMediator.js
core/trunk/geoext/tests/lib/GeoExt/data/FeatureStoreMediator.html
core/trunk/geoext/tests/lib/GeoExt/data/LayerStoreMediator.html
Modified:
core/trunk/geoext/build/apidoc_config/Menu.txt
core/trunk/geoext/lib/GeoExt.js
core/trunk/geoext/tests/list-tests.html
Log:
add FeatureStore, a helper class for creating stores pre-configured with a FeatureReader, p=sbenthall,bbinet,me, r=me (closes #18)
Modified: core/trunk/geoext/build/apidoc_config/Menu.txt
===================================================================
--- core/trunk/geoext/build/apidoc_config/Menu.txt 2009-04-13 23:56:33 UTC (rev 377)
+++ core/trunk/geoext/build/apidoc_config/Menu.txt 2009-04-14 15:00:11 UTC (rev 378)
@@ -50,10 +50,9 @@
File: FeatureReader (GeoExt/data/FeatureReader.js)
File: FeatureRecord (GeoExt/data/FeatureRecord.js)
- File: FeatureStoreMediator (GeoExt/data/FeatureStoreMediator.js)
+ File: FeatureStoreMixin (GeoExt/data/FeatureStore.js)
File: LayerReader (GeoExt/data/LayerReader.js)
File: LayerRecord (GeoExt/data/LayerRecord.js)
- File: LayerStoreMediator (GeoExt/data/LayerStoreMediator.js)
File: LayerStoreMixin (GeoExt/data/LayerStore.js)
File: ProtocolProxy (GeoExt/data/ProtocolProxy.js)
} # Group: Data
Added: core/trunk/geoext/examples/data/summits.json
===================================================================
--- core/trunk/geoext/examples/data/summits.json (rev 0)
+++ core/trunk/geoext/examples/data/summits.json 2009-04-14 15:00:11 UTC (rev 378)
@@ -0,0 +1 @@
+{"type": "FeatureCollection", "features": [{"geometry": {"type": "Point", "coordinates": [6.18218, 45.5949]}, "type": "Feature", "properties": {"elevation": 1770, "name": "Col d'Arclusaz"}, "id": 472}, {"geometry": {"type": "Point", "coordinates": [6.27827, 45.6769]}, "type": "Feature", "properties": {"elevation": 1831, "name": "Pointe de C\u00f4te Favre"}, "id": 458}, {"geometry": {"type": "Point", "coordinates": [6.47122, 46.0062]}, "type": "Feature", "properties": {"elevation": 2364, "name": "Pointe du Midi"}, "id": 487}, {"geometry": {"type": "Point", "coordinates": [6.82156068193, 46.3129835428]}, "type": "Feature", "properties": {"elevation": 1856, "name": "Col d'Outanne"}, "id": 5700}, {"geometry": {"type": "Point", "coordinates": [6.84989241629, 46.136626095]}, "type": "Feature", "properties": {"elevation": 2375, "name": "Col de Comba Mornay"}, "id": 5644}, {"geometry": {"type": "Point", "coordinates": [6.62, 46.187778]}, "type": "Feature", "properties": {"elevation": 2000, "name": "La Pointe"}, "id": 5710}, {"geometry": {"type": "Point", "coordinates": [5.9134, 44.93331]}, "type": "Feature", "properties": {"elevation": 2607, "name": "Le Coiro"}, "id": 496}, {"geometry": {"type": "Point", "coordinates": [6.03219, 45.7204]}, "type": "Feature", "properties": {"elevation": 1451, "name": "D\u00f4me de la Cochette"}, "id": 322}, {"geometry": {"type": "Point", "coordinates": [6.23048, 45.6324]}, "type": "Feature", "properties": {"elevation": 2197, "name": "Mont P\u00e9cloz"}, "id": 515}, {"geometry": {"type": "Point", "coordinates": [6.1962, 45.6927]}, "type": "Feature", "properties": {"elevation": 2181, "name": "Tr\u00e9lod"}, "id": 601}]}
\ No newline at end of file
Added: core/trunk/geoext/examples/feature-grid.html
===================================================================
--- core/trunk/geoext/examples/feature-grid.html (rev 0)
+++ core/trunk/geoext/examples/feature-grid.html 2009-04-14 15:00:11 UTC (rev 378)
@@ -0,0 +1,23 @@
+<html>
+ <head>
+ <link rel="stylesheet" type="text/css" href="../../ext/resources/css/ext-all.css"></link>
+ <link rel="stylesheet" type="text/css" href="../../ext/examples/shared/examples.css"></link>
+ <script type="text/javascript" src="../../openlayers/lib/OpenLayers.js"></script>
+ <script type="text/javascript" src="../../ext/adapter/ext/ext-base.js"></script>
+ <script type="text/javascript" src="../../ext/ext-all.js"></script>
+ <script type="text/javascript" src="../lib/GeoExt.js"></script>
+ <script type="text/javascript" src="feature-grid.js"></script>
+ </head>
+ <body>
+ <h1>Grid Panel configured with a GeoExt.data.FeatureStore</h1>
+
+ <p>This example shows an Ext grid loaded with features read from a
+ GeoJSON document (data/summits.json). Because the layer and the store
+ are bound to each other, the features loaded into the store are
+ automatically added to the layer. See <a
+ href=feature-grid.js>feature-grid.js</a>. </p>
+
+ <div id="grid" style="width:350px; height:270px; margin-top:10px;"></div>
+ <div id="map" style="width:600px; height:400px; border:solid;"></div>
+ </body>
+</html>
Added: core/trunk/geoext/examples/feature-grid.js
===================================================================
--- core/trunk/geoext/examples/feature-grid.js (rev 0)
+++ core/trunk/geoext/examples/feature-grid.js 2009-04-14 15:00:11 UTC (rev 378)
@@ -0,0 +1,51 @@
+Ext.BLANK_IMAGE_URL = "../../../../ext/resources/images/default/s.gif"
+
+var map, store, grid;
+
+Ext.onReady(function() {
+ map = new OpenLayers.Map("map");
+ var wmsLayer = new OpenLayers.Layer.WMS(
+ "vmap0",
+ "http://labs.metacarta.com/wms/vmap0",
+ {layers: 'basic'}
+ );
+ var vecLayer = new OpenLayers.Layer.Vector("vector");
+ map.addLayers([wmsLayer, vecLayer]);
+ map.zoomToExtent(
+ OpenLayers.Bounds.fromString(
+ "3.131104,43.445435,9.7229,47.839966"
+ )
+ );
+
+ store = new GeoExt.data.FeatureStore({
+ fields: [
+ {name: 'name', type: 'string'},
+ {name: 'elevation', type: 'float'}
+ ],
+ proxy: new GeoExt.data.ProtocolProxy({
+ protocol: new OpenLayers.Protocol.HTTP({
+ url: "data/summits.json",
+ format: new OpenLayers.Format.GeoJSON()
+ })
+ }),
+ layer: vecLayer,
+ autoLoad: true
+ });
+
+ grid = new Ext.grid.GridPanel({
+ store: store,
+ height: 260,
+ width: 320,
+ columns: [{
+ header: "Name",
+ width: 200,
+ dataIndex: "name"
+ }, {
+ header: "Elevation",
+ width: 100,
+ dataIndex: "elevation"
+ }],
+ renderTo: "grid"
+ });
+});
+
Added: core/trunk/geoext/lib/GeoExt/data/FeatureStore.js
===================================================================
--- core/trunk/geoext/lib/GeoExt/data/FeatureStore.js (rev 0)
+++ core/trunk/geoext/lib/GeoExt/data/FeatureStore.js 2009-04-14 15:00:11 UTC (rev 378)
@@ -0,0 +1,452 @@
+/* Copyright (C) 2008-2009 The Open Source Geospatial Foundation ¹
+ * Published under the BSD license.
+ * See http://geoext.org/svn/geoext/core/trunk/license.txt for the full text
+ * of the license.
+ *
+ * ¹ pending approval */
+
+/**
+ * @include GeoExt/data/FeatureReader.js
+ */
+
+Ext.namespace("GeoExt.data");
+
+/**
+ * Class: GeoExt.data.FeatureStoreMixin
+ * A store that synchronizes a features array of an {OpenLayers.Layer.Vector} with a
+ * feature store holding {<GeoExt.data.FeatureRecord>} entries.
+ *
+ * This class can not be instantiated directly. Instead, it is meant to extend
+ * {Ext.data.Store} or a subclass of it:
+ * (start code)
+ * var store = new (Ext.extend(Ext.data.Store, GeoExt.data.FeatureStoreMixin))({
+ * layer: myLayer,
+ * features: myFeatures
+ * });
+ * (end)
+ *
+ * For convenience, a {<GeoExt.data.FeatureStore>} class is available as a
+ * shortcut to the Ext.extend sequence in the above code snippet. The above
+ * is equivalent to:
+ * (start code)
+ * var store = new GeoExt.data.FeatureStore({
+ * layer: myLayer,
+ * features: myFeatures
+ * });
+ * (end)
+ */
+GeoExt.data.FeatureStoreMixin = {
+ /**
+ * APIProperty: layer
+ * {OpenLayers.Layer.Vector} Layer that this store will be in sync with.
+ */
+ layer: null,
+
+ /**
+ * Property: reader
+ * {<GeoExt.data.FeatureReader>} The reader used to get
+ * <GeoExt.data.FeatureRecord> objects from {OpenLayers.Feature.Vector}
+ * objects.
+ */
+ reader: null,
+
+ /**
+ * APIProperty: addFeatureFilter
+ * {Function} This function is called before a feature record is added to
+ * the store, it receives the feature from which a feature record is
+ * to be created, if it returns false then no record is added.
+ */
+ addFeatureFilter: null,
+
+ /**
+ * APIProperty: addRecordFilter
+ * {Function} This function is called before a feature is added to the
+ * layer, it receives the feature record associated with the feature
+ * to be added, if it returns false then no feature is added.
+ */
+ addRecordFilter: null,
+
+ /**
+ * Constructor: GeoExt.data.FeatureStoreMixin
+ *
+ * Parameters:
+ * config - {Object}
+ *
+ * Valid config options:
+ * layer - {OpenLayers.Layer.Vector} layer to sync the feature store with.
+ * features - {Array(OpenLayers.Feature.Vector)} Features that will be added to the
+ * feature store (and the layer, because we are already syncing).
+ * recordType - {<GeoExt.data.FeatureRecord>} If provided, a custom feature
+ * record type with additional fields will be used. Default fields for
+ * every feature record are {OpenLayers.Feature.Vector} feature and {String} title.
+ * initDir - {Number} Bitfields specifying the direction to use for the
+ * initial sync between the layer and the store, if set to 0 then no
+ * initial sync is done. Defaults to
+ * <GeoExt.data.FeatureStore.LAYER_TO_STORE>|<GeoExt.data.FeatureStore.STORE_TO_LAYER>.
+ */
+ constructor: function(config) {
+ config = config || {};
+ config.reader = config.reader ||
+ new GeoExt.data.FeatureReader({}, config.fields);
+ var layer = config.layer;
+ delete config.layer;
+ // 'features' option - is an alias 'data' option
+ if (config.features) {
+ config.data = config.features;
+ }
+ delete config.features;
+ // "initDir" option
+ var options = {initDir: config.initDir};
+ delete config.initDir;
+ arguments.callee.superclass.constructor.call(this, config);
+ if(layer) {
+ this.bind(layer, options);
+ }
+ },
+
+ /**
+ * APIMethod: bind
+ * Bind this store to a layer instance, once bound the store
+ * is synchronized with the layer and vice-versa.
+ *
+ * Parameters:
+ * layer - {OpenLayers.Layer.Vector} The layer instance.
+ * options - {Object}
+ *
+ * Valid config options:
+ * initDir - {Number} Bitfields specifying the direction to use for the
+ * initial sync between the layer and the store, if set to 0 then no
+ * initial sync is done. Defaults to
+ * <GeoExt.data.FeatureStore.LAYER_TO_STORE>|<GeoExt.data.FeatureStore.STORE_TO_LAYER>.
+ */
+ bind: function(layer, options) {
+ if(this.layer) {
+ // already bound
+ return;
+ }
+ this.layer = layer;
+ options = options || {};
+
+ var initDir = options.initDir;
+ if(options.initDir == undefined) {
+ initDir = GeoExt.data.FeatureStore.LAYER_TO_STORE |
+ GeoExt.data.FeatureStore.STORE_TO_LAYER;
+ }
+
+ // create a snapshot of the layer's features
+ var features = layer.features.slice(0);
+
+ if(initDir & GeoExt.data.FeatureStore.STORE_TO_LAYER) {
+ var records = this.getRange();
+ for(var i=records.length - 1; i>=0; i--) {
+ this.layer.addFeatures([records[i].get("feature")]);
+ }
+ }
+
+ if(initDir & GeoExt.data.FeatureStore.LAYER_TO_STORE) {
+ this.loadData(features, true /* append */);
+ }
+
+ layer.events.on({
+ "featuresadded": this.onFeaturesAdded,
+ "featuresremoved": this.onFeaturesRemoved,
+ "featuremodified": this.onFeatureModified,
+ scope: this
+ });
+ this.on({
+ "load": this.onLoad,
+ "clear": this.onClear,
+ "add": this.onAdd,
+ "remove": this.onRemove,
+ "update": this.onUpdate,
+ scope: this
+ });
+ },
+
+ /**
+ * APIMethod: unbind
+ * Unbind this store from the layer it is currently bound.
+ */
+ unbind: function() {
+ if(this.layer) {
+ this.layer.events.un({
+ "featuresadded": this.onFeaturesAdded,
+ "featuresremoved": this.onFeaturesRemoved,
+ "featuremodified": this.onFeatureModified,
+ scope: this
+ });
+ this.un("load", this.onLoad, this);
+ this.un("clear", this.onClear, this);
+ this.un("add", this.onAdd, this);
+ this.un("remove", this.onRemove, this);
+ this.un("update", this.onUpdate, this);
+
+ this.layer = null;
+ }
+ },
+
+
+ /**
+ * Method: onFeaturesAdded
+ * Handler for layer featuresadded event
+ *
+ * Parameters:
+ * evt - {Object}
+ */
+ onFeaturesAdded: function(evt) {
+ if(!this._adding) {
+ var features = evt.features, toAdd = features;
+ if(typeof this.addFeatureFilter == "function") {
+ toAdd = [];
+ var i, len, feature;
+ for(var i=0, len=features.length; i<len; i++) {
+ feature = features[i];
+ if(this.addFeatureFilter(feature) !== false) {
+ toAdd.push(feature);
+ }
+ }
+ }
+ // add feature records to the store, when called with
+ // append true loadData triggers an "add" event and
+ // then a "load" event
+ this._adding = true;
+ this.loadData(toAdd, true /* append */);
+ delete this._adding;
+ }
+ },
+
+ /**
+ * Method: onFeaturesRemoved
+ * Handler for layer featuresremoved event
+ *
+ * Parameters:
+ * evt - {Object}
+ */
+ onFeaturesRemoved: function(evt){
+ if(!this._removing) {
+ var features = evt.features, feature, record, i;
+ for(i=features.length - 1; i>=0; i--) {
+ feature = features[i];
+ record = this.getById(feature.id);
+ if(record !== undefined) {
+ this._removing = true;
+ this.remove(record);
+ delete this._removing;
+ }
+ }
+ }
+ },
+
+ /**
+ * Method: onFeatureModified
+ * Handler for layer featuremodified event
+ *
+ * Parameters:
+ * evt - {Object}
+ */
+ onFeatureModified: function(evt) {
+ if(!this._updating) {
+ var feature = evt.feature;
+ var record = this.getById(feature.id);
+ if(record !== undefined) {
+ record.beginEdit();
+ attributes = feature.attributes;
+ if(attributes) {
+ var fields = this.recordType.prototype.fields;
+ for(var i=0, len=fields.length; i<len; i++) {
+ var field = fields.items[i];
+ var v = attributes[field.mapping || field.name] ||
+ field.defaultValue;
+ v = field.convert(v);
+ record.set(field.name, v);
+ }
+ }
+ // the calls to set below won't trigger "update"
+ // events because we called beginEdit to start a
+ // "transaction", "update" will be triggered by
+ // endEdit
+ record.set("state", feature.state);
+ record.set("fid", feature.fid);
+ record.set("feature", feature);
+ this._updating = true;
+ record.endEdit();
+ delete this._updating;
+ }
+ }
+ },
+
+ /**
+ * Method: addFeaturesToLayer
+ * Given an array of records add features to the layer. This
+ * function is used by the onLoad and onAdd handlers.
+ *
+ * Parameters:
+ * records - {Array(Ext.data.Record)}
+ */
+ addFeaturesToLayer: function(records) {
+ var i, len, features, record;
+ if(typeof this.addRecordFilter == "function") {
+ features = []
+ for(i=0, len=records.length; i<len; i++) {
+ record = records[i];
+ if(this.addRecordFilter(record) !== false) {
+ features.push(record.get("feature"));
+ }
+ }
+ } else {
+ features = new Array(len);
+ for(i=0, len=records.length; i<len; i++) {
+ features[i] = records[i].get("feature");
+ }
+ }
+ if(features.length > 0) {
+ this._adding = true;
+ this.layer.addFeatures(features);
+ delete this._adding;
+ }
+ },
+
+ /**
+ * Method: onLoad
+ * Handler for store load event
+ *
+ * Parameters:
+ * store - {Ext.data.Store}
+ * records - {Array(Ext.data.Record)}
+ * options - {Object}
+ */
+ onLoad: function(store, records, options) {
+ // if options.add is true an "add" event was already
+ // triggered, and onAdd already did the work of
+ // adding the features to the layer.
+ if(!options || options.add !== true) {
+ this._removing = true;
+ this.layer.removeFeatures(this.layer.features);
+ delete this._removing;
+
+ this.addFeaturesToLayer(records);
+ }
+ },
+
+ /**
+ * Method: onClear
+ * Handler for store clear event
+ *
+ * Parameters:
+ * store - {Ext.data.Store}
+ */
+ onClear: function(store) {
+ this._removing = true;
+ this.layer.removeFeatures(this.layer.features);
+ delete this._removing;
+ },
+
+ /**
+ * Method: onAdd
+ * Handler for store add event
+ *
+ * Parameters:
+ * store - {Ext.data.Store}
+ * records - {Array(Ext.data.Record)}
+ * index - {Number}
+ */
+ onAdd: function(store, records, index) {
+ if(!this._adding) {
+ // addFeaturesToLayer takes care of setting
+ // this._adding to true and deleting it
+ this.addFeaturesToLayer(records);
+ }
+ },
+
+ /**
+ * Method: onRemove
+ * Handler for store remove event
+ *
+ * Parameters:
+ * store - {Ext.data.Store}
+ * records - {Array(Ext.data.Record)}
+ * index - {Number}
+ */
+ onRemove: function(store, record, index){
+ if(!this._removing) {
+ var feature = record.get("feature");
+ if (this.layer.getFeatureById(feature.id) != null) {
+ this._removing = true;
+ this.layer.removeFeatures([record.get("feature")]);
+ delete this._removing;
+ }
+ }
+ },
+
+ /**
+ * Method: onUpdate
+ * Handler for store update event
+ *
+ * Parameters:
+ * store - {Ext.data.Store}
+ * record - (Ext.data.Record)}
+ * operation - {String}
+ */
+ onUpdate: function(store, record, operation) {
+ if(!this._updating) {
+ var feature = record.get("feature");
+ if(record.fields) {
+ var cont = this.layer.events.triggerEvent(
+ "beforefeaturemodified", {feature: feature}
+ );
+ if(cont !== false) {
+ record.fields.each(
+ function(field) {
+ feature.attributes[field.mapping || field.name] =
+ record.get(field.name);
+ }
+ );
+ this._updating = true;
+ this.layer.events.triggerEvent(
+ "featuremodified", {feature: feature}
+ );
+ delete this._updating;
+ if (this.layer.getFeatureById(feature.id) != null) {
+ this.layer.drawFeature(feature);
+ }
+ }
+ }
+ }
+ }
+};
+
+/**
+ * Class: GeoExt.data.FeatureStore
+ * Default implementation of an {Ext.data.Store} extended with
+ * {<GeoExt.data.FeatureStoreMixin>}
+ *
+ * Inherits from:
+ * - {Ext.data.Store}
+ * - {<GeoExt.data.FeatureStoreMixin>}
+ */
+/**
+ * Constructor: GeoExt.data.FeatureStore
+ *
+ * Parameters:
+ * config - {Object} See {<GeoExt.data.FeatureStoreMixin>} and
+ * http://extjs.com/deploy/dev/docs/?class=Ext.data.Store for valid config
+ * options.
+ */
+GeoExt.data.FeatureStore = Ext.extend(
+ Ext.data.Store,
+ GeoExt.data.FeatureStoreMixin
+);
+
+/**
+ * Constant: GeoExt.data.FeatureStore.LAYER_TO_STORE
+ * {Integer} Constant used to make the store be automatically updated
+ * when changes occur in the layer.
+ */
+GeoExt.data.FeatureStore.LAYER_TO_STORE = 1;
+
+/**
+ * Constant: GeoExt.data.FeatureStore.STORE_TO_LAYER
+ * {Integer} Constant used to make the layer be automatically updated
+ * when changes occur in the store.
+ */
+GeoExt.data.FeatureStore.STORE_TO_LAYER = 2;
Deleted: core/trunk/geoext/lib/GeoExt/data/FeatureStoreMediator.js
===================================================================
--- core/trunk/geoext/lib/GeoExt/data/FeatureStoreMediator.js 2009-04-13 23:56:33 UTC (rev 377)
+++ core/trunk/geoext/lib/GeoExt/data/FeatureStoreMediator.js 2009-04-14 15:00:11 UTC (rev 378)
@@ -1,161 +0,0 @@
-/*
- * Copyright (C) 2008 Eric Lemoine, Camptocamp France SAS
- *
- * This file is part of GeoExt
- *
- * GeoExt is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * GeoExt is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with GeoExt. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/**
- * @requires GeoExt/data/FeatureReader.js
- */
-
-Ext.namespace('GeoExt', 'GeoExt.data');
-
-/**
- * Class: GeoExt.data.FeatureStoreMediator
- * This class is to be used when one wants to insert features in a store.
- *
- * Usage example:
- * (start code)
- * var store = new Ext.data.Store({
- * reader: new GeoExt.data.FeatureReader(
- * {}, [{name: "name", type: "string"}]
- * )
- * });
- * var mediator = new GeoExt.data.FeatureStoreMediator({
- * store: store,
- * append: false,
- * filter: function(feature) {
- * return feature.state != OpenLayers.State.UNKNOWN;
- * }
- * });
- * (end)
- */
-
-/**
- * Constructor: GeoExt.data.FeatureStoreMediator
- * Create an instance of GeoExt.data.FeatureStoreMediator
- *
- * Parameters:
- * config - {Object} A config object used to set the feature
- * store mediator's properties, see below for the list
- * of supported properties.
- *
- * Returns:
- * {<GeoExt.data.FeatureStoreMediator>}
- */
-GeoExt.data.FeatureStoreMediator = function(config){
- Ext.apply(this, config);
- if (!this.store) {
- OpenLayers.Console.error(
- "store is missing in the config");
- }
- if (!(this.store.reader instanceof GeoExt.data.FeatureReader)) {
- OpenLayers.Console.error(
- "store does not use a FeatureReader");
- }
-};
-
-GeoExt.data.FeatureStoreMediator.prototype = {
- /**
- * APIProperty: store
- * {Ext.data.Store} An Ext data store
- */
- store: null,
-
- /**
- * APIProperty: append
- * {Boolean} False if the store must be cleared before adding new
- * features into it, false otherwise; defaults to true.
- */
- append: true,
-
- /**
- * APIProperty: filter
- * {Function} a filter function called for each feature to be
- * inserted, the feature is passed as an argument to the function,
- * if it returns true the feature is inserted into the store,
- * otherwise the feature is not inserted.
- */
- filter: null,
-
- /**
- * APIMethod: addFeatures
- * Add features to the store.
- *
- * Parameters:
- * features - {<OpenLayers.Feature.Vector>} or
- * {Array{<OpenLayers.Feature.Vector>}} A feature or an
- * array of features to add to the store.
- * config - a config object which can include the properties
- * "append" and "filter", if set these properties will
- * override that set in the object.
- */
- addFeatures: function(features, config) {
- if (!Ext.isArray(features)) {
- features = [features];
- }
- config = OpenLayers.Util.applyDefaults(config,
- {append: this.append, filter: this.filter});
- var toAdd = features;
- if (config.filter) {
- toAdd = [];
- var feature;
- for (var i = 0, len = features.length; i < len; i++) {
- feature = features[i];
- if (config.filter(feature)) {
- toAdd.push(feature);
- }
- }
- }
- // because of a bug in Ext if config.append is false we clean
- // the store ourself and always pass true to loadData, there
- // are cases where passing false to loadData results in Ext
- // trying to dereference an undefined value, see the unit
- // tests test_ExtBug and text_addFeatures_ExtBug for
- // concrete examples
- if (!config.append) {
- this.store.removeAll();
- }
- this.store.loadData(toAdd, true);
- },
-
- /**
- * APIMethod: removeFeatures
- * Remove features from the store.
- *
- * Parameters:
- * features - {<OpenLayers.Feature.Vector>} or
- * {Array{<OpenLayers.Feature.Vector>}} A feature or an
- * array of features to remove from the store. If null
- * all the features in the store are removed.
- */
- removeFeatures: function(features) {
- if (!features) {
- this.store.removeAll();
- } else {
- if (!Ext.isArray(features)) {
- features = [features];
- }
- for (var i = 0, len = features.length; i < len; i++) {
- var feature = features[i];
- var r = this.store.getById(feature.id);
- if (r !== undefined) {
- this.store.remove(r);
- }
- }
- }
- }
-};
Deleted: core/trunk/geoext/lib/GeoExt/data/LayerStoreMediator.js
===================================================================
--- core/trunk/geoext/lib/GeoExt/data/LayerStoreMediator.js 2009-04-13 23:56:33 UTC (rev 377)
+++ core/trunk/geoext/lib/GeoExt/data/LayerStoreMediator.js 2009-04-14 15:00:11 UTC (rev 378)
@@ -1,175 +0,0 @@
-/*
- * Copyright (C) 2008 Eric Lemoine, Camptocamp France SAS
- *
- * This file is part of GeoExt
- *
- * GeoExt is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * GeoExt is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with GeoExt. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/**
- * @requires GeoExt/data/FeatureStoreMediator.js
- */
-
-Ext.namespace('GeoExt', 'GeoExt.data');
-
-/**
- * Class: GeoExt.data.LayerStoreMediator
- *
- * This class is to be used when one wants to insert, remove, and
- * update features in a grid as a result of features being inserted,
- * removed, modified in a vector layer.
- *
- * Usage example:
- * (start code)
- * var layer = new OpenLayers.Layer.Vector("vector");
- * var store = new Ext.data.Store({
- * reader: new GeoExt.data.FeatureReader(
- * {}, [{name: "name", type: "string"}]
- * )
- * });
- * var mediator = new GeoExt.data.LayerStoreMediator({
- * store: store,
- * filter: function(feature) {
- * return feature.state != OpenLayers.State.UNKNOWN;
- * }
- * });
- * (end)
- */
-
-/**
- * Constructor: GeoExt.data.LayerStoreMediator
- * Create an instance of GeoExt.data.LayerStoreMediator.
- *
- * Parameters:
- * config - {Object} A config object used to set the layer
- * store mediator's properties (see below for the list
- * of supported properties), and configure it with the
- * Ext store; see the usage example above.
- *
- * Returns:
- * {<GeoExt.data.LayerStoreMediator>}
- */
-GeoExt.data.LayerStoreMediator = function(config) {
- var store = config.store;
- // no need to place the store in the instance
- delete config.store;
- Ext.apply(this, config);
- if (!this.layer) {
- OpenLayers.Console.error(
- "layer is missing in config");
- }
- this.featureStoreMediator = new GeoExt.data.FeatureStoreMediator({
- store: store
- });
- if (this.autoActivate) {
- this.activate();
- }
-};
-
-GeoExt.data.LayerStoreMediator.prototype = {
- /**
- * APIProperty: layer
- * {<OpenLayers.Layer.Vector>} The vector layer.
- */
- layer: null,
-
- /**
- * APIProperty: filter
- * {Function} a filter function called for each feature to be
- * inserted, the feature is passed as an argument to the function,
- * if it returns true the feature is inserted into the store,
- * otherwise the feature is not inserted.
- */
- filter: null,
-
- /**
- * APIProperty: autoActivate
- * {Boolean} True if the mediator must be activated as part of
- * its creation, false otherwise; if false then the mediator must
- * be explicitely activate using the activate method; defaults
- * to true.
- */
- autoActivate: true,
-
- /**
- * Property: active
- * {Boolean}
- */
- active: false,
-
- /**
- * Property: featureStoreMediator
- * {<GeoExt.data.featureStoreMediator>} An internal
- * feature store mediator for manually adding features to the
- * Ext store.
- */
- featureStoreMediator: null,
-
- /**
- * APIMethod: activate
- * Activate the mediator.
- *
- * Returns:
- * {Boolean} - False if the mediator was already active, true
- * otherwise.
- */
- activate: function() {
- if (!this.active) {
- this.layer.events.on({
- featuresadded: this.update,
- featuresremoved: this.update,
- featuremodified: this.update,
- scope: this
- });
- this.active = true;
- return true;
- }
- return false;
- },
-
- /**
- * APIMethod: deactivate
- * Deactivate the mediator.
- *
- * Returns:
- * {Boolean} - False if the mediator was already deactive, true
- * otherwise.
- */
- deactivate: function() {
- if (this.active) {
- this.layer.events.un({
- featuresadded: this.update,
- featuresremoved: this.update,
- featuremodified: this.update,
- scope: this
- });
- return true;
- }
- return false;
- },
-
- /**
- * Method: update
- * Called when features are added, removed or modified. This
- * function empties the store, loops over the features in
- * the layer, and for each feature calls the user-defined
- * filter function, if the return value of the filter function
- * evaluates to true the feature is added to the store.
- */
- update: function() {
- this.featureStoreMediator.addFeatures(
- this.layer.features,
- {append: false, filter: this.filter});
- }
-};
Modified: core/trunk/geoext/lib/GeoExt.js
===================================================================
--- core/trunk/geoext/lib/GeoExt.js 2009-04-13 23:56:33 UTC (rev 377)
+++ core/trunk/geoext/lib/GeoExt.js 2009-04-14 15:00:11 UTC (rev 378)
@@ -60,11 +60,10 @@
var jsfiles = new Array(
"GeoExt/data/FeatureRecord.js",
"GeoExt/data/FeatureReader.js",
- "GeoExt/data/FeatureStoreMediator.js",
+ "GeoExt/data/FeatureStore.js",
"GeoExt/data/LayerRecord.js",
"GeoExt/data/LayerReader.js",
"GeoExt/data/LayerStore.js",
- "GeoExt/data/LayerStoreMediator.js",
"GeoExt/data/ProtocolProxy.js",
"GeoExt/widgets/MapPanel.js",
"GeoExt/widgets/Popup.js"
Added: core/trunk/geoext/tests/lib/GeoExt/data/FeatureStore.html
===================================================================
--- core/trunk/geoext/tests/lib/GeoExt/data/FeatureStore.html (rev 0)
+++ core/trunk/geoext/tests/lib/GeoExt/data/FeatureStore.html 2009-04-14 15:00:11 UTC (rev 378)
@@ -0,0 +1,249 @@
+<!DOCTYPE html>
+<html debug="true">
+ <head>
+ <script type="text/javascript" src="../../../../../openlayers/lib/OpenLayers.js"></script>
+ <script type="text/javascript" src="../../../../../ext/adapter/ext/ext-base.js"></script>
+ <script type="text/javascript" src="../../../../../ext/ext-all-debug.js"></script>
+ <script type="text/javascript" src="../../../../lib/GeoExt.js"></script>
+
+ <script type="text/javascript">
+ function test_constructor(t) {
+ t.plan(3);
+
+ var store, reader, layer;
+
+ store = new GeoExt.data.FeatureStore();
+ t.ok(store.reader instanceof GeoExt.data.FeatureReader,
+ "ctor creates a feature reader if none is provided");
+
+ reader = new Ext.data.ArrayReader();
+ store = new GeoExt.data.FeatureStore({reader: reader});
+ t.ok(store.reader == reader,
+ "ctor sets the passed reader in the instance");
+
+ layer = new OpenLayers.Layer.Vector("Foo Layer");
+ store = new GeoExt.data.FeatureStore({layer: layer});
+ t.ok(store.layer == layer,
+ "ctor sets the passed layer in the instance");
+ }
+
+ function test_load_clear(t) {
+ t.plan(5);
+
+ var layer = new OpenLayers.Layer.Vector("Foo layer");
+ var store = new GeoExt.data.FeatureStore({
+ layer: layer
+ });
+
+ // loadData
+ store.loadData([
+ new OpenLayers.Feature.Vector(),
+ new OpenLayers.Feature.Vector()
+ ]);
+ t.eq(layer.features.length, 2, "loading two records in the store with 'loadData' adds two features to the layer");
+ t.eq(store.getCount(), 2, 'loading two records in the store with "loadData" does not create duplicate records in store');
+
+ // loadData with addRecordFilter
+ store.addRecordFilter = function(record) { return false; };
+ store.loadData([
+ new OpenLayers.Feature.Vector(),
+ new OpenLayers.Feature.Vector()
+ ]);
+ t.eq(layer.features.length, 0,
+ "loading two records in the store with 'loadData' adds no feature to the layer if addRecordFilter returns false");
+
+ // removeAll
+ store.removeAll();
+ t.eq(store.getCount(), 0, '"removeAll" on store removes all records from the store');
+ t.eq(layer.features.length, 0, '"removeAll" on store removes features from layer');
+ }
+
+ function test_bind_unbind(t) {
+ t.plan(28);
+
+ var layer = new OpenLayers.Layer.Vector("Foo layer");
+ var store = new GeoExt.data.FeatureStore();
+ var features = [new OpenLayers.Feature.Vector("Foo feature"),
+ new OpenLayers.Feature.Vector("Bar feature")];
+ var records = [
+ new GeoExt.data.FeatureRecord({
+ feature: new OpenLayers.Feature.Vector("Foo record")}),
+ new GeoExt.data.FeatureRecord({
+ feature: new OpenLayers.Feature.Vector("Bar record")})
+ ];
+
+ var reinit_test_data = function () {
+ // unbind store
+ store.unbind();
+
+ // remove all existing records and features
+ store.removeAll();
+ layer.removeFeatures(layer.features);
+ t.eq(layer.features.length, 0, "there is no more features in the layer");
+ t.eq(store.getCount(), 0, "there is no more records in the store");
+
+ // add testing data to store and layer
+ store.add(records);
+ layer.addFeatures(features);
+ t.eq(layer.features.length, 2, "initial features are loaded in the layer");
+ t.eq(store.getCount(), 2, "initial records are loaded in the store");
+ };
+
+ // test store to layer synchronization
+ reinit_test_data();
+ store.bind(layer, {initDir: GeoExt.data.FeatureStore.STORE_TO_LAYER});
+ t.eq(layer.features.length, 4, "initial records are synchronized to layer");
+ t.eq(store.getCount(), 2, "initial features are not synchronized to store");
+ layer.removeFeatures([features[0]]);
+ t.eq(layer.features.length, 3, "removing feature not present in store has been well removed");
+ t.eq(store.getCount(), 2, "nothing to remove in store when removing feature not present in store");
+
+ // test layer to store synchronization
+ reinit_test_data();
+ store.bind(layer, {initDir: GeoExt.data.FeatureStore.LAYER_TO_STORE});
+ t.eq(layer.features.length, 2, "initial records are not synchronized to layer");
+ t.eq(store.getCount(), 4, "initial features are synchronized to store");
+ store.remove(records[0]);
+ t.eq(store.getCount(), 3, "removing record not present in layer has been well removed");
+ t.eq(layer.features.length, 2, "nothing to remove in layer when removing record not present in layer");
+
+ // test both synchronization
+ reinit_test_data();
+ store.bind(layer, {initDir: GeoExt.data.FeatureStore.LAYER_TO_STORE |
+ GeoExt.data.FeatureStore.STORE_TO_LAYER});
+ t.eq(layer.features.length, 4, "initial records are synchronized to layer");
+ t.eq(store.getCount(), 4, "initial features are synchronized to store");
+
+ // test no synchronization
+ reinit_test_data();
+ store.bind(layer, {initDir: 0});
+ t.eq(layer.features.length, 2, "initial records are not synchronized to layer");
+ t.eq(store.getCount(), 2, "initial features are not synchronized to store");
+ }
+
+ function test_add_remove(t) {
+
+ t.plan(5);
+
+ var layer = new OpenLayers.Layer.Vector("Foo layer");
+ var store = new GeoExt.data.FeatureStore({
+ layer: layer
+ });
+ var record = new GeoExt.data.FeatureRecord({
+ feature: new OpenLayers.Feature.Vector()
+ });
+
+ // add
+ store.add([record]);
+ t.eq(store.getCount(), 1, 'Adding a record to store with "add" does not create duplicate record in store');
+ t.eq(layer.features.length, 1, 'Adding a record to store with "add" does create corresponding feature in layer');
+
+ // remove
+ store.remove(record);
+ t.eq(store.getCount(), 0, 'remove on store with "remove" removes the record from the store');
+ t.eq(layer.features.length, 0, 'remove on store with "remove" removes the corresponding feature from layer');
+
+ // add with addRecordFilter
+ store.addRecordFilter = function(record) { return false; };
+ store.add([record]);
+ t.eq(layer.features.length, 0,
+ 'Adding a record with "add" does not add feature to layer if addRecordFilter returns false');
+ }
+
+ function test_addFeatures_removeFeatures(t) {
+
+ t.plan(5);
+
+ var features = [
+ new OpenLayers.Feature.Vector(),
+ new OpenLayers.Feature.Vector()
+ ];
+ var layer = new OpenLayers.Layer.Vector("Foo layer");
+ var store = new GeoExt.data.FeatureStore({
+ layer: layer
+ });
+
+ // test layer addFeatures
+ layer.addFeatures(features);
+ t.eq(layer.features.length, 2, 'Adding features to layer with "addFeatures" does not create duplicate features on the layer');
+ t.eq(store.getCount(), 2, 'Adding features to layer with "addFeatures" does create corresponding records in the store');
+
+ // test layer removeFeatures
+ layer.removeFeatures(layer.features);
+ t.eq(store.getCount(), 0, '"removeFeatures" on layer removes records from the store');
+ t.eq(layer.features.length, 0, '"removeFeatures" on layer removes features from layer');
+
+ // test layer addFeatures with addFeatureFilter
+ store.addFeatureFilter = function(feature) { return false; };
+ layer.addFeatures(features);
+ t.eq(store.getCount(), 0,
+ 'Adding features to layer with "addFeatures" does not insert records in the store if addFeatureFilter returns false');
+ }
+
+ function test_featuremodified_update(t) {
+ t.plan(6);
+
+ /*
+ * Set up
+ */
+ var feature, id, layer, store, recordType, record;
+
+ feature = new OpenLayers.Feature.Vector(null, {
+ foo: "foo",
+ bar: "bar"
+ });
+
+ id = feature.id;
+
+ recordType = GeoExt.data.FeatureRecord.create([
+ {name: "foo"}, {name: "bar"}
+ ]);
+
+ layer = new OpenLayers.Layer.Vector("vector");
+
+ store = new GeoExt.data.FeatureStore({
+ layer: layer,
+ recordType: recordType,
+ data: [feature]
+ });
+
+ t.eq(store.getById(id).get("foo"), "foo",
+ "record gets correct initial value for property \"foo\"");
+
+ t.eq(store.getById(id).get("bar"), "bar",
+ "record gets correct initial value for property \"bar\"");
+
+ /*
+ * Test
+ */
+
+ // featuremodified
+ feature.attributes.foo = "foo2";
+ feature.attributes.bar = "bar2";
+ layer.events.triggerEvent("featuremodified", {feature: feature});
+
+ t.eq(store.getById(id).get("foo"), "foo2",
+ "featuremodified event causes update of record property \"foo\"");
+
+ t.eq(store.getById(id).get("bar"), "bar2",
+ "featuremodified event causes update of record property \"bar\"");
+
+ // update
+ record = store.getById(id);
+ record.set("foo", "foo3");
+ record.set("bar", "bar3");
+
+ t.eq(layer.getFeatureById(id).attributes.foo, "foo3",
+ "update event causes update of feature property \"foo\"");
+
+ t.eq(layer.getFeatureById(id).attributes.bar, "bar3",
+ "update event causes update of feature property \"bar\"");
+
+ }
+ </script>
+
+ <body>
+ <div id="map"></div>
+ </body>
+</html>
+
Deleted: core/trunk/geoext/tests/lib/GeoExt/data/FeatureStoreMediator.html
===================================================================
--- core/trunk/geoext/tests/lib/GeoExt/data/FeatureStoreMediator.html 2009-04-13 23:56:33 UTC (rev 377)
+++ core/trunk/geoext/tests/lib/GeoExt/data/FeatureStoreMediator.html 2009-04-14 15:00:11 UTC (rev 378)
@@ -1,161 +0,0 @@
-<!DOCTYPE html>
-<html debug="true">
- <head>
- <script type="text/javascript" src="../../../../../ext/adapter/ext/ext-base.js"></script>
- <script type="text/javascript" src="../../../../../ext/ext-all-debug.js"></script>
-
- <script type="text/javascript" src="../../../../../openlayers/lib/OpenLayers.js"></script>
- <script type="text/javascript" src="../../../../lib/GeoExt.js"></script>
-
- <script type="text/javascript">
- function test_constructor(t) {
- t.plan(1);
- // setup
- var mediator, store;
- store = new Ext.data.Store({
- reader: new GeoExt.data.FeatureReader(
- {}, [{name: "name", type: "string"}]
- )
- });
- // 1 test
- mediator = new GeoExt.data.FeatureStoreMediator({
- store: store
- });
- t.ok(mediator.store == store,
- "ctor correctly sets store");
- }
- function test_addFeatures(t) {
- t.plan(4);
- // setup
- var mediator, store, features, flip, filter;
- store = new Ext.data.Store({
- reader: new GeoExt.data.FeatureReader(
- {}, [{name: "name", type: "string"}]
- )
- });
- mediator = new GeoExt.data.FeatureStoreMediator({
- store: store
- });
- function createFeatures() {
- return [
- new OpenLayers.Feature.Vector(null, {
- name: "foo"
- }),
- new OpenLayers.Feature.Vector()
- ];
- }
- // 2 tests
- features = createFeatures();
- mediator.addFeatures(features);
- t.eq(store.getCount(), 2,
- "addFeatures adds correct number of features");
- var record = store.getById(features[0].id);
- t.ok(record.get('feature') == features[0],
- 'addFeatures correctly adds features');
- // 1 test
- features = createFeatures();
- mediator.addFeatures(features, {append: false});
- t.eq(store.getCount(), 2,
- "addFeatures adds correct number of features");
- // 1 test
- flip = false;
- filter = function() { flip = !flip; return flip; };
- features = createFeatures();
- mediator.addFeatures(features,
- {append: false, filter: filter});
- t.eq(store.getCount(), 1,
- "addFeatures adds correct number of features " +
- "with filter passed");
- }
- // there's a bug in Ext where Ext dereferences an undefined
- // value, the bug triggers with a grouping store and group
- // field when store.loadData is called with only one arg
- // or with false as the second arg. addFeatures works
- // around that bug, so that test_addFeatures_ExtBug passes
- //
- // prefix the function name with test_ if you want to
- // actually run the test
- /*
- function ExtBug(t) {
- t.plan(1);
- // setup
- var store, a;
- store = new Ext.data.GroupingStore({
- reader: new Ext.data.ArrayReader({id: 0}, [
- {name: "name", mapping: 1},
- {name: "occupation", mapping: 2}
- ]),
- groupField: "name"
- });
- a = [[1, 'Bill', 'Gardener'], [2, 'Ben', 'Horticulturalist']];
- store.loadData(a, false); // same effect with store.loadData(a)
- // 1 test
- t.eq(store.getCount(), 2,
- "correct number of records loaded");
- }
- */
- function test_addFeatures_ExtBug(t) {
- t.plan(2);
- // setup
- var mediator, store, features, flip, filter;
- store = new Ext.data.GroupingStore({
- reader: new GeoExt.data.FeatureReader(
- {}, [{name: "name", type: "string"}]
- ),
- groupField: "name"
- });
- mediator = new GeoExt.data.FeatureStoreMediator({
- store: store
- });
- function createFeatures() {
- return [
- new OpenLayers.Feature.Vector(null, {
- name: "foo"
- }),
- new OpenLayers.Feature.Vector()
- ];
- }
- // 2 tests
- features = createFeatures();
- // {append: false} makes Ext panic without the workaround
- // in FeatureStoreMediator.js, see test_ExtBug for making
- // Ext panic without MapFish involves
- mediator.addFeatures(features, {append: false});
- t.eq(store.getCount(), 2,
- "addFeatures adds correct number of features");
- var record = store.getById(features[0].id);
- t.ok(record.get('feature') == features[0],
- 'addFeatures correctly adds features');
- }
- function test_removeFeatures(t) {
- t.plan(1);
- // setup
- var mediator, store, features;
- store = new Ext.data.Store({
- reader: new GeoExt.data.FeatureReader(
- {}, [{name: "name", type: "string"}]
- )
- });
- mediator = new GeoExt.data.FeatureStoreMediator({
- store: store
- });
- function createFeatures() {
- return [
- new OpenLayers.Feature.Vector(null, {
- name: "foo"
- }),
- new OpenLayers.Feature.Vector()
- ];
- }
- // 1 test
- features = createFeatures();
- mediator.addFeatures(features);
- mediator.removeFeatures(features);
- t.eq(store.getCount(), 0,
- 'removesFeatures correctly removes features');
- }
- </script>
- <body>
- <div id="map"></div>
- </body>
-</html>
Deleted: core/trunk/geoext/tests/lib/GeoExt/data/LayerStoreMediator.html
===================================================================
--- core/trunk/geoext/tests/lib/GeoExt/data/LayerStoreMediator.html 2009-04-13 23:56:33 UTC (rev 377)
+++ core/trunk/geoext/tests/lib/GeoExt/data/LayerStoreMediator.html 2009-04-14 15:00:11 UTC (rev 378)
@@ -1,97 +0,0 @@
-<!DOCTYPE html>
-<html debug="true">
- <head>
- <script type="text/javascript" src="../../../../../ext/adapter/ext/ext-base.js"></script>
- <script type="text/javascript" src="../../../../../ext/ext-all-debug.js"></script>
-
- <script type="text/javascript" src="../../../../../openlayers/lib/OpenLayers.js"></script>
- <script type="text/javascript" src="../../../../lib/GeoExt.js"></script>
-
- <script type="text/javascript">
- function test_constructor(t) {
- t.plan(3);
- // setup
- var mediator, store, layer;
- store = new Ext.data.Store({
- reader: new GeoExt.data.FeatureReader(
- {}, [{name: "name", type: "string"}]
- )
- });
- layer = new OpenLayers.Layer.Vector();
- // 3 tests
- mediator = new GeoExt.data.LayerStoreMediator({
- store: store,
- layer: layer,
- activate: function() {
- t.ok(true, "ctor calls activate");
- }
- });
- t.ok(mediator.layer == layer,
- "ctor correctly sets layer");
- t.ok(mediator.featureStoreMediator instanceof
- GeoExt.data.FeatureStoreMediator,
- "ctor correctly creates feature store mediator");
- }
- function test_events(t) {
- t.plan(3);
- // setup
- var mediator, store, layer, eventType;
- store = new Ext.data.Store({
- reader: new GeoExt.data.FeatureReader(
- {}, [{name: "name", type: "string"}]
- )
- });
- layer = new OpenLayers.Layer.Vector();
- mediator = new GeoExt.data.LayerStoreMediator({
- store: store,
- layer: layer,
- update: function() {
- t.ok(true, "update called on " + eventType);
- }
- });
- // 1 test
- eventType = "featuresadded";
- layer.events.triggerEvent(eventType);
- // 1 test
- eventType = "featuresremoved";
- layer.events.triggerEvent(eventType);
- // 1 test
- eventType = "featuremodified";
- layer.events.triggerEvent(eventType);
- }
- function test_update(t) {
- t.plan(2);
- // setup
- var mediator, store, layer;
- store = new Ext.data.Store({
- reader: new GeoExt.data.FeatureReader(
- {}, [{name: "name", type: "string"}]
- )
- });
- layer = new OpenLayers.Layer.Vector();
- mediator = new GeoExt.data.LayerStoreMediator({
- store: store,
- layer: layer
- });
- function createFeatures() {
- return [
- new OpenLayers.Feature.Vector(null, {name: "foo"}),
- new OpenLayers.Feature.Vector(null, {name: "bar"})
- ];
- }
- // 1 test
- layer.features = createFeatures();
- layer.events.triggerEvent("featuresadded");
- t.eq(store.getCount(), 2,
- "featuresadded event caused insertion of 2 records");
- // 1 test
- layer.features = createFeatures();
- layer.events.triggerEvent("featuresadded");
- t.eq(store.getCount(), 2,
- "featuresadded event caused insertion of 2 records");
- }
- </script>
- <body>
- <div id="map"></div>
- </body>
-</html>
Modified: core/trunk/geoext/tests/list-tests.html
===================================================================
--- core/trunk/geoext/tests/list-tests.html 2009-04-13 23:56:33 UTC (rev 377)
+++ core/trunk/geoext/tests/list-tests.html 2009-04-14 15:00:11 UTC (rev 378)
@@ -1,11 +1,10 @@
<ul id="testlist">
<li>lib/GeoExt/data/FeatureRecord.html</li>
<li>lib/GeoExt/data/FeatureReader.html</li>
- <li>lib/GeoExt/data/FeatureStoreMediator.html</li>
+ <li>lib/GeoExt/data/FeatureStore.html</li>
<li>lib/GeoExt/data/LayerRecord.html</li>
<li>lib/GeoExt/data/LayerReader.html</li>
<li>lib/GeoExt/data/LayerStore.html</li>
- <li>lib/GeoExt/data/LayerStoreMediator.html</li>
<li>lib/GeoExt/data/ProtocolProxy.html</li>
<li>lib/GeoExt/widgets/MapPanel.html</li>
<li>lib/GeoExt/widgets/Popup.html</li>
More information about the Commits
mailing list