From 4e45e377f130af94ab4388230eb1d09f477778bd Mon Sep 17 00:00:00 2001
From: Michael Zangl <michael.zangl@student.kit.edu>
Date: Wed, 1 Jul 2015 14:41:30 +0200
Subject: [PATCH 6/8] Synchronized access to temporary layers and added a
getter.
---
src/org/openstreetmap/josm/gui/MapView.java | 52 ++++++++++++++++++++++++-----
1 file changed, 44 insertions(+), 8 deletions(-)
diff --git a/src/org/openstreetmap/josm/gui/MapView.java b/src/org/openstreetmap/josm/gui/MapView.java
index a32db86..4e2dee0 100644
a
|
b
|
import java.beans.PropertyChangeListener; |
24 | 24 | import java.util.ArrayList; |
25 | 25 | import java.util.Collection; |
26 | 26 | import java.util.Collections; |
27 | | import java.util.LinkedList; |
| 27 | import java.util.LinkedHashSet; |
28 | 28 | import java.util.List; |
29 | 29 | import java.util.ListIterator; |
| 30 | import java.util.Set; |
30 | 31 | import java.util.concurrent.CopyOnWriteArrayList; |
31 | 32 | import java.util.concurrent.locks.ReentrantReadWriteLock; |
32 | 33 | |
… |
… |
implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer |
264 | 265 | */ |
265 | 266 | public MouseEvent lastMEvent = new MouseEvent(this, 0, 0, 0, 0, 0, 0, false); // In case somebody reads it before first mouse move |
266 | 267 | |
267 | | private final transient List<MapViewPaintable> temporaryLayers = new LinkedList<>(); |
| 268 | private final transient Set<MapViewPaintable> temporaryLayers = new LinkedHashSet<>(); |
| 269 | |
| 270 | /** |
| 271 | * This is a mutex that locks changes to {@link #temporaryLayers} |
| 272 | */ |
| 273 | private final transient Object temporaryLayersMutex = new Object(); |
268 | 274 | |
269 | 275 | private transient BufferedImage nonChangedLayersBuffer; |
270 | 276 | private transient BufferedImage offscreenBuffer; |
… |
… |
implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer |
777 | 783 | paintLayer(visibleLayers.get(i), tempG, box); |
778 | 784 | } |
779 | 785 | |
780 | | for (MapViewPaintable mvp : temporaryLayers) { |
781 | | mvp.paint(tempG, this, box); |
| 786 | synchronized (temporaryLayersMutex) { |
| 787 | for (MapViewPaintable mvp : temporaryLayers) { |
| 788 | mvp.paint(tempG, this, box); |
| 789 | } |
782 | 790 | } |
783 | 791 | |
784 | 792 | // draw world borders |
… |
… |
implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer |
1058 | 1066 | } |
1059 | 1067 | } |
1060 | 1068 | |
| 1069 | /** |
| 1070 | * Adds a new temporary layer. |
| 1071 | * <p> |
| 1072 | * A temporary layer is a layer that is painted above all normal layers. Layers are painted in the order they are added. |
| 1073 | * |
| 1074 | * @param mvp The layer to paint. |
| 1075 | * @return <code>true</code> if the layer was added. |
| 1076 | */ |
1061 | 1077 | public boolean addTemporaryLayer(MapViewPaintable mvp) { |
1062 | | if (temporaryLayers.contains(mvp)) return false; |
1063 | | return temporaryLayers.add(mvp); |
| 1078 | synchronized (temporaryLayersMutex) { |
| 1079 | return temporaryLayers.add(mvp); |
| 1080 | } |
1064 | 1081 | } |
1065 | 1082 | |
| 1083 | /** |
| 1084 | * Removes a layer previously added as temporary layer. |
| 1085 | * @param mvp The layer to remove. |
| 1086 | * @return <code>true</code> if that layer was removed. |
| 1087 | */ |
1066 | 1088 | public boolean removeTemporaryLayer(MapViewPaintable mvp) { |
1067 | | return temporaryLayers.remove(mvp); |
| 1089 | synchronized (temporaryLayersMutex) { |
| 1090 | return temporaryLayers.remove(mvp); |
| 1091 | } |
| 1092 | } |
| 1093 | |
| 1094 | /** |
| 1095 | * Gets a list of temporary layers. |
| 1096 | * @return The layers in the order they are added. |
| 1097 | */ |
| 1098 | public List<MapViewPaintable> getTemporaryLayers() { |
| 1099 | synchronized (temporaryLayersMutex) { |
| 1100 | return Collections.unmodifiableList(new ArrayList<>(temporaryLayers)); |
| 1101 | } |
1068 | 1102 | } |
1069 | 1103 | |
1070 | 1104 | @Override |
… |
… |
implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer |
1135 | 1169 | layerLock.writeLock().unlock(); |
1136 | 1170 | } |
1137 | 1171 | nonChangedLayers.clear(); |
1138 | | temporaryLayers.clear(); |
| 1172 | synchronized (temporaryLayersMutex) { |
| 1173 | temporaryLayers.clear(); |
| 1174 | } |
1139 | 1175 | } |
1140 | 1176 | |
1141 | 1177 | @Override |