"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:
@@ -31,6 +31,9 @@
|
||||
// the thumbail attribute of the rss item
|
||||
style = new OpenLayers.Style({externalGraphic: "${thumbnail}"});
|
||||
|
||||
// make the thumbnails larger when we select them
|
||||
selectStyle = new OpenLayers.Style({pointRadius: 35});
|
||||
|
||||
// create a rule with a point symbolizer that will make the thumbnail
|
||||
// larger if the title of the rss item conatins "powder"
|
||||
var rule = new OpenLayers.Rule.Comparison({
|
||||
@@ -47,12 +50,13 @@
|
||||
|
||||
style.addRules([rule, elseRule]);
|
||||
|
||||
markerLayer = new OpenLayers.Layer.Vector("", {style: style});
|
||||
markerLayer = new OpenLayers.Layer.Vector("", {styleMap: new OpenLayers.StyleMap({
|
||||
"default": style,
|
||||
"select": selectStyle})});
|
||||
map.addLayer(markerLayer);
|
||||
|
||||
// control that will show a popup when clicking on a thumbnail
|
||||
var popupControl = new OpenLayers.Control.SelectFeature(markerLayer, {
|
||||
selectStyle: style,
|
||||
onSelect: function(feature) {
|
||||
var pos = feature.geometry;
|
||||
if (popup) {
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
map.addLayer(wms);
|
||||
|
||||
wfs = new OpenLayers.Layer.WFS("Minnesota Streams (WFS)", wfs_url, {'typename':'streams'}, {ratio:1.25, minZoomLevel:4});
|
||||
wfs = new OpenLayers.Layer.WFS("Minnesota Streams (WFS)", wfs_url, {'typename':'streams'}, {ratio:1.25, minZoomLevel:4, style: OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default'])});
|
||||
|
||||
// preFeatureInsert can be used to set style before the feature is drawn
|
||||
wfs.preFeatureInsert= function(feature) { feature.style.strokeWidth="3"; feature.style.strokeColor="blue";
|
||||
@@ -57,7 +57,7 @@
|
||||
map.addLayer(pwfs);
|
||||
|
||||
rstyle = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']);
|
||||
OpenLayers.Util.extend(rstyle, {'strokeColor': 'white', strokeWIdth: "4"});
|
||||
OpenLayers.Util.extend(rstyle, {'strokeColor': 'white', strokeWidth: "4"});
|
||||
rwfs = new OpenLayers.Layer.WFS("Minnesota Roads (WFS)", wfs_url, {'typename':'roads'},
|
||||
{ratio:1.25, minZoomLevel:7, extractAttributes: true, style:rstyle});
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
gml.loadGML();
|
||||
}
|
||||
function style_osm_feature(feature) {
|
||||
feature.style.fill = "black";
|
||||
feature.style = OpenLayers.Util.extend({'fill':'black'}, OpenLayers.Feature.Vector.style['default']);
|
||||
if (feature.attributes.highway == "motorway") {
|
||||
feature.style.strokeColor = "blue";
|
||||
feature.style.strokeWidth = 5;
|
||||
|
||||
@@ -32,41 +32,33 @@
|
||||
|
||||
styles = sld[1];
|
||||
|
||||
waterStyle = styles["WaterBodies"];
|
||||
// for the hover style, we do not want to use the SLD default as
|
||||
// base style
|
||||
styles["WaterBodies"]["Hover Styler"].defaultStyle = OpenLayers.Util.extend({},
|
||||
OpenLayers.Feature.Vector.style["select"]);
|
||||
|
||||
gmlLayers = [
|
||||
// use the sld UserStyle named "Default Styler"
|
||||
new OpenLayers.Layer.GML("StateBoundaries",
|
||||
"tasmania/TasmaniaStateBoundaries.xml", {
|
||||
style: waterStyle["default"]}),
|
||||
styleMap: new OpenLayers.StyleMap(styles["WaterBodies"])}),
|
||||
new OpenLayers.Layer.GML("Roads",
|
||||
"tasmania/TasmaniaRoads.xml", {
|
||||
style: waterStyle["default"]}),
|
||||
styleMap: new OpenLayers.StyleMap(styles["Roads"])}),
|
||||
new OpenLayers.Layer.GML("WaterBodies",
|
||||
"tasmania/TasmaniaWaterBodies.xml", {
|
||||
style: waterStyle["default"]}),
|
||||
styleMap: new OpenLayers.StyleMap(styles["WaterBodies"])}),
|
||||
new OpenLayers.Layer.GML("Cities",
|
||||
"tasmania/TasmaniaCities.xml", {
|
||||
style: waterStyle["default"]})];
|
||||
styleMap: new OpenLayers.StyleMap(styles["Cities"])})];
|
||||
|
||||
// add the first layer with the style passed to the constructor
|
||||
map.addLayer(gmlLayers[0]);
|
||||
// add the other layers after setting the style using the
|
||||
// setStyle() method, which will pick the correct default style
|
||||
// from the styles hash we got back from
|
||||
// OpenLayers.Format.SLD.read()
|
||||
for (var i=1; i<gmlLayers.length; i++) {
|
||||
gmlLayers[i].style = styles[gmlLayers[i].name]["default"];
|
||||
map.addLayer(gmlLayers[i]);
|
||||
gmlLayers[i].redraw();
|
||||
for (var i=0; i<gmlLayers.length; i++) {
|
||||
map.addLayer(gmlLayers[i]);
|
||||
}
|
||||
|
||||
// SLD can also be used for the SelectFeature control
|
||||
waterStyle["Hover Styler"].defaultStyle =
|
||||
OpenLayers.Feature.Vector.style["select"];
|
||||
hover = new OpenLayers.Control.SelectFeature(gmlLayers[2], {
|
||||
selectStyle: waterStyle["Hover Styler"],
|
||||
hover: true
|
||||
hover: true,
|
||||
renderIntent: "Hover Styler"
|
||||
});
|
||||
map.addControl(hover);
|
||||
hover.activate();
|
||||
@@ -74,11 +66,8 @@
|
||||
|
||||
// set a new style when the radio button changes
|
||||
function setStyle(styleName) {
|
||||
gmlLayers[2].styleMap.styles["default"] = styles["WaterBodies"][styleName];
|
||||
// change the style of the features of the WaterBodies layer
|
||||
var features = gmlLayers[2].features;
|
||||
for (var i=0; i<features.length; i++) {
|
||||
features[i].style = waterStyle[styleName];
|
||||
}
|
||||
gmlLayers[2].redraw();
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
df = new OpenLayers.Control.DrawFeature(layer, OpenLayers.Handler.Path, {handlerOptions: {'freehand': false}, 'displayClass': 'olControlDrawFeaturePath'});
|
||||
df.featureAdded = function(feature) {
|
||||
feature.state = OpenLayers.State.INSERT;
|
||||
feature.style['strokeColor'] = "#ff0000";
|
||||
feature.style = OpenLayers.Util.extend({'strokeColor': '#ff0000'}, OpenLayers.Feature.Vector.style['default']);
|
||||
feature.layer.drawFeature(feature);
|
||||
}
|
||||
p.addControls([ new OpenLayers.Control.Navigation(), df ]);
|
||||
|
||||
@@ -177,6 +177,7 @@
|
||||
"OpenLayers/Layer/PointTrack.js",
|
||||
"OpenLayers/Layer/GML.js",
|
||||
"OpenLayers/Style.js",
|
||||
"OpenLayers/StyleMap.js",
|
||||
"OpenLayers/Rule.js",
|
||||
"OpenLayers/Rule/FeatureId.js",
|
||||
"OpenLayers/Rule/Logical.js",
|
||||
|
||||
@@ -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"
|
||||
});
|
||||
@@ -6,6 +6,7 @@
|
||||
function test_ModifyFeature_constructor(t) {
|
||||
t.plan(3);
|
||||
var layer = {
|
||||
styleMap: {createSymbolizer: function(){}},
|
||||
events: {
|
||||
on: function() {}
|
||||
}
|
||||
@@ -77,7 +78,7 @@
|
||||
*/
|
||||
|
||||
var control = new OpenLayers.Control.ModifyFeature({
|
||||
style: null,
|
||||
styleMap: {createSymbolizer: function(){}},
|
||||
events: {
|
||||
on: function() {}
|
||||
}
|
||||
|
||||
@@ -33,44 +33,20 @@
|
||||
}
|
||||
|
||||
function test_Control_SelectFeature_select(t) {
|
||||
t.plan(7);
|
||||
t.plan(2);
|
||||
var map = new OpenLayers.Map("map");
|
||||
var layer = new OpenLayers.Layer.Vector();
|
||||
map.addLayer(layer);
|
||||
var control = new OpenLayers.Control.SelectFeature(layer);
|
||||
var feature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(0,0));
|
||||
layer.addFeatures(feature);
|
||||
layer.drawFeature = function() { }
|
||||
layer.drawFeature = function(feature, style) {
|
||||
layer.styleMap.createSymbolizer(feature, style);
|
||||
}
|
||||
control.select(feature);
|
||||
t.eq(feature.style.strokeColor, OpenLayers.Feature.Vector.style['select'].strokeColor, "feature style is set to select style");
|
||||
t.eq(feature.renderIntent, "select", "render intent is set to select");
|
||||
control.unselect(feature);
|
||||
t.eq(feature.style.strokeColor, OpenLayers.Feature.Vector.style['default'].strokeColor, "feature style is set back to old style");
|
||||
|
||||
// Don't ever overwrite my feature style with undefined properties from the selectStyle
|
||||
feature.style = {externalGraphic: "foo.png", pointRadius: 39};
|
||||
control.selectStyle.pointRadius = undefined;
|
||||
control.select(feature);
|
||||
t.eq(feature.style.pointRadius, 39, "undefined style property inherited from original feature style");
|
||||
control.unselect(feature);
|
||||
|
||||
// Ok, that one went well. But I'm sure you cannot handle OL.Style.
|
||||
feature.style = new OpenLayers.Style({externalGraphic: "foo.png", pointRadius: 39});
|
||||
control.select(feature);
|
||||
t.eq(feature.style.pointRadius, 39, "undefined style property inherited from original feature style object");
|
||||
control.unselect(feature);
|
||||
|
||||
// Wow, but using OL.Style as selectStyle will break you.
|
||||
control.selectStyle = new OpenLayers.Style({strokeColor: "green"});
|
||||
control.select(feature);
|
||||
t.eq(feature.style.strokeColor, "green", "style correct if both feature.style and selectStyle are OL.Style");
|
||||
control.unselect(feature);
|
||||
|
||||
// Not bad, not bad. And what if I set feature.style back to a style hash?
|
||||
feature.style = layer.style;
|
||||
control.select(feature);
|
||||
t.eq(feature.style.strokeColor, "green", "style still correct with only selectStyle being OL.Style");
|
||||
control.unselect(feature);
|
||||
t.eq(feature.style.strokeColor, OpenLayers.Feature.Vector.style["default"].strokeColor, "style set back to original correctly");
|
||||
t.eq(feature.renderIntent, "default", "render intent is set back to default");
|
||||
}
|
||||
|
||||
function test_Control_SelectFeature_clickFeature(t) {
|
||||
|
||||
@@ -69,18 +69,6 @@
|
||||
"OpenLayers.Layer.Vector.removeFeatures(layer.features) removes all feature from the features array");
|
||||
}
|
||||
|
||||
function test_Layer_Vector_addStyle (t) {
|
||||
t.plan(2);
|
||||
var layer = new OpenLayers.Layer.Vector(name);
|
||||
var map = new OpenLayers.Map('map');
|
||||
map.addLayer(layer);
|
||||
var g = new OpenLayers.Geometry.Point(0, 0);
|
||||
var f = new OpenLayers.Feature.Vector(g);
|
||||
t.eq( f.style, null, "Feature style is null by default.");
|
||||
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");
|
||||
@@ -106,22 +94,22 @@
|
||||
t.ok(geometry.equals(f.geometry),
|
||||
"calls layer.renderer.drawFeature() with feature.geometry");
|
||||
|
||||
feature.style = 'exists';
|
||||
feature.style = {foo: "bar"};
|
||||
layer.drawFeature(feature);
|
||||
t.eq(feature.style, s,
|
||||
"calls layer.renderer.drawFeature() with feature.style");
|
||||
|
||||
feature.style = null;
|
||||
layer.style = 'exists';
|
||||
layer.style = {foo: "bar"};
|
||||
layer.drawFeature(feature);
|
||||
t.eq(layer.style, s,
|
||||
t.eq(layer.style.foo, s.foo,
|
||||
"given null feature style, uses layer style");
|
||||
|
||||
feature.style = 'exists';
|
||||
layer.style = 'exists';
|
||||
var customStyle = 'custom';
|
||||
feature.style = {foo1: "bar1"};
|
||||
layer.style = {foo2: "bar2"};
|
||||
var customStyle = {foo: "bar"};
|
||||
layer.drawFeature(feature, customStyle);
|
||||
t.eq(customStyle, s,
|
||||
t.eq(customStyle.foo, s.foo,
|
||||
"given a custom style, renders with that");
|
||||
|
||||
}
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
<li>test_Feature.html</li>
|
||||
<li>Feature/test_Vector.html</li>
|
||||
<li>test_Style.html</li>
|
||||
<li>test_StyleMap.html</li>
|
||||
<li>test_Rule.html</li>
|
||||
<li>Rule/test_Comparison.html</li>
|
||||
<li>Rule/test_FeatureId.html</li>
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
t.ok(style instanceof OpenLayers.Style,
|
||||
"new OpenLayers.Style returns object" );
|
||||
t.eq(style.foo, "bar", "constructor sets options correctly");
|
||||
t.eq(typeof style.createStyle, "function", "style has a createStyle function");
|
||||
t.eq(typeof style.createSymbolizer, "function", "style has a createSymbolizer function");
|
||||
}
|
||||
|
||||
function test_Style_create(t) {
|
||||
@@ -45,11 +45,12 @@
|
||||
|
||||
var feature = new OpenLayers.Feature.Vector(
|
||||
new OpenLayers.Geometry.Point(3,5),
|
||||
{"foo": "bar"},
|
||||
style);
|
||||
{"foo": "bar"});
|
||||
|
||||
feature.fid = "1";
|
||||
// for this fid, the above rule should apply
|
||||
|
||||
layer.styleMap = new OpenLayers.StyleMap(style);
|
||||
|
||||
layer.addFeatures([feature]);
|
||||
map.addLayer(layer);
|
||||
@@ -58,37 +59,37 @@
|
||||
map.setCenter(new OpenLayers.LonLat(3,5), 10);
|
||||
|
||||
// at this scale, the feature should be green
|
||||
var createdStyle = style.createStyle(feature);
|
||||
var createdStyle = style.createSymbolizer(feature);
|
||||
t.eq(createdStyle.externalGraphic, "barbar.png", "Calculated property style correctly.");
|
||||
t.eq(createdStyle.display, "", "Feature is visible at scale "+map.getScale());
|
||||
t.eq(createdStyle.fillColor, "green", "Point symbolizer from rule applied correctly.");
|
||||
|
||||
map.setCenter(new OpenLayers.LonLat(3,5), 9);
|
||||
// at this scale, the feature should be red
|
||||
createdStyle = style.createStyle(feature);
|
||||
createdStyle = style.createSymbolizer(feature);
|
||||
t.eq(createdStyle.display, "", "Feature is visible at scale "+map.getScale());
|
||||
t.eq(createdStyle.fillColor, "yellow", "Point symbolizer from rule applied correctly.");
|
||||
|
||||
map.setCenter(new OpenLayers.LonLat(3,5), 8);
|
||||
// at this scale, the feature should be yellow
|
||||
createdStyle = style.createStyle(feature);
|
||||
createdStyle = style.createSymbolizer(feature);
|
||||
t.eq(createdStyle.display, "", "Feature is visible at scale "+map.getScale());
|
||||
t.eq(createdStyle.fillColor, "red", "Point symbolizer from rule applied correctly.");
|
||||
|
||||
map.setCenter(new OpenLayers.LonLat(3,5), 7);
|
||||
// at this scale, the feature should be invisible
|
||||
createdStyle = style.createStyle(feature);
|
||||
createdStyle = style.createSymbolizer(feature);
|
||||
t.eq(createdStyle.display, "none", "Feature is invisible at scale "+map.getScale());
|
||||
t.eq(createdStyle.fillColor, baseStyle.fillColor, "Point symbolizer from base style applied correctly.");
|
||||
|
||||
feature.fid = "2";
|
||||
// now the rule should not apply
|
||||
|
||||
createdStyle = style.createStyle(feature);
|
||||
createdStyle = style.createSymbolizer(feature);
|
||||
t.eq(createdStyle.fillColor, baseStyle.fillColor, "Correct style for rule that does not apply to fid=\"2\".");
|
||||
}
|
||||
|
||||
function test_Style_createStyle(t) {
|
||||
function test_Style_createSymbolizer(t) {
|
||||
t.plan(2);
|
||||
var style = new OpenLayers.Style();
|
||||
var rule = new OpenLayers.Rule({
|
||||
@@ -104,13 +105,13 @@
|
||||
style.applySymbolizer = function(r) {
|
||||
t.eq(r.id, rule.id, "(plain) applySymbolizer called with correct rule");
|
||||
}
|
||||
style.createStyle(new OpenLayers.Feature.Vector());
|
||||
style.createSymbolizer(new OpenLayers.Feature.Vector());
|
||||
|
||||
rule.evaluate = function() {return false;};
|
||||
style.applySymbolizer = function(r) {
|
||||
t.eq(r.id, elseRule.id, "(else) applySymbolizer called with correct rule");
|
||||
}
|
||||
style.createStyle(new OpenLayers.Feature.Vector());
|
||||
style.createSymbolizer(new OpenLayers.Feature.Vector());
|
||||
}
|
||||
|
||||
function test_Style_context(t) {
|
||||
@@ -126,7 +127,7 @@
|
||||
symbolizer: {"Point": {externalGraphic: "${foo}.png"}}});
|
||||
var style = new OpenLayers.Style();
|
||||
style.addRules([rule]);
|
||||
var styleHash = style.createStyle(new OpenLayers.Feature.Vector());
|
||||
var styleHash = style.createSymbolizer(new OpenLayers.Feature.Vector());
|
||||
t.eq(styleHash.externalGraphic, "bar.png", "correctly evaluated rule against a custom context");
|
||||
}
|
||||
|
||||
|
||||
44
tests/test_StyleMap.html
Normal file
44
tests/test_StyleMap.html
Normal file
@@ -0,0 +1,44 @@
|
||||
<html>
|
||||
<head>
|
||||
<script src="../lib/OpenLayers.js"></script>
|
||||
<script type="text/javascript">
|
||||
|
||||
function test_StyleMap_constructor(t) {
|
||||
t.plan(6);
|
||||
|
||||
var options = {'foo': 'bar'};
|
||||
var styleMap = new OpenLayers.StyleMap(null, options);
|
||||
t.ok(styleMap instanceof OpenLayers.StyleMap,
|
||||
"new OpenLayers.StyleMap returns object" );
|
||||
t.eq(styleMap.foo, "bar", "constructor sets options correctly");
|
||||
|
||||
var style = new OpenLayers.Style();
|
||||
var styleMap = new OpenLayers.StyleMap(style);
|
||||
t.eq(styleMap.styles["default"].defaultStyle.strokeColor, style.defaultStyle.strokeColor, "default style set correctly from style object");
|
||||
|
||||
var style = {strokeColor: "blue"};
|
||||
var styleMap = new OpenLayers.StyleMap(style);
|
||||
t.eq(styleMap.styles["default"].defaultStyle.strokeColor, "blue", "default style set correctly from style hash");
|
||||
|
||||
var style = {
|
||||
"default": new OpenLayers.Style({strokeColor: "yellow"}),
|
||||
"select": {strokeColor: "blue"}};
|
||||
var styleMap = new OpenLayers.StyleMap(style);
|
||||
t.eq(styleMap.styles["default"].defaultStyle.strokeColor, "yellow", "default style set correctly from a mixed hash of renderIntents");
|
||||
t.eq(styleMap.styles["select"].defaultStyle.strokeColor, "blue", "select style set correctly from a mixed hash of renderIntents");
|
||||
}
|
||||
|
||||
function test_StyleMap_destroy(t) {
|
||||
t.plan(2);
|
||||
var styleMap = new OpenLayers.StyleMap();
|
||||
t.ok(styleMap.styles["default"], "Got a default style after initialisation");
|
||||
styleMap.destroy();
|
||||
t.ok(!styleMap.styles, "StyleMap styles successfully destroyed");
|
||||
}
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="map" style="width:500px;height:500px"></div>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user