Revision: 5829
          http://sourceforge.net/p/jump-pilot/code/5829
Author:   michaudm
Date:     2018-06-03 21:35:20 +0000 (Sun, 03 Jun 2018)
Log Message:
-----------
3 bugfix in layerListener management (hopefully fix #419)
    - layerListener is removed when the concerned layer is removed
    - sridStyle set geometry srid only once, not once per Layer
    - layerListener added by AbstractPlugIn UndoableEdit is removed from
      LayerManager when the layer is removed

Modified Paths:
--------------
    core/trunk/ChangeLog
    
core/trunk/src/com/vividsolutions/jump/workbench/model/AbstractLayerable.java
    core/trunk/src/com/vividsolutions/jump/workbench/model/Layer.java
    core/trunk/src/com/vividsolutions/jump/workbench/model/LayerManager.java
    core/trunk/src/com/vividsolutions/jump/workbench/plugin/AbstractPlugIn.java
    core/trunk/src/org/openjump/core/ccordsys/srid/SRIDStyle.java

Modified: core/trunk/ChangeLog
===================================================================
--- core/trunk/ChangeLog        2018-06-03 18:08:12 UTC (rev 5828)
+++ core/trunk/ChangeLog        2018-06-03 21:35:20 UTC (rev 5829)
@@ -5,6 +5,11 @@
 
 2018-06-03 mmichaud <m.michael.mich...@orange.fr>
   * bugfix in Dissolve2 : could not use geometry attribute as key
+  * 3 bugfix in layerListener management (hopefully fix #419)
+    - layerListener is removed when the concerned layer is removed
+    - sridStyle set geometry srid only once, not once per Layer
+    - layerListener added by AbstractPlugIn UndoableEdit is removed from
+      LayerManager when the layer is removed
 
 2018-06-02 mmichaud <m.michael.mich...@orange.fr>
   * upgrade dxf-driver to 0.9.0 (could not export MultiPolygon)

Modified: 
core/trunk/src/com/vividsolutions/jump/workbench/model/AbstractLayerable.java
===================================================================
--- 
core/trunk/src/com/vividsolutions/jump/workbench/model/AbstractLayerable.java   
    2018-06-03 18:08:12 UTC (rev 5828)
+++ 
core/trunk/src/com/vividsolutions/jump/workbench/model/AbstractLayerable.java   
    2018-06-03 21:35:20 UTC (rev 5829)
@@ -66,7 +66,12 @@
   public AbstractLayerable(String name, LayerManager layerManager) {
     Assert.isTrue(name != null);
     Assert.isTrue(layerManager != null);
-    setLayerManager(layerManager);
+    // We got side effects with Layer#setLayerManager(layerManager) :
+    // a layerListener is added to the layerManager, then replaced it is
+    // replaced by a new layerListener during Layer initialization, and
+    // can never be removed.
+    //setLayerManager(layerManager);
+    this.layerManager = layerManager;
 
     // Can't fire events because this Layerable hasn't been added to the
     // LayerManager yet. [Jon Aquino]

Modified: core/trunk/src/com/vividsolutions/jump/workbench/model/Layer.java
===================================================================
--- core/trunk/src/com/vividsolutions/jump/workbench/model/Layer.java   
2018-06-03 18:08:12 UTC (rev 5828)
+++ core/trunk/src/com/vividsolutions/jump/workbench/model/Layer.java   
2018-06-03 21:35:20 UTC (rev 5829)
@@ -55,6 +55,7 @@
 import com.vividsolutions.jump.workbench.ui.renderer.style.SquareVertexStyle;
 import com.vividsolutions.jump.workbench.ui.renderer.style.Style;
 import com.vividsolutions.jump.workbench.ui.renderer.style.VertexStyle;
+import org.openjump.core.ccordsys.srid.SRIDStyle;
 
 /**
  * Adds colour, line-width, and other stylistic information to a Feature
@@ -102,7 +103,7 @@
       FeatureCollection featureCollection, LayerManager layerManager) {
     super(name, layerManager);
     Assert.isTrue(featureCollection != null);
-
+    setLayerManager(layerManager);
     // Can't fire events because this Layerable hasn't been added to the
     // LayerManager yet. [Jon Aquino]
     boolean firingEvents = layerManager.isFiringEvents();
@@ -345,8 +346,9 @@
     // dispose features if disposable nature
     Collection<Feature> features = getFeatureCollectionWrapper().getFeatures();
     for (Feature feature : features) {
-      if (feature instanceof Disposable)
+      if (feature instanceof Disposable) {
         ((Disposable) feature).dispose();
+      }
     }
     // Don't just call FeatureCollection#removeAll, because it may be a
     // database table, and we don't want to delete its contents! [Jon Aquino]
@@ -397,9 +399,11 @@
     }
   }
 
-  private LayerListener getLayerListener() {
+  LayerListener getLayerListener() {
     // Need to create layerListener lazily because it will be called by the
     // superclass constructor. [Jon Aquino]
+    // Do not call getLayerListener in superclass constructor or layerListener
+    // will be erased during the instance initialization [mmichaud]
     if (layerListener == null) {
       layerListener = new LayerListener() {
         public void featuresChanged(FeatureEvent e) {
@@ -425,6 +429,13 @@
               // on the blackboard [Jon Aquino 10/21/2003]
               fireAppearanceChanged();
             }
+            // Taken from SRIDStyle class to set SRID on new features
+            SRIDStyle ss = (SRIDStyle) getStyle(SRIDStyle.class);
+            if (e.getType() != FeatureEventType.DELETED && ss != null) {
+              for (Feature feature : e.getFeatures()) {
+                feature.getGeometry().setSRID(ss.getSRID());
+              }
+            }
           }
         }
 
@@ -435,7 +446,6 @@
         }
       };
     }
-
     return layerListener;
   }
 

Modified: 
core/trunk/src/com/vividsolutions/jump/workbench/model/LayerManager.java
===================================================================
--- core/trunk/src/com/vividsolutions/jump/workbench/model/LayerManager.java    
2018-06-03 18:08:12 UTC (rev 5828)
+++ core/trunk/src/com/vividsolutions/jump/workbench/model/LayerManager.java    
2018-06-03 21:35:20 UTC (rev 5829)
@@ -343,6 +343,9 @@
                     fireLayerChanged(layerable, LayerEventType.REMOVED, 
category,
                             index);
                 }
+                if (layerable instanceof Layer) {
+                    
layerListeners.remove(((Layer)layerable).getLayerListener());
+                }
             }
         }
         System.gc();

Modified: 
core/trunk/src/com/vividsolutions/jump/workbench/plugin/AbstractPlugIn.java
===================================================================
--- core/trunk/src/com/vividsolutions/jump/workbench/plugin/AbstractPlugIn.java 
2018-06-03 18:08:12 UTC (rev 5828)
+++ core/trunk/src/com/vividsolutions/jump/workbench/plugin/AbstractPlugIn.java 
2018-06-03 21:35:20 UTC (rev 5829)
@@ -392,18 +392,20 @@
     // resources if the layer has been removed. 
     final UndoableEdit undoableEdit = command.toUndoableEdit();
     if (command.getLayer() != null) {
-        LayerManager layerManager = command.getLayer().getLayerManager();
+        final LayerManager layerManager = command.getLayer().getLayerManager();
         if (layerManager != null) {
-            layerManager.addLayerListener(new LayerListener(){
-                  public void categoryChanged(CategoryEvent e) {}
-                  public void featuresChanged(FeatureEvent e) {}
-                  public void layerChanged(LayerEvent e) {
-                      if (e.getType() == LayerEventType.REMOVED &&
-                          e.getLayerable() == command.getLayer()) {
-                          undoableEdit.die();
-                      }
-                  }
-            });
+            LayerListener listener = new LayerListener(){
+              public void categoryChanged(CategoryEvent e) {}
+              public void featuresChanged(FeatureEvent e) {}
+              public void layerChanged(LayerEvent e) {
+                if (e.getType() == LayerEventType.REMOVED &&
+                        e.getLayerable() == command.getLayer()) {
+                  undoableEdit.die();
+                  layerManager.removeLayerListener(this);
+                }
+              }
+            };
+            layerManager.addLayerListener(listener);
         }
     }
     layerManagerProxy.getLayerManager().getUndoableEditReceiver()

Modified: core/trunk/src/org/openjump/core/ccordsys/srid/SRIDStyle.java
===================================================================
--- core/trunk/src/org/openjump/core/ccordsys/srid/SRIDStyle.java       
2018-06-03 18:08:12 UTC (rev 5828)
+++ core/trunk/src/org/openjump/core/ccordsys/srid/SRIDStyle.java       
2018-06-03 21:35:20 UTC (rev 5829)
@@ -34,6 +34,10 @@
         }
 
         updateSRIDs(layer);
+        // mmichaud 2018-06-03 : This is wrong. Every time a feature is added 
or change,
+        // it is updated as many times as the layerManager contains layers.
+        // Responsability of updating the  the srid is moved to the 
LayerListener
+        /*
         layer.getLayerManager().addLayerListener(new LayerListener() {
             public void featuresChanged(FeatureEvent e) {
                 for (Feature feature : e.getFeatures()) {
@@ -47,6 +51,7 @@
             public void categoryChanged(CategoryEvent e) {
             }
         });
+        */
         initialized = true;
     }
 


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Jump-pilot-devel mailing list
Jump-pilot-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel

Reply via email to