"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:
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