Ticket #628: geometry.feature.patch
| File geometry.feature.patch, 23.9 kB (added by tschaub, 1 year ago) |
|---|
-
examples/openmnnd.html
old new 99 99 } 100 100 } 101 101 } 102 var displayedGeom = null; 103 function feature_info_hover(geometry) { 104 if(geometry.parent) { 105 geometry = geometry.parent; 106 } 107 if (displayedGeom != geometry && 108 (!geometry.feature.layer.selectedFeatures.length || 109 (geometry.feature.layer.selectedFeatures[0].geometry == geometry))) { 110 feature_info(geometry); 111 displaydGeom = geometry; 102 var displayedFeature = null; 103 function feature_info_hover(feature) { 104 if (displayedFeature != feature && 105 (!feature.layer.selectedFeatures.length || 106 (feature.layer.selectedFeatures[0] == feature))) { 107 feature_info(feature); 108 displayedFeature = feature; 112 109 } 113 110 } 114 function feature_info(geometry) { 115 if(geometry.parent) { 116 geometry = geometry.parent; 117 } 111 function feature_info(feature) { 118 112 var html = "<ul>"; 119 for(var i in geometry.feature.attributes)120 html += "<li><b>" + i + "</b>: "+ geometry.feature.attributes[i] + "</li>";113 for(var i in feature.attributes) 114 html += "<li><b>" + i + "</b>: "+ feature.attributes[i] + "</li>"; 121 115 html += "</ul>"; 122 116 $('feature_info').innerHTML = html; 123 117 } -
examples/wfs-scribble.html
old new 35 35 df.featureAdded = function(feature) { 36 36 feature.state = OpenLayers.State.INSERT; 37 37 feature.style['strokeColor'] = "#ff0000"; 38 feature.layer. renderer.drawGeometry(feature.geometry, feature.style);38 feature.layer.drawFeature(feature); 39 39 } 40 40 p.addControls([ new OpenLayers.Control.Navigation(), df ]); 41 41 … … 47 47 for(var i = 0; i < map.layers[1].features.length; i++) { 48 48 var f = map.layers[1].features[i]; 49 49 f.style['strokeColor'] = '#ee9900'; 50 map.layers[1]. renderer.drawGeometry(f.geometry, f.style);50 map.layers[1].drawFeature(f); 51 51 } 52 52 map.layers[1].commit(); 53 53 return false; -
examples/wfs-t.html
old new 27 27 featureNS: 'http://www.openplans.org/topp', 28 28 extractAttributes: false 29 29 } ); 30 rlayer.onFeatureInsert=function(feature) { feature.style.strokeColor = "#ff0000"; feature.layer. renderer.drawGeometry(feature.geometry, feature.style); }30 rlayer.onFeatureInsert=function(feature) { feature.style.strokeColor = "#ff0000"; feature.layer.drawFeature(feature); } 31 31 map.addLayer(rlayer); 32 32 layer = new OpenLayers.Layer.WFS( "Cities", 33 33 "http://dev.openlayers.org/geoserver/wfs", {typename: 'topp:tasmania_cities'}, … … 44 44 df.featureAdded = function(feature) { 45 45 feature.state = OpenLayers.State.INSERT; 46 46 feature.style['strokeColor'] = "#0000ff"; 47 feature.layer. renderer.drawGeometry(feature.geometry, feature.style);47 feature.layer.drawFeature(feature); 48 48 } 49 49 dp = new OpenLayers.Control.DrawFeature(layer, OpenLayers.Handler.Point, {handlerOptions: {'freehand': false}, 'displayClass': 'olControlDrawFeaturePoint'}); 50 50 dp.featureAdded = function(feature) { … … 53 53 feature.geometry = new OpenLayers.Geometry.MultiPoint(oldgeom); 54 54 feature.state = OpenLayers.State.INSERT; 55 55 feature.style['strokeColor'] = "#0000ff"; 56 feature.layer. renderer.drawGeometry(feature.geometry, feature.style);56 feature.layer.drawFeature(feature); 57 57 } 58 58 p.addControls([ new OpenLayers.Control.Navigation(), df, dp ]); 59 59 -
examples/wkt.html
old new 77 77 } 78 78 } 79 79 80 function displayWKT( geometry) {81 var str = wkt.write( geometry);80 function displayWKT(feature) { 81 var str = wkt.write(feature.geometry); 82 82 // not a good idea in general, just for this demo 83 83 str = str.replace(/,/g, ', '); 84 84 document.getElementById('info').innerHTML = str; -
lib/OpenLayers/Control/SelectFeature.js
old new 27 27 28 28 /** 29 29 * @type {Function} Optional function to be called when a feature is selected. 30 * The function should expect to be called with a geometry.30 * The function should expect to be called with a feature. 31 31 */ 32 32 onSelect: function() {}, 33 33 34 34 /** 35 35 * @type {Function} Optional function to be called when a feature is unselected. 36 * The function should expect to be called with a geometry.36 * The function should expect to be called with a feature. 37 37 */ 38 38 onUnselect: function() {}, 39 39 … … 76 76 77 77 /** 78 78 * Called when the feature handler detects a mouse-down on a feature 79 * @param {OpenLayers. Geometry}79 * @param {OpenLayers.Vector.Feature} 80 80 */ 81 downFeature: function( geometry) {81 downFeature: function(feature) { 82 82 if(this.hover) { 83 83 return; 84 84 } 85 if(geometry.parent) {86 geometry = geometry.parent;87 }88 85 if (this.multiple) { 89 if(OpenLayers.Util.indexOf(this.layer.selectedFeatures, geometry.feature) > -1) {90 this.unselect( geometry);86 if(OpenLayers.Util.indexOf(this.layer.selectedFeatures, feature) > -1) { 87 this.unselect(feature); 91 88 } else { 92 this.select( geometry);89 this.select(feature); 93 90 } 94 91 } else { 95 if(OpenLayers.Util.indexOf(this.layer.selectedFeatures, geometry.feature) > -1) {96 this.unselect( geometry);92 if(OpenLayers.Util.indexOf(this.layer.selectedFeatures, feature) > -1) { 93 this.unselect(feature); 97 94 } else { 98 95 if (this.layer.selectedFeatures) { 99 96 for (var i = 0; i < this.layer.selectedFeatures.length; i++) { 100 this.unselect(this.layer.selectedFeatures[i] .geometry);97 this.unselect(this.layer.selectedFeatures[i]); 101 98 } 102 99 } 103 this.select( geometry);100 this.select(feature); 104 101 } 105 102 } 106 103 }, … … 108 105 /** 109 106 * Called when the feature handler detects a mouse-over on a feature. 110 107 * Only responds if this.hover is true. 111 * @param {OpenLayers. Geometry}108 * @param {OpenLayers.Feature.Vector} 112 109 */ 113 overFeature: function( geometry) {110 overFeature: function(feature) { 114 111 if(!this.hover) { 115 112 return; 116 113 } 117 if( geometry.parent) {118 geometry = geometry.parent;114 if(!(OpenLayers.Util.indexOf(this.layer.selectedFeatures, feature) > -1)) { 115 this.select(feature); 119 116 } 120 if(!(OpenLayers.Util.indexOf(this.layer.selectedFeatures, geometry.feature) > -1)) {121 this.select(geometry);122 }123 117 }, 124 118 125 119 /** 126 120 * Called when the feature handler detects a mouse-out on a feature. 127 121 * Only responds if this.hover is true. 128 * @param {OpenLayers. Geometry}122 * @param {OpenLayers.Feature.Vector} 129 123 */ 130 outFeature: function( geometry) {124 outFeature: function(feature) { 131 125 if(!this.hover) { 132 126 return; 133 127 } 134 if(geometry.parent) { 135 geometry = geometry.parent; 136 } 137 this.unselect(geometry); 128 this.unselect(feature); 138 129 }, 139 130 140 131 /** 141 132 * Add feature to the layer's selectedFeature array, render the feature as 142 133 * selected, and call the onSelect function. 143 * @param {OpenLayers. Geometry} geometry134 * @param {OpenLayers.Feature.Vector} feature 144 135 */ 145 select: function( geometry) {136 select: function(feature) { 146 137 // Store feature style for restoration later 147 if( geometry.feature.originalStyle == null) {148 geometry.feature.originalStyle = geometry.feature.style;138 if(feature.originalStyle == null) { 139 feature.originalStyle = feature.style; 149 140 } 150 this.layer.selectedFeatures.push( geometry.feature);151 this.layer. renderer.drawGeometry(geometry, this.selectStyle);152 this.onSelect( geometry);141 this.layer.selectedFeatures.push(feature); 142 this.layer.drawFeature(feature, this.selectStyle); 143 this.onSelect(feature); 153 144 }, 154 145 155 146 /** 156 147 * Remove feature from the layer's selectedFeature array, render the feature as 157 148 * normal, and call the onUnselect function. 158 * @param {OpenLayers. Geometry} geometry149 * @param {OpenLayers.Feature.Vector} feature 159 150 */ 160 unselect: function( geometry) {151 unselect: function(feature) { 161 152 // Store feature style for restoration later 162 if( geometry.feature.originalStyle == null) {163 geometry.feature.originalStyle = geometry.feature.style;153 if(feature.originalStyle == null) { 154 feature.originalStyle = feature.style; 164 155 } 165 this.layer. renderer.drawGeometry(geometry, geometry.feature.originalStyle);166 OpenLayers.Util.removeItem(this.layer.selectedFeatures, geometry.feature);167 this.onUnselect( geometry);156 this.layer.drawFeature(feature, feature.originalStyle); 157 OpenLayers.Util.removeItem(this.layer.selectedFeatures, feature); 158 this.onUnselect(feature); 168 159 }, 169 160 170 161 /** Set the map property for the control. -
lib/OpenLayers/Feature/Vector.js
old new 142 142 */ 143 143 setGeometry: function(geometry, recurse) { 144 144 if(geometry) { 145 this.geometry = geometry; 146 this.geometry.feature = this; 145 geometry.feature = this; 147 146 if (recurse != false) { 148 this._setGeometryFeatureReference(this.geometry, this); 149 } 150 } 151 }, 152 153 /** 154 * Sets recursively the reference to the feature in the geometry 155 * 156 * @param {OpenLayers.Geometry} 157 * @param {OpenLayers.Feature} 158 */ 159 _setGeometryFeatureReference: function(geometry, feature) { 160 geometry.feature = feature; 161 if (geometry.components) { 162 for (var i = 0; i < geometry.components.length; i++) { 163 this._setGeometryFeatureReference(geometry.components[i], feature); 147 if (geometry.components) { 148 // set geometry.feature for all components 149 for (var i = 0; i < geometry.components.length; i++) { 150 OpenLayers.Feature.Vector.prototype.setGeometry.apply( 151 this, [geometry.components[i], recurse]); 152 } 153 } 164 154 } 155 this.geometry = geometry; 165 156 } 166 157 }, 167 158 -
lib/OpenLayers/Geometry.js
old new 23 23 /** 24 24 * Cross reference back to the feature that owns this geometry so 25 25 * that that the feature can be identified after the geometry has been 26 * selected by a mouse click. 27 * 28 * @type OpenLayers.Feature */ 26 * selected by a mouse click. This is subject to change. Not to be 27 * considered a stable part of the API. 28 * 29 * @private 30 * @type OpenLayers.Feature 31 */ 29 32 feature: null, 30 33 31 34 /** -
lib/OpenLayers/Handler/Feature.js
old new 21 21 layerIndex: null, 22 22 23 23 /** 24 * @type {OpenLayers. Geometry}24 * @type {OpenLayers.Feature.Vector} 25 25 */ 26 geometry: null,26 feature: null, 27 27 28 28 /** 29 29 * @constructor … … 33 33 * @param {Array} callbacks An object with a 'over' property whos value is 34 34 * a function to be called when the mouse is over 35 35 * a feature. The callback should expect to recieve 36 * a single argument, the geometry.36 * a single argument, the feature. 37 37 * @param {Object} options 38 38 */ 39 39 initialize: function(control, layer, callbacks, options) { … … 75 75 76 76 /** 77 77 * Capture double-clicks. Let the event continue propagating if the 78 * double-click doesn't hit a geometry. Otherwise call the dblclick78 * double-click doesn't hit a feature. Otherwise call the dblclick 79 79 * callback. 80 80 * 81 81 * @param {Event} evt … … 94 94 select: function(type, evt) { 95 95 var geometry = this.layer.renderer.getGeometryFromEvent(evt); 96 96 if(geometry) { 97 var feature; 98 if(geometry.parent) { 99 feature = geometry.parent.feature; 100 } else { 101 feature = geometry.feature; 102 } 97 103 // three cases: 98 104 // over a new, out of the last and over a new, or still on the last 99 if(!this. geometry) {100 // over a new geometry101 this.callback('over', [ geometry]);102 } else if(this. geometry != geometry) {105 if(!this.feature) { 106 // over a new feature 107 this.callback('over', [feature]); 108 } else if(this.feature != feature) { 103 109 // out of the last and over a new 104 this.callback('out', [this. geometry]);105 this.callback('over', [ geometry]);110 this.callback('out', [this.feature]); 111 this.callback('over', [feature]); 106 112 } 107 this. geometry = geometry;108 this.callback(type, [ geometry]);113 this.feature = feature; 114 this.callback(type, [feature]); 109 115 return true; 110 116 } else { 111 if(this. geometry) {117 if(this.feature) { 112 118 // out of the last 113 this.callback('out', [this. geometry]);114 this. geometry= null;119 this.callback('out', [this.feature]); 120 this.feature = null; 115 121 } 116 122 return false; 117 123 } -
lib/OpenLayers/Layer/Vector.js
old new 28 28 selectedFeatures: [], 29 29 30 30 /** @type {Boolean} */ 31 editing: false,32 33 /** @type {Boolean} */34 editable: false,35 36 /** @type {Boolean} */37 31 reportError: true, 38 32 39 33 /** @type {Object} */ … … 75 69 * Options renderer {Object}: Typically SVGRenderer or VMLRenderer. 76 70 */ 77 71 initialize: function(name, options) { 72 this.style = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']); 78 73 OpenLayers.Layer.prototype.initialize.apply(this, arguments); 79 74 80 75 // allow user-set renderer, otherwise assign one … … 102 97 // calling feature[i].destroy() here. 103 98 this.features = null; 104 99 this.selectedFeatures = null; 105 this.editing = null;106 this.editable = null;107 100 if (this.renderer) { 108 101 this.renderer.destroy(); 109 102 } … … 199 192 this.drawn = true; 200 193 for(var i = 0; i < this.features.length; i++) { 201 194 var feature = this.features[i]; 202 this. renderer.drawGeometry(feature.geometry, feature.style);195 this.drawFeature(feature); 203 196 } 204 197 } 205 198 }, … … 228 221 feature.layer = this; 229 222 230 223 if (!feature.style) { 231 if (this.style) { 232 feature.style = OpenLayers.Util.extend({}, this.style); 233 } else { 234 feature.style = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']); 235 } 224 feature.style = OpenLayers.Util.extend({}, this.style); 236 225 } 237 226 238 227 this.preFeatureInsert(feature); 239 228 240 229 if (this.drawn) { 241 this. renderer.drawGeometry(feature.geometry, feature.style);230 this.drawFeature(feature); 242 231 } 243 232 244 233 this.onFeatureInsert(feature); … … 271 260 }, 272 261 273 262 /** 274 * @param {String} fid 263 * Draw (or redraw) a feature on the layer. If the optional style argument 264 * is included, this style will be used. If no style is included, the 265 * feature's style will be used. If the feature doesn't have a style, 266 * the layer's style will be used. 267 * 268 * @param {OpenLayers.Feature.Vector} feature 275 269 * @param {Object} style 276 270 */ 277 redrawFeature: function(fid, style) { 278 for (var i = 0; i < this.features.length; i++) { 279 var feature = this.features[i]; 280 if (feature.fid == fid) { 281 this.renderer.drawGeometry(feature.geometry, style); 271 drawFeature: function(feature, style) { 272 if(style == null) { 273 if(feature.style) { 274 style = feature.style; 275 } else { 276 style = this.style; 282 277 } 283 278 } 279 this.renderer.drawGeometry(feature.geometry, style); 284 280 }, 285 281 286 282 /** … … 297 293 }, 298 294 299 295 /** 300 * Stop editing the layer301 *302 * @return Whether or not the layer *was* editing303 * HACK HACK This return value seems wierd to me.304 * @type Boolean305 */306 lock: function() {307 if(this.editing) {308 this.editing = false;309 }310 return this.editing;311 },312 313 /**314 296 * Unselect the selected features 315 297 * i.e. clears the featureSelection array 316 298 * change the style back … … 319 301 var vectorLayer = this.map.vectorLayer; 320 302 for (var i = 0; i < this.map.featureSelection.length; i++) { 321 303 var featureSelection = this.map.featureSelection[i]; 322 vectorLayer.renderer.drawGeometry(featureSelection.geometry, 323 vectorLayer.style); 304 vectorLayer.drawFeature(featureSelection, vectorLayer.style); 324 305 } 325 306 this.map.featureSelection = []; 326 307 }, -
tests/Feature/test_Vector.html
old new 2 2 <head> 3 3 <script src="../../lib/OpenLayers.js"></script> 4 4 <script type="text/javascript"><!-- 5 var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);6 5 var map; 7 6 var feature; 8 7 … … 14 13 t.ok( feature instanceof OpenLayers.Feature.Vector, "new OpenLayers.Feature.Vector returns Feature.Vector object" ); 15 14 } 16 15 16 function test_Feature_Vector_setGeometry(t) { 17 t.plan(5); 18 var p0 = new OpenLayers.Geometry.Point(0, 0); 19 var p1 = new OpenLayers.Geometry.Point(1, 1); 20 var line = new OpenLayers.Geometry.LineString([ 21 new OpenLayers.Geometry.Point(2, 2), 22 new OpenLayers.Geometry.Point(3, 3)]); 23 var collection = new OpenLayers.Geometry.Collection([p0, p1, line]); 24 var feature = new OpenLayers.Feature.Vector(); 25 26 feature.setGeometry(collection); 27 t.ok(collection.feature, 28 "geometry.feature property is set"); 29 t.ok(collection.feature instanceof OpenLayers.Feature.Vector, 30 "geometry.feature is an OpenLayers.Feature.Vector"); 31 t.eq(collection.feature.id, feature.id, 32 "geometry.feature has the same id as the original feature"); 33 t.eq(collection.components[0].feature.id, feature.id, 34 "recursive call sets geometry.feature on geometry.components[0]"); 35 36 var p0 = new OpenLayers.Geometry.Point(0, 0); 37 var p1 = new OpenLayers.Geometry.Point(1, 1); 38 var line = new OpenLayers.Geometry.LineString([ 39 new OpenLayers.Geometry.Point(2, 2), 40 new OpenLayers.Geometry.Point(3, 3)]); 41 var collection = new OpenLayers.Geometry.Collection([p0, p1, line]); 42 var feature = new OpenLayers.Feature.Vector(); 43 feature.setGeometry(collection, false); 44 t.ok(!collection.components[0].feature, 45 "recursive call can be disabled"); 46 47 } 48 17 49 18 50 // --> 19 51 </script> -
tests/Layer/test_Vector.html
old new 21 21 var layer = new OpenLayers.Layer.Vector(name); 22 22 23 23 var point = new OpenLayers.Geometry.Point(-111.04, 45.68); 24 var pointFeature = new OpenLayers.Feature.Vector(layer, point); 25 24 var pointFeature = new OpenLayers.Feature.Vector(point); 26 25 layer.addFeatures([pointFeature]); 27 26 28 27 t.eq(layer.features.length, 1, "OpenLayers.Layer.Vector.addFeatures adds something to the array"); … … 55 54 layer.addFeatures(f); 56 55 t.ok( f.style != null, "Feature style is set by layer."); 57 56 } 57 58 function test_Layer_Vector_drawFeature(t) { 59 t.plan(4); 60 var layer = new OpenLayers.Layer.Vector("Test Layer"); 61 var map = new OpenLayers.Map('map'); 62 map.addLayer(layer); 63 var geometry = new OpenLayers.Geometry.Point(10, 10); 64 var feature = new OpenLayers.Feature.Vector(geometry); 65 66 var g, s; 67 layer.renderer = { 68 drawGeometry: function(geometry, style) { 69 g = geometry; 70 s = style; 71 } 72 }; 58 73 74 layer.drawFeature(feature); 75 t.ok(geometry.equals(g), 76 "calls layer.renderer.drawGeometry() with feature.geometry"); 77 78 feature.style = 'exists'; 79 layer.drawFeature(feature); 80 t.eq(feature.style, s, 81 "calls layer.renderer.drawGeometry() with feature.style"); 82 83 feature.style = null; 84 layer.style = 'exists'; 85 layer.drawFeature(feature); 86 t.eq(layer.style, s, 87 "given null feature style, uses layer style"); 88 89 feature.style = 'exists'; 90 layer.style = 'exists'; 91 var customStyle = 'custom'; 92 layer.drawFeature(feature, customStyle); 93 t.eq(customStyle, s, 94 "given a custom style, renders with that"); 95 96 } 97 59 98 function test_Layer_Vector_destroyFeatures (t) { 60 99 t.plan(2); 61 100 layer = new OpenLayers.Layer.Vector(name);
