Index: trunk/src/org/openstreetmap/josm/gui/MapView.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 8571)
+++ trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 8573)
@@ -27,4 +27,5 @@
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.EnumSet;
 import java.util.LinkedHashSet;
 import java.util.List;
@@ -407,6 +408,7 @@
         layerLock.writeLock().lock();
         layerLock.readLock().lock();
-        boolean fireSetActiveLayer = false;
+        EnumSet<LayerListenerType> listenersToFire = EnumSet.noneOf(LayerListenerType.class);
         Layer oldActiveLayer = activeLayer;
+        OsmDataLayer oldEditLayer = editLayer;
         try {
             try {
@@ -433,5 +435,5 @@
                 if (isOsmDataLayer || oldActiveLayer == null) {
                     // autoselect the new layer
-                    fireSetActiveLayer = setActiveLayer(layer, true);
+                    listenersToFire.addAll(setActiveLayer(layer, true));
                 }
             } finally {
@@ -443,7 +445,5 @@
                 ((OsmDataLayer) layer).addLayerStateChangeListener(this);
             }
-            if (fireSetActiveLayer) {
-                onActiveLayerChanged(oldActiveLayer);
-            }
+            onActiveEditLayerChanged(oldActiveLayer, oldEditLayer, listenersToFire);
             layer.addPropertyChangeListener(this);
             Main.addProjectionChangeListener(layer);
@@ -452,5 +452,5 @@
             layerLock.readLock().unlock();
         }
-        if (!fireSetActiveLayer) {
+        if (!listenersToFire.isEmpty()) {
             repaint();
         }
@@ -531,12 +531,10 @@
      */
     public void removeLayer(Layer layer) {
-        boolean fireEditLayerChanged;
-        boolean fireSetActiveLayer = false;
         layerLock.writeLock().lock();
         layerLock.readLock().lock();
 
+        EnumSet<LayerListenerType> listenersToFire = EnumSet.noneOf(LayerListenerType.class);
+        Layer oldActiveLayer = activeLayer;
         OsmDataLayer oldEditLayer = editLayer;
-        Layer oldActiveLayer = activeLayer;
-
         try {
             try {
@@ -546,8 +544,8 @@
                     return;
 
-                fireEditLayerChanged = setEditLayer(layersList);
+                listenersToFire = setEditLayer(layersList);
 
                 if (layer == activeLayer) {
-                    fireSetActiveLayer = setActiveLayer(determineNextActiveLayer(layersList), false);
+                    listenersToFire.addAll(setActiveLayer(determineNextActiveLayer(layersList), false));
                 }
 
@@ -562,10 +560,5 @@
                 layerLock.writeLock().unlock();
             }
-            if (fireEditLayerChanged) {
-               onEditLayerChanged(oldEditLayer);
-            }
-            if (fireSetActiveLayer) {
-                onActiveLayerChanged(oldActiveLayer);
-            }
+            onActiveEditLayerChanged(oldActiveLayer, oldEditLayer, listenersToFire);
             fireLayerRemoved(layer);
             layer.removePropertyChangeListener(this);
@@ -611,5 +604,6 @@
         layerLock.writeLock().lock();
         layerLock.readLock().lock();
-        boolean fireEditLayerChanged;
+        EnumSet<LayerListenerType> listenersToFire;
+        Layer oldActiveLayer = activeLayer;
         OsmDataLayer oldEditLayer = editLayer;
         try {
@@ -626,11 +620,9 @@
                     layers.add(pos, layer);
                 }
-                fireEditLayerChanged = setEditLayer(layers);
+                listenersToFire = setEditLayer(layers);
             } finally {
                 layerLock.writeLock().unlock();
             }
-            if (fireEditLayerChanged) {
-                onEditLayerChanged(editLayer);
-            }
+            onActiveEditLayerChanged(oldActiveLayer, oldEditLayer, listenersToFire);
             AudioPlayer.reset();
         } finally {
@@ -946,7 +938,7 @@
      * You must own a write {@link #layerLock} when calling this method.
      * @param layersList A list to select that layer from.
-     * @return <code>true</code> if the edit layer was really changed and the listeners should be informed.
-     */
-    private boolean setEditLayer(List<Layer> layersList) {
+     * @return A list of change listeners that should be fired using {@link #onActiveEditLayerChanged(Layer, OsmDataLayer, EnumSet)}
+     */
+    private EnumSet<LayerListenerType> setEditLayer(List<Layer> layersList) {
         final OsmDataLayer newEditLayer = findNewEditLayer(layersList);
 
@@ -959,7 +951,7 @@
 
             editLayer = newEditLayer;
-            return true;
+            return EnumSet.of(LayerListenerType.EDIT_LAYER_CHANGE);
         } else {
-            return false;
+            return EnumSet.noneOf(LayerListenerType.class);
         }
 
@@ -994,15 +986,14 @@
         layerLock.writeLock().lock();
         layerLock.readLock().lock();
+        EnumSet<LayerListenerType> listenersToFire;
         Layer oldActiveLayer = activeLayer;
-        try {
-            boolean fireSetActiveLayer;
+        OsmDataLayer oldEditLayer = editLayer;
+        try {
             try {
-                fireSetActiveLayer = setActiveLayer(layer, true);
+                listenersToFire = setActiveLayer(layer, true);
             } finally {
                 layerLock.writeLock().unlock();
             }
-            if (fireSetActiveLayer) {
-                onActiveLayerChanged(oldActiveLayer);
-            }
+            onActiveEditLayerChanged(oldActiveLayer, oldEditLayer, listenersToFire);
         } finally {
             layerLock.readLock().unlock();
@@ -1015,19 +1006,20 @@
      * @param layer The layer to be active.
      * @param setEditLayer if this is <code>true</code>, the edit layer is also set.
-     * @return {@code true} if the active layer has changed, {@code false otherwise}
-     */
-    private boolean setActiveLayer(final Layer layer, boolean setEditLayer) {
+     * @return A list of change listeners that should be fired using {@link #onActiveEditLayerChanged(Layer, OsmDataLayer, EnumSet)}
+     */
+    private EnumSet<LayerListenerType> setActiveLayer(final Layer layer, boolean setEditLayer) {
         if (layer != null && !layers.contains(layer))
             throw new IllegalArgumentException(tr("Layer ''{0}'' must be in list of layers", layer.toString()));
 
         if (layer == activeLayer)
-            return false;
+            return EnumSet.noneOf(LayerListenerType.class);
 
         activeLayer = layer;
+        EnumSet<LayerListenerType> listenersToFire = EnumSet.of(LayerListenerType.ACTIVE_LAYER_CHANGE);
         if (setEditLayer) {
-            setEditLayer(layers);
-        }
-
-        return true;
+            listenersToFire.addAll(setEditLayer(layers));
+        }
+
+        return listenersToFire;
     }
 
@@ -1043,4 +1035,24 @@
         } finally {
             layerLock.readLock().unlock();
+        }
+    }
+
+    private enum LayerListenerType {
+        ACTIVE_LAYER_CHANGE,
+        EDIT_LAYER_CHANGE
+    }
+
+    /**
+     * This is called whenever one of active layer/edit layer or both may have been changed,
+     * @param oldActive The old active layer
+     * @param oldEdit The old edit layer.
+     * @param listenersToFire A mask of listeners to fire using {@link LayerListenerType}s
+     */
+    private void onActiveEditLayerChanged(final Layer oldActive, final OsmDataLayer oldEdit, EnumSet<LayerListenerType> listenersToFire) {
+        if (listenersToFire.contains(LayerListenerType.EDIT_LAYER_CHANGE)) {
+            onEditLayerChanged(oldEdit);
+        }
+        if (listenersToFire.contains(LayerListenerType.ACTIVE_LAYER_CHANGE)) {
+            onActiveLayerChanged(oldActive);
         }
     }
