[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