"users should be able to customize the select style per feature": Created a !StyleMap class which stores all styles that are needed for a layer. Controls that need to render features differently can now just give a render intent (e.g. "default", "select" or "temporary") to the layer's drawFeature method, instead of having extra style informations like Control.!SelectFeature.selectStyle. Existing application that set layer.style or feature.style are still supported, but both of these style properties are now null by default. r=crschmidt,elemoine,tschaub (closes #1120)
git-svn-id: http://svn.openlayers.org/trunk/openlayers@6240 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
@@ -167,7 +167,8 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
|
||||
this.layer = layer;
|
||||
this.vertices = [];
|
||||
this.virtualVertices = [];
|
||||
this.styleVirtual = OpenLayers.Util.extend({}, this.layer.style);
|
||||
this.styleVirtual = OpenLayers.Util.extend({},
|
||||
this.layer.style || this.layer.styleMap.createSymbolizer());
|
||||
this.styleVirtual.fillOpacity = 0.3;
|
||||
this.styleVirtual.strokeOpacity = 0.3;
|
||||
this.deleteCodes = [46, 100];
|
||||
@@ -409,7 +410,7 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
|
||||
this.layer.destroyFeatures(this.virtualVertices);
|
||||
this.virtualVertices = [];
|
||||
}
|
||||
this.layer.drawFeature(this.feature, this.selectControl.selectStyle);
|
||||
this.layer.drawFeature(this.feature, this.selectControl.renderIntent);
|
||||
}
|
||||
// keep the vertex on top so it gets the mouseout after dragging
|
||||
// this should be removed in favor of an option to draw under or
|
||||
@@ -496,7 +497,7 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
|
||||
// remove the vertex
|
||||
vertex.geometry.parent.removeComponent(vertex.geometry);
|
||||
this.layer.drawFeature(this.feature,
|
||||
this.selectControl.selectStyle);
|
||||
this.selectControl.renderIntent);
|
||||
this.resetVertices();
|
||||
this.onModification(this.feature);
|
||||
}
|
||||
|
||||
@@ -95,7 +95,14 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, {
|
||||
* APIProperty: selectStyle
|
||||
* {Object} Hash of styles
|
||||
*/
|
||||
selectStyle: OpenLayers.Feature.Vector.style['select'],
|
||||
selectStyle: null,
|
||||
|
||||
/**
|
||||
* Property: renderIntent
|
||||
* {String} key used to retrieve the select style from the layer's
|
||||
* style map.
|
||||
*/
|
||||
renderIntent: "select",
|
||||
|
||||
/**
|
||||
* Property: handler
|
||||
@@ -247,25 +254,11 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, {
|
||||
* feature - {<OpenLayers.Feature.Vector>}
|
||||
*/
|
||||
select: function(feature) {
|
||||
// Store feature style for restoration later
|
||||
if(feature.originalStyle != feature.style) {
|
||||
feature.originalStyle = feature.style;
|
||||
}
|
||||
this.layer.selectedFeatures.push(feature);
|
||||
|
||||
var selectStyle = this.selectStyle;
|
||||
|
||||
if (feature.style.CLASS_NAME == "OpenLayers.Style") {
|
||||
feature.style = feature.style.createStyle(feature);
|
||||
} else {
|
||||
feature.style = OpenLayers.Util.extend({}, feature.style);
|
||||
}
|
||||
if (selectStyle.CLASS_NAME == "OpenLayers.Style") {
|
||||
selectStyle = selectStyle.createStyle(feature);
|
||||
}
|
||||
OpenLayers.Util.extend(feature.style, selectStyle);
|
||||
|
||||
this.layer.drawFeature(feature);
|
||||
var selectStyle = this.selectStyle || this.renderIntent;
|
||||
|
||||
this.layer.drawFeature(feature, selectStyle);
|
||||
this.layer.events.triggerEvent("featureselected", {feature: feature});
|
||||
this.onSelect(feature);
|
||||
},
|
||||
@@ -280,10 +273,7 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, {
|
||||
*/
|
||||
unselect: function(feature) {
|
||||
// Store feature style for restoration later
|
||||
if(feature.originalStyle != null) {
|
||||
feature.style = feature.originalStyle;
|
||||
}
|
||||
this.layer.drawFeature(feature);
|
||||
this.layer.drawFeature(feature, "default");
|
||||
OpenLayers.Util.removeItem(this.layer.selectedFeatures, feature);
|
||||
this.layer.events.triggerEvent("featureunselected", {feature: feature});
|
||||
this.onUnselect(feature);
|
||||
|
||||
@@ -59,6 +59,12 @@ OpenLayers.Feature.Vector = OpenLayers.Class(OpenLayers.Feature, {
|
||||
*/
|
||||
style: null,
|
||||
|
||||
/**
|
||||
* Property: renderIntent
|
||||
* {String} rendering intent currently being used
|
||||
*/
|
||||
renderIntent: "default",
|
||||
|
||||
/**
|
||||
* Constructor: OpenLayers.Feature.Vector
|
||||
* Create a vector feature.
|
||||
|
||||
@@ -195,7 +195,6 @@ OpenLayers.Format.SLD = OpenLayers.Class(OpenLayers.Format.XML, {
|
||||
*
|
||||
* Parameters:
|
||||
* xmlNode - {<DOMElement>}
|
||||
* name - {String} The name of the returned rule.
|
||||
*
|
||||
* Returns:
|
||||
* {Object} Hash of rule properties
|
||||
@@ -567,9 +566,6 @@ OpenLayers.Format.SLD = OpenLayers.Class(OpenLayers.Format.XML, {
|
||||
* xmlNodeList - {Array(<DOMElement>)} list to search
|
||||
* attributeName - {String} name of the attribute to match
|
||||
* attributeValue - {String} optional value of the attribute
|
||||
*
|
||||
* Returns:
|
||||
* {DOMElement}
|
||||
*/
|
||||
getNodeWithAttribute: function(xmlNodeList, attributeName, attributeValue) {
|
||||
for (var i=0; i<xmlNodeList.length; i++) {
|
||||
|
||||
@@ -98,6 +98,12 @@ OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, {
|
||||
* {Object} Default style for the layer
|
||||
*/
|
||||
style: null,
|
||||
|
||||
/**
|
||||
* Property: styleMap
|
||||
* {<OpenLayers.StyleMap>}
|
||||
*/
|
||||
styleMap: null,
|
||||
|
||||
/**
|
||||
* Property: renderers
|
||||
@@ -147,9 +153,6 @@ OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, {
|
||||
OpenLayers.Layer.prototype.EVENT_TYPES
|
||||
);
|
||||
|
||||
var defaultStyle = OpenLayers.Feature.Vector.style['default'];
|
||||
this.style = OpenLayers.Util.extend({}, defaultStyle);
|
||||
|
||||
OpenLayers.Layer.prototype.initialize.apply(this, arguments);
|
||||
|
||||
// allow user-set renderer, otherwise assign one
|
||||
@@ -163,6 +166,10 @@ OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, {
|
||||
this.displayError();
|
||||
}
|
||||
|
||||
if (!this.styleMap) {
|
||||
this.styleMap = new OpenLayers.StyleMap();
|
||||
}
|
||||
|
||||
this.features = [];
|
||||
this.selectedFeatures = [];
|
||||
},
|
||||
@@ -312,7 +319,7 @@ OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, {
|
||||
//give feature reference to its layer
|
||||
feature.layer = this;
|
||||
|
||||
if (!feature.style) {
|
||||
if (!feature.style && this.style) {
|
||||
feature.style = OpenLayers.Util.extend({}, this.style);
|
||||
}
|
||||
|
||||
@@ -403,21 +410,17 @@ OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, {
|
||||
*
|
||||
* Parameters:
|
||||
* feature - {<OpenLayers.Feature.Vector>}
|
||||
* style - {Object}
|
||||
* style - {Object} Symbolizer hash or {String} renderIntent
|
||||
*/
|
||||
drawFeature: function(feature, style) {
|
||||
if(style == null) {
|
||||
if(feature.style) {
|
||||
style = feature.style;
|
||||
} else {
|
||||
style = this.style;
|
||||
if (typeof style != "object") {
|
||||
var renderIntent = typeof style == "string" ?
|
||||
style : feature.renderIntent;
|
||||
style = feature.style || this.style;
|
||||
if (!style) {
|
||||
style = this.styleMap.createSymbolizer(feature, renderIntent);
|
||||
}
|
||||
}
|
||||
|
||||
if (style && style.CLASS_NAME &&
|
||||
style.CLASS_NAME == "OpenLayers.Style") {
|
||||
style = style.createStyle(feature);
|
||||
}
|
||||
|
||||
this.renderer.drawFeature(feature, style);
|
||||
},
|
||||
|
||||
@@ -43,8 +43,8 @@ OpenLayers.Style = OpenLayers.Class({
|
||||
/**
|
||||
* Property: defaultStyle
|
||||
* {Object} hash of style properties to use as default for merging
|
||||
* rule-based style symbolizers onto. If no rules are defined, createStyle
|
||||
* will return this style.
|
||||
* rule-based style symbolizers onto. If no rules are defined,
|
||||
* createSymbolizer will return this style.
|
||||
*/
|
||||
defaultStyle: null,
|
||||
|
||||
@@ -96,18 +96,17 @@ OpenLayers.Style = OpenLayers.Class({
|
||||
},
|
||||
|
||||
/**
|
||||
* APIMethod: createStyle
|
||||
* Method: createSymbolizer
|
||||
* creates a style by applying all feature-dependent rules to the base
|
||||
* style.
|
||||
*
|
||||
* Parameters:
|
||||
* feature - {<OpenLayers.Feature>} feature to evaluate rules for
|
||||
* baseStyle - {Object} hash of styles feature styles to extend
|
||||
*
|
||||
* Returns:
|
||||
* {<OpenLayers.Feature.Vector.style>} hash of feature styles
|
||||
* {Object} symbolizer hash
|
||||
*/
|
||||
createStyle: function(feature) {
|
||||
createSymbolizer: function(feature) {
|
||||
var style = OpenLayers.Util.extend({}, this.defaultStyle);
|
||||
|
||||
var rules = this.rules;
|
||||
|
||||
115
lib/OpenLayers/StyleMap.js
Normal file
115
lib/OpenLayers/StyleMap.js
Normal file
@@ -0,0 +1,115 @@
|
||||
/* Copyright (c) 2006-2008 MetaCarta, Inc., published under the Clear BSD
|
||||
* license. See http://svn.openlayers.org/trunk/openlayers/license.txt for the
|
||||
* full text of the license. */
|
||||
|
||||
/**
|
||||
* @requires OpenLayers/Style.js
|
||||
* @requires OpenLayers/Feature/Vector.js
|
||||
*/
|
||||
|
||||
/**
|
||||
* Class: OpenLayers.StyleMap
|
||||
*/
|
||||
OpenLayers.StyleMap = OpenLayers.Class({
|
||||
|
||||
/**
|
||||
* Property: styles
|
||||
* Hash of {<OpenLayers.Style>}, keyed by names of well known
|
||||
* rendering intents (e.g. "default", "temporary", "select").
|
||||
*/
|
||||
styles: null,
|
||||
|
||||
/**
|
||||
* Property: extendDefault
|
||||
* {Boolean} if true, every render intent will extend the symbolizers
|
||||
* specified for the "default" intent. Otherwise, every rendering intent
|
||||
* is treated as a completely independent symbolizer.
|
||||
*/
|
||||
extendDefault: true,
|
||||
|
||||
/**
|
||||
* Constructor: OpenLayers.StyleMap
|
||||
*
|
||||
* Parameters:
|
||||
* style - {Object} Optional. Either a style hash, or a style object, or
|
||||
* a hash of style objects (style hashes) keyed by rendering
|
||||
* intent
|
||||
* options - {Object} optional hash of additional options for this
|
||||
* instance
|
||||
*/
|
||||
initialize: function (style, options) {
|
||||
this.styles = {
|
||||
"default": new OpenLayers.Style(
|
||||
OpenLayers.Feature.Vector.style["default"]),
|
||||
"select": new OpenLayers.Style(
|
||||
OpenLayers.Feature.Vector.style["select"]),
|
||||
"temporary": new OpenLayers.Style(
|
||||
OpenLayers.Feature.Vector.style["temporary"])
|
||||
};
|
||||
|
||||
// take whatever the user passed as style parameter and convert it
|
||||
// into parts of stylemap.
|
||||
if(style instanceof OpenLayers.Style) {
|
||||
// user passed a style object
|
||||
this.styles["default"] = style;
|
||||
} else if(typeof style == "object") {
|
||||
for(var key in style) {
|
||||
if(style[key] instanceof OpenLayers.Style) {
|
||||
// user passed a hash of style objects
|
||||
this.styles[key] = style[key];
|
||||
} else if(typeof style[key] == "object") {
|
||||
// user passsed a hash of style hashes
|
||||
this.styles[key] = new OpenLayers.Style(style[key]);
|
||||
} else {
|
||||
// user passed a style hash (i.e. symbolizer)
|
||||
this.styles["default"] = new OpenLayers.Style(style);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
OpenLayers.Util.extend(this, options);
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: destroy
|
||||
*/
|
||||
destroy: function() {
|
||||
for(var key in this.styles) {
|
||||
this.styles[key].destroy();
|
||||
}
|
||||
this.styles = null;
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: createSymbolizer
|
||||
* Creates the symbolizer for a feature for a render intent.
|
||||
*
|
||||
* Parameters:
|
||||
* feature - {<OpenLayers.Feature>} The feature to evaluate the rules
|
||||
* of the intended style against.
|
||||
* intent - {String} The intent determines the symbolizer that will be
|
||||
* used to draw the feature. Well known intents are "default"
|
||||
* (for just drawing the features), "select" (for selected
|
||||
* features) and "temporary" (for drawing features).
|
||||
*
|
||||
* Returns:
|
||||
* {Object} symbolizer hash
|
||||
*/
|
||||
createSymbolizer: function(feature, intent) {
|
||||
if(!feature) {
|
||||
feature = new OpenLayers.Feature.Vector();
|
||||
}
|
||||
if(!this.styles[intent]) {
|
||||
intent = "default";
|
||||
}
|
||||
feature.renderIntent = intent;
|
||||
var defaultSymbolizer = {};
|
||||
if(this.extendDefault && intent != "default") {
|
||||
defaultSymbolizer = this.styles["default"].createSymbolizer(feature);
|
||||
}
|
||||
return OpenLayers.Util.extend(defaultSymbolizer,
|
||||
this.styles[intent].createSymbolizer(feature));
|
||||
},
|
||||
|
||||
CLASS_NAME: "OpenLayers.StyleMap"
|
||||
});
|
||||
Reference in New Issue
Block a user