[Commits] r1591 - in sandbox/ahocevar/playground/ux/Printing/ux: data widgets/form
commits at geoext.org
commits at geoext.org
Thu Dec 17 16:56:54 CET 2009
Author: ahocevar
Date: 2009-12-17 16:56:54 +0100 (Thu, 17 Dec 2009)
New Revision: 1591
Modified:
sandbox/ahocevar/playground/ux/Printing/ux/data/PrintPage.js
sandbox/ahocevar/playground/ux/Printing/ux/data/PrintProvider.js
sandbox/ahocevar/playground/ux/Printing/ux/widgets/form/PrintForm.js
Log:
Added encoders to the prototype and call them in the scope of the instance. This makes it easier to customize e.g. legend encoders.
Modified: sandbox/ahocevar/playground/ux/Printing/ux/data/PrintPage.js
===================================================================
--- sandbox/ahocevar/playground/ux/Printing/ux/data/PrintPage.js 2009-12-17 09:41:00 UTC (rev 1590)
+++ sandbox/ahocevar/playground/ux/Printing/ux/data/PrintPage.js 2009-12-17 15:56:54 UTC (rev 1591)
@@ -286,11 +286,19 @@
calculatePageBounds: function(scale) {
var s = scale.get("value");
var geom = this.feature.geometry;
- var size = this.printProvider.layout.get("size");
- var unitsRatio = OpenLayers.INCHES_PER_UNIT[this.printProvider.units];
- var w = size.width / 72 / unitsRatio * s / 2;
- var h = size.height / 72 / unitsRatio * s / 2;
var center = geom.getBounds().getCenterLonLat();
+
+ // if the layer has a map, we have to care about the bounds, otherwise
+ // we just create bounds with zero extent around the center.
+ var w = 0, h = 0;
+ var map = this.feature.layer.map;
+ if(map) {
+ var size = this.printProvider.layout.get("size");
+ var unitsRatio = map ?
+ OpenLayers.INCHES_PER_UNIT[map.baseLayer.units] : 1;
+ var w = size.width / 72 / unitsRatio * s / 2;
+ var h = size.height / 72 / unitsRatio * s / 2;
+ }
return new OpenLayers.Bounds(center.lon - w, center.lat - h,
center.lon + w, center.lat + h);
Modified: sandbox/ahocevar/playground/ux/Printing/ux/data/PrintProvider.js
===================================================================
--- sandbox/ahocevar/playground/ux/Printing/ux/data/PrintProvider.js 2009-12-17 09:41:00 UTC (rev 1590)
+++ sandbox/ahocevar/playground/ux/Printing/ux/data/PrintProvider.js 2009-12-17 15:56:54 UTC (rev 1591)
@@ -66,22 +66,6 @@
*/
method: "POST",
- /** api: config[units]
- * ``String`` Map units to use with this printProvider. These can e.g. be
- * taken from an ``OpenLayers.Map``:
- *
- * .. code-block:: javascript
- * units: map.baseLayer.units,
- */
-
- /** api: property[units]
- * ``String`` Map units to use with this printProvider. Must be set
- * before print pages can be created. If a
- * :class:`GeoExt.ux.form.PrintForm` is configured with this
- * printProvider, this will be taken care of properly.
- */
- units: null,
-
/** api: config[customParams]
* ``Object`` Key-value pairs of custom data to be sent to the print
* service. Optional. This is e.g. useful for complex layout definitions
@@ -249,11 +233,17 @@
* with the resulting PDF.
*/
print: function(map, pages, options) {
- options = options || {};
if(map instanceof GeoExt.MapPanel) {
map = map.map;
}
+ var jsonData = Ext.apply({
+ units: map.baseLayer.units,
+ srs: map.baseLayer.projection.getCode(),
+ layout: this.layout.get("name"),
+ dpi: this.dpi.get("value")
+ }, this.customParams);
+
var pagesLayer = pages[0].feature.layer;
var encodedLayers = [];
Ext.each(map.layers, function(layer){
@@ -262,6 +252,7 @@
enc && encodedLayers.push(enc);
}
}, this);
+ jsonData.layers = encodedLayers;
var encodedPages = [];
Ext.each(pages, function(page) {
@@ -272,32 +263,24 @@
rotation: page.rotation
}, page.customParams));
}, this);
+ jsonData.pages = encodedPages;
- var payload = Ext.apply({
- pages: encodedPages,
- dpi: this.dpi.get("value"),
- units: this.units,
- srs: map.baseLayer.projection.getCode(),
- layers: encodedLayers,
- layout: this.layout.get("name")
- }, this.customParams);
-
if(options.legend) {
- var legends = [];
+ var encodedLegends = [];
options.legend.items.each(function(cmp) {
- var encFn = GeoExt.ux.data.PrintProvider.encode.legend[cmp.getXType()];
- legends = legends.concat(encFn(cmp));
+ var encFn = this.encoders.legends[cmp.getXType()];
+ encodedLegends = encodedLegends.concat(encFn.call(this, cmp));
}, this);
- payload.legends = legends;
+ jsonData.legends = encodedLegends;
}
if(this.method === "GET") {
window.open(this.capabilities.printURL + "?spec=" +
- escape(Ext.encode(payload)));
+ escape(Ext.encode(jsonData)));
} else {
Ext.Ajax.request({
url: this.capabilities.createURL,
- jsonData: payload,
+ jsonData: jsonData,
success: function(response) {
window.open(Ext.decode(response.responseText).getURL);
}
@@ -331,7 +314,7 @@
this.setLayout(this.layouts.getAt(0));
this.setDpi(this.dpis.getAt(0));
},
-
+
/** private: method[encodeLayer]
* :param layer: ``OpenLayers.Layer``
* :return: ``Object``
@@ -340,83 +323,96 @@
*/
encodeLayer: function(layer) {
var encLayer;
- for(var c in GeoExt.ux.data.PrintProvider.encode.layer) {
+ for(var c in this.encoders.layers) {
if(layer instanceof OpenLayers.Layer[c]) {
- encLayer = GeoExt.ux.data.PrintProvider.encode.layer[c](layer);
+ encLayer = this.encoders.layers[c].call(this, layer);
break;
}
}
+ // only return the encLayer object when we have a type. Prevents a
+ // fallback on base encoders like HTTPRequest.
return (encLayer && encLayer.type) ? encLayer : null;
- }
-
-});
+ },
-/** private: property[encode]
- * An object providing encoding functions for different layer types.
- */
-GeoExt.ux.data.PrintProvider.encode = {
- layer: {
- "WMS": function(layer){
- var enc = Ext.apply(GeoExt.ux.data.PrintProvider.encode.layer["HTTPRequest"](layer), {
- type: 'WMS',
- layers: [layer.params.LAYERS].join(",").split(","),
- format: layer.params.FORMAT,
- styles: [layer.params.STYLES].join(",").split(","),
- customParams: {}
- });
- var param;
- for (var p in layer.params) {
- param = p.toLowerCase();
- if (!layer.DEFAULT_PARAMS[param] &&
- "layers,styles,width,height,srs".indexOf(param) == -1) {
- enc.customParams[p] = layer.params[p];
+ /** private: method[getAbsoluteUrl]
+ * :param url: ``String``
+ * :return: ``String``
+ *
+ * Converts the provided url to an absolute url.
+ */
+ getAbsoluteUrl: function(url) {
+ return Ext.DomHelper.overwrite(document.createElement("a"), {
+ tag: "a",
+ href: url
+ }).href
+ },
+
+ /** private: property[encoders]
+ * ``Object`` Encoders for all print content
+ */
+ encoders: {
+ "layers": {
+ "WMS": function(layer) {
+ var enc = this.encoders.layers.HTTPRequest.call(this, layer);
+ Ext.apply(enc, {
+ type: 'WMS',
+ layers: [layer.params.LAYERS].join(",").split(","),
+ format: layer.params.FORMAT,
+ styles: [layer.params.STYLES].join(",").split(","),
+ customParams: {}
+ });
+ var param;
+ for(var p in layer.params) {
+ param = p.toLowerCase();
+ if(!layer.DEFAULT_PARAMS[param] &&
+ "layers,styles,width,height,srs".indexOf(param) == -1) {
+ enc.customParams[p] = layer.params[p];
+ }
}
- }
- return enc;
- },
- "OSM": function(layer){
- return Ext.apply(GeoExt.ux.data.PrintProvider.encode.layer["TileCache"](layer), {
- type: 'Osm',
- baseURL: enc.baseURL.substr(0, enc.baseURL.indexOf("$")),
- extension: "png"
- });
- },
- "TileCache": function(layer){
- return Ext.apply(GeoExt.ux.data.PrintProvider.encode.layer["HTTPRequest"](layer), {
- type: 'TileCache',
- layer: layer.layername,
- maxExtent: layer.maxExtent.toArray(),
- tileSize: [layer.tileSize.w, layer.tileSize.h],
- extension: layer.extension,
- resolutions: layer.serverResolutions || layer.resolutions
- });
- },
- "HTTPRequest": function(layer){
- var url = layer.url instanceof Array ? layer.url[0] : layer.url;
- return {
- baseURL: Ext.DomHelper.overwrite(document.createElement("a"), {
- tag: "a",
- href: url
- }).href,
- opacity: (layer.opacity != null) ? layer.opacity : 1.0,
- singleTile: layer.singleTile
- };
- },
- "Image": function(layer){
- return {
- type: 'Image',
- baseURL: Ext.DomHelper.overwrite(document.createElement("a"), {
- tag: "a",
- href: layer.getURL(layer.extent)
- }).href,
- opacity: (layer.opacity != null) ? layer.opacity : 1.0,
- extent: layer.extent.toArray(),
- pixelSize: [layer.size.w, layer.size.h],
- name: layer.name
- };
- },
- "Vector": function(layer){
- if (layer.features.length) {
+ return enc;
+ },
+ "OSM": function(layer) {
+ var enc = this.encoders.layers.TileCache.call(this, layer);
+ return Ext.apply(enc, {
+ type: 'Osm',
+ baseURL: enc.baseURL.substr(0, enc.baseURL.indexOf("$")),
+ extension: "png"
+ });
+ },
+ "TileCache": function(layer) {
+ var enc = this.encoders.layers.HTTPRequest.call(this, layer);
+ return Ext.apply(enc, {
+ type: 'TileCache',
+ layer: layer.layername,
+ maxExtent: layer.maxExtent.toArray(),
+ tileSize: [layer.tileSize.w, layer.tileSize.h],
+ extension: layer.extension,
+ resolutions: layer.serverResolutions || layer.resolutions
+ });
+ },
+ "HTTPRequest": function(layer) {
+ return {
+ baseURL: this.getAbsoluteUrl(layer.url instanceof Array ?
+ layer.url[0] : layer.url),
+ opacity: (layer.opacity != null) ? layer.opacity : 1.0,
+ singleTile: layer.singleTile
+ };
+ },
+ "Image": function(layer) {
+ return {
+ type: 'Image',
+ baseURL: this.getAbsoluteUrl(layer.getURL(layer.extent)),
+ opacity: (layer.opacity != null) ? layer.opacity : 1.0,
+ extent: layer.extent.toArray(),
+ pixelSize: [layer.size.w, layer.size.h],
+ name: layer.name
+ };
+ },
+ "Vector": function(layer) {
+ if(!layer.features.length) {
+ return;
+ }
+
var encFeatures = [];
var encStyles = {};
var features = layer.features;
@@ -425,30 +421,25 @@
var nextId = 1;
var styleDict = {};
var feature, style, dictKey, dictItem;
- for (var i = 0, len = features.length; i < len; ++i) {
+ for(var i = 0, len = features.length; i < len; ++i) {
feature = features[i];
style = feature.style || layer.style ||
layer.styleMap.createSymbolizer(feature,
feature.renderIntent);
dictKey = styleFormat.write(style);
dictItem = styleDict[dictKey];
- if (dictItem) {
+ if(dictItem) {
//this style is already known
styleName = dictItem;
- }
- else {
+ } else {
//new style
styleDict[dictKey] = styleName = nextId++;
- if (style.externalGraphic) {
+ if(style.externalGraphic) {
encStyles[styleName] = Ext.applyIf({
- externalGraphic: Ext.DomHelper.overwrite(
- document.createElement("a"), {
- tag: "a",
- href: style.externalGraphic
- }).href
+ externalGraphic: this.getAbsoluteUrl(
+ style.externalGraphic)
}, style);
- }
- else {
+ } else {
encStyles[styleName] = style;
}
}
@@ -474,32 +465,33 @@
opacity: (layer.opacity != null) ? layer.opacity : 1.0
};
}
- }
- },
- legend: {
- "gx_legendwms": function(legend) {
- return GeoExt.ux.data.PrintProvider.encode.legend.base(legend);
},
- "gx_legendurl": function(legend) {
- return GeoExt.ux.data.PrintProvider.encode.legend.base(legend);
- },
- "base": function(legend) {
- var enc = [];
- legend.items.each(function(cmp) {
- if(cmp instanceof Ext.form.Label) {
- enc.push({name: cmp.text, classes: []});
- } else if(cmp instanceof GeoExt.LegendImage) {
- enc.push({
- name: "",
- icon: Ext.DomHelper.overwrite(
- document.createElement("a"), {
- tag: "a",
- href: cmp.url
- }).href,
- classes: []});
- }
- }, this);
- return enc;
+ "legends": {
+ "gx_legendwms": function(legend) {
+ return this.encoders.legends.base.call(this, legend);
+ },
+ "gx_legendurl": function(legend) {
+ return this.encoders.legends.base.call(this, legend);
+ },
+ "base": function(legend){
+ var enc = [];
+ legend.items.each(function(cmp) {
+ if(cmp instanceof Ext.form.Label) {
+ enc.push({
+ name: cmp.text,
+ classes: []
+ });
+ } else if(cmp instanceof GeoExt.LegendImage) {
+ enc.push({
+ name: "",
+ icon: this.getAbsoluteUrl(cmp.url),
+ classes: []
+ });
+ }
+ }, this);
+ return enc;
+ }
}
}
-};
\ No newline at end of file
+
+});
\ No newline at end of file
Modified: sandbox/ahocevar/playground/ux/Printing/ux/widgets/form/PrintForm.js
===================================================================
--- sandbox/ahocevar/playground/ux/Printing/ux/widgets/form/PrintForm.js 2009-12-17 09:41:00 UTC (rev 1590)
+++ sandbox/ahocevar/playground/ux/Printing/ux/widgets/form/PrintForm.js 2009-12-17 15:56:54 UTC (rev 1591)
@@ -48,9 +48,9 @@
*/
/** private: property[map]
- * ``OpenLayers.Map`` The map the control uses to draw and control
- * extent features and handles, and to determine the map units for the
- * printProvider.
+ * ``OpenLayers.Map`` The map that layer and control will be added to.
+ * Optional if a layer is provided, and that layer is already added to
+ * a map.
*/
map: null,
More information about the Commits
mailing list