[Commits] r1585 - in sandbox/ahocevar/playground/ux/Printing/ux: data widgets/form

commits at geoext.org commits at geoext.org
Tue Dec 15 01:09:31 CET 2009


Author: ahocevar
Date: 2009-12-15 01:09:31 +0100 (Tue, 15 Dec 2009)
New Revision: 1585

Modified:
   sandbox/ahocevar/playground/ux/Printing/ux/data/PrintProvider.js
   sandbox/ahocevar/playground/ux/Printing/ux/widgets/form/SimplePrint.js
Log:
added legend support (works with attachment:geoext-153.patch), added printOptions to print command and SimplePrint form

Modified: sandbox/ahocevar/playground/ux/Printing/ux/data/PrintProvider.js
===================================================================
--- sandbox/ahocevar/playground/ux/Printing/ux/data/PrintProvider.js	2009-12-14 09:10:08 UTC (rev 1584)
+++ sandbox/ahocevar/playground/ux/Printing/ux/data/PrintProvider.js	2009-12-15 00:09:31 UTC (rev 1585)
@@ -259,11 +259,15 @@
      *  :param map: ``GeoExt.MapPanel``|``OpenLayers.Map`` The map to print.
      *  :param pages: ``Array`` of :class:`GeoExt.ux.data.PrintPage`` pages to
      *      print.
+     *  :param options: ``Object`` of additional options:
+     *      * ``legend``: :class:`GeoExt.LegendPanel` If provided, the legend
+     *        will be added to the print document.
      * 
      *  Sends the print command to the print service and opens a new window
      *  with the resulting PDF.
      */
-    print: function(map, pages) {
+    print: function(map, pages, options) {
+        options = options || {};
         if(map instanceof GeoExt.MapPanel) {
             map = map.map;
         }
@@ -285,7 +289,7 @@
                 scale: page.scale,
                 rotation: page.rotation
             }, page.customParams));
-        }, this)
+        }, this);
         
         var payload = Ext.apply({
             pages: encodedPages,
@@ -296,6 +300,15 @@
             layout: this.layout
         }, this.customParams);
         
+        if(options.legend) {
+            var legends = [];
+            options.legend.items.each(function(cmp) {
+                var encFn = GeoExt.ux.data.PrintProvider.encode.legend[cmp.getXType()];
+                legends = legends.concat(encFn(cmp));
+            }, this);
+            payload.legends = legends;
+        }
+
         if(this.method === "GET") {
             window.open(this.capabilities.printURL + "?spec=" +
                 escape(Ext.encode(payload)));
@@ -345,9 +358,9 @@
      */
     encodeLayer: function(layer) {
         var encLayer;
-        for(var c in GeoExt.ux.data.PrintProvider.encode) {
+        for(var c in GeoExt.ux.data.PrintProvider.encode.layer) {
             if(layer instanceof OpenLayers.Layer[c]) {
-                encLayer = GeoExt.ux.data.PrintProvider.encode[c](layer);
+                encLayer = GeoExt.ux.data.PrintProvider.encode.layer[c](layer);
                 break;
             }
         }
@@ -360,115 +373,151 @@
  *  An object providing encoding functions for different layer types.
  */
 GeoExt.ux.data.PrintProvider.encode = {
-    "WMS": function(layer){
-        var enc = Ext.apply(GeoExt.ux.data.PrintProvider.encode["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];
+    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];
+                }
             }
-        }
-        return enc;
-    },
-    "OSM": function(layer) {
-        return Ext.apply(GeoExt.ux.data.PrintProvider.encode["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["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) {
-            var encFeatures = [];
-            var encStyles = {};
-            var features = layer.features;
-            var featureFormat = new OpenLayers.Format.GeoJSON();
-            var styleFormat = new OpenLayers.Format.JSON();
-            var nextId = 1;
-            var styleDict = {};
-            var feature, style, dictKey, dictItem;
-            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) {
-                    //this style is already known
-                    styleName = dictItem;
-                } else {
-                    //new style
-                    styleDict[dictKey] = styleName = nextId++;
-                    if (style.externalGraphic) {
-                        encStyles[styleName] = Ext.applyIf({
-                            externalGraphic: Ext.DomHelper.overwrite(
-                                document.createElement("a"),
-                                {tag: "a", href: style.externalGraphic}).href
-                        }, style);
-                    } else {
-                        encStyles[styleName] = style;
+            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) {
+                var encFeatures = [];
+                var encStyles = {};
+                var features = layer.features;
+                var featureFormat = new OpenLayers.Format.GeoJSON();
+                var styleFormat = new OpenLayers.Format.JSON();
+                var nextId = 1;
+                var styleDict = {};
+                var feature, style, dictKey, dictItem;
+                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) {
+                        //this style is already known
+                        styleName = dictItem;
                     }
+                    else {
+                        //new style
+                        styleDict[dictKey] = styleName = nextId++;
+                        if (style.externalGraphic) {
+                            encStyles[styleName] = Ext.applyIf({
+                                externalGraphic: Ext.DomHelper.overwrite(
+                                    document.createElement("a"), {
+                                        tag: "a",
+                                        href: style.externalGraphic
+                                    }).href
+                            }, style);
+                        }
+                        else {
+                            encStyles[styleName] = style;
+                        }
+                    }
+                    var featureGeoJson = featureFormat.extract.feature.call(
+                        featureFormat, feature);
+                    
+                    featureGeoJson.properties = OpenLayers.Util.extend({
+                        _gx_style: styleName
+                    }, featureGeoJson.properties);
+                    
+                    encFeatures.push(featureGeoJson);
                 }
-                var featureGeoJson = featureFormat.extract.feature.call(
-                    featureFormat, feature);
-    
-                featureGeoJson.properties = OpenLayers.Util.extend({
-                    _gx_style: styleName
-                }, featureGeoJson.properties);
-    
-                encFeatures.push(featureGeoJson);
+                
+                return {
+                    type: 'Vector',
+                    styles: encStyles,
+                    styleProperty: '_gx_style',
+                    geoJson: {
+                        type: "FeatureCollection",
+                        features: encFeatures
+                    },
+                    name: layer.name,
+                    opacity: (layer.opacity != null) ? layer.opacity : 1.0
+                };
             }
-    
-            return {
-                type: 'Vector',
-                styles: encStyles,
-                styleProperty: '_gx_style',
-                geoJson: {
-                    type: "FeatureCollection",
-                    features: encFeatures
-                },
-                name: layer.name,
-                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;
+        }
     }
-    
 };
\ No newline at end of file

Modified: sandbox/ahocevar/playground/ux/Printing/ux/widgets/form/SimplePrint.js
===================================================================
--- sandbox/ahocevar/playground/ux/Printing/ux/widgets/form/SimplePrint.js	2009-12-14 09:10:08 UTC (rev 1584)
+++ sandbox/ahocevar/playground/ux/Printing/ux/widgets/form/SimplePrint.js	2009-12-15 00:09:31 UTC (rev 1585)
@@ -37,7 +37,12 @@
     rotationText: "Rotation",
     printText: "Print",
     /* end i18n */
-    
+   
+   /** api: property[printOptions]
+    *  ``Object`` Optional options for the printProvider's print command.
+    */
+   printOptions: null,
+   
     /** private: method[initComponent]
      */
     initComponent: function() {
@@ -109,7 +114,8 @@
         this.addButton({
             text: this.printText,
             handler: function() {
-                this.printProvider.print(this.map, this.pages);
+                this.printProvider.print(this.map, this.pages,
+                    this.printOptions);
             },
             scope: this
         });



More information about the Commits mailing list