Merge pull request #733 from tschaub/filter-tweaks

Allow writer functions to use document fragments when they need to append more than a single child to the parent.
This commit is contained in:
Tim Schaub
2012-10-26 09:45:53 -07:00
3 changed files with 59 additions and 33 deletions

View File

@@ -279,9 +279,8 @@ OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
* {DOMElement} Updated node element.
*/
writeOgcExpression: function(value, node) {
if(value instanceof OpenLayers.Filter.Function){
var child = this.writeNode("Function", value, node);
node.appendChild(child);
if (value instanceof OpenLayers.Filter.Function){
this.writeNode("Function", value, node);
} else {
this.writeNode("Literal", value, node);
}
@@ -301,19 +300,6 @@ OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
return this.writers.ogc["Filter"].apply(this, [filter]);
},
/**
* Method: writeFeatureIdNodes
*
* Parameters:
* filter - {<OpenLayers.Filter.FeatureId}
* node - {DOMElement}
*/
writeFeatureIdNodes: function(filter, node) {
for (var i=0, ii=filter.fids.length; i<ii; ++i) {
this.writeNode("FeatureId", filter.fids[i], node);
}
},
/**
* Property: writers
* As a compliment to the readers property, this structure contains public
@@ -324,10 +310,13 @@ OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
"ogc": {
"Filter": function(filter) {
var node = this.createElementNSPlus("ogc:Filter");
if (filter.type === "FID") {
OpenLayers.Format.Filter.v1.prototype.writeFeatureIdNodes.call(this, filter, node);
} else {
this.writeNode(this.getFilterType(filter), filter, node);
this.writeNode(this.getFilterType(filter), filter, node);
return node;
},
"_featureIds": function(filter) {
var node = this.createDocumentFragment();
for (var i=0, ii=filter.fids.length; i<ii; ++i) {
this.writeNode("ogc:FeatureId", filter.fids[i], node);
}
return node;
},
@@ -341,14 +330,10 @@ OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
var childFilter;
for (var i=0, ii=filter.filters.length; i<ii; ++i) {
childFilter = filter.filters[i];
if (childFilter.type === "FID") {
OpenLayers.Format.Filter.v1.prototype.writeFeatureIdNodes.call(this, childFilter, node);
} else {
this.writeNode(
this.getFilterType(childFilter), childFilter, node
);
}
}
return node;
},
"Or": function(filter) {
@@ -356,26 +341,18 @@ OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
var childFilter;
for (var i=0, ii=filter.filters.length; i<ii; ++i) {
childFilter = filter.filters[i];
if (childFilter.type === "FID") {
OpenLayers.Format.Filter.v1.prototype.writeFeatureIdNodes.call(this, childFilter, node);
} else {
this.writeNode(
this.getFilterType(childFilter), childFilter, node
);
}
}
return node;
},
"Not": function(filter) {
var node = this.createElementNSPlus("ogc:Not");
var childFilter = filter.filters[0];
if (childFilter.type === "FID") {
OpenLayers.Format.Filter.v1.prototype.writeFeatureIdNodes.call(this, childFilter, node);
} else {
this.writeNode(
this.getFilterType(childFilter), childFilter, node
);
}
return node;
},
"PropertyIsLessThan": function(filter) {
@@ -519,7 +496,7 @@ OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
"WITHIN": "WITHIN",
"CONTAINS": "CONTAINS",
"INTERSECTS": "INTERSECTS",
"FID": "FeatureId"
"FID": "_featureIds"
},
CLASS_NAME: "OpenLayers.Format.Filter.v1"

View File

@@ -230,6 +230,26 @@ OpenLayers.Format.XML = OpenLayers.Class(OpenLayers.Format, {
return element;
},
/**
* APIMethod: createDocumentFragment
* Create a document fragment node that can be appended to another node
* created by createElementNS. This will call
* document.createDocumentFragment outside of IE. In IE, the ActiveX
* object's createDocumentFragment method is used.
*
* Returns:
* {Element} A document fragment.
*/
createDocumentFragment: function() {
var element;
if (this.xmldom) {
element = this.xmldom.createDocumentFragment();
} else {
element = document.createDocumentFragment();
}
return element;
},
/**
* APIMethod: createTextNode
* Create a text node. This node can be appended to another node with