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
|
406 | 406 | boolean isOsmDataLayer = layer instanceof OsmDataLayer; |
407 | 407 | layerLock.writeLock().lock(); |
408 | 408 | layerLock.readLock().lock(); |
409 | | boolean fireSetActiveLayer = false; |
| 409 | int listenersToFire = 0; |
410 | 410 | Layer oldActiveLayer = activeLayer; |
| 411 | OsmDataLayer oldEditLayer = editLayer; |
411 | 412 | try { |
412 | 413 | try { |
413 | 414 | if (layer instanceof MarkerLayer && playHeadMarker == null) { |
… |
… |
implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
|
432 | 433 | |
433 | 434 | if (isOsmDataLayer || oldActiveLayer == null) { |
434 | 435 | // autoselect the new layer |
435 | | fireSetActiveLayer = setActiveLayer(layer, true); |
| 436 | listenersToFire = setActiveLayer(layer, true); |
436 | 437 | } |
437 | 438 | } finally { |
438 | 439 | layerLock.writeLock().unlock(); |
… |
… |
implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
|
442 | 443 | if (isOsmDataLayer) { |
443 | 444 | ((OsmDataLayer) layer).addLayerStateChangeListener(this); |
444 | 445 | } |
445 | | if (fireSetActiveLayer) { |
446 | | onActiveLayerChanged(oldActiveLayer); |
447 | | } |
| 446 | onActiveEditLayerChanged(oldActiveLayer, oldEditLayer, listenersToFire); |
448 | 447 | layer.addPropertyChangeListener(this); |
449 | 448 | Main.addProjectionChangeListener(layer); |
450 | 449 | AudioPlayer.reset(); |
451 | 450 | } finally { |
452 | 451 | layerLock.readLock().unlock(); |
453 | 452 | } |
454 | | if (!fireSetActiveLayer) { |
| 453 | if (listenersToFire != 0) { |
455 | 454 | repaint(); |
456 | 455 | } |
457 | 456 | } |
… |
… |
implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
|
530 | 529 | * @param layer The layer to remove |
531 | 530 | */ |
532 | 531 | public void removeLayer(Layer layer) { |
533 | | boolean fireEditLayerChanged; |
534 | | boolean fireSetActiveLayer = false; |
535 | 532 | layerLock.writeLock().lock(); |
536 | 533 | layerLock.readLock().lock(); |
537 | 534 | |
538 | | OsmDataLayer oldEditLayer = editLayer; |
| 535 | int listenersToFire = 0; |
539 | 536 | Layer oldActiveLayer = activeLayer; |
540 | | |
| 537 | OsmDataLayer oldEditLayer = editLayer; |
541 | 538 | try { |
542 | 539 | try { |
543 | 540 | List<Layer> layersList = new ArrayList<>(layers); |
… |
… |
implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
|
545 | 542 | if (!layersList.remove(layer)) |
546 | 543 | return; |
547 | 544 | |
548 | | fireEditLayerChanged = setEditLayer(layersList); |
| 545 | listenersToFire = setEditLayer(layersList); |
549 | 546 | |
550 | 547 | if (layer == activeLayer) { |
551 | | fireSetActiveLayer = setActiveLayer(determineNextActiveLayer(layersList), false); |
| 548 | listenersToFire |= setActiveLayer(determineNextActiveLayer(layersList), false); |
552 | 549 | } |
553 | 550 | |
554 | 551 | if (layer instanceof OsmDataLayer) { |
… |
… |
implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
|
561 | 558 | } finally { |
562 | 559 | layerLock.writeLock().unlock(); |
563 | 560 | } |
564 | | if (fireEditLayerChanged) { |
565 | | onEditLayerChanged(oldEditLayer); |
566 | | } |
567 | | if (fireSetActiveLayer) { |
568 | | onActiveLayerChanged(oldActiveLayer); |
569 | | } |
| 561 | onActiveEditLayerChanged(oldActiveLayer, oldEditLayer, listenersToFire); |
570 | 562 | fireLayerRemoved(layer); |
571 | 563 | layer.removePropertyChangeListener(this); |
572 | 564 | layer.destroy(); |
… |
… |
implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
|
610 | 602 | public void moveLayer(Layer layer, int pos) { |
611 | 603 | layerLock.writeLock().lock(); |
612 | 604 | layerLock.readLock().lock(); |
613 | | boolean fireEditLayerChanged; |
| 605 | int listenersToFire; |
| 606 | Layer oldActiveLayer = activeLayer; |
614 | 607 | OsmDataLayer oldEditLayer = editLayer; |
615 | 608 | try { |
616 | 609 | try { |
… |
… |
implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
|
625 | 618 | } else { |
626 | 619 | layers.add(pos, layer); |
627 | 620 | } |
628 | | fireEditLayerChanged = setEditLayer(layers); |
| 621 | listenersToFire = setEditLayer(layers); |
629 | 622 | } finally { |
630 | 623 | layerLock.writeLock().unlock(); |
631 | 624 | } |
632 | | if (fireEditLayerChanged) { |
633 | | onEditLayerChanged(editLayer); |
634 | | } |
| 625 | onActiveEditLayerChanged(oldActiveLayer, oldEditLayer, listenersToFire); |
635 | 626 | AudioPlayer.reset(); |
636 | 627 | } finally { |
637 | 628 | layerLock.readLock().unlock(); |
… |
… |
implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
|
945 | 936 | * <p> |
946 | 937 | * You must own a write {@link #layerLock} when calling this method. |
947 | 938 | * @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)} |
949 | 940 | */ |
950 | | private boolean setEditLayer(List<Layer> layersList) { |
| 941 | private int setEditLayer(List<Layer> layersList) { |
951 | 942 | final OsmDataLayer newEditLayer = findNewEditLayer(layersList); |
952 | 943 | |
953 | 944 | // Set new edit layer |
… |
… |
implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
|
958 | 949 | } |
959 | 950 | |
960 | 951 | editLayer = newEditLayer; |
961 | | return true; |
| 952 | return FIRE_CHANGE_EDIT_LAYER; |
962 | 953 | } else { |
963 | | return false; |
| 954 | return 0; |
964 | 955 | } |
965 | 956 | |
966 | 957 | } |
… |
… |
implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
|
993 | 984 | public void setActiveLayer(Layer layer) { |
994 | 985 | layerLock.writeLock().lock(); |
995 | 986 | layerLock.readLock().lock(); |
| 987 | int listenersToFire; |
996 | 988 | Layer oldActiveLayer = activeLayer; |
| 989 | OsmDataLayer oldEditLayer = editLayer; |
997 | 990 | try { |
998 | | boolean fireSetActiveLayer; |
999 | 991 | try { |
1000 | | fireSetActiveLayer = setActiveLayer(layer, true); |
| 992 | listenersToFire = setActiveLayer(layer, true); |
1001 | 993 | } finally { |
1002 | 994 | layerLock.writeLock().unlock(); |
1003 | 995 | } |
1004 | | if (fireSetActiveLayer) { |
1005 | | onActiveLayerChanged(oldActiveLayer); |
1006 | | } |
| 996 | onActiveEditLayerChanged(oldActiveLayer, oldEditLayer, listenersToFire); |
1007 | 997 | } finally { |
1008 | 998 | layerLock.readLock().unlock(); |
1009 | 999 | } |
… |
… |
implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
|
1014 | 1004 | * Sets the active layer. Propagates this change to all map buttons. |
1015 | 1005 | * @param layer The layer to be active. |
1016 | 1006 | * @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)} |
1018 | 1008 | */ |
1019 | | private boolean setActiveLayer(final Layer layer, boolean setEditLayer) { |
| 1009 | private int setActiveLayer(final Layer layer, boolean setEditLayer) { |
1020 | 1010 | if (layer != null && !layers.contains(layer)) |
1021 | 1011 | throw new IllegalArgumentException(tr("Layer ''{0}'' must be in list of layers", layer.toString())); |
1022 | 1012 | |
1023 | 1013 | if (layer == activeLayer) |
1024 | | return false; |
| 1014 | return 0; |
| 1015 | |
1025 | 1016 | |
1026 | 1017 | activeLayer = layer; |
| 1018 | int listenersToFire = FIRE_CHANGE_ACTIVE_LAYER; |
1027 | 1019 | if (setEditLayer) { |
1028 | | setEditLayer(layers); |
| 1020 | listenersToFire |= setEditLayer(layers); |
1029 | 1021 | } |
1030 | 1022 | |
1031 | | return true; |
| 1023 | return listenersToFire; |
1032 | 1024 | } |
1033 | 1025 | |
1034 | 1026 | /** |
… |
… |
implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
|
1045 | 1037 | } |
1046 | 1038 | } |
1047 | 1039 | |
| 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 | |
1048 | 1058 | private void onActiveLayerChanged(final Layer old) { |
1049 | 1059 | fireActiveLayerChanged(old, activeLayer); |
1050 | 1060 | |