[Commits] r1619 - in sandbox/ahocevar/playground/ux/Printing: examples ux/data ux/plugins ux/widgets

commits at geoext.org commits at geoext.org
Sun Dec 27 11:29:30 CET 2009


Author: ahocevar
Date: 2009-12-27 11:29:30 +0100 (Sun, 27 Dec 2009)
New Revision: 1619

Modified:
   sandbox/ahocevar/playground/ux/Printing/examples/PrintMapPanel.html
   sandbox/ahocevar/playground/ux/Printing/examples/PrintMapPanel.js
   sandbox/ahocevar/playground/ux/Printing/ux/data/PrintPage.js
   sandbox/ahocevar/playground/ux/Printing/ux/plugins/PrintPageField.js
   sandbox/ahocevar/playground/ux/Printing/ux/plugins/PrintProviderField.js
   sandbox/ahocevar/playground/ux/Printing/ux/widgets/PrintMapPanel.js
Log:
working version of PrintMapPanel with example.

Modified: sandbox/ahocevar/playground/ux/Printing/examples/PrintMapPanel.html
===================================================================
--- sandbox/ahocevar/playground/ux/Printing/examples/PrintMapPanel.html	2009-12-27 07:13:21 UTC (rev 1618)
+++ sandbox/ahocevar/playground/ux/Printing/examples/PrintMapPanel.html	2009-12-27 10:29:30 UTC (rev 1619)
@@ -2,12 +2,35 @@
     <head>
         <title>Printing ux Example</title>
 
-        <script type="text/javascript" src="http://extjs.cachefly.net/ext-2.2.1/adapter/ext/ext-base.js"></script>
-        <script type="text/javascript" src="http://extjs.cachefly.net/ext-2.2.1/ext-all-debug.js"></script>
-        <link rel="stylesheet" type="text/css" href="http://extjs.cachefly.net/ext-2.2.1/resources/css/ext-all.css" />
-        <link rel="stylesheet" type="text/css" href="http://extjs.cachefly.net/ext-2.2.1/examples/shared/examples.css" />
+        <script type="text/javascript" src="http://extjs.cachefly.net/ext-3.0.0/adapter/ext/ext-base.js"></script>
+        <script type="text/javascript" src="http://extjs.cachefly.net/ext-3.0.0/ext-all-debug.js"></script>
+        <link rel="stylesheet" type="text/css" href="http://extjs.cachefly.net/ext-3.0.0/resources/css/ext-all.css" />
+        <link rel="stylesheet" type="text/css" href="http://extjs.cachefly.net/ext-3.0.0/examples/shared/examples.css" />
         <script src="http://openlayers.org/api/2.8/OpenLayers.js"></script>
-        <script type="text/javascript" src="/geoext/geoext/lib/GeoExt.js"></script>
+        <script type="text/javascript">
+        // remove this script tag when http://trac.openlayers.org/ticket/2391 is fixed
+        OpenLayers.Layer.Vector.prototype.clone = function (obj) {
+            
+            if (obj == null) {
+                obj = new OpenLayers.Layer.Vector(this.name, this.options);
+            }
+    
+            //get all additions from superclasses
+            obj = OpenLayers.Layer.prototype.clone.apply(this, [obj]);
+    
+            // copy/set any non-init, non-simple values here
+            var features = this.features;
+            var len = features.length;
+            var clonedFeatures = new Array(len);
+            for(var i=0; i<len; ++i) {
+                clonedFeatures[i] = features[i].clone();
+            }
+            obj.features = clonedFeatures;
+    
+            return obj;
+        };   
+        </script>
+        <script type="text/javascript" src="../../../trunk/geoext/lib/GeoExt.js"></script>
         
         <script type="text/javascript" src="../ux/Printing.js"></script>
         

Modified: sandbox/ahocevar/playground/ux/Printing/examples/PrintMapPanel.js
===================================================================
--- sandbox/ahocevar/playground/ux/Printing/examples/PrintMapPanel.js	2009-12-27 07:13:21 UTC (rev 1618)
+++ sandbox/ahocevar/playground/ux/Printing/examples/PrintMapPanel.js	2009-12-27 10:29:30 UTC (rev 1619)
@@ -1,4 +1,4 @@
-var printProvider, map;
+var printProvider, map, printMapPanel;
 
 Ext.onReady(function() {
 
@@ -52,14 +52,74 @@
 });
 
 function showPrintWindow() {
+    printMapPanel = new GeoExt.ux.PrintMapPanel({
+        sourceMap: map,
+        printProvider: printProvider
+    });
+
     new Ext.Window({
         title: "Print",
-        layout: "fit",
-        autoWidth: true,
-        autoHeight: true,
-        items: new GeoExt.PrintMapPanel({
-            sourceMap: map,
-            printProvider: printProvider
-        })
+        modal: true,
+        items: [{
+            xtype: "form",
+            border: false,
+            forceLayout: true,
+            hideLabels: true,
+            bodyStyle: "padding: 5px 30px 5px 30px",
+            defaults: {
+                anchor: "100%"
+            },
+            items: [{
+                xtype: "textfield",
+                name: "mapTitle",
+                emptyText: "Enter map title here.",
+                plugins: new GeoExt.ux.plugins.PrintProviderField({
+                    printProvider: printProvider
+                })
+            }, {
+                xtype: "textarea",
+                name: "comment",
+                emptyText: "Enter comments here.",
+                plugins: new GeoExt.ux.plugins.PrintProviderField({
+                    printProvider: printProvider
+                })
+            }, printMapPanel]
+        }],
+        tbar: ["Paper Size:", {
+            xtype: "combo",
+            width: 98,
+            plugins: new GeoExt.ux.plugins.PrintProviderField({
+                printProvider: printProvider
+            }),
+            store: printProvider.layouts,
+            displayField: "name",
+            typeAhead: true,
+            mode: "local",
+            forceSelection: true,
+            triggerAction: "all",
+            selectOnFocus: true
+        }, "&nbsp;Resolution:", {
+            xtype: "combo",
+            width: 62,
+            plugins: new GeoExt.ux.plugins.PrintProviderField({
+                printProvider: printProvider
+            }),
+            store: printProvider.dpis,
+            displayField: "name",
+            tpl: '<tpl for="."><div class="x-combo-list-item">{name} dpi</div></tpl>',
+            typeAhead: true,
+            mode: "local",
+            forceSelection: true,
+            triggerAction: "all",
+            selectOnFocus: true,
+            setValue: function(v) {
+                v = parseInt(v) + " dpi";
+                Ext.form.ComboBox.prototype.setValue.apply(this, arguments);
+            }
+        }, "->", {
+            text: "Print",
+            handler: printMapPanel.print,
+            scope: printMapPanel
+        }]
     }).show();
 }

Modified: sandbox/ahocevar/playground/ux/Printing/ux/data/PrintPage.js
===================================================================
--- sandbox/ahocevar/playground/ux/Printing/ux/data/PrintPage.js	2009-12-27 07:13:21 UTC (rev 1618)
+++ sandbox/ahocevar/playground/ux/Printing/ux/data/PrintPage.js	2009-12-27 10:29:30 UTC (rev 1619)
@@ -170,23 +170,26 @@
     
     /** api: method[fitPage]
      *  :param map: ``OpenLayers.Map`` The map to fit the page to.
+     *  :param loose: ``Boolean`` If set to true, the print extent will
+     *      be at least as large as the visible map extent. Default is false.
      * 
      *  Fits the page layout to the current map extent, using the smallest
      *  scale that entirely fits the extent.
      */
-    fitPage: function(map) {
+    fitPage: function(map, loose) {
         this.suspendEvents();
         this.setCenter(map.getCenter());
+        this.resumeEvents();
         var extent = map.getExtent();
         var units = map.baseLayer.units;
-        var scale;
+        var scale, looseScale;
         this.printProvider.scales.each(function(rec) {
+            looseScale = scale || rec;
             scale = rec;
             return !extent.containsBounds(
                 this.calculatePageBounds(scale, units));
         }, this);
-        this.resumeEvents();
-        this.setScale(scale, units);
+        this.setScale(loose === true ? looseScale : scale, units);
     },
 
     /** api: method[updateByHandle]
@@ -291,11 +294,14 @@
      */
     calculatePageBounds: function(scale, units) {
         var s = scale.get("value");
+        var f = this.feature;
         var geom = this.feature.geometry;
         var center = geom.getBounds().getCenterLonLat();
 
         var size = this.printProvider.layout.get("size");
-        var units = units || this.feature.layer.map.baseLayer.units || "dd";
+        var units = units ||
+            (f.layer && f.layer.map && f.layer.map.baseLayer.units) ||
+            "dd";
         var unitsRatio = OpenLayers.INCHES_PER_UNIT[units];
         var w = size.width / 72 / unitsRatio * s / 2;
         var h = size.height / 72 / unitsRatio * s / 2;

Modified: sandbox/ahocevar/playground/ux/Printing/ux/plugins/PrintPageField.js
===================================================================
--- sandbox/ahocevar/playground/ux/Printing/ux/plugins/PrintPageField.js	2009-12-27 07:13:21 UTC (rev 1618)
+++ sandbox/ahocevar/playground/ux/Printing/ux/plugins/PrintPageField.js	2009-12-27 10:29:30 UTC (rev 1619)
@@ -70,6 +70,7 @@
     onFieldChange: function(field, record) {
         var printProvider = this.page.printProvider;
         var value = field.getValue();
+        this._updating = true;
         if(field.store === printProvider.scales) {
             this.page.setScale(record);
         } else if(field.name == "rotation") {
@@ -77,6 +78,7 @@
         } else {
             this.page.customParams[field.name] = value;
         }
+        delete this._updating;
     },
 
     /** private: method[onPageChange]
@@ -86,15 +88,17 @@
      *  with.
      */
     onPageChange: function(page) {
-        var t = this.target;
-        t.suspendEvents();
-        if(t.store === page.printProvider.scales) {
-            t.setValue(page.scale.get(t.displayField));
-        } else if(t.name == "rotation") {
-            t.setValue(page.rotation);
-            t.setDisabled(!page.printProvider.layout.get("rotation"));
+        if(!this._updating) {
+            var t = this.target;
+            t.suspendEvents();
+            if(t.store === page.printProvider.scales) {
+                t.setValue(page.scale.get(t.displayField));
+            } else if(t.name == "rotation") {
+                t.setValue(page.rotation);
+                t.setDisabled(!page.printProvider.layout.get("rotation"));
+            }
+            t.resumeEvents();
         }
-        t.resumeEvents();
     },
     
     /** private: method[destroy]

Modified: sandbox/ahocevar/playground/ux/Printing/ux/plugins/PrintProviderField.js
===================================================================
--- sandbox/ahocevar/playground/ux/Printing/ux/plugins/PrintProviderField.js	2009-12-27 07:13:21 UTC (rev 1618)
+++ sandbox/ahocevar/playground/ux/Printing/ux/plugins/PrintProviderField.js	2009-12-27 10:29:30 UTC (rev 1619)
@@ -21,6 +21,12 @@
  */
 GeoExt.ux.plugins.PrintProviderField = Ext.extend(Ext.util.Observable, {
     
+    /** api: config[printProvider]
+     *  ``GeoExt.ux.data.PrintProvider`` The print provider to use with this
+     *  plugin's field. Not required if set on the owner container of the
+     *  field.
+     */
+    
     /** private: property[target]
      *  ``Ext.form.Field`` This plugin's target field.
      */
@@ -56,17 +62,17 @@
      *  Handler for the target field's "render" event.
      */
     onRender: function(field) {
-        var printProvider = field.ownerCt.printProvider;
+        var printProvider = this.printProvider || field.ownerCt.printProvider;
         if(field.store === printProvider.layouts) {
             field.setValue(printProvider.layout.get(field.displayField));
             printProvider.on({
-                "layoutchange": this.onLayoutChange,
+                "layoutchange": this.onProviderChange,
                 scope: this
             });
         } else if(field.store === printProvider.dpis) {
             field.setValue(printProvider.dpi.get(field.displayField));
             printProvider.on({
-                "dpichange": this.onDpiChange,
+                "dpichange": this.onProviderChange,
                 scope: this
             });
         } else {
@@ -81,8 +87,9 @@
      *  Handler for the target field's "valid" or "select" event.
      */
     onFieldChange: function(field, record) {
-        var printProvider = field.ownerCt.printProvider;
+        var printProvider = this.printProvider || field.ownerCt.printProvider;
         var value = field.getValue();
+        this._updating = true;
         if(record) {
             switch(field.store) {
                 case printProvider.layouts:
@@ -94,40 +101,21 @@
         } else {
             printProvider.customParams[field.name] = value;
         }
+        delete this._updating;
     },
     
-    /** private: method[onLayoutChange]
+    /** private: method[onProviderChange]
      *  :param printProvider: :class:`GeoExt.ux.data.PrintProvider`
-     *  :param layout: ``Ext.data.Record``
+     *  :param rec: ``Ext.data.Record``
      *  
-     *  Handler function for the printProvider's layoutchange event
+     *  Handler for the printProvider's dpichange and layoutchange event
      */
-    onLayoutChange: function(printProvider, layout) {
-        this.target.setValue(layout.get(this.target.displayField));
-    },
-    
-    /** private: method[onDpiChange]
-     *  :param printProvider: :class:`GeoExt.ux.data.PrintProvider`
-     *  :param layout: ``Ext.data.Record``
-     *  
-     *  Handler function for the printProvider's dpichange event
-     */
-    onDpiChange: function(printProvider, dpi) {
-        this.target.setValue(dpi.get(this.target.displayField));
-    },
-    
-    /** private: method[destroy]
-     */
-    destroy: function() {
-        var printProvider = this.target.ownerCt.printProvider;
-        printProvider.un("layoutchange", this.onLayoutChange, this);
-        printProvider.un("dpichange", this.onDpiChange, this);
-        this.target.un("select", this.onFieldChange, this);
-        this.target.un("valid", this.onFieldChange, this);
-        this.target.un("render", this.onRender, this);
-        GeoExt.ux.plugins.PrintProviderField.superclass.destroy.apply(this, arguments);
+    onProviderChange: function(printProvider, rec) {
+        if(!this._updating) {
+            this.target.setValue(rec.get(this.target.displayField));
+        }
     }
-        
+    
 });
 
 /** api: ptype = gx_printproviderfield */

Modified: sandbox/ahocevar/playground/ux/Printing/ux/widgets/PrintMapPanel.js
===================================================================
--- sandbox/ahocevar/playground/ux/Printing/ux/widgets/PrintMapPanel.js	2009-12-27 07:13:21 UTC (rev 1618)
+++ sandbox/ahocevar/playground/ux/Printing/ux/widgets/PrintMapPanel.js	2009-12-27 10:29:30 UTC (rev 1619)
@@ -1,6 +1,6 @@
-Ext.namespace("GeoExt");
+Ext.namespace("GeoExt.ux");
 
-GeoExt.PrintMapPanel = Ext.extend(GeoExt.MapPanel, {
+GeoExt.ux.PrintMapPanel = Ext.extend(GeoExt.MapPanel, {
     
     sourceMap: null,
     
@@ -9,20 +9,56 @@
     printPage: null,
     
     initComponent: function() {
-        this.layers = this.sourceMap.layers;
-        this.extent = this.sourceMap.getExtent();
+        var resolutions = [];
+        printProvider.scales.each(function(s){
+            var res = OpenLayers.Util.getResolutionFromScale(s.get("value"));
+            var zoom = this.sourceMap.getZoomForResolution(res)
+            resolutions.push(this.sourceMap.baseLayer.resolutions[zoom]);
+        }, this)
         
-        GeoExt.PrintMapPanel.superclass.initComponent.call(this);
-        
+        this.zoom = resolutions.indexOf(this.sourceMap.getResolution());
+        this.center = this.sourceMap.getCenter();
+
+        this.layers = [];
+        var layer;
+        Ext.each(this.sourceMap.layers, function(layer){
+            var clone = layer.clone();
+            layer.getVisibility() === true && this.layers.push(clone);
+        }, this);
+
+        this.map = {
+            resolutions: resolutions,
+            numZoomLevels: resolutions.length
+        };
+
         this.printPage = new GeoExt.ux.data.PrintPage({
             printProvider: this.printProvider
         });
+        
+        GeoExt.ux.PrintMapPanel.superclass.initComponent.call(this);
+        
+        this.fitMap();
+        this.printProvider.on("layoutchange", this.fitMap, this);
+    },
+    
+    fitMap: function() {
         this.printPage.fitPage(this.sourceMap);
         var extent = this.printPage.feature.geometry.getBounds();
-        var resolution = this.map.getResolution();
+        var zoom = this.sourceMap.getZoomForExtent(extent);
+        var resolution = this.sourceMap.getResolutionForZoom(zoom);
         this.setSize(
             extent.getWidth() / resolution,
             extent.getHeight() / resolution
         );
+    },
+    
+    print: function() {
+        this.printPage.fitPage(this.map, true);
+        this.printProvider.print(this.map, [this.printPage]);
+    },
+    
+    beforeDestroy: function() {
+        this.printProvider.un("layoutchange", this.fitMap, this);
+        GeoExt.ux.PrintMapPanel.superclass.beforeDestroy.apply(this, arguments);
     }
 });



More information about the Commits mailing list