diff --git a/examples/openmnnd.html b/examples/openmnnd.html index 30a0c17ec6..9e1283912d 100644 --- a/examples/openmnnd.html +++ b/examples/openmnnd.html @@ -99,25 +99,19 @@ } } } - var displayedGeom = null; - function feature_info_hover(geometry) { - if(geometry.parent) { - geometry = geometry.parent; - } - if (displayedGeom != geometry && - (!geometry.feature.layer.selectedFeatures.length || - (geometry.feature.layer.selectedFeatures[0].geometry == geometry))) { - feature_info(geometry); - displaydGeom = geometry; + var displayedFeature = null; + function feature_info_hover(feature) { + if (displayedFeature != feature && + (!feature.layer.selectedFeatures.length || + (feature.layer.selectedFeatures[0] == feature))) { + feature_info(feature); + displayedFeature = feature; } } - function feature_info(geometry) { - if(geometry.parent) { - geometry = geometry.parent; - } + function feature_info(feature) { var html = ""; $('feature_info').innerHTML = html; } diff --git a/examples/wfs-scribble.html b/examples/wfs-scribble.html index ad02311281..bb741439b8 100644 --- a/examples/wfs-scribble.html +++ b/examples/wfs-scribble.html @@ -35,7 +35,7 @@ df.featureAdded = function(feature) { feature.state = OpenLayers.State.INSERT; feature.style['strokeColor'] = "#ff0000"; - feature.layer.renderer.drawGeometry(feature.geometry, feature.style); + feature.layer.drawFeature(feature); } p.addControls([ new OpenLayers.Control.Navigation(), df ]); @@ -47,7 +47,7 @@ for(var i = 0; i < map.layers[1].features.length; i++) { var f = map.layers[1].features[i]; f.style['strokeColor'] = '#ee9900'; - map.layers[1].renderer.drawGeometry(f.geometry, f.style); + map.layers[1].drawFeature(f); } map.layers[1].commit(); return false; diff --git a/examples/wfs-t.html b/examples/wfs-t.html index 1fe0396013..7ec9fbe0ec 100644 --- a/examples/wfs-t.html +++ b/examples/wfs-t.html @@ -27,7 +27,7 @@ featureNS: 'http://www.openplans.org/topp', extractAttributes: false } ); - rlayer.onFeatureInsert=function(feature) { feature.style.strokeColor = "#ff0000"; feature.layer.renderer.drawGeometry(feature.geometry, feature.style); } + rlayer.onFeatureInsert=function(feature) { feature.style.strokeColor = "#ff0000"; feature.layer.drawFeature(feature); } map.addLayer(rlayer); layer = new OpenLayers.Layer.WFS( "Cities", "http://dev.openlayers.org/geoserver/wfs", {typename: 'topp:tasmania_cities'}, @@ -44,7 +44,7 @@ df.featureAdded = function(feature) { feature.state = OpenLayers.State.INSERT; feature.style['strokeColor'] = "#0000ff"; - feature.layer.renderer.drawGeometry(feature.geometry, feature.style); + feature.layer.drawFeature(feature); } dp = new OpenLayers.Control.DrawFeature(layer, OpenLayers.Handler.Point, {handlerOptions: {'freehand': false}, 'displayClass': 'olControlDrawFeaturePoint'}); dp.featureAdded = function(feature) { @@ -53,7 +53,7 @@ feature.geometry = new OpenLayers.Geometry.MultiPoint(oldgeom); feature.state = OpenLayers.State.INSERT; feature.style['strokeColor'] = "#0000ff"; - feature.layer.renderer.drawGeometry(feature.geometry, feature.style); + feature.layer.drawFeature(feature); } p.addControls([ new OpenLayers.Control.Navigation(), df, dp ]); diff --git a/examples/wkt.html b/examples/wkt.html index 220c59ead1..92c32b5f91 100644 --- a/examples/wkt.html +++ b/examples/wkt.html @@ -77,8 +77,8 @@ } } - function displayWKT(geometry) { - var str = wkt.write(geometry); + function displayWKT(feature) { + var str = wkt.write(feature.geometry); // not a good idea in general, just for this demo str = str.replace(/,/g, ', '); document.getElementById('info').innerHTML = str; diff --git a/lib/OpenLayers/Control/SelectFeature.js b/lib/OpenLayers/Control/SelectFeature.js index 1cacf3a20a..ebda28f0f0 100644 --- a/lib/OpenLayers/Control/SelectFeature.js +++ b/lib/OpenLayers/Control/SelectFeature.js @@ -27,13 +27,13 @@ OpenLayers.Control.SelectFeature.prototype = /** * @type {Function} Optional function to be called when a feature is selected. - * The function should expect to be called with a geometry. + * The function should expect to be called with a feature. */ onSelect: function() {}, /** * @type {Function} Optional function to be called when a feature is unselected. - * The function should expect to be called with a geometry. + * The function should expect to be called with a feature. */ onUnselect: function() {}, @@ -76,31 +76,28 @@ OpenLayers.Control.SelectFeature.prototype = /** * Called when the feature handler detects a mouse-down on a feature - * @param {OpenLayers.Geometry} + * @param {OpenLayers.Vector.Feature} */ - downFeature: function(geometry) { + downFeature: function(feature) { if(this.hover) { return; } - if(geometry.parent) { - geometry = geometry.parent; - } if (this.multiple) { - if(OpenLayers.Util.indexOf(this.layer.selectedFeatures, geometry.feature) > -1) { - this.unselect(geometry); + if(OpenLayers.Util.indexOf(this.layer.selectedFeatures, feature) > -1) { + this.unselect(feature); } else { - this.select(geometry); + this.select(feature); } } else { - if(OpenLayers.Util.indexOf(this.layer.selectedFeatures, geometry.feature) > -1) { - this.unselect(geometry); + if(OpenLayers.Util.indexOf(this.layer.selectedFeatures, feature) > -1) { + this.unselect(feature); } else { if (this.layer.selectedFeatures) { for (var i = 0; i < this.layer.selectedFeatures.length; i++) { - this.unselect(this.layer.selectedFeatures[i].geometry); + this.unselect(this.layer.selectedFeatures[i]); } } - this.select(geometry); + this.select(feature); } } }, @@ -108,63 +105,57 @@ OpenLayers.Control.SelectFeature.prototype = /** * Called when the feature handler detects a mouse-over on a feature. * Only responds if this.hover is true. - * @param {OpenLayers.Geometry} + * @param {OpenLayers.Feature.Vector} */ - overFeature: function(geometry) { + overFeature: function(feature) { if(!this.hover) { return; } - if(geometry.parent) { - geometry = geometry.parent; - } - if(!(OpenLayers.Util.indexOf(this.layer.selectedFeatures, geometry.feature) > -1)) { - this.select(geometry); + if(!(OpenLayers.Util.indexOf(this.layer.selectedFeatures, feature) > -1)) { + this.select(feature); } }, /** * Called when the feature handler detects a mouse-out on a feature. * Only responds if this.hover is true. - * @param {OpenLayers.Geometry} + * @param {OpenLayers.Feature.Vector} */ - outFeature: function(geometry) { + outFeature: function(feature) { if(!this.hover) { return; } - if(geometry.parent) { - geometry = geometry.parent; - } - this.unselect(geometry); + this.unselect(feature); }, /** * Add feature to the layer's selectedFeature array, render the feature as * selected, and call the onSelect function. - * @param {OpenLayers.Geometry} geometry + * @param {OpenLayers.Feature.Vector} feature */ - select: function(geometry) { + select: function(feature) { // Store feature style for restoration later - if(geometry.feature.originalStyle == null) { - geometry.feature.originalStyle = geometry.feature.style; + if(feature.originalStyle == null) { + feature.originalStyle = feature.style; } - this.layer.selectedFeatures.push(geometry.feature); - this.layer.renderer.drawGeometry(geometry, this.selectStyle); - this.onSelect(geometry); + this.layer.selectedFeatures.push(feature); + this.layer.drawFeature(feature, this.selectStyle); + this.onSelect(feature); }, /** * Remove feature from the layer's selectedFeature array, render the feature as * normal, and call the onUnselect function. - * @param {OpenLayers.Geometry} geometry + * @param {OpenLayers.Feature.Vector} feature */ - unselect: function(geometry) { + unselect: function(feature) { // Store feature style for restoration later - if(geometry.feature.originalStyle == null) { - geometry.feature.originalStyle = geometry.feature.style; + if(feature.originalStyle == null) { + feature.originalStyle = feature.style; } - this.layer.renderer.drawGeometry(geometry, geometry.feature.originalStyle); - OpenLayers.Util.removeItem(this.layer.selectedFeatures, geometry.feature); - this.onUnselect(geometry); + this.layer.drawFeature(feature, feature.originalStyle); + OpenLayers.Util.removeItem(this.layer.selectedFeatures, feature); + this.onUnselect(feature); }, /** Set the map property for the control. diff --git a/lib/OpenLayers/Feature/Vector.js b/lib/OpenLayers/Feature/Vector.js index b53e8965a8..dd03caad56 100644 --- a/lib/OpenLayers/Feature/Vector.js +++ b/lib/OpenLayers/Feature/Vector.js @@ -46,7 +46,7 @@ OpenLayers.Feature.Vector.prototype = initialize: function(geometry, data, style) { OpenLayers.Feature.prototype.initialize.apply(this, [null, null, data]); this.lonlat = null; - this.setGeometry(geometry); + this.geometry = geometry; this.state = null; if (data) { OpenLayers.Util.extend(this.attributes, data); @@ -125,56 +125,6 @@ OpenLayers.Feature.Vector.prototype = return null; }, - /** - * Set a feature id to the feature - * - * @param {String} feature id to set - */ - setFid: function(fid) { - this.fid = fid; - }, - - /** - * Set a geometry to the feature - * - * @param {OpenLayers.Geometry} geometry to set - * @param {Boolean} recurse Recursively set feature (for components) - */ - setGeometry: function(geometry, recurse) { - if(geometry) { - this.geometry = geometry; - this.geometry.feature = this; - if (recurse != false) { - this._setGeometryFeatureReference(this.geometry, this); - } - } - }, - - /** - * Sets recursively the reference to the feature in the geometry - * - * @param {OpenLayers.Geometry} - * @param {OpenLayers.Feature} - */ - _setGeometryFeatureReference: function(geometry, feature) { - geometry.feature = feature; - if (geometry.components) { - for (var i = 0; i < geometry.components.length; i++) { - this._setGeometryFeatureReference(geometry.components[i], feature); - } - } - }, - - /** - * Adds attributes an attributes object to the feature. - * (should not be in geometry but in feature class) - * - * @param {Attributes} attributes - */ - setAttributes: function(attributes) { - this.attributes=attributes; - }, - /** * @param {OpenLayers.LonLat} lonlat * @param {float} toleranceLon Optional tolerance in Geometric Coords diff --git a/lib/OpenLayers/Format/GML.js b/lib/OpenLayers/Format/GML.js index b2639c1599..3695684ab2 100644 --- a/lib/OpenLayers/Format/GML.js +++ b/lib/OpenLayers/Format/GML.js @@ -165,7 +165,7 @@ OpenLayers.Format.GML.prototype = } } - feature.setGeometry(geom, false); + feature.geometry = geom; if (this.extractAttributes) { feature.attributes = this.parseAttributes(xmlNode); } diff --git a/lib/OpenLayers/Format/KML.js b/lib/OpenLayers/Format/KML.js index 4d7a8d13d0..7ed9378b35 100644 --- a/lib/OpenLayers/Format/KML.js +++ b/lib/OpenLayers/Format/KML.js @@ -80,7 +80,7 @@ OpenLayers.Format.KML.prototype = } } - feature.setGeometry(geom); + feature.geometry = geom; feature.attributes = this.parseAttributes(xmlNode); return feature; diff --git a/lib/OpenLayers/Geometry.js b/lib/OpenLayers/Geometry.js index 23874b3815..430c11539d 100644 --- a/lib/OpenLayers/Geometry.js +++ b/lib/OpenLayers/Geometry.js @@ -19,14 +19,6 @@ OpenLayers.Geometry.prototype = { /** @type OpenLayers.Bounds */ bounds: null, - - /** - * Cross reference back to the feature that owns this geometry so - * that that the feature can be identified after the geometry has been - * selected by a mouse click. - * - * @type OpenLayers.Feature */ - feature: null, /** * @constructor @@ -42,7 +34,6 @@ OpenLayers.Geometry.prototype = { this.id = null; this.bounds = null; - this.feature = null; }, diff --git a/lib/OpenLayers/Handler/Feature.js b/lib/OpenLayers/Handler/Feature.js index dbf5a35a2d..dafd0297dc 100644 --- a/lib/OpenLayers/Handler/Feature.js +++ b/lib/OpenLayers/Handler/Feature.js @@ -21,9 +21,9 @@ OpenLayers.Handler.Feature.prototype = layerIndex: null, /** - * @type {OpenLayers.Geometry} + * @type {OpenLayers.Feature.Vector} */ - geometry: null, + feature: null, /** * @constructor @@ -33,7 +33,7 @@ OpenLayers.Handler.Feature.prototype = * @param {Array} callbacks An object with a 'over' property whos value is * a function to be called when the mouse is over * a feature. The callback should expect to recieve - * a single argument, the geometry. + * a single argument, the feature. * @param {Object} options */ initialize: function(control, layer, callbacks, options) { @@ -75,7 +75,7 @@ OpenLayers.Handler.Feature.prototype = /** * Capture double-clicks. Let the event continue propagating if the - * double-click doesn't hit a geometry. Otherwise call the dblclick + * double-click doesn't hit a feature. Otherwise call the dblclick * callback. * * @param {Event} evt @@ -92,26 +92,26 @@ OpenLayers.Handler.Feature.prototype = * @type {Boolean} A feature was selected */ select: function(type, evt) { - var geometry = this.layer.renderer.getGeometryFromEvent(evt); - if(geometry) { + var feature = this.layer.getFeatureFromEvent(evt); + if(feature) { // three cases: // over a new, out of the last and over a new, or still on the last - if(!this.geometry) { - // over a new geometry - this.callback('over', [geometry]); - } else if(this.geometry != geometry) { + if(!this.feature) { + // over a new feature + this.callback('over', [feature]); + } else if(this.feature != feature) { // out of the last and over a new - this.callback('out', [this.geometry]); - this.callback('over', [geometry]); + this.callback('out', [this.feature]); + this.callback('over', [feature]); } - this.geometry = geometry; - this.callback(type, [geometry]); + this.feature = feature; + this.callback(type, [feature]); return true; } else { - if(this.geometry) { + if(this.feature) { // out of the last - this.callback('out', [this.geometry]); - this.geometry = null; + this.callback('out', [this.feature]); + this.feature = null; } return false; } diff --git a/lib/OpenLayers/Handler/Path.js b/lib/OpenLayers/Handler/Path.js index 748f72e28b..0b0c42a7b1 100644 --- a/lib/OpenLayers/Handler/Path.js +++ b/lib/OpenLayers/Handler/Path.js @@ -17,7 +17,7 @@ OpenLayers.Handler.Path.prototype = OpenLayers.Class.inherit(OpenLayers.Handler.Point, { /** - * @type OpenLayers.Geometry.LineString + * @type OpenLayers.Feature.Vector * @private */ line: null, @@ -65,15 +65,17 @@ OpenLayers.Handler.Path.prototype = /** * Add temporary geometries */ - createGeometry: function() { - this.line = new OpenLayers.Geometry.LineString(); - this.point = new OpenLayers.Geometry.Point(); + createFeature: function() { + this.line = new OpenLayers.Feature.Vector( + new OpenLayers.Geometry.LineString()); + this.point = new OpenLayers.Feature.Vector( + new OpenLayers.Geometry.Point()); }, /** * Destroy temporary geometries */ - destroyGeometry: function() { + destroyFeature: function() { this.line.destroy(); this.point.destroy(); }, @@ -83,7 +85,9 @@ OpenLayers.Handler.Path.prototype = * the behavior of LinearRing that disregards adding duplicate points. */ addPoint: function() { - this.line.addComponent(this.point.clone(), this.line.components.length); + this.line.geometry.addComponent(this.point.geometry.clone(), + this.line.geometry.components.length); + this.callback("point", [this.point.geometry]); }, /** @@ -100,18 +104,18 @@ OpenLayers.Handler.Path.prototype = * Modify the existing geometry given the new point * */ - modifyGeometry: function() { - var index = this.line.components.length - 1; - this.line.components[index].x = this.point.x; - this.line.components[index].y = this.point.y; + modifyFeature: function() { + var index = this.line.geometry.components.length - 1; + this.line.geometry.components[index].x = this.point.geometry.x; + this.line.geometry.components[index].y = this.point.geometry.y; }, /** * Render geometries on the temporary layer. */ - drawGeometry: function() { - this.layer.renderer.drawGeometry(this.line, this.style); - this.layer.renderer.drawGeometry(this.point, this.style); + drawFeature: function() { + this.layer.drawFeature(this.line, this.style); + this.layer.drawFeature(this.point, this.style); }, /** @@ -120,7 +124,7 @@ OpenLayers.Handler.Path.prototype = * @type OpenLayers.Geometry.LineString */ geometryClone: function() { - return this.line.clone(); + return this.line.geometry.clone(); }, /** @@ -136,17 +140,17 @@ OpenLayers.Handler.Path.prototype = return false; } if(this.lastDown == null) { - this.createGeometry(); + this.createFeature(); } this.mouseDown = true; this.lastDown = evt.xy; var lonlat = this.control.map.getLonLatFromPixel(evt.xy); - this.point.x = lonlat.lon; - this.point.y = lonlat.lat; + this.point.geometry.x = lonlat.lon; + this.point.geometry.y = lonlat.lat; if((this.lastUp == null) || !this.lastUp.equals(evt.xy)) { this.addPoint(); } - this.drawGeometry(); + this.drawFeature(); this.drawing = true; return false; }, @@ -161,14 +165,14 @@ OpenLayers.Handler.Path.prototype = mousemove: function (evt) { if(this.drawing) { var lonlat = this.map.getLonLatFromPixel(evt.xy); - this.point.x = lonlat.lon; - this.point.y = lonlat.lat; + this.point.geometry.x = lonlat.lon; + this.point.geometry.y = lonlat.lat; if(this.mouseDown && this.freehandMode(evt)) { this.addPoint(); } else { - this.modifyGeometry(); + this.modifyFeature(); } - this.drawGeometry(); + this.drawFeature(); } return true; }, @@ -190,7 +194,6 @@ OpenLayers.Handler.Path.prototype = this.addPoint(); } this.lastUp = evt.xy; - this.callback("point", [this.point]); } return false; } @@ -205,9 +208,9 @@ OpenLayers.Handler.Path.prototype = */ dblclick: function(evt) { if(!this.freehandMode(evt)) { - var index = this.line.components.length - 1; - this.line.removeComponent(this.line.components[index]); - this.finalize(this.line); + var index = this.line.geometry.components.length - 1; + this.line.geometry.removeComponent(this.line.geometry.components[index]); + this.finalize(); } return false; }, diff --git a/lib/OpenLayers/Handler/Point.js b/lib/OpenLayers/Handler/Point.js index c39ac7aaf9..435ce7025d 100644 --- a/lib/OpenLayers/Handler/Point.js +++ b/lib/OpenLayers/Handler/Point.js @@ -16,7 +16,7 @@ OpenLayers.Handler.Point.prototype = OpenLayers.Class.inherit(OpenLayers.Handler, { /** - * @type OpenLayers.Geometry.Point + * @type OpenLayers.Feature.Vector * @private */ point: null, @@ -87,10 +87,11 @@ OpenLayers.Handler.Point.prototype = }, /** - * Add temporary geometries + * Add temporary features */ - createGeometry: function() { - this.point = new OpenLayers.Geometry.Point(); + createFeature: function() { + this.point = new OpenLayers.Feature.Vector( + new OpenLayers.Geometry.Point()); }, /** @@ -112,7 +113,7 @@ OpenLayers.Handler.Point.prototype = /** * Destroy the temporary geometries */ - destroyGeometry: function() { + destroyFeature: function() { this.point.destroy(); }, @@ -122,7 +123,7 @@ OpenLayers.Handler.Point.prototype = finalize: function() { this.layer.renderer.clear(); this.callback("done", [this.geometryClone()]); - this.destroyGeometry(); + this.destroyFeature(); this.drawing = false; this.mouseDown = false; this.lastDown = null; @@ -135,7 +136,7 @@ OpenLayers.Handler.Point.prototype = cancel: function() { this.layer.renderer.clear(); this.callback("cancel", [this.geometryClone()]); - this.destroyGeometry(); + this.destroyFeature(); this.drawing = false; this.mouseDown = false; this.lastDown = null; @@ -151,10 +152,10 @@ OpenLayers.Handler.Point.prototype = }, /** - * Render geometries on the temporary layer. + * Render features on the temporary layer. */ - drawGeometry: function() { - this.layer.renderer.drawGeometry(this.point, this.style); + drawFeature: function() { + this.layer.drawFeature(this.point, this.style); }, /** @@ -163,7 +164,7 @@ OpenLayers.Handler.Point.prototype = * @type OpenLayers.Geometry.Point */ geometryClone: function() { - return this.point.clone(); + return this.point.geometry.clone(); }, /** @@ -183,14 +184,14 @@ OpenLayers.Handler.Point.prototype = return true; } if(this.lastDown == null) { - this.createGeometry(); + this.createFeature(); } this.lastDown = evt.xy; this.drawing = true; var lonlat = this.map.getLonLatFromPixel(evt.xy); - this.point.x = lonlat.lon; - this.point.y = lonlat.lat; - this.drawGeometry(); + this.point.geometry.x = lonlat.lon; + this.point.geometry.y = lonlat.lat; + this.drawFeature(); return false; }, @@ -204,9 +205,9 @@ OpenLayers.Handler.Point.prototype = mousemove: function (evt) { if(this.drawing) { var lonlat = this.map.getLonLatFromPixel(evt.xy); - this.point.x = lonlat.lon; - this.point.y = lonlat.lat; - this.drawGeometry(); + this.point.geometry.x = lonlat.lon; + this.point.geometry.y = lonlat.lat; + this.drawFeature(); } return true; }, @@ -220,7 +221,7 @@ OpenLayers.Handler.Point.prototype = */ mouseup: function (evt) { if(this.drawing) { - this.finalize(this.point); + this.finalize(); return false; } else { return true; diff --git a/lib/OpenLayers/Handler/Polygon.js b/lib/OpenLayers/Handler/Polygon.js index 31089d63d2..8225c5e038 100644 --- a/lib/OpenLayers/Handler/Polygon.js +++ b/lib/OpenLayers/Handler/Polygon.js @@ -16,7 +16,7 @@ OpenLayers.Handler.Polygon.prototype = OpenLayers.Class.inherit(OpenLayers.Handler.Path, { /** - * @type OpenLayers.Geometry.Polygon + * @type OpenLayers.Feature.Vector * @private */ polygon: null, @@ -44,17 +44,20 @@ OpenLayers.Handler.Polygon.prototype = /** * Add temporary geometries */ - createGeometry: function() { - this.polygon = new OpenLayers.Geometry.Polygon(); - this.line = new OpenLayers.Geometry.LinearRing(); - this.polygon.addComponent(this.line); - this.point = new OpenLayers.Geometry.Point(); + createFeature: function() { + this.polygon = new OpenLayers.Feature.Vector( + new OpenLayers.Geometry.Polygon()); + this.line = new OpenLayers.Feature.Vector( + new OpenLayers.Geometry.LinearRing()); + this.polygon.geometry.addComponent(this.line.geometry); + this.point = new OpenLayers.Feature.Vector( + new OpenLayers.Geometry.Point()); }, /** * Destroy temporary geometries */ - destroyGeometry: function() { + destroyFeature: function() { this.polygon.destroy(); this.point.destroy(); }, @@ -63,18 +66,18 @@ OpenLayers.Handler.Polygon.prototype = * Modify the existing geometry given the new point * */ - modifyGeometry: function() { - var index = this.line.components.length - 2; - this.line.components[index].x = this.point.x; - this.line.components[index].y = this.point.y; + modifyFeature: function() { + var index = this.line.geometry.components.length - 2; + this.line.geometry.components[index].x = this.point.geometry.x; + this.line.geometry.components[index].y = this.point.geometry.y; }, /** * Render geometries on the temporary layer. */ - drawGeometry: function() { - this.layer.renderer.drawGeometry(this.polygon, this.style); - this.layer.renderer.drawGeometry(this.point, this.style); + drawFeature: function() { + this.layer.drawFeature(this.polygon, this.style); + this.layer.drawFeature(this.point, this.style); }, /** @@ -83,7 +86,7 @@ OpenLayers.Handler.Polygon.prototype = * @type OpenLayers.Geometry.Polygon */ geometryClone: function() { - return this.polygon.clone(); + return this.polygon.geometry.clone(); }, /** @@ -95,9 +98,9 @@ OpenLayers.Handler.Polygon.prototype = dblclick: function(evt) { if(!this.freehandMode(evt)) { // remove the penultimate point - var index = this.line.components.length - 2; - this.line.removeComponent(this.line.components[index]); - this.finalize(this.line); + var index = this.line.geometry.components.length - 2; + this.line.geometry.removeComponent(this.line.geometry.components[index]); + this.finalize(); } return false; }, diff --git a/lib/OpenLayers/Layer/Vector.js b/lib/OpenLayers/Layer/Vector.js index a752552932..ae8c0076a5 100644 --- a/lib/OpenLayers/Layer/Vector.js +++ b/lib/OpenLayers/Layer/Vector.js @@ -21,18 +21,12 @@ OpenLayers.Layer.Vector.prototype = /** @type Boolean */ isVector: true, - /** @type {Array(OpenLayer.Feature.Vector)} */ + /** @type Array(OpenLayer.Feature.Vector) */ features: null, - /** @type {Array(OpenLayers.Feature.Vector)} */ + /** @type Array(OpenLayers.Feature.Vector) */ selectedFeatures: [], - /** @type {Boolean} */ - editing: false, - - /** @type {Boolean} */ - editable: false, - /** @type {Boolean} */ reportError: true, @@ -75,6 +69,7 @@ OpenLayers.Layer.Vector.prototype = * Options renderer {Object}: Typically SVGRenderer or VMLRenderer. */ initialize: function(name, options) { + this.style = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']); OpenLayers.Layer.prototype.initialize.apply(this, arguments); // allow user-set renderer, otherwise assign one @@ -102,8 +97,6 @@ OpenLayers.Layer.Vector.prototype = // calling feature[i].destroy() here. this.features = null; this.selectedFeatures = null; - this.editing = null; - this.editable = null; if (this.renderer) { this.renderer.destroy(); } @@ -172,7 +165,7 @@ OpenLayers.Layer.Vector.prototype = /** Reset the vector layer's div so that it once again is lined up with * the map. Notify the renderer of the change of extent, and in the * case of a change of zoom level (resolution), have the - * renderer reproject. + * renderer redraw features. * * If the layer has not yet been drawn, cycle through the layer's * features and draw each one. @@ -191,15 +184,11 @@ OpenLayers.Layer.Vector.prototype = this.renderer.setExtent(extent); } - if (zoomChanged) { - this.renderer.reproject(); - } - - if (!this.drawn) { + if (!this.drawn || zoomChanged) { this.drawn = true; for(var i = 0; i < this.features.length; i++) { var feature = this.features[i]; - this.renderer.drawGeometry(feature.geometry, feature.style); + this.drawFeature(feature); } } }, @@ -228,17 +217,13 @@ OpenLayers.Layer.Vector.prototype = feature.layer = this; if (!feature.style) { - if (this.style) { - feature.style = OpenLayers.Util.extend({}, this.style); - } else { - feature.style = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']); - } + feature.style = OpenLayers.Util.extend({}, this.style); } this.preFeatureInsert(feature); if (this.drawn) { - this.renderer.drawGeometry(feature.geometry, feature.style); + this.drawFeature(feature); } this.onFeatureInsert(feature); @@ -271,45 +256,57 @@ OpenLayers.Layer.Vector.prototype = }, /** - * @param {String} fid + * Draw (or redraw) a feature on the layer. If the optional style argument + * is included, this style will be used. If no style is included, the + * feature's style will be used. If the feature doesn't have a style, + * the layer's style will be used. + * + * @param {OpenLayers.Feature.Vector} feature * @param {Object} style */ - redrawFeature: function(fid, style) { - for (var i = 0; i < this.features.length; i++) { - var feature = this.features[i]; - if (feature.fid == fid) { - this.renderer.drawGeometry(feature.geometry, style); + drawFeature: function(feature, style) { + if(style == null) { + if(feature.style) { + style = feature.style; + } else { + style = this.style; } } + this.renderer.drawFeature(feature, style); }, /** - * Start editing the layer - * - * @returns Whether or not the layer is editable - * @type Boolean + * Given an event, return a feature if the event occurred over one. + * Otherwise, return null. + * + * @param {Event} + * @type OpenLayers.Feature.Vector + * @return A feature if one was under the event */ - unlock: function() { - if(this.editable) { - this.editing = true; - } - return this.editable; + getFeatureFromEvent: function(evt) { + var featureId = this.renderer.getFeatureIdFromEvent(evt); + return this.getFeatureById(featureId); }, - + /** - * Stop editing the layer + * Given a feature id, return the feature if it exists in the features array * - * @return Whether or not the layer *was* editing - * HACK HACK This return value seems wierd to me. - * @type Boolean + * @param String featureId + * @type OpenLayers.Feature.Vector + * @return A feature corresponding to the given featureId */ - lock: function() { - if(this.editing) { - this.editing = false; + getFeatureById: function(featureId) { + //TBD - would it be more efficient to use a hash for this.features? + var feature = null; + for(var i=0; i