[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