[Commits] r863 - in core/trunk/geoext: examples lib/GeoExt/data lib/GeoExt/widgets tests/lib/GeoExt/data tests/lib/GeoExt/widgets

commits at geoext.org commits at geoext.org
Mon May 25 00:40:21 CEST 2009


Author: tschaub
Date: 2009-05-25 00:40:21 +0200 (Mon, 25 May 2009)
New Revision: 863

Modified:
   core/trunk/geoext/examples/popup.js
   core/trunk/geoext/lib/GeoExt/data/LayerStore.js
   core/trunk/geoext/lib/GeoExt/widgets/MapPanel.js
   core/trunk/geoext/lib/GeoExt/widgets/Popup.js
   core/trunk/geoext/tests/lib/GeoExt/data/LayerStore.html
   core/trunk/geoext/tests/lib/GeoExt/widgets/Popup.html
Log:
The LayerStore now triggers update when layer properties change.  r=ahocevar (closes #66)

Modified: core/trunk/geoext/examples/popup.js
===================================================================
--- core/trunk/geoext/examples/popup.js	2009-05-23 06:21:00 UTC (rev 862)
+++ core/trunk/geoext/examples/popup.js	2009-05-24 22:40:21 UTC (rev 863)
@@ -36,7 +36,7 @@
                 }
             }
         });
-        popup.addToMapPanel(mapPanel);
+        mapPanel.add(popup);
     }
 
     // create popup on "featureselected"

Modified: core/trunk/geoext/lib/GeoExt/data/LayerStore.js
===================================================================
--- core/trunk/geoext/lib/GeoExt/data/LayerStore.js	2009-05-23 06:21:00 UTC (rev 862)
+++ core/trunk/geoext/lib/GeoExt/data/LayerStore.js	2009-05-24 22:40:21 UTC (rev 863)
@@ -190,15 +190,15 @@
      */
     onChangeLayer: function(evt) {
         var layer = evt.layer;
-        if(evt.property === "order") {
-            if(!this._adding && !this._removing) {
-                var layerIndex = this.map.getLayerIndex(layer);
-                var recordIndex = this.findBy(function(rec, id) {
-                    return rec.get("layer") === layer;
-                });
-                if(recordIndex > -1) {
+        var recordIndex = this.findBy(function(rec, id) {
+            return rec.get("layer") === layer;
+        });
+        if(recordIndex > -1) {
+            var record = this.getAt(recordIndex);
+            if(evt.property === "order") {
+                if(!this._adding && !this._removing) {
+                    var layerIndex = this.map.getLayerIndex(layer);
                     if(layerIndex !== recordIndex) {
-                        var record = this.getAt(recordIndex);
                         this._removing = true;
                         this.remove(record);
                         delete this._removing;
@@ -207,6 +207,8 @@
                         delete this._adding;
                     }
                 }
+            } else {
+                this.fireEvent("update", this, record, Ext.data.Record.EDIT);
             }
         }
     },

Modified: core/trunk/geoext/lib/GeoExt/widgets/MapPanel.js
===================================================================
--- core/trunk/geoext/lib/GeoExt/widgets/MapPanel.js	2009-05-23 06:21:00 UTC (rev 862)
+++ core/trunk/geoext/lib/GeoExt/widgets/MapPanel.js	2009-05-24 22:40:21 UTC (rev 863)
@@ -170,6 +170,26 @@
         this.updateMapSize();
     },
     
+    /** private: method[onBeforeAdd]
+     *  Private method called before a component is added to the panel.
+     */
+    onBeforeAdd: function(item) {
+        if(typeof item.addToMapPanel === "function") {
+            item.addToMapPanel(this);
+        }
+        GeoExt.MapPanel.superclass.onBeforeAdd.apply(this, arguments);
+    },
+    
+    /** private: method[remove]
+     *  Private method called when a component is removed from the panel.
+     */
+    remove: function(item, autoDestroy) {
+        if(typeof item.removeFromMapPanel === "function") {
+            item.removeFromMapPanel(this);
+        }
+        GeoExt.MapPanel.superclass.remove.apply(this, arguments);
+    },
+
     /** private: method[beforeDestroy]
      *  Private method called during the destroy sequence.
      */

Modified: core/trunk/geoext/lib/GeoExt/widgets/Popup.js
===================================================================
--- core/trunk/geoext/lib/GeoExt/widgets/Popup.js	2009-05-23 06:21:00 UTC (rev 862)
+++ core/trunk/geoext/lib/GeoExt/widgets/Popup.js	2009-05-24 22:40:21 UTC (rev 863)
@@ -146,34 +146,36 @@
         GeoExt.Popup.superclass.initTools.call(this);
     },
 
-    /** api: method[addToMapPanel]
+    /** private: method[addToMapPanel]
      *  :param mapPanel: :class:`MapPanel` The panel to which this popup should
      *      be added.
      *  
      *  Adds this popup to a :class:`MapPanel`.  Assumes that the
      *  MapPanel's map is already initialized and that the
-     *  Popup's feature is on the map.
+     *  Popup's feature is on the map.  This method is called by the MapPanel's
+     *  add method.
      */
     addToMapPanel: function(mapPanel) {
         this.mapPanel = mapPanel;
         this.map = this.mapPanel.map;
-
-        mapPanel.add(this);
-        mapPanel.doLayout();
-
-        this.position();
-
-        /* Anchoring */
-        if(this.anchored) {
-            this.anchorPopup();
-        }
-
-        this.show();
-
-        /* Panning */
-        if(this.panIn) {
-            this.panIntoView();
-        }
+        
+        mapPanel.on({
+            "add": {
+                fn: function() {
+                    mapPanel.doLayout();
+                    this.position();
+                    if(this.anchored) {
+                        this.anchorPopup();
+                    }
+                    this.show();
+                    if(this.panIn) {
+                        this.panIntoView();
+                    }
+                },
+                single: true,
+                scope: this
+            }
+        });
     },
 
     /** api: method[setSize]
@@ -249,7 +251,6 @@
      *  MapPanel and adds it to the page body.
      */
     unanchorPopup: function() {
-        this.unbindFromMapPanel();
 
         //make the window draggable
         this.draggable = true;
@@ -284,10 +285,11 @@
         }
     },
 
-    /** private: method[unbindFromMapPanel]
+    /** private: method[removeFromMapPanel]
      *  Utility method for unbinding events that call for popup repositioning.
+     *  Called from the panel during panel.remove(popup).
      */
-    unbindFromMapPanel: function() {
+    removeFromMapPanel: function() {
         if(this.map && this.map.events) {
             //stop position with feature
             this.map.events.un({
@@ -296,9 +298,12 @@
             });
         }
 
-        this.un("resize", this.position);
-        this.un("collapse", this.position);
-        this.un("expand", this.position);
+        this.un("resize", this.position, this);
+        this.un("collapse", this.position, this);
+        this.un("expand", this.position, this);
+
+        delete this.mapPanel;
+        delete this.map;
     },
 
     /** private: method[panIntoView]
@@ -354,7 +359,7 @@
      *  Cleanup events before destroying the popup.
      */
     beforeDestroy: function() {
-        this.unbindFromMapPanel();
+        this.removeFromMapPanel();
         GeoExt.Popup.superclass.beforeDestroy.call(this);
     }
 });

Modified: core/trunk/geoext/tests/lib/GeoExt/data/LayerStore.html
===================================================================
--- core/trunk/geoext/tests/lib/GeoExt/data/LayerStore.html	2009-05-23 06:21:00 UTC (rev 862)
+++ core/trunk/geoext/tests/lib/GeoExt/data/LayerStore.html	2009-05-24 22:40:21 UTC (rev 863)
@@ -285,7 +285,92 @@
 
         }
         
+        function test_events(t) {
+            t.plan(21);
+            
+            var map = new OpenLayers.Map({div: "mappanel", allOverlays: true});
+            var a = new OpenLayers.Layer("a");
+            var b = new OpenLayers.Layer("b");
+            var c = new OpenLayers.Layer("c");
+            var d = new OpenLayers.Layer("d");
 
+            var store = new GeoExt.data.LayerStore({
+                map: map
+            });
+            
+            store.add(store.reader.readRecords([a, b, c]).records);
+            
+            var events = [];
+            function logEvent(type, args) {
+                events.push({type: type, args: args});
+            }
+            store.on({
+                add: function() {logEvent("add", arguments)},
+                remove: function() {logEvent("remove", arguments)},
+                update: function() {logEvent("update", arguments)}
+            });
+            
+            var batch, event, record;
+            
+            // confirm that we get an "add" on map.addLayer
+            batch = "map.addLayer";
+            map.addLayer(d);
+            t.eq(events.length, 1, "[" + batch + "] one event");
+            event = events[0];
+            t.eq(event.type, "add", "[" + batch + "] 'add' event");
+            t.eq(event.args[1].length, 1, "[" + batch + "] correct number of records");
+            record = event.args[1][0];
+            t.ok(record.get("layer") === d, "[" + batch + "] correct layer on record");
+            
+            // confirm that we get a "remove" on map.removeLayer
+            events = [];
+            batch = "map.removeLayer";
+            map.removeLayer(d);
+            t.eq(events.length, 1, "[" + batch + "] one event");
+            event = events[0];
+            t.eq(event.type, "remove", "[" + batch + "] 'remove' event");
+            t.ok(event.args[1].get("layer") === d, "[" + batch + "] correct layer on record");
+
+            // confirm that we get an "add" and "remove" on map.setLayerIndex
+            events = [];
+            batch = "map.setLayerIndex";
+            map.setLayerIndex(b, 0);
+            t.eq(events.length, 2, "[" + batch + "] two events");
+            event = events[0];
+            t.eq(event.type, "remove", "[" + batch + "] 'remove' event first");
+            t.ok(event.args[1].get("layer") === b, "[" + batch + "] correct layer on record");
+            event = events[1];
+            t.eq(event.type, "add", "[" + batch + "] 'add' event second");
+            t.eq(event.args[1].length, 1, "[" + batch + "] correct number of records");
+            record = event.args[1][0];
+            t.ok(record.get("layer") === b, "[" + batch + "] correct layer on record");
+
+            // confirm that we get an "update" on layer.setName
+            events = [];
+            batch = "layer.setName";
+            c.setName("c layer");
+            t.eq(events.length, 1, "[" + batch + "] one event");
+            event = events[0];
+            t.eq(event.type, "update", "[" + batch + "] 'update' event");
+            t.ok(event.args[1].get("layer") === c, "[" + batch + "] correct layer on record");
+            t.eq(event.args[2], Ext.data.Record.EDIT, "[" + batch + "] correct operation");
+            
+            // confirm that we get an "update" on layer.setVisibility
+            events = [];
+            batch = "layer.setVisibility";
+            a.setVisibility(false);
+            t.eq(events.length, 1, "[" + batch + "] one event");
+            event = events[0];
+            t.eq(event.type, "update", "[" + batch + "] 'update' event");
+            t.ok(event.args[1].get("layer") === a, "[" + batch + "] correct layer on record");
+            t.eq(event.args[2], Ext.data.Record.EDIT, "[" + batch + "] correct operation");
+
+
+            map.destroy();
+            
+        }
+        
+
     </script>
   </head>  
   <body>

Modified: core/trunk/geoext/tests/lib/GeoExt/widgets/Popup.html
===================================================================
--- core/trunk/geoext/tests/lib/GeoExt/widgets/Popup.html	2009-05-23 06:21:00 UTC (rev 862)
+++ core/trunk/geoext/tests/lib/GeoExt/widgets/Popup.html	2009-05-24 22:40:21 UTC (rev 863)
@@ -63,7 +63,7 @@
 
             var pop = popup(context.feature);
 
-            pop.addToMapPanel(context.mapPanel);
+            context.mapPanel.add(pop);
 
             t.ok(context.mapPanel.el.child("div." + pop.popupCls),"Map panel contains popup");
             
@@ -77,7 +77,7 @@
 
             var pop = popup(context.feature);
 
-            pop.addToMapPanel(context.mapPanel);
+            context.mapPanel.add(pop);
 
             pop.on({
                 'move' : function(c,x,y){
@@ -108,7 +108,7 @@
 
             var pop = popup(context.feature, context.mapPanel);
 
-            pop.addToMapPanel(context.mapPanel);
+            context.mapPanel.add(pop);
         
             pop.collapse();
 
@@ -145,31 +145,25 @@
 
         }
 
-        function test_Popup_beforeDestroy(t){
+        function test_Popup_destroy(t){
 
-            t.plan(0);
+            t.plan(1);
 
             var context = setupContext();
             var pop = popup(context.feature);
-            pop.addToMapPanel(context.mapPanel);
-
+            context.mapPanel.add(pop);
+            
+            var called = false;
             pop.on({
-                'move' : function(c,x,y){
-                    t.ok(false,"Move event fired improperly on " + action); //should happen twice, on call to position()
-                },
-                scope : this
+                move: function() {
+                    called = true;
+                }
             });
+            pop.destroy();
 
-            pop.beforeDestroy();
-
-            var action = "map move";
             context.map.events.triggerEvent("move");
-
-            action = "popup expand"
-            pop.expand();
             
-            action = "popup collapse";
-            pop.collapse();
+            t.ok(!called, "pop is not moved after it is destroyed");
             
             tearDown(context);
         }



More information about the Commits mailing list