[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