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 | |