#628 - a feature has a geometry - a geometry doesn't have a feature - features are rendered, selected, moved, modified, etc - down in the renderer, expando properties on nodes are limited to _featureId, _style, and _options - this removes expandos that created circular references back through the map and to other dom elements - when the renderer is involved in selecting features, it returns a featureId (instead of a geometry or feature) and the layer is responsible for fetching the appropriate feature
git-svn-id: http://svn.openlayers.org/trunk/openlayers@3043 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
@@ -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 = "<ul>";
|
||||
for(var i in geometry.feature.attributes)
|
||||
html += "<li><b>" + i + "</b>: "+ geometry.feature.attributes[i] + "</li>";
|
||||
for(var i in feature.attributes)
|
||||
html += "<li><b>" + i + "</b>: "+ feature.attributes[i] + "</li>";
|
||||
html += "</ul>";
|
||||
$('feature_info').innerHTML = 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;
|
||||
|
||||
@@ -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 ]);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -165,7 +165,7 @@ OpenLayers.Format.GML.prototype =
|
||||
}
|
||||
}
|
||||
|
||||
feature.setGeometry(geom, false);
|
||||
feature.geometry = geom;
|
||||
if (this.extractAttributes) {
|
||||
feature.attributes = this.parseAttributes(xmlNode);
|
||||
}
|
||||
|
||||
@@ -80,7 +80,7 @@ OpenLayers.Format.KML.prototype =
|
||||
}
|
||||
}
|
||||
|
||||
feature.setGeometry(geom);
|
||||
feature.geometry = geom;
|
||||
feature.attributes = this.parseAttributes(xmlNode);
|
||||
|
||||
return feature;
|
||||
|
||||
@@ -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;
|
||||
|
||||
},
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
},
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
},
|
||||
|
||||
@@ -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<this.features.length; ++i) {
|
||||
if(this.features[i].id == featureId) {
|
||||
feature = this.features[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
return this.editing;
|
||||
return feature;
|
||||
},
|
||||
|
||||
|
||||
/**
|
||||
* Unselect the selected features
|
||||
* i.e. clears the featureSelection array
|
||||
@@ -319,8 +316,7 @@ OpenLayers.Layer.Vector.prototype =
|
||||
var vectorLayer = this.map.vectorLayer;
|
||||
for (var i = 0; i < this.map.featureSelection.length; i++) {
|
||||
var featureSelection = this.map.featureSelection[i];
|
||||
vectorLayer.renderer.drawGeometry(featureSelection.geometry,
|
||||
vectorLayer.style);
|
||||
vectorLayer.drawFeature(featureSelection, vectorLayer.style);
|
||||
}
|
||||
this.map.featureSelection = [];
|
||||
},
|
||||
|
||||
@@ -106,13 +106,26 @@ OpenLayers.Renderer.prototype =
|
||||
return this.resolution;
|
||||
},
|
||||
|
||||
/**
|
||||
* Draw the feature. The optional style argument can be used
|
||||
* to override the feature's own style. This method should only
|
||||
* be called from layer.drawFeature(). Implemented by a renderer
|
||||
* subclass.
|
||||
*
|
||||
* @param {OpenLayers.Feature.Vector} feature
|
||||
* @param {Object} style
|
||||
*/
|
||||
drawFeature: function(feature, style) {},
|
||||
|
||||
/**
|
||||
* virtual function
|
||||
*
|
||||
* Draw a geometry on the specified layer.
|
||||
* Draw a geometry. This should only be called from the renderer itself.
|
||||
* Use layer.drawFeature() from outside the renderer.
|
||||
*
|
||||
* @param geometry {OpenLayers.Geometry}
|
||||
* @param style {Object}
|
||||
* @private
|
||||
*/
|
||||
drawGeometry: function(geometry, style) {},
|
||||
|
||||
@@ -127,15 +140,17 @@ OpenLayers.Renderer.prototype =
|
||||
/**
|
||||
* virtual function
|
||||
*
|
||||
* Returns a geometry from an event that happened on a layer.
|
||||
* How this happens is specific to the renderer.
|
||||
* Returns a feature id from an event on the renderer.
|
||||
* How this happens is specific to the renderer. This should be
|
||||
* called from layer.getFeatureFromEvent().
|
||||
*
|
||||
* @param evt {OpenLayers.Event}
|
||||
*
|
||||
* @returns A geometry from an event that happened on a layer
|
||||
* @type OpenLayers.Geometry
|
||||
* @returns A feature id or null
|
||||
* @type String
|
||||
* @private
|
||||
*/
|
||||
getGeometryFromEvent: function(evt) {},
|
||||
getFeatureIdFromEvent: function(evt) {},
|
||||
|
||||
/**
|
||||
* virtual function
|
||||
|
||||
@@ -61,7 +61,7 @@ OpenLayers.Renderer.Elements.prototype =
|
||||
|
||||
/**
|
||||
* Remove all the elements from the root
|
||||
*
|
||||
* @private
|
||||
*/
|
||||
clear: function() {
|
||||
if (this.root) {
|
||||
@@ -71,24 +71,6 @@ OpenLayers.Renderer.Elements.prototype =
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Cycle through the rendered nodes and reproject them (this should be
|
||||
* called when the extent or size has changed);
|
||||
*
|
||||
* @param {OpenLayers.Bounds} extent
|
||||
*/
|
||||
reproject: function(extent) {
|
||||
|
||||
for (var i = 0; i < this.root.childNodes.length; i++) {
|
||||
var node = this.root.childNodes[i];
|
||||
//reproject node
|
||||
// for the moment, this only really happens so as to reset
|
||||
// the heaviness of the line relative to the resolution and
|
||||
// the size of the circle for the Point object
|
||||
this.reprojectNode(node);
|
||||
}
|
||||
},
|
||||
|
||||
/** This function is in charge of asking the specific renderer which type
|
||||
* of node to create for the given geometry. All geometries in an
|
||||
* Elements-based renderer consist of one node and some attributes. We
|
||||
@@ -100,23 +82,42 @@ OpenLayers.Renderer.Elements.prototype =
|
||||
*
|
||||
* @returns The corresponding node type for the specified geometry
|
||||
* @type String
|
||||
* @private
|
||||
*/
|
||||
getNodeType: function(geometry) { },
|
||||
|
||||
|
||||
/**
|
||||
* Draw the geometry on the specified layer, creating new nodes,
|
||||
* setting paths, setting style.
|
||||
* Draw the feature. The optional style argument can be used
|
||||
* to override the feature's own style. This method should only
|
||||
* be called from layer.drawFeature().
|
||||
*
|
||||
* @param {OpenLayers.Feature.Vector} feature
|
||||
* @param {Object} style
|
||||
*/
|
||||
drawFeature: function(feature, style) {
|
||||
if(style == null) {
|
||||
style = feature.style;
|
||||
}
|
||||
this.drawGeometry(feature.geometry, style, feature.id);
|
||||
},
|
||||
|
||||
/**
|
||||
* Draw the geometry, creating new nodes, setting paths, setting style,
|
||||
* setting featureId on the node. This method should only be called
|
||||
* by the renderer itself.
|
||||
*
|
||||
* @param {OpenLayers.Geometry} geometry
|
||||
* @param {Object} style
|
||||
* @param {Object} style
|
||||
* @param {String} featureId
|
||||
* @private
|
||||
*/
|
||||
drawGeometry: function(geometry, style) {
|
||||
drawGeometry: function(geometry, style, featureId) {
|
||||
|
||||
if ((geometry.CLASS_NAME == "OpenLayers.Geometry.MultiPoint") ||
|
||||
(geometry.CLASS_NAME == "OpenLayers.Geometry.MultiLineString") ||
|
||||
(geometry.CLASS_NAME == "OpenLayers.Geometry.MultiPolygon")) {
|
||||
for (var i = 0; i < geometry.components.length; i++) {
|
||||
this.drawGeometry(geometry.components[i], style);
|
||||
this.drawGeometry(geometry.components[i], style, featureId);
|
||||
}
|
||||
return;
|
||||
};
|
||||
@@ -124,24 +125,27 @@ OpenLayers.Renderer.Elements.prototype =
|
||||
//first we create the basic node and add it to the root
|
||||
var nodeType = this.getNodeType(geometry);
|
||||
var node = this.nodeFactory(geometry.id, nodeType, geometry);
|
||||
node.geometry = geometry;
|
||||
node.olStyle = style;
|
||||
node._featureId = featureId;
|
||||
node._geometryClass = geometry.CLASS_NAME;
|
||||
node._style = style;
|
||||
this.root.appendChild(node);
|
||||
|
||||
//now actually draw the node, and style it
|
||||
this.drawGeometryNode(node);
|
||||
this.drawGeometryNode(node, geometry);
|
||||
},
|
||||
|
||||
/**
|
||||
* Given a node, draw a geometry on the specified layer.
|
||||
* node and geometry are required arguments, style is optional.
|
||||
* This method is only called by the render itself.
|
||||
*
|
||||
* @param {DOMElement} node
|
||||
* @param {OpenLayers.Geometry} geometry
|
||||
* @param {Object} style
|
||||
* @param {Object} style
|
||||
* @private
|
||||
*/
|
||||
drawGeometryNode: function(node, geometry, style) {
|
||||
geometry = geometry || node.geometry;
|
||||
style = style || node.olStyle;
|
||||
style = style || node._style;
|
||||
|
||||
var options = {
|
||||
'isFilled': true,
|
||||
@@ -171,19 +175,22 @@ OpenLayers.Renderer.Elements.prototype =
|
||||
break;
|
||||
}
|
||||
|
||||
node.olStyle = style;
|
||||
node.olOptions = options;
|
||||
node._style = style;
|
||||
node._options = options;
|
||||
|
||||
//set style
|
||||
this.setStyle(node);
|
||||
//TBD simplify this
|
||||
this.setStyle(node, style, options, geometry);
|
||||
},
|
||||
|
||||
/**
|
||||
* virtual functions for drawing different Geometries.
|
||||
* These should all be implemented by subclasses.
|
||||
* These methods are only called by the render itself.
|
||||
*
|
||||
* @param {DOMElement} node
|
||||
* @param {OpenLayers.Geometry} geometry
|
||||
* @param {OpenLayers.Geometry} geometry
|
||||
* @private
|
||||
*/
|
||||
drawPoint: function(node, geometry) {},
|
||||
drawLineString: function(node, geometry) {},
|
||||
@@ -200,10 +207,9 @@ OpenLayers.Renderer.Elements.prototype =
|
||||
* @returns A geometry from an event that happened on a layer
|
||||
* @type OpenLayers.Geometry
|
||||
*/
|
||||
getGeometryFromEvent: function(evt) {
|
||||
getFeatureIdFromEvent: function(evt) {
|
||||
var node = evt.target || evt.srcElement;
|
||||
var geometry = node.geometry ? node.geometry : null
|
||||
return geometry;
|
||||
return node._featureId;
|
||||
},
|
||||
|
||||
/** Erase a geometry from the renderer. In the case of a multi-geometry,
|
||||
|
||||
@@ -46,6 +46,7 @@ OpenLayers.Renderer.SVG.prototype =
|
||||
|
||||
/**
|
||||
* @param {OpenLayers.Bounds} extent
|
||||
* @private
|
||||
*/
|
||||
setExtent: function(extent) {
|
||||
OpenLayers.Renderer.Elements.prototype.setExtent.apply(this,
|
||||
@@ -64,6 +65,7 @@ OpenLayers.Renderer.SVG.prototype =
|
||||
* sets the size of the drawing surface
|
||||
*
|
||||
* @param size {OpenLayers.Size} the size of the drawing surface
|
||||
* @private
|
||||
*/
|
||||
setSize: function(size) {
|
||||
OpenLayers.Renderer.prototype.setSize.apply(this, arguments);
|
||||
@@ -80,6 +82,7 @@ OpenLayers.Renderer.SVG.prototype =
|
||||
*
|
||||
* @returns The corresponding node type for the specified geometry
|
||||
* @type String
|
||||
* @private
|
||||
*/
|
||||
getNodeType: function(geometry) {
|
||||
var nodeType = null;
|
||||
@@ -106,14 +109,7 @@ OpenLayers.Renderer.SVG.prototype =
|
||||
}
|
||||
return nodeType;
|
||||
},
|
||||
|
||||
/**
|
||||
* @param {DOMElement} node
|
||||
*/
|
||||
reprojectNode: function(node) {
|
||||
this.drawGeometryNode(node);
|
||||
},
|
||||
|
||||
|
||||
/**
|
||||
* Use to set all the style attributes to a SVG node.
|
||||
*
|
||||
@@ -125,13 +121,13 @@ OpenLayers.Renderer.SVG.prototype =
|
||||
* @param {Object} options
|
||||
* @option isFilled {boolean}
|
||||
* @option isStroked {boolean}
|
||||
* @private
|
||||
*/
|
||||
setStyle: function(node, style, options) {
|
||||
style = style || node.olStyle;
|
||||
options = options || node.olOptions;
|
||||
style = style || node._style;
|
||||
options = options || node._options;
|
||||
|
||||
|
||||
if (node.geometry.CLASS_NAME == "OpenLayers.Geometry.Point") {
|
||||
if (node._geometryClass == "OpenLayers.Geometry.Point") {
|
||||
node.setAttributeNS(null, "r", style.pointRadius);
|
||||
}
|
||||
|
||||
@@ -192,6 +188,7 @@ OpenLayers.Renderer.SVG.prototype =
|
||||
/**
|
||||
* @returns The specific render engine's root element
|
||||
* @type DOMElement
|
||||
* @private
|
||||
*/
|
||||
createRenderRoot: function() {
|
||||
var id = this.container.id + "_svgRoot";
|
||||
@@ -202,6 +199,7 @@ OpenLayers.Renderer.SVG.prototype =
|
||||
/**
|
||||
* @returns The main root element to which we'll add vectors
|
||||
* @type DOMElement
|
||||
* @private
|
||||
*/
|
||||
createRoot: function() {
|
||||
var id = this.container.id + "_root";
|
||||
@@ -224,6 +222,7 @@ OpenLayers.Renderer.SVG.prototype =
|
||||
/**
|
||||
* @param {DOMElement} node
|
||||
* @param {OpenLayers.Geometry} geometry
|
||||
* @private
|
||||
*/
|
||||
drawPoint: function(node, geometry) {
|
||||
this.drawCircle(node, geometry, 1);
|
||||
@@ -233,6 +232,7 @@ OpenLayers.Renderer.SVG.prototype =
|
||||
* @param {DOMElement} node
|
||||
* @param {OpenLayers.Geometry} geometry
|
||||
* @param {float} radius
|
||||
* @private
|
||||
*/
|
||||
drawCircle: function(node, geometry, radius) {
|
||||
var resolution = this.getResolution();
|
||||
@@ -244,6 +244,7 @@ OpenLayers.Renderer.SVG.prototype =
|
||||
/**
|
||||
* @param {DOMElement} node
|
||||
* @param {OpenLayers.Geometry} geometry
|
||||
* @private
|
||||
*/
|
||||
drawLineString: function(node, geometry) {
|
||||
node.setAttributeNS(null, "points", this.getComponentsString(geometry.components));
|
||||
@@ -252,6 +253,7 @@ OpenLayers.Renderer.SVG.prototype =
|
||||
/**
|
||||
* @param {DOMElement} node
|
||||
* @param {OpenLayers.Geometry} geometry
|
||||
* @private
|
||||
*/
|
||||
drawLinearRing: function(node, geometry) {
|
||||
node.setAttributeNS(null, "points", this.getComponentsString(geometry.components));
|
||||
@@ -260,6 +262,7 @@ OpenLayers.Renderer.SVG.prototype =
|
||||
/**
|
||||
* @param {DOMElement} node
|
||||
* @param {OpenLayers.Geometry} geometry
|
||||
* @private
|
||||
*/
|
||||
drawPolygon: function(node, geometry) {
|
||||
var d = "";
|
||||
@@ -279,6 +282,7 @@ OpenLayers.Renderer.SVG.prototype =
|
||||
/**
|
||||
* @param {DOMElement} node
|
||||
* @param {OpenLayers.Geometry} geometry
|
||||
* @private
|
||||
*/
|
||||
drawRectangle: function(node, geometry) {
|
||||
node.setAttributeNS(null, "x", geometry.x / resolution);
|
||||
@@ -291,6 +295,7 @@ OpenLayers.Renderer.SVG.prototype =
|
||||
/**
|
||||
* @param {DOMElement} node
|
||||
* @param {OpenLayers.Geometry} geometry
|
||||
* @private
|
||||
*/
|
||||
drawCurve: function(node, geometry) {
|
||||
var d = null;
|
||||
@@ -309,6 +314,7 @@ OpenLayers.Renderer.SVG.prototype =
|
||||
/**
|
||||
* @param {DOMElement} node
|
||||
* @param {OpenLayers.Geometry} geometry
|
||||
* @private
|
||||
*/
|
||||
drawSurface: function(node, geometry) {
|
||||
|
||||
@@ -329,6 +335,7 @@ OpenLayers.Renderer.SVG.prototype =
|
||||
|
||||
/**
|
||||
* @param {Array} components array of points
|
||||
* @private
|
||||
*/
|
||||
getComponentsString: function(components) {
|
||||
var strings = [];
|
||||
@@ -341,6 +348,7 @@ OpenLayers.Renderer.SVG.prototype =
|
||||
|
||||
/**
|
||||
* @param {OpenLayers.Geometry.Point} point
|
||||
* @private
|
||||
*/
|
||||
getShortString: function(point) {
|
||||
var resolution = this.getResolution();
|
||||
|
||||
@@ -89,6 +89,7 @@ OpenLayers.Renderer.VML.prototype =
|
||||
*
|
||||
* @returns The corresponding node type for the specified geometry
|
||||
* @type String
|
||||
* @private
|
||||
*/
|
||||
getNodeType: function(geometry) {
|
||||
var nodeType = null;
|
||||
@@ -112,16 +113,6 @@ OpenLayers.Renderer.VML.prototype =
|
||||
return nodeType;
|
||||
},
|
||||
|
||||
/**
|
||||
* @param {DOMElement} node
|
||||
*/
|
||||
reprojectNode: function(node) {
|
||||
//we have to reprojectNode the entire node since the coordinates
|
||||
// system has changed
|
||||
this.drawGeometryNode(node);
|
||||
},
|
||||
|
||||
|
||||
/**
|
||||
* Use to set all the style attributes to a VML node.
|
||||
*
|
||||
@@ -129,14 +120,16 @@ OpenLayers.Renderer.VML.prototype =
|
||||
* @param {Object} style
|
||||
* @param {Object} options
|
||||
* @option isFilled {boolean}
|
||||
* @option isStroked {boolean}
|
||||
* @option isStroked {boolean}
|
||||
* @param {OpenLayers.Geometry} geometry
|
||||
* @private
|
||||
*/
|
||||
setStyle: function(node, style, options) {
|
||||
style = style || node.olStyle;
|
||||
options = options || node.olOptions;
|
||||
setStyle: function(node, style, options, geometry) {
|
||||
style = style || node._style;
|
||||
options = options || node._options;
|
||||
|
||||
if (node.geometry.CLASS_NAME == "OpenLayers.Geometry.Point") {
|
||||
this.drawCircle(node, node.geometry, style.pointRadius);
|
||||
if (node._geometryClass == "OpenLayers.Geometry.Point") {
|
||||
this.drawCircle(node, geometry, style.pointRadius);
|
||||
}
|
||||
|
||||
//fill
|
||||
@@ -186,6 +179,7 @@ OpenLayers.Renderer.VML.prototype =
|
||||
*
|
||||
* @param {DOMElement} node
|
||||
* @param {OpenLayers.Geometry} geometry
|
||||
* @private
|
||||
*/
|
||||
setNodeDimension: function(node, geometry) {
|
||||
|
||||
@@ -257,6 +251,7 @@ OpenLayers.Renderer.VML.prototype =
|
||||
/**
|
||||
* @returns The specific render engine's root element
|
||||
* @type DOMElement
|
||||
* @private
|
||||
*/
|
||||
createRenderRoot: function() {
|
||||
var id = this.container.id + "_vmlRoot";
|
||||
@@ -267,6 +262,7 @@ OpenLayers.Renderer.VML.prototype =
|
||||
/**
|
||||
* @returns The main root element to which we'll add vectors
|
||||
* @type DOMElement
|
||||
* @private
|
||||
*/
|
||||
createRoot: function() {
|
||||
var id = this.container.id + "_root";
|
||||
@@ -282,10 +278,11 @@ OpenLayers.Renderer.VML.prototype =
|
||||
|
||||
/**
|
||||
* @param {DOMElement} node
|
||||
* @param {OpenLayers.Geometry} geometry
|
||||
* @param {OpenLayers.Geometry} geometry
|
||||
* @private
|
||||
*/
|
||||
drawPoint: function(node, geometry) {
|
||||
this.drawCircle(node, node.geometry, 1);
|
||||
this.drawCircle(node, geometry, 1);
|
||||
},
|
||||
|
||||
/** Size and Center a circle given geometry (x,y center) and radius
|
||||
@@ -293,6 +290,7 @@ OpenLayers.Renderer.VML.prototype =
|
||||
* @param {DOMElement} node
|
||||
* @param {OpenLayers.Geometry} geometry
|
||||
* @param {float} radius
|
||||
* @private
|
||||
*/
|
||||
drawCircle: function(node, geometry, radius) {
|
||||
|
||||
@@ -311,6 +309,7 @@ OpenLayers.Renderer.VML.prototype =
|
||||
/**
|
||||
* @param {DOMElement} node
|
||||
* @param {OpenLayers.Geometry} geometry
|
||||
* @private
|
||||
*/
|
||||
drawLineString: function(node, geometry) {
|
||||
this.drawLine(node, geometry, false);
|
||||
@@ -319,6 +318,7 @@ OpenLayers.Renderer.VML.prototype =
|
||||
/**
|
||||
* @param {DOMElement} node
|
||||
* @param {OpenLayers.Geometry} geometry
|
||||
* @private
|
||||
*/
|
||||
drawLinearRing: function(node, geometry) {
|
||||
this.drawLine(node, geometry, true);
|
||||
@@ -328,6 +328,7 @@ OpenLayers.Renderer.VML.prototype =
|
||||
* @param {DOMElement} node
|
||||
* @param {OpenLayers.Geometry} geometry
|
||||
* @param {Boolean} closeLine Close the line? (make it a ring?)
|
||||
* @private
|
||||
*/
|
||||
drawLine: function(node, geometry, closeLine) {
|
||||
|
||||
@@ -352,6 +353,7 @@ OpenLayers.Renderer.VML.prototype =
|
||||
/**
|
||||
* @parm {DOMElement} node
|
||||
* @param {OpenLayers.Geometry} geometry
|
||||
* @private
|
||||
*/
|
||||
drawPolygon: function(node, geometry) {
|
||||
this.setNodeDimension(node, geometry);
|
||||
@@ -380,6 +382,7 @@ OpenLayers.Renderer.VML.prototype =
|
||||
/**
|
||||
* @parm {DOMElement} node
|
||||
* @param {OpenLayers.Geometry} geometry
|
||||
* @private
|
||||
*/
|
||||
drawRectangle: function(node, geometry) {
|
||||
var resolution = this.getResolution();
|
||||
@@ -395,6 +398,7 @@ OpenLayers.Renderer.VML.prototype =
|
||||
/**
|
||||
* @parm {DOMElement} node
|
||||
* @param {OpenLayers.Geometry} geometry
|
||||
* @private
|
||||
*/
|
||||
drawCurve: function(node, geometry) {
|
||||
this.setNodeDimension(node, geometry);
|
||||
@@ -421,6 +425,7 @@ OpenLayers.Renderer.VML.prototype =
|
||||
/**
|
||||
* @parm {DOMElement} node
|
||||
* @param {OpenLayers.Geometry} geometry
|
||||
* @private
|
||||
*/
|
||||
drawSurface: function(node, geometry) {
|
||||
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
<head>
|
||||
<script src="../../lib/OpenLayers.js"></script>
|
||||
<script type="text/javascript"><!--
|
||||
var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
|
||||
var map;
|
||||
var feature;
|
||||
|
||||
|
||||
@@ -21,8 +21,7 @@
|
||||
var layer = new OpenLayers.Layer.Vector(name);
|
||||
|
||||
var point = new OpenLayers.Geometry.Point(-111.04, 45.68);
|
||||
var pointFeature = new OpenLayers.Feature.Vector(layer, point);
|
||||
|
||||
var pointFeature = new OpenLayers.Feature.Vector(point);
|
||||
layer.addFeatures([pointFeature]);
|
||||
|
||||
t.eq(layer.features.length, 1, "OpenLayers.Layer.Vector.addFeatures adds something to the array");
|
||||
@@ -60,6 +59,46 @@
|
||||
layer.addFeatures(f);
|
||||
t.ok( f.style != null, "Feature style is set by layer.");
|
||||
}
|
||||
|
||||
function test_Layer_Vector_drawFeature(t) {
|
||||
t.plan(4);
|
||||
var layer = new OpenLayers.Layer.Vector("Test Layer");
|
||||
var map = new OpenLayers.Map('map');
|
||||
map.addLayer(layer);
|
||||
var geometry = new OpenLayers.Geometry.Point(10, 10);
|
||||
var feature = new OpenLayers.Feature.Vector(geometry);
|
||||
|
||||
var f, s;
|
||||
layer.renderer = {
|
||||
drawFeature: function(feature, style) {
|
||||
f = feature;
|
||||
s = style;
|
||||
}
|
||||
};
|
||||
|
||||
layer.drawFeature(feature);
|
||||
t.ok(geometry.equals(f.geometry),
|
||||
"calls layer.renderer.drawFeature() with feature.geometry");
|
||||
|
||||
feature.style = 'exists';
|
||||
layer.drawFeature(feature);
|
||||
t.eq(feature.style, s,
|
||||
"calls layer.renderer.drawFeature() with feature.style");
|
||||
|
||||
feature.style = null;
|
||||
layer.style = 'exists';
|
||||
layer.drawFeature(feature);
|
||||
t.eq(layer.style, s,
|
||||
"given null feature style, uses layer style");
|
||||
|
||||
feature.style = 'exists';
|
||||
layer.style = 'exists';
|
||||
var customStyle = 'custom';
|
||||
layer.drawFeature(feature, customStyle);
|
||||
t.eq(customStyle, s,
|
||||
"given a custom style, renders with that");
|
||||
|
||||
}
|
||||
|
||||
function test_Layer_Vector_destroyFeatures (t) {
|
||||
t.plan(2);
|
||||
|
||||
@@ -178,11 +178,10 @@
|
||||
}
|
||||
|
||||
function test_99_Geometry_destroy(t) {
|
||||
t.plan( 3 );
|
||||
t.plan( 2 );
|
||||
|
||||
var g = new OpenLayers.Geometry();
|
||||
g.bounds = new OpenLayers.Bounds();
|
||||
g.feature = new Object();
|
||||
|
||||
g_style_destroy = null;
|
||||
g.destroy();
|
||||
@@ -190,7 +189,6 @@
|
||||
t.eq(g.id, null, "id nullified");
|
||||
|
||||
t.eq(g.bounds, null, "bounds nullified");
|
||||
t.eq(g.feature, null, "feature reference nullified");
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user