Ticket #11647: 0001-Made-setActiveLayer-fire-the-edit-layer-change-liste.patch

File 0001-Made-setActiveLayer-fire-the-edit-layer-change-liste.patch, 9.4 KB (added by michael2402, 10 years ago)
  • src/org/openstreetmap/josm/gui/MapView.java

    From 2a56adfa48f64344e64783e69ff6b68470833723 Mon Sep 17 00:00:00 2001
    From: Michael Zangl <michael.zangl@student.kit.edu>
    Date: Sun, 5 Jul 2015 14:03:33 +0200
    Subject: [PATCH 1/2] Made setActiveLayer fire the edit layer change listener
     if edit layer was also changed.
    
    ---
     src/org/openstreetmap/josm/gui/MapView.java | 84 ++++++++++++++++-------------
     1 file changed, 47 insertions(+), 37 deletions(-)
    
    diff --git a/src/org/openstreetmap/josm/gui/MapView.java b/src/org/openstreetmap/josm/gui/MapView.java
    index f00edf2..70afe09 100644
    a b implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer  
    406406        boolean isOsmDataLayer = layer instanceof OsmDataLayer;
    407407        layerLock.writeLock().lock();
    408408        layerLock.readLock().lock();
    409         boolean fireSetActiveLayer = false;
     409        int listenersToFire = 0;
    410410        Layer oldActiveLayer = activeLayer;
     411        OsmDataLayer oldEditLayer = editLayer;
    411412        try {
    412413            try {
    413414                if (layer instanceof MarkerLayer && playHeadMarker == null) {
    implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer  
    432433
    433434                if (isOsmDataLayer || oldActiveLayer == null) {
    434435                    // autoselect the new layer
    435                     fireSetActiveLayer = setActiveLayer(layer, true);
     436                    listenersToFire = setActiveLayer(layer, true);
    436437                }
    437438            } finally {
    438439                layerLock.writeLock().unlock();
    implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer  
    442443            if (isOsmDataLayer) {
    443444                ((OsmDataLayer) layer).addLayerStateChangeListener(this);
    444445            }
    445             if (fireSetActiveLayer) {
    446                 onActiveLayerChanged(oldActiveLayer);
    447             }
     446            onActiveEditLayerChanged(oldActiveLayer, oldEditLayer, listenersToFire);
    448447            layer.addPropertyChangeListener(this);
    449448            Main.addProjectionChangeListener(layer);
    450449            AudioPlayer.reset();
    451450        } finally {
    452451            layerLock.readLock().unlock();
    453452        }
    454         if (!fireSetActiveLayer) {
     453        if (listenersToFire != 0) {
    455454            repaint();
    456455        }
    457456    }
    implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer  
    530529     * @param layer The layer to remove
    531530     */
    532531    public void removeLayer(Layer layer) {
    533         boolean fireEditLayerChanged;
    534         boolean fireSetActiveLayer = false;
    535532        layerLock.writeLock().lock();
    536533        layerLock.readLock().lock();
    537534
    538         OsmDataLayer oldEditLayer = editLayer;
     535        int listenersToFire = 0;
    539536        Layer oldActiveLayer = activeLayer;
    540 
     537        OsmDataLayer oldEditLayer = editLayer;
    541538        try {
    542539            try {
    543540                List<Layer> layersList = new ArrayList<>(layers);
    implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer  
    545542                if (!layersList.remove(layer))
    546543                    return;
    547544
    548                 fireEditLayerChanged = setEditLayer(layersList);
     545                listenersToFire = setEditLayer(layersList);
    549546
    550547                if (layer == activeLayer) {
    551                     fireSetActiveLayer = setActiveLayer(determineNextActiveLayer(layersList), false);
     548                    listenersToFire |= setActiveLayer(determineNextActiveLayer(layersList), false);
    552549                }
    553550
    554551                if (layer instanceof OsmDataLayer) {
    implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer  
    561558            } finally {
    562559                layerLock.writeLock().unlock();
    563560            }
    564             if (fireEditLayerChanged) {
    565                onEditLayerChanged(oldEditLayer);
    566             }
    567             if (fireSetActiveLayer) {
    568                 onActiveLayerChanged(oldActiveLayer);
    569             }
     561            onActiveEditLayerChanged(oldActiveLayer, oldEditLayer, listenersToFire);
    570562            fireLayerRemoved(layer);
    571563            layer.removePropertyChangeListener(this);
    572564            layer.destroy();
    implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer  
    610602    public void moveLayer(Layer layer, int pos) {
    611603        layerLock.writeLock().lock();
    612604        layerLock.readLock().lock();
    613         boolean fireEditLayerChanged;
     605        int listenersToFire;
     606        Layer oldActiveLayer = activeLayer;
    614607        OsmDataLayer oldEditLayer = editLayer;
    615608        try {
    616609            try {
    implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer  
    625618                } else {
    626619                    layers.add(pos, layer);
    627620                }
    628                 fireEditLayerChanged = setEditLayer(layers);
     621                listenersToFire = setEditLayer(layers);
    629622            } finally {
    630623                layerLock.writeLock().unlock();
    631624            }
    632             if (fireEditLayerChanged) {
    633                 onEditLayerChanged(editLayer);
    634             }
     625            onActiveEditLayerChanged(oldActiveLayer, oldEditLayer, listenersToFire);
    635626            AudioPlayer.reset();
    636627        } finally {
    637628            layerLock.readLock().unlock();
    implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer  
    945936     * <p>
    946937     * You must own a write {@link #layerLock} when calling this method.
    947938     * @param layersList A list to select that layer from.
    948      * @return <code>true</code> if the edit layer was really changed and the listeners should be informed.
     939     * @return A list of change listeners that should be fired using {@link #onActiveEditLayerChanged(Layer, Layer, int)}
    949940     */
    950     private boolean setEditLayer(List<Layer> layersList) {
     941    private int setEditLayer(List<Layer> layersList) {
    951942        final OsmDataLayer newEditLayer = findNewEditLayer(layersList);
    952943
    953944        // Set new edit layer
    implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer  
    958949            }
    959950
    960951            editLayer = newEditLayer;
    961             return true;
     952            return FIRE_CHANGE_EDIT_LAYER;
    962953        } else {
    963             return false;
     954            return 0;
    964955        }
    965956
    966957    }
    implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer  
    993984    public void setActiveLayer(Layer layer) {
    994985        layerLock.writeLock().lock();
    995986        layerLock.readLock().lock();
     987        int listenersToFire;
    996988        Layer oldActiveLayer = activeLayer;
     989        OsmDataLayer oldEditLayer = editLayer;
    997990        try {
    998             boolean fireSetActiveLayer;
    999991            try {
    1000                 fireSetActiveLayer = setActiveLayer(layer, true);
     992                listenersToFire = setActiveLayer(layer, true);
    1001993            } finally {
    1002994                layerLock.writeLock().unlock();
    1003995            }
    1004             if (fireSetActiveLayer) {
    1005                 onActiveLayerChanged(oldActiveLayer);
    1006             }
     996            onActiveEditLayerChanged(oldActiveLayer, oldEditLayer, listenersToFire);
    1007997        } finally {
    1008998            layerLock.readLock().unlock();
    1009999        }
    implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer  
    10141004     * Sets the active layer. Propagates this change to all map buttons.
    10151005     * @param layer The layer to be active.
    10161006     * @param setEditLayer if this is <code>true</code>, the edit layer is also set.
    1017      * @return {@code true} if the active layer has changed, {@code false otherwise}
     1007     * @return A list of change listeners that should be fired using {@link #onActiveEditLayerChanged(Layer, Layer, int)}
    10181008     */
    1019     private boolean setActiveLayer(final Layer layer, boolean setEditLayer) {
     1009    private int setActiveLayer(final Layer layer, boolean setEditLayer) {
    10201010        if (layer != null && !layers.contains(layer))
    10211011            throw new IllegalArgumentException(tr("Layer ''{0}'' must be in list of layers", layer.toString()));
    10221012
    10231013        if (layer == activeLayer)
    1024             return false;
     1014            return 0;
     1015
    10251016
    10261017        activeLayer = layer;
     1018        int listenersToFire = FIRE_CHANGE_ACTIVE_LAYER;
    10271019        if (setEditLayer) {
    1028             setEditLayer(layers);
     1020            listenersToFire |= setEditLayer(layers);
    10291021        }
    10301022
    1031         return true;
     1023        return listenersToFire;
    10321024    }
    10331025
    10341026    /**
    implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer  
    10451037        }
    10461038    }
    10471039
     1040    private static final int FIRE_CHANGE_ACTIVE_LAYER = 1;
     1041    private static final int FIRE_CHANGE_EDIT_LAYER = 2;
     1042
     1043    /**
     1044     * This is called whenever one of active layer/edit layer or both may have been changed,
     1045     * @param oldActive The old active layer
     1046     * @param oldEdit The old edit layer.
     1047     * @param listenersToFire A bitmask using {@link #FIRE_CHANGE_ACTIVE_LAYER} and {@link #FIRE_CHANGE_EDIT_LAYER}
     1048     */
     1049    private void onActiveEditLayerChanged(final Layer oldActive, final OsmDataLayer oldEdit, int listenersToFire) {
     1050        if ((listenersToFire & FIRE_CHANGE_EDIT_LAYER) != 0) {
     1051            onEditLayerChanged(oldEdit);
     1052        }
     1053        if ((listenersToFire & FIRE_CHANGE_ACTIVE_LAYER) != 0) {
     1054            onActiveLayerChanged(oldActive);
     1055        }
     1056    }
     1057
    10481058    private void onActiveLayerChanged(final Layer old) {
    10491059        fireActiveLayerChanged(old, activeLayer);
    10501060