[Commits] r2650 - in sandbox/mapgears/geoext.ux/ux/WFSTFeatureEditing: examples lib lib/GeoExt.ux/widgets lib/OpenLayers lib/OpenLayers/Control

commits at geoext.org commits at geoext.org
Thu Apr 14 15:19:46 CEST 2011


Author: adube
Date: 2011-04-14 15:19:46 +0200 (Thu, 14 Apr 2011)
New Revision: 2650

Added:
   sandbox/mapgears/geoext.ux/ux/WFSTFeatureEditing/lib/OpenLayers/
   sandbox/mapgears/geoext.ux/ux/WFSTFeatureEditing/lib/OpenLayers/Control/
   sandbox/mapgears/geoext.ux/ux/WFSTFeatureEditing/lib/OpenLayers/Control/UserFilter.js
Modified:
   sandbox/mapgears/geoext.ux/ux/WFSTFeatureEditing/examples/WFSTFeatureEditing.html
   sandbox/mapgears/geoext.ux/ux/WFSTFeatureEditing/lib/GeoExt.ux/widgets/WFSTFeatureEditingManager.js
Log:
UserFilter control added (when 'useFilter' property set to true)

Modified: sandbox/mapgears/geoext.ux/ux/WFSTFeatureEditing/examples/WFSTFeatureEditing.html
===================================================================
--- sandbox/mapgears/geoext.ux/ux/WFSTFeatureEditing/examples/WFSTFeatureEditing.html	2011-04-13 15:47:29 UTC (rev 2649)
+++ sandbox/mapgears/geoext.ux/ux/WFSTFeatureEditing/examples/WFSTFeatureEditing.html	2011-04-14 13:19:46 UTC (rev 2650)
@@ -43,6 +43,8 @@
             src="../../../../geoext/lib/GeoExt.js"></script>
     <script type="text/javascript" src="http://dev.geoext.org/ux/geoext.ux/ux/FeatureEditing/lib/GeoExt.ux/FeatureEditorGrid.js"></script>
     <script type="text/javascript"
+            src="../lib/OpenLayers/Control/UserFilter.js"></script>
+    <script type="text/javascript"
             src="../lib/GeoExt.ux/WFSTFeatureEditing.js"></script>
     <!--script type="text/javascript" src="../resources/lang/fr.js"></script-->
     <script type="text/javascript" src="WFSTFeatureEditing.js"></script>

Modified: sandbox/mapgears/geoext.ux/ux/WFSTFeatureEditing/lib/GeoExt.ux/widgets/WFSTFeatureEditingManager.js
===================================================================
--- sandbox/mapgears/geoext.ux/ux/WFSTFeatureEditing/lib/GeoExt.ux/widgets/WFSTFeatureEditingManager.js	2011-04-13 15:47:29 UTC (rev 2649)
+++ sandbox/mapgears/geoext.ux/ux/WFSTFeatureEditing/lib/GeoExt.ux/widgets/WFSTFeatureEditingManager.js	2011-04-14 13:19:46 UTC (rev 2650)
@@ -51,7 +51,9 @@
 
     featureEditorGridContainerTitleText: "Editing feature",
 
+    returnToSelectionText: "Return to selection",
 
+
 /* API */
 
     toolbar: null,
@@ -74,7 +76,7 @@
 
     actionGroup: null,
 
-    useFilter: false,
+    useFilter: true,
 
     ignoredAttributes: {name:["the_geom", "id", "gid", "fid"]},
 
@@ -311,9 +313,10 @@
             },
             "deactivate": function() { this.layer.setVisibility(false); },
             "featureadded": function(e) {
+                var wfstFE = this.layer.wfstFeatureEditing;
                 var feature = e.feature;
                 if (feature) {
-                    var multiGeom = this.layer.wfstFeatureEditing.multiGeometry;
+                    var multiGeom = wfstFE.multiGeometry;
     
                     // if we're dealing with a "MultiGeometry" layer, we
                     // must cast the geometry as "Multi" when the feature
@@ -322,9 +325,13 @@
                         this.layer.eraseFeatures([feature]);
                         feature.geometry = new multiGeom(feature.geometry);
                     }
-                    this.layer.wfstFeatureEditing.drawControl.deactivate();
-                    this.layer.wfstFeatureEditing.highlightControl.activate();
-                    this.layer.wfstFeatureEditing.selectControl.select(feature);
+                    wfstFE.drawControl.deactivate();
+                    if (this.manager.useFilter) {
+                        wfstFE.userFilterControl.activate();
+                        wfstFE.userFilterControl.deactivateHandlers();
+                    }
+                    wfstFE.highlightControl.activate();
+                    wfstFE.selectControl.select(feature);
                 }
             },
             scope: {layer: layer, manager: this}
@@ -356,12 +363,28 @@
         layer.wfstFeatureEditing.drawControl = drawControl;
 
 
-        // =======================
-        // GetFeature (filtering)
-        // =======================
+        // ==================
+        // UserFilter control
+        // ==================
+        var userFilterControl;
         if (this.useFilter) {
-            var getFeatureControl;
-            // do stuff...
+            userFilterControl = new OpenLayers.Control.UserFilter({
+                layer: layer,
+                box: true
+            });
+            layer.wfstFeatureEditing.userFilterControl = userFilterControl;
+
+            userFilterControl.events.on({
+                "filtermerged": function(e) {
+                    e.control.deactivateHandlers();
+                    e.layer.wfstFeatureEditing.highlightControl.activate();
+                },
+                "deactivate": function(e) {
+                    var layer = e.object.layer;
+                    layer.wfstFeatureEditing.highlightControl.deactivate();
+                },
+                scope: this
+            });
         }
 
         // ================================================
@@ -426,12 +449,12 @@
         this.map.addControl(selectControl);
         this.useFilter && this.map.addControl(highlightControl);
         layer.wfstFeatureEditing._mainEditControl = (this.useFilter) 
-            ? getFeatureControl : highlightControl;
+            ? userFilterControl : highlightControl;
 
         var editAction = new GeoExt.Action({
             text: layer.name,
             hidden: true,
-            control: (this.useFilter) ? getFeatureControl : highlightControl,
+            control: (this.useFilter) ? userFilterControl : highlightControl,
             map: map,
             disabled: !layer.inRange,
             // button options
@@ -461,7 +484,8 @@
             },
             "featureselected" :function(e) {
                 var feature = e.feature;
-                var editorGrid = this.manager.getNewFeatureEditorGrid(feature);
+                var editorGrid = this.manager.getNewFeatureEditorGrid(
+                    feature, this.layer);
 
                 // todo: is this useful ?
                 this.layer.wfstFeatureEditing.editorGrid = editorGrid;
@@ -496,7 +520,7 @@
         return wmsLayerSibling;
     },
 
-    getNewFeatureEditorGrid: function(feature) {
+    getNewFeatureEditorGrid: function(feature, layer) {
         var store = this.getNewAttributeStore(feature);
         return new GeoExt.ux.FeatureEditorGrid({
             nameField: "name",
@@ -510,14 +534,14 @@
             listeners: {
                 done: function(panel, e) {
                     var feature = e.feature, modified = e.modified;
-                    this.closeEditing(feature.layer);
-                    this.commitFeature(feature);
+                    this.manager.closeEditing(this.layer, {skipReturn: true});
+                    this.manager.commitFeature(feature);
                 },
                 cancel: function(panel, e) {
-                    this.cancelEditing(e.feature.layer);
+                    this.manager.cancelEditing(this.layer);
                     return false;
                 },
-                scope: this
+                scope: {"manager": this, "layer": layer}
             }
         }); // end of return
     },
@@ -538,13 +562,14 @@
 
     getNewFeatureGrid: function(layer) {
         var store = this.getNewFeatureStore(layer);
-        return new gxp.grid.FeatureGrid({
+        var featureGrid = new gxp.grid.FeatureGrid({
             title: layer.name,
             disabled: true,
             border: false,
             layer: layer,
             store: store,
             ignoreFields: ["the_geom"],
+            bbar: this.useFilter ? this.getNewFeatureGridToolbar(layer) : null,
             sm: new GeoExt.grid.FeatureSelectionModel({
                 layerFromStore: true,
                 selectControl: layer.wfstFeatureEditing.selectControl,
@@ -557,8 +582,44 @@
                 scope: this
             })
         });
+
+        this.useFilter && layer.events.on({"loadend": function(e) {
+            if (!this.layer.wfstFeatureEditing.userFilterControl.hasBlankFilter
+                && this.grid.store.getCount() === 0) {
+                this.manager.returnToSelection(this.layer)
+            }
+        }, "scope": {"manager": this, "grid": featureGrid, "layer": layer}});
+
+        store.on("load", function(store, records, options) {
+            if (this.manager.useFilter &&
+                this.layer.wfstFeatureEditing.userFilterControl.active) {
+                if (store.getCount() === 1) {
+                    this.grid.getSelectionModel().selectFirstRow();
+                }
+            }
+        }, {"manager": this, "grid": featureGrid, "layer": layer});
+
+        return featureGrid;
     },
 
+    getNewFeatureGridToolbar: function(layer) {
+        return new Ext.Toolbar({
+            "items": ["->", new Ext.Action({
+                "text": this.returnToSelectionText,
+                "handler": function(action, event) {
+                    this.manager.returnToSelection(this.layer);
+                },
+                "scope": {"manager": this, "layer": layer}
+            })]
+        });
+    },
+
+    returnToSelection: function(layer) {
+        layer.wfstFeatureEditing.selectControl.unselectAll();
+        layer.wfstFeatureEditing.highlightControl.deactivate();
+        layer.wfstFeatureEditing.userFilterControl.activateHandlers();
+    },
+
     getNewFeatureStore: function(layer) {
         return new GeoExt.data.FeatureStore({
             fields: layer.wfstFeatureEditing.fields,
@@ -580,7 +641,8 @@
         }
     },
 
-    closeEditing: function(layer) {
+    closeEditing: function(layer, options) {
+        options = options || {};
         // avoid reentrance
         if(!arguments.callee._in) {
             arguments.callee._in = true;
@@ -589,6 +651,11 @@
             layer.wfstFeatureEditing.selectControl.unselectAll();
             delete arguments.callee._in;
         }
+        // returnToSelection if only one feature
+        if (options.skipReturn !== true && this.useFilter &&
+            layer.wfstFeatureEditing.featureGrid.store.getCount() <= 1) {
+            this.returnToSelection(layer);
+        }
     },
 
     commitFeature: function(feature) {
@@ -599,9 +666,28 @@
 
     onCommitSuccess: function(e) {
         // todo : show success message
-        this.layer.wfstFeatureEditing.wmsLayerSibling &&
-            this.layer.wfstFeatureEditing.wmsLayerSibling.redraw(true);
+        var wfstFE = this.layer.wfstFeatureEditing;
+        wfstFE.wmsLayerSibling && wfstFE.wmsLayerSibling.redraw(true);
         this.manager.cancelEditing(this.layer);
+
+        // bug : there is currently a bug with newly inserted features... the
+        //       record in the grid is invalid...
+        if (e.response.insertIds.length) {
+            if (this.manager.useFilter) {
+                wfstFE.userFilterControl.applyBlankFilter({force: true});
+            } else {
+                this.layer.refresh({force:true});
+            }
+            // normally, the store should not contain anything at this point
+            if (wfstFE.featureGrid.store.getCount() > 0){
+                wfstFE.featureGrid.store.removeAll(true);
+            }
+        }
+
+        if (this.manager.useFilter &&
+            wfstFE.featureGrid.store.getCount() <= 1) {
+            this.manager.returnToSelection(this.layer);
+        }
     },
 
     onCommitFail: function(e) {

Added: sandbox/mapgears/geoext.ux/ux/WFSTFeatureEditing/lib/OpenLayers/Control/UserFilter.js
===================================================================
--- sandbox/mapgears/geoext.ux/ux/WFSTFeatureEditing/lib/OpenLayers/Control/UserFilter.js	                        (rev 0)
+++ sandbox/mapgears/geoext.ux/ux/WFSTFeatureEditing/lib/OpenLayers/Control/UserFilter.js	2011-04-14 13:19:46 UTC (rev 2650)
@@ -0,0 +1,122 @@
+OpenLayers.Control.UserFilter = OpenLayers.Class(OpenLayers.Control.GetFeature, {
+    /**
+     * Constant: EVENT_TYPES
+     * {Array(String)} Supported application event types.
+     *
+     *  - *filtermerged* Triggered when a new filter was merged with the layer
+     *                   protocol
+     */
+    EVENT_TYPES: ["filtermerged"],
+
+    /* Public properties */
+
+    layer: null,
+
+    autoRefresh: true,
+
+    autoVisibility: true,
+
+    /* Private properties */
+
+    hasBlankFilter: false,
+
+    /* methods */
+    initialize: function(options) {
+        this.EVENT_TYPES =
+            OpenLayers.Control.UserFilter.prototype.EVENT_TYPES.concat(
+                OpenLayers.Control.prototype.EVENT_TYPES,
+                OpenLayers.Control.GetFeature.prototype.EVENT_TYPES
+        );
+
+        options.handlerOptions = options.handlerOptions || {};
+
+        OpenLayers.Control.prototype.initialize.apply(this, [options]);
+        
+        this.handlers = {};
+        
+        if(this.click) {
+            this.handlers.click = new OpenLayers.Handler.Click(this,
+                {click: this.selectClick}, this.handlerOptions.click || {});
+        }
+
+        if(this.box) {
+            this.handlers.box = new OpenLayers.Handler.Box(
+                this, {done: this.selectBox},
+                OpenLayers.Util.extend(this.handlerOptions.box, {
+                    boxDivClassName: "olHandlerBoxSelectFeature"
+                })
+            ); 
+        }
+    },
+
+    /**
+     * Method: request
+     * Sends a GetFeature request to the WFS
+     * 
+     * Parameters:
+     * bounds - {<OpenLayers.Bounds>} bounds for the protocol BBOX filter
+     * options - {Object} additional options for this method.
+     */
+    request: function(bounds, options) {
+        options = options || {};
+        var filter = new OpenLayers.Filter.Spatial({
+            type: this.filterType, 
+            value: bounds
+        });
+        this.layer.protocol.defaultFilter = filter;
+        this.hasBlankFilter = false;
+        this.events.triggerEvent("filtermerged", {
+              layer: this.layer, filter: filter, control: this});
+        this.autoRefresh && this.layer.refresh({force:true});
+        this.autoVisibility && this.layer.setVisibility(true);
+    },
+
+    activateHandlers: function() {
+        for(var key in this.handlers) {
+            this.handlers[key].activate();
+        }
+    },
+
+    deactivateHandlers: function() {
+        for(var key in this.handlers) {
+            this.handlers[key].deactivate();
+        }
+    },
+
+    setMap: function(map) {
+        OpenLayers.Control.GetFeature.prototype.setMap.apply(this, arguments);
+        this.applyBlankFilter();
+    },
+
+    activate: function() {
+        OpenLayers.Control.GetFeature.prototype.activate.apply(this, arguments);
+        this.applyBlankFilter();
+    },
+
+    deactivate: function() {
+        OpenLayers.Control.GetFeature.prototype.deactivate.apply(
+            this, arguments);
+        this.applyBlankFilter();
+    },
+
+    applyBlankFilter: function(options) {
+        options = options || {};
+        if (options.force === true || this.hasBlankFilter === false) {
+            var filter = new OpenLayers.Filter.Spatial({
+                type: this.filterType, 
+                value: new OpenLayers.Bounds(0,0,0,0)
+            });
+            this.layer.protocol.defaultFilter = filter;
+            if (this.layer.getVisibility()) {
+                this.layer.refresh({force:true});
+            } else {
+                this.layer.setVisibility(true);
+                this.layer.refresh({force:true});
+                this.layer.setVisibility(false);
+            }
+            this.hasBlankFilter = true;
+        }
+    },
+
+    CLASS_NAME: "OpenLayers.Control.UserFilter"
+});



More information about the Commits mailing list