diff --git a/examples/georss-flickr.html b/examples/georss-flickr.html index 7e8d3037e9..747f7b5445 100644 --- a/examples/georss-flickr.html +++ b/examples/georss-flickr.html @@ -31,28 +31,34 @@ // 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({ - type: OpenLayers.Rule.Comparison.LIKE, + var rule = new OpenLayers.Rule({ + symbolizer: {pointRadius: 30}, + filter: new OpenLayers.Filter.Comparison({ + type: OpenLayers.Filter.Comparison.LIKE, property: "title", - value: "*powder*", - symbolizer: {"Point": {pointRadius: 30}}}); - rule.value2regex("*"); + value: "*powder*" + }) + }); + rule.filter.value2regex("*"); // If the above rule does not apply, use a smaller pointRadius. var elseRule = new OpenLayers.Rule({ - elseFilter: true, - symbolizer: {"Point": {pointRadius: 20}}}); + elseFilter: true, + symbolizer: {pointRadius: 20} + }); style.addRules([rule, elseRule]); - markerLayer = new OpenLayers.Layer.Vector("", {styleMap: new OpenLayers.StyleMap({ - "default": style, - "select": selectStyle})}); + // Create a layer with a style map. Giving the style map keys + // for "default" and "select" rendering intent. + markerLayer = new OpenLayers.Layer.Vector("", { + styleMap: new OpenLayers.StyleMap({ + "default": style, + "select": new OpenLayers.Style({pointRadius: 35}) + }) + }); map.addLayer(markerLayer); // control that will show a popup when clicking on a thumbnail diff --git a/examples/spherical-mercator.html b/examples/spherical-mercator.html index 309456b3fa..efd304a7f4 100644 --- a/examples/spherical-mercator.html +++ b/examples/spherical-mercator.html @@ -121,7 +121,7 @@ map.addControl(new OpenLayers.Control.EditingToolbar(vector)); map.addControl(new OpenLayers.Control.Permalink()); map.addControl(new OpenLayers.Control.MousePosition()); - map.zoomToMaxExtent() + if (!map.getCenter()) {map.zoomToMaxExtent()} } function osm_getTileURL(bounds) { diff --git a/examples/styles-context.html b/examples/styles-context.html index 4849cfc540..9b9d9c65e7 100644 --- a/examples/styles-context.html +++ b/examples/styles-context.html @@ -105,112 +105,4 @@ on the context object passed to the Style constructor.

- - - - OpenLayers Vector Styles - - - - - - -

Feature Styles Example

- -
- -

- Shows how to create a feature styles. -

- -
- -
-

Features in the northern hemisphere are styled according to their - "type" attribute. This is accomplished with a simple template that - is evaluated with the feature attributes as context.

-

Features in the sourthern hemisphere are styled according to a - combination of their attributes and non-attribute properties. This - is accomplished using an advanced template that calls functions - on the context object passed to the Style constructor.

-
- - + \ No newline at end of file diff --git a/lib/OpenLayers.js b/lib/OpenLayers.js index 354f705bc3..24b0003971 100644 --- a/lib/OpenLayers.js +++ b/lib/OpenLayers.js @@ -183,9 +183,10 @@ "OpenLayers/Style.js", "OpenLayers/StyleMap.js", "OpenLayers/Rule.js", - "OpenLayers/Rule/FeatureId.js", - "OpenLayers/Rule/Logical.js", - "OpenLayers/Rule/Comparison.js", + "OpenLayers/Filter.js", + "OpenLayers/Filter/FeatureId.js", + "OpenLayers/Filter/Logical.js", + "OpenLayers/Filter/Comparison.js", "OpenLayers/Format.js", "OpenLayers/Format/XML.js", "OpenLayers/Format/GML.js", diff --git a/lib/OpenLayers/Control/ModifyFeature.js b/lib/OpenLayers/Control/ModifyFeature.js index 318bb932c1..302862789f 100644 --- a/lib/OpenLayers/Control/ModifyFeature.js +++ b/lib/OpenLayers/Control/ModifyFeature.js @@ -179,10 +179,10 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, { this.layer = layer; this.vertices = []; this.virtualVertices = []; - this.styleVirtual = OpenLayers.Util.extend({}, + this.virtualStyle = OpenLayers.Util.extend({}, this.layer.style || this.layer.styleMap.createSymbolizer()); - this.styleVirtual.fillOpacity = 0.3; - this.styleVirtual.strokeOpacity = 0.3; + this.virtualStyle.fillOpacity = 0.3; + this.virtualStyle.strokeOpacity = 0.3; this.deleteCodes = [46, 100]; this.mode = OpenLayers.Control.ModifyFeature.RESHAPE; OpenLayers.Control.prototype.initialize.apply(this, [options]); @@ -564,7 +564,7 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, { var y = (prevVertex.y + nextVertex.y) / 2; var point = new OpenLayers.Feature.Vector( new OpenLayers.Geometry.Point(x, y), - null, control.styleVirtual + null, control.virtualStyle ); // set the virtual parent and intended index point.geometry.parent = geometry; diff --git a/lib/OpenLayers/Control/OverviewMap.js b/lib/OpenLayers/Control/OverviewMap.js index a283184e17..12a9def34f 100644 --- a/lib/OpenLayers/Control/OverviewMap.js +++ b/lib/OpenLayers/Control/OverviewMap.js @@ -27,7 +27,7 @@ OpenLayers.Control.OverviewMap = OpenLayers.Class(OpenLayers.Control, { /** * APIProperty: ovmap - * {} A reference to the overvew map itself. + * {} A reference to the overview map itself. */ ovmap: null, diff --git a/lib/OpenLayers/Control/PanZoomBar.js b/lib/OpenLayers/Control/PanZoomBar.js index fca45c9844..26ba2ff858 100644 --- a/lib/OpenLayers/Control/PanZoomBar.js +++ b/lib/OpenLayers/Control/PanZoomBar.js @@ -242,12 +242,11 @@ OpenLayers.Control.PanZoomBar = OpenLayers.Class(OpenLayers.Control.PanZoom, { var y = evt.xy.y; var top = OpenLayers.Util.pagePosition(evt.object)[1]; var levels = (y - top)/this.zoomStopHeight; - var zoom = (this.map.getNumZoomLevels() - 1) - levels; - if(this.map.fractionalZoom) { - zoom = Math.min(Math.max(zoom, 0), this.map.getNumZoomLevels() - 1); - } else { - zoom = Math.floor(zoom); + if(!this.map.fractionalZoom) { + levels = Math.floor(levels); } + var zoom = (this.map.getNumZoomLevels() - 1) - levels; + zoom = Math.min(Math.max(zoom, 0), this.map.getNumZoomLevels() - 1); this.map.zoomTo(zoom); OpenLayers.Event.stop(evt); }, diff --git a/lib/OpenLayers/Filter.js b/lib/OpenLayers/Filter.js new file mode 100644 index 0000000000..777ab4fbd3 --- /dev/null +++ b/lib/OpenLayers/Filter.js @@ -0,0 +1,55 @@ +/* Copyright (c) 2006 MetaCarta, Inc., published under a modified BSD license. + * See http://svn.openlayers.org/trunk/openlayers/repository-license.txt + * for the full text of the license. */ + + +/** + * @requires OpenLayers/Util.js + * @requires OpenLayers/Style.js + */ + +/** + * Class: OpenLayers.Filter + * This class represents an OGC Filter. + */ +OpenLayers.Filter = OpenLayers.Class({ + + /** + * Constructor: OpenLayers.Filter + * This is an abstract class. Create an instance of a filter subclass. + * + * Parameters: + * options - {Object} Optional object whose properties will be set on the + * instance. + * + * Returns: + * {} + */ + initialize: function(options) { + OpenLayers.Util.extend(this, options); + }, + + /** + * APIMethod: destroy + * Remove reference to anything added. + */ + destroy: function() { + }, + + /** + * APIMethod: evaluate + * Evaluates this filter in a specific context. Should be implemented by + * subclasses. + * + * Parameters: + * context - {Object} Context to use in evaluating the filter. + * + * Returns: + * {Boolean} The filter applies. + */ + evaluate: function(context) { + return true; + }, + + CLASS_NAME: "OpenLayers.Filter" +}); \ No newline at end of file diff --git a/lib/OpenLayers/Rule/Comparison.js b/lib/OpenLayers/Filter/Comparison.js similarity index 68% rename from lib/OpenLayers/Rule/Comparison.js rename to lib/OpenLayers/Filter/Comparison.js index 334fe3b4b3..0cf3e7a059 100644 --- a/lib/OpenLayers/Rule/Comparison.js +++ b/lib/OpenLayers/Filter/Comparison.js @@ -3,30 +3,29 @@ * full text of the license. */ /** - * @requires OpenLayers/Rule.js + * @requires OpenLayers/Filter.js */ /** - * Class: OpenLayers.Rule.Comparison - * This class represents the comparison rules, as being used for rule-based - * SLD styling + * Class: OpenLayers.Filter.Comparison + * This class represents a comparison filter. * * Inherits from - * - + * - */ -OpenLayers.Rule.Comparison = OpenLayers.Class(OpenLayers.Rule, { +OpenLayers.Filter.Comparison = OpenLayers.Class(OpenLayers.Filter, { /** * APIProperty: type * {String} type: type of the comparison. This is one of - * - OpenLayers.Rule.Comparison.EQUAL_TO = "=="; - * - OpenLayers.Rule.Comparison.NOT_EQUAL_TO = "!="; - * - OpenLayers.Rule.Comparison.LESS_THAN = "<"; - * - OpenLayers.Rule.Comparison.GREATER_THAN = ">"; - * - OpenLayers.Rule.Comparison.LESS_THAN_OR_EQUAL_TO = "<="; - * - OpenLayers.Rule.Comparison.GREATER_THAN_OR_EQUAL_TO = ">="; - * - OpenLayers.Rule.Comparison.BETWEEN = ".."; - * - OpenLayers.Rule.Comparison.LIKE = "~"; + * - OpenLayers.Filter.Comparison.EQUAL_TO = "=="; + * - OpenLayers.Filter.Comparison.NOT_EQUAL_TO = "!="; + * - OpenLayers.Filter.Comparison.LESS_THAN = "<"; + * - OpenLayers.Filter.Comparison.GREATER_THAN = ">"; + * - OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO = "<="; + * - OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO = ">="; + * - OpenLayers.Filter.Comparison.BETWEEN = ".."; + * - OpenLayers.Filter.Comparison.LIKE = "~"; */ type: null, @@ -65,7 +64,7 @@ OpenLayers.Rule.Comparison = OpenLayers.Class(OpenLayers.Rule, { upperBoundary: null, /** - * Constructor: OpenLayers.Rule.Comparison + * Constructor: OpenLayers.Filter.Comparison * Creates a comparison rule. * * Parameters: @@ -76,42 +75,39 @@ OpenLayers.Rule.Comparison = OpenLayers.Class(OpenLayers.Rule, { * rule * * Returns: - * {} + * {} */ initialize: function(options) { - OpenLayers.Rule.prototype.initialize.apply(this, [options]); + OpenLayers.Filter.prototype.initialize.apply(this, [options]); }, /** * APIMethod: evaluate - * evaluates this rule for a specific context + * Evaluates this filter in a specific context. Should be implemented by + * subclasses. * * Parameters: - * context - {Object} context to apply the rule to. + * context - {Object} Context to use in evaluating the filter. * * Returns: - * {boolean} true if the rule applies, false if it does not + * {Boolean} The filter applies. */ - evaluate: function(feature) { - if (!OpenLayers.Rule.prototype.evaluate.apply(this, arguments)) { - return false; - } - var context = this.getContext(feature); + evaluate: function(context) { switch(this.type) { - case OpenLayers.Rule.Comparison.EQUAL_TO: - case OpenLayers.Rule.Comparison.LESS_THAN: - case OpenLayers.Rule.Comparison.GREATER_THAN: - case OpenLayers.Rule.Comparison.LESS_THAN_OR_EQUAL_TO: - case OpenLayers.Rule.Comparison.GREATER_THAN_OR_EQUAL_TO: + case OpenLayers.Filter.Comparison.EQUAL_TO: + case OpenLayers.Filter.Comparison.LESS_THAN: + case OpenLayers.Filter.Comparison.GREATER_THAN: + case OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO: + case OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO: return this.binaryCompare(context, this.property, this.value); - case OpenLayers.Rule.Comparison.BETWEEN: + case OpenLayers.Filter.Comparison.BETWEEN: var result = context[this.property] >= this.lowerBoundary; result = result && context[this.property] <= this.upperBoundary; return result; - case OpenLayers.Rule.Comparison.LIKE: + case OpenLayers.Filter.Comparison.LIKE: var regexp = new RegExp(this.value, "gi"); return regexp.test(context[this.property]); @@ -139,7 +135,7 @@ OpenLayers.Rule.Comparison = OpenLayers.Class(OpenLayers.Rule, { value2regex: function(wildCard, singleChar, escapeChar) { if (wildCard == ".") { var msg = "'.' is an unsupported wildCard character for "+ - "OpenLayers.Rule.Comparison"; + "OpenLayers.Filter.Comparison"; OpenLayers.Console.error(msg); return null; } @@ -212,30 +208,30 @@ OpenLayers.Rule.Comparison = OpenLayers.Class(OpenLayers.Rule, { */ binaryCompare: function(context, property, value) { switch (this.type) { - case OpenLayers.Rule.Comparison.EQUAL_TO: + case OpenLayers.Filter.Comparison.EQUAL_TO: return context[property] == value; - case OpenLayers.Rule.Comparison.NOT_EQUAL_TO: + case OpenLayers.Filter.Comparison.NOT_EQUAL_TO: return context[property] != value; - case OpenLayers.Rule.Comparison.LESS_THAN: + case OpenLayers.Filter.Comparison.LESS_THAN: return context[property] < value; - case OpenLayers.Rule.Comparison.GREATER_THAN: + case OpenLayers.Filter.Comparison.GREATER_THAN: return context[property] > value; - case OpenLayers.Rule.Comparison.LESS_THAN_OR_EQUAL_TO: + case OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO: return context[property] <= value; - case OpenLayers.Rule.Comparison.GREATER_THAN_OR_EQUAL_TO: + case OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO: return context[property] >= value; } }, - CLASS_NAME: "OpenLayers.Rule.Comparison" + CLASS_NAME: "OpenLayers.Filter.Comparison" }); -OpenLayers.Rule.Comparison.EQUAL_TO = "=="; -OpenLayers.Rule.Comparison.NOT_EQUAL_TO = "!="; -OpenLayers.Rule.Comparison.LESS_THAN = "<"; -OpenLayers.Rule.Comparison.GREATER_THAN = ">"; -OpenLayers.Rule.Comparison.LESS_THAN_OR_EQUAL_TO = "<="; -OpenLayers.Rule.Comparison.GREATER_THAN_OR_EQUAL_TO = ">="; -OpenLayers.Rule.Comparison.BETWEEN = ".."; -OpenLayers.Rule.Comparison.LIKE = "~"; +OpenLayers.Filter.Comparison.EQUAL_TO = "=="; +OpenLayers.Filter.Comparison.NOT_EQUAL_TO = "!="; +OpenLayers.Filter.Comparison.LESS_THAN = "<"; +OpenLayers.Filter.Comparison.GREATER_THAN = ">"; +OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO = "<="; +OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO = ">="; +OpenLayers.Filter.Comparison.BETWEEN = ".."; +OpenLayers.Filter.Comparison.LIKE = "~"; diff --git a/lib/OpenLayers/Rule/FeatureId.js b/lib/OpenLayers/Filter/FeatureId.js similarity index 71% rename from lib/OpenLayers/Rule/FeatureId.js rename to lib/OpenLayers/Filter/FeatureId.js index 4cb00b0ece..ca458fb084 100644 --- a/lib/OpenLayers/Rule/FeatureId.js +++ b/lib/OpenLayers/Filter/FeatureId.js @@ -4,18 +4,18 @@ /** - * @requires OpenLayers/Rule.js + * @requires OpenLayers/Filter.js */ /** - * Class: OpenLayers.Rule.FeatureId - * This class represents a ogc:FeatureId Rule, as being used for rule-based SLD + * Class: OpenLayers.Filter.FeatureId + * This class represents a ogc:FeatureId Filter, as being used for rule-based SLD * styling * * Inherits from - * - + * - */ -OpenLayers.Rule.FeatureId = OpenLayers.Class(OpenLayers.Rule, { +OpenLayers.Filter.FeatureId = OpenLayers.Class(OpenLayers.Filter, { /** * APIProperty: fids @@ -25,7 +25,7 @@ OpenLayers.Rule.FeatureId = OpenLayers.Class(OpenLayers.Rule, { fids: null, /** - * Constructor: OpenLayers.Rule.FeatureId + * Constructor: OpenLayers.Filter.FeatureId * Creates an ogc:FeatureId rule. * * Parameters: @@ -33,11 +33,11 @@ OpenLayers.Rule.FeatureId = OpenLayers.Class(OpenLayers.Rule, { * rule * * Returns: - * {} + * {} */ initialize: function(options) { this.fids = []; - OpenLayers.Rule.prototype.initialize.apply(this, [options]); + OpenLayers.Filter.prototype.initialize.apply(this, [options]); }, /** @@ -53,9 +53,6 @@ OpenLayers.Rule.FeatureId = OpenLayers.Class(OpenLayers.Rule, { * {boolean} true if the rule applies, false if it does not */ evaluate: function(feature) { - if (!OpenLayers.Rule.prototype.evaluate.apply(this, arguments)) { - return false; - } for (var i=0; i + */ +OpenLayers.Filter.Logical = OpenLayers.Class(OpenLayers.Filter, { + + /** + * APIProperty: filters + * {Array()} Child filters for this filter. + */ + filters: null, + + /** + * APIProperty: type + * {String} type of logical operator. Available types are: + * - OpenLayers.Filter.Locical.AND = "&&"; + * - OpenLayers.Filter.Logical.OR = "||"; + * - OpenLayers.Filter.Logical.NOT = "!"; + */ + type: null, + + /** + * Constructor: OpenLayers.Filter.Logical + * Creates a logical filter (And, Or, Not). + * + * Parameters: + * options - {Object} An optional object with properties to set on the + * filter. + * + * Returns: + * {} + */ + initialize: function(options) { + this.filters = []; + OpenLayers.Filter.prototype.initialize.apply(this, [options]); + }, + + /** + * APIMethod: destroy + * Remove reference to child filters. + */ + destroy: function() { + this.filters = null; + OpenLayers.Filter.prototype.destroy.apply(this); + }, + + /** + * APIMethod: evaluate + * Evaluates this filter in a specific context. Should be implemented by + * subclasses. + * + * Parameters: + * context - {Object} Context to use in evaluating the filter. + * + * Returns: + * {Boolean} The filter applies. + */ + evaluate: function(context) { + switch(this.type) { + case OpenLayers.Filter.Logical.AND: + for (var i=0; i 0) { - rule.rules.push(new OpenLayers.Rule.FeatureId({ - fids: filter.fids - })); - } - if(filter.rules.length > 0) { - rule.rules = rule.rules.concat(filter.rules); + this.readChildNodes(node, obj); + if(obj.fids.length > 0) { + rule.filter = new OpenLayers.Filter.FeatureId({ + fids: obj.fids + }); + } else if(obj.filters.length > 0) { + rule.filter = obj.filters[0]; } }, - "FeatureId": function(node, filter) { + "FeatureId": function(node, obj) { var fid = node.getAttribute("fid"); if(fid) { - filter.fids.push(fid); + obj.fids.push(fid); } }, - "And": function(node, filter) { - var rule = new OpenLayers.Rule.Logical({ - type: OpenLayers.Rule.Logical.AND + "And": function(node, obj) { + var filter = new OpenLayers.Filter.Logical({ + type: OpenLayers.Filter.Logical.AND }); - // since FeatureId rules may be nested here, make room for them - rule.fids = []; - this.readChildNodes(node, rule); - if(rule.fids.length > 0) { - rule.rules.push(new OpenLayers.Rule.FeatureId({ - fids: rule.fids - })); - } - delete rule.fids; - filter.rules.push(rule); + this.readChildNodes(node, filter); + obj.filters.push(filter); }, - "Or": function(node, filter) { - var rule = new OpenLayers.Rule.Logical({ - type: OpenLayers.Rule.Logical.OR + "Or": function(node, obj) { + var filter = new OpenLayers.Filter.Logical({ + type: OpenLayers.Filter.Logical.OR }); - // since FeatureId rules may be nested here, make room for them - rule.fids = []; - this.readChildNodes(node, rule); - if(rule.fids.length > 0) { - rule.rules.push(new OpenLayers.Rule.FeatureId({ - fids: rule.fids - })); - } - delete rule.fids; - filter.rules.push(rule); + this.readChildNodes(node, filter); + obj.filters.push(filter); }, - "Not": function(node, filter) { - var rule = new OpenLayers.Rule.Logical({ - type: OpenLayers.Rule.Logical.NOT + "Not": function(node, obj) { + var filter = new OpenLayers.Filter.Logical({ + type: OpenLayers.Filter.Logical.NOT }); - // since FeatureId rules may be nested here, make room for them - rule.fids = []; - this.readChildNodes(node, rule); - if(rule.fids.length > 0) { - rule.rules.push(new OpenLayers.Rule.FeatureId({ - fids: rule.fids - })); - } - delete rule.fids; - filter.rules.push(rule); + this.readChildNodes(node, filter); + obj.filters.push(filter); }, - "PropertyIsEqualTo": function(node, filter) { - var rule = new OpenLayers.Rule.Comparison({ - type: OpenLayers.Rule.Comparison.EQUAL_TO + "PropertyIsEqualTo": function(node, obj) { + var filter = new OpenLayers.Filter.Comparison({ + type: OpenLayers.Filter.Comparison.EQUAL_TO }); - this.readChildNodes(node, rule); - filter.rules.push(rule); + this.readChildNodes(node, filter); + obj.filters.push(filter); }, - "PropertyIsNotEqualTo": function(node, filter) { - var rule = new OpenLayers.Rule.Comparison({ - type: OpenLayers.Rule.Comparison.NOT_EQUAL_TO + "PropertyIsNotEqualTo": function(node, obj) { + var filter = new OpenLayers.Filter.Comparison({ + type: OpenLayers.Filter.Comparison.NOT_EQUAL_TO }); - this.readChildNodes(node, rule); - filter.rules.push(rule); + this.readChildNodes(node, filter); + obj.filters.push(filter); }, - "PropertyIsLessThan": function(node, filter) { - var rule = new OpenLayers.Rule.Comparison({ - type: OpenLayers.Rule.Comparison.LESS_THAN + "PropertyIsLessThan": function(node, obj) { + var filter = new OpenLayers.Filter.Comparison({ + type: OpenLayers.Filter.Comparison.LESS_THAN }); - this.readChildNodes(node, rule); - filter.rules.push(rule); + this.readChildNodes(node, filter); + obj.filters.push(filter); }, - "PropertyIsGreaterThan": function(node, filter) { - var rule = new OpenLayers.Rule.Comparison({ - type: OpenLayers.Rule.Comparison.GREATER_THAN + "PropertyIsGreaterThan": function(node, obj) { + var filter = new OpenLayers.Filter.Comparison({ + type: OpenLayers.Filter.Comparison.GREATER_THAN }); - this.readChildNodes(node, rule); - filter.rules.push(rule); + this.readChildNodes(node, filter); + obj.filters.push(filter); }, - "PropertyIsLessThanOrEqualTo": function(node, filter) { - var rule = new OpenLayers.Rule.Comparison({ - type: OpenLayers.Rule.Comparison.LESS_THAN_OR_EQUAL_TO + "PropertyIsLessThanOrEqualTo": function(node, obj) { + var filter = new OpenLayers.Filter.Comparison({ + type: OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO }); - this.readChildNodes(node, rule); - filter.rules.push(rule); + this.readChildNodes(node, filter); + obj.filters.push(filter); }, - "PropertyIsGreaterThanOrEqualTo": function(node, filter) { - var rule = new OpenLayers.Rule.Comparison({ - type: OpenLayers.Rule.Comparison.GREATER_THAN_OR_EQUAL_TO + "PropertyIsGreaterThanOrEqualTo": function(node, obj) { + var filter = new OpenLayers.Filter.Comparison({ + type: OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO }); - this.readChildNodes(node, rule); - filter.rules.push(rule); + this.readChildNodes(node, filter); + obj.filters.push(filter); }, - "PropertyIsBetween": function(node, filter) { - var rule = new OpenLayers.Rule.Comparison({ - type: OpenLayers.Rule.Comparison.BETWEEN + "PropertyIsBetween": function(node, obj) { + var filter = new OpenLayers.Filter.Comparison({ + type: OpenLayers.Filter.Comparison.BETWEEN }); - this.readChildNodes(node, rule); - filter.rules.push(rule); + this.readChildNodes(node, filter); + obj.filters.push(filter); }, - "PropertyIsLike": function(node, filter) { - var rule = new OpenLayers.Rule.Comparison({ - type: OpenLayers.Rule.Comparison.LIKE + "PropertyIsLike": function(node, obj) { + var filter = new OpenLayers.Filter.Comparison({ + type: OpenLayers.Filter.Comparison.LIKE }); - this.readChildNodes(node, rule); + this.readChildNodes(node, filter); var wildCard = node.getAttribute("wildCard"); var singleChar = node.getAttribute("singleChar"); var esc = node.getAttribute("escape"); - rule.value2regex(wildCard, singleChar, esc); - filter.rules.push(rule); + filter.value2regex(wildCard, singleChar, esc); + obj.filters.push(filter); }, "Literal": function(node, obj) { obj.value = this.getChildValue(node); }, - "PropertyName": function(node, rule) { - rule.property = this.getChildValue(node); + "PropertyName": function(node, filter) { + filter.property = this.getChildValue(node); }, - "LowerBoundary": function(node, rule) { - rule.lowerBoundary = this.readOgcExpression(node); + "LowerBoundary": function(node, filter) { + filter.lowerBoundary = this.readOgcExpression(node); }, - "UpperBoundary": function(node, rule) { - rule.upperBoundary = this.readOgcExpression(node); + "UpperBoundary": function(node, filter) { + filter.upperBoundary = this.readOgcExpression(node); } } }, @@ -682,8 +641,8 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.XML, { // add in optional filters if(rule.elseFilter) { this.writeNode(node, "ElseFilter"); - } else if(rule.CLASS_NAME != "OpenLayers.Rule") { - this.writeNode(node, "ogc:Filter", rule); + } else if(rule.filter) { + this.writeNode(node, "ogc:Filter", rule.filter); } // add in scale limits @@ -867,15 +826,15 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.XML, { } }, "ogc": { - "Filter": function(rule) { + "Filter": function(filter) { var node = this.createElementNSPlus("ogc:Filter"); - var sub = rule.CLASS_NAME.split(".").pop(); + var sub = filter.CLASS_NAME.split(".").pop(); if(sub == "FeatureId") { - for(var i=0; i} Optional filter for the rule. + */ + filter: null, /** * Property: elseFilter @@ -136,6 +142,16 @@ OpenLayers.Rule = OpenLayers.Class({ applies = scale < OpenLayers.Style.createLiteral( this.maxScaleDenominator, context); } + + // check if optional filter applies + if(applies && this.filter) { + // feature id filters get the feature, others get the context + if(this.filter.CLASS_NAME == "OpenLayers.Filter.FeatureId") { + applies = this.filter.evaluate(feature); + } else { + applies = this.filter.evaluate(context); + } + } return applies; }, diff --git a/lib/OpenLayers/Rule/Logical.js b/lib/OpenLayers/Rule/Logical.js deleted file mode 100644 index 05f1d4d4ea..0000000000 --- a/lib/OpenLayers/Rule/Logical.js +++ /dev/null @@ -1,104 +0,0 @@ -/* 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/Rule.js - */ - -/** - * Class: OpenLayers.Rule.Logical - * This class represents ogc:And, ogc:Or and ogc:Not rules. - * - * Inherits from - * - - */ -OpenLayers.Rule.Logical = OpenLayers.Class(OpenLayers.Rule, { - - /** - * APIProperty: children - * {Array()} child rules for this rule - */ - rules: null, - - /** - * APIProperty: type - * {String} type of logical operator. Available types are: - * - OpenLayers.Rule.Locical.AND = "&&"; - * - OpenLayers.Rule.Logical.OR = "||"; - * - OpenLayers.Rule.Logical.NOT = "!"; - */ - type: null, - - /** - * Constructor: OpenLayers.Rule.Logical - * Creates a logical rule (And, Or, Not). - * - * Parameters: - * options - {Object} An optional object with properties to set on the - * rule - * - * Returns: - * {} - */ - initialize: function(options) { - this.rules = []; - OpenLayers.Rule.prototype.initialize.apply(this, [options]); - }, - - /** - * APIMethod: destroy - * nullify references to prevent circular references and memory leaks - */ - destroy: function() { - for (var i=0; i} feature to apply the rule to. - * - * Returns: - * {boolean} true if the rule applies, false if it does not - */ - evaluate: function(feature) { - if (!OpenLayers.Rule.prototype.evaluate.apply(this, arguments)) { - return false; - } - switch(this.type) { - case OpenLayers.Rule.Logical.AND: - for (var i=0; i diff --git a/tests/Filter.html b/tests/Filter.html new file mode 100644 index 0000000000..b981d20d8d --- /dev/null +++ b/tests/Filter.html @@ -0,0 +1,21 @@ + + + + + + + + diff --git a/tests/Rule/Comparison.html b/tests/Filter/Comparison.html similarity index 58% rename from tests/Rule/Comparison.html rename to tests/Filter/Comparison.html index 62af049673..5275ff4a7e 100644 --- a/tests/Rule/Comparison.html +++ b/tests/Filter/Comparison.html @@ -7,41 +7,41 @@ t.plan(3); var options = {'foo': 'bar'}; - var rule = new OpenLayers.Rule.Comparison(options); - t.ok(rule instanceof OpenLayers.Rule.Comparison, - "new OpenLayers.Rule.Comparison returns object" ); - t.eq(rule.foo, "bar", "constructor sets options correctly"); - t.eq(typeof rule.evaluate, "function", "rule has an evaluate function"); + var filter = new OpenLayers.Filter.Comparison(options); + t.ok(filter instanceof OpenLayers.Filter.Comparison, + "new OpenLayers.Filter.Comparison returns object" ); + t.eq(filter.foo, "bar", "constructor sets options correctly"); + t.eq(typeof filter.evaluate, "function", "filter has an evaluate function"); } function test_Comparison_destroy(t) { t.plan(1); - var rule = new OpenLayers.Rule.Comparison(); - rule.destroy(); - t.eq(rule.symbolizer, null, "symbolizer hash nulled properly"); + var filter = new OpenLayers.Filter.Comparison(); + filter.destroy(); + t.eq(filter.symbolizer, null, "symbolizer hash nulled properly"); } function test_Comparison_value2regex(t) { t.plan(2); - var rule = new OpenLayers.Rule.Comparison({ + var filter = new OpenLayers.Filter.Comparison({ property: "foo", value: "*b?r\\*\\?*", - type: OpenLayers.Rule.Comparison.LIKE}); - rule.value2regex("*", "?", "\\"); - t.eq(rule.value, ".*b.r\\*\\?.*", "Regular expression generated correctly."); + type: OpenLayers.Filter.Comparison.LIKE}); + filter.value2regex("*", "?", "\\"); + t.eq(filter.value, ".*b.r\\*\\?.*", "Regular expression generated correctly."); - rule.value = "%b.r!%!.%"; - rule.value2regex("%", ".", "!"); - t.eq(rule.value, ".*b.r\\%\\..*", "Regular expression with different wildcard and escape chars generated correctly."); + filter.value = "%b.r!%!.%"; + filter.value2regex("%", ".", "!"); + t.eq(filter.value, ".*b.r\\%\\..*", "Regular expression with different wildcard and escape chars generated correctly."); } function test_regex2value(t) { t.plan(8); function r2v(regex) { - return OpenLayers.Rule.Comparison.prototype.regex2value.call( + return OpenLayers.Filter.Comparison.prototype.regex2value.call( {value: regex} ); } @@ -60,11 +60,11 @@ function test_Comparison_evaluate(t) { t.plan(5); - var rule = new OpenLayers.Rule.Comparison({ + var filter = new OpenLayers.Filter.Comparison({ property: "area", lowerBoundary: 1000, upperBoundary: 4999, - type: OpenLayers.Rule.Comparison.BETWEEN}); + type: OpenLayers.Filter.Comparison.BETWEEN}); var features = [ new OpenLayers.Feature.Vector(null, { @@ -76,21 +76,21 @@ new OpenLayers.Feature.Vector(null, { area: 5000})]; // PropertyIsBetween filter: lower and upper boundary are inclusive - var ruleResults = { + var filterResults = { 0: false, 1: true, 2: true, 3: false}; - for (var i in ruleResults) { - var result = rule.evaluate(features[i]); - t.eq(result, ruleResults[i], "feature "+i+ + for (var i in filterResults) { + var result = filter.evaluate(features[i].attributes); + t.eq(result, filterResults[i], "feature "+i+ " evaluates to "+result.toString()+" correctly."); } - rule.context = { + var context = { area: 4998 - } - var result = rule.evaluate(); - t.eq(result, true, "evaluation against custom rule context works."); + }; + var result = filter.evaluate(context); + t.eq(result, true, "evaluation against custom filter context works."); } diff --git a/tests/Filter/FeatureId.html b/tests/Filter/FeatureId.html new file mode 100644 index 0000000000..31734a6916 --- /dev/null +++ b/tests/Filter/FeatureId.html @@ -0,0 +1,47 @@ + + + + + + + + diff --git a/tests/Filter/Logical.html b/tests/Filter/Logical.html new file mode 100644 index 0000000000..1a0b8f816f --- /dev/null +++ b/tests/Filter/Logical.html @@ -0,0 +1,41 @@ + + + + + + + + diff --git a/tests/Format/SLD/v1_0_0.html b/tests/Format/SLD/v1_0_0.html new file mode 100644 index 0000000000..f98f8f86f7 --- /dev/null +++ b/tests/Format/SLD/v1_0_0.html @@ -0,0 +1,158 @@ + + + + + + + + diff --git a/tests/Popup/FramedCloud.html b/tests/Popup/FramedCloud.html new file mode 100644 index 0000000000..b7f33257a5 --- /dev/null +++ b/tests/Popup/FramedCloud.html @@ -0,0 +1,18 @@ + + + + + + +
+ + diff --git a/tests/Rule/FeatureId.html b/tests/Rule/FeatureId.html deleted file mode 100644 index 730941c5c5..0000000000 --- a/tests/Rule/FeatureId.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - diff --git a/tests/Rule/Logical.html b/tests/Rule/Logical.html deleted file mode 100644 index 5b34f1015b..0000000000 --- a/tests/Rule/Logical.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - diff --git a/tests/Style.html b/tests/Style.html index 84c181dd5b..790c0b640e 100644 --- a/tests/Style.html +++ b/tests/Style.html @@ -27,20 +27,29 @@ var style = new OpenLayers.Style(baseStyle); - var rule1 = new OpenLayers.Rule.FeatureId({ - fids: ["1"], - symbolizer: {"Point": {fillColor: "green"}}, - maxScaleDenominator: 500000}); - var rule2 = new OpenLayers.Rule.FeatureId({ - fids: ["1"], - symbolizer: {"Point": {fillColor: "yellow"}}, - minScaleDenominator: 500000, - maxScaleDenominator: 1000000}); - var rule3 = new OpenLayers.Rule.FeatureId({ - fids: ["1"], - symbolizer: {"Point": {fillColor: "red"}}, - minScaleDenominator: 1000000, - maxScaleDenominator: 2500000}); + var rule1 = new OpenLayers.Rule({ + symbolizer: {"Point": {fillColor: "green"}}, + maxScaleDenominator: 500000, + filter: new OpenLayers.Filter.FeatureId({ + fids: ["1"] + }) + }); + var rule2 = new OpenLayers.Rule({ + symbolizer: {"Point": {fillColor: "yellow"}}, + minScaleDenominator: 500000, + maxScaleDenominator: 1000000, + filter: new OpenLayers.Filter.FeatureId({ + fids: ["1"] + }) + }); + var rule3 = new OpenLayers.Rule({ + symbolizer: {"Point": {fillColor: "red"}}, + minScaleDenominator: 1000000, + maxScaleDenominator: 2500000, + filter: new OpenLayers.Filter.FeatureId({ + fids: ["1"] + }) + }); var feature = new OpenLayers.Feature.Vector( new OpenLayers.Geometry.Point(3,5), @@ -119,11 +128,14 @@ function test_Style_context(t) { t.plan(1); - var rule = new OpenLayers.Rule.Comparison({ - type: OpenLayers.Rule.Comparison.LESS_THAN, - property: "size", - value: 11, - symbolizer: {"Point": {externalGraphic: "${img1}"}}}); + var rule = new OpenLayers.Rule({ + symbolizer: {"Point": {externalGraphic: "${img1}"}}, + filter: new OpenLayers.Filter.Comparison({ + type: OpenLayers.Filter.Comparison.LESS_THAN, + property: "size", + value: 11 + }) + }); var style = new OpenLayers.Style(); style.context = { "img1": "myImage.png" diff --git a/tests/list-tests.html b/tests/list-tests.html index 94ba67900c..8ef9a61134 100644 --- a/tests/list-tests.html +++ b/tests/list-tests.html @@ -29,6 +29,7 @@
  • Format/OSM.html
  • Format/KML.html
  • Format/SLD.html
  • +
  • Format/SLD/v1_0_0.html
  • Format/WKT.html
  • Format/WMC.html
  • Format/WMC/v1_1_0.html
  • @@ -40,14 +41,16 @@
  • Popup.html
  • Popup/Anchored.html
  • Popup/AnchoredBubble.html
  • +
  • Popup/FramedCloud.html
  • Feature.html
  • Feature/Vector.html
  • Style.html
  • StyleMap.html
  • Rule.html
  • -
  • Rule/Comparison.html
  • -
  • Rule/FeatureId.html
  • -
  • Rule/Logical.html
  • +
  • Filter.html
  • +
  • Filter/Comparison.html
  • +
  • Filter/FeatureId.html
  • +
  • Filter/Logical.html
  • Events.html
  • Util.html
  • Lang.html