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