diff --git a/src/org/openstreetmap/josm/gui/MainApplication.java b/src/org/openstreetmap/josm/gui/MainApplication.java
index 4abcbe5..15dd555 100644
a
|
b
|
public class MainApplication extends Main {
|
396 | 396 | |
397 | 397 | I18n.setupLanguageFonts(); |
398 | 398 | |
399 | | // Can only be called after preferences are initialized. |
400 | | // We can move this to MainPanel constructor as soon as noone depends on Main#panel any more. |
401 | | GuiHelper.runInEDTAndWait(new Runnable() { |
402 | | @Override |
403 | | public void run() { |
404 | | mainPanel.updateContent(); |
405 | | } |
406 | | }); |
407 | | |
408 | 399 | WindowGeometry geometry = WindowGeometry.mainWindow("gui.geometry", |
409 | 400 | args.containsKey(Option.GEOMETRY) ? args.get(Option.GEOMETRY).iterator().next() : null, |
410 | 401 | !args.containsKey(Option.NO_MAXIMIZE) && Main.pref.getBoolean("gui.maximized", false)); |
diff --git a/src/org/openstreetmap/josm/gui/MainPanel.java b/src/org/openstreetmap/josm/gui/MainPanel.java
index 0762e3b..f7ffd64 100644
a
|
b
|
import java.util.List;
|
6 | 6 | import java.util.concurrent.CopyOnWriteArrayList; |
7 | 7 | |
8 | 8 | import javax.swing.JPanel; |
9 | | import javax.swing.SwingUtilities; |
10 | 9 | |
11 | 10 | import org.openstreetmap.josm.Main; |
12 | 11 | import org.openstreetmap.josm.actions.mapmode.MapMode; |
13 | 12 | import org.openstreetmap.josm.gui.layer.Layer; |
14 | | import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent; |
15 | | import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener; |
16 | | import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent; |
17 | | import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent; |
18 | 13 | import org.openstreetmap.josm.gui.layer.MainLayerManager; |
| 14 | import org.openstreetmap.josm.gui.layer.MainLayerManager.LayerAvailabilityEvent; |
| 15 | import org.openstreetmap.josm.gui.layer.MainLayerManager.LayerAvailabilityListener; |
19 | 16 | import org.openstreetmap.josm.gui.util.GuiHelper; |
20 | 17 | |
21 | 18 | /** |
… |
… |
public class MainPanel extends JPanel {
|
44 | 41 | |
45 | 42 | /** |
46 | 43 | * Update the content of this {@link MainFrame} to either display the map or display the welcome screen. |
| 44 | * @param showMap If the map should be displayed. |
47 | 45 | */ |
48 | | protected void updateContent() { |
| 46 | protected void updateContent(boolean showMap) { |
49 | 47 | GuiHelper.assertCallFromEdt(); |
50 | 48 | MapFrame old = map; |
51 | | boolean showMap = !layerManager.getLayers().isEmpty(); |
52 | 49 | if (old != null && showMap) { |
53 | 50 | // no state change |
54 | 51 | return; |
… |
… |
public class MainPanel extends JPanel {
|
154 | 151 | * Re-adds the layer listeners. Never call this in production, only needed for testing. |
155 | 152 | */ |
156 | 153 | public void reAddListeners() { |
157 | | layerManager.addLayerChangeListener(new LayerChangeListener() { |
| 154 | layerManager.addLayerAvailabilityListener(new LayerAvailabilityListener() { |
158 | 155 | @Override |
159 | | public void layerAdded(LayerAddEvent e) { |
160 | | updateContent(); |
| 156 | public void beforeFirstLayerAdded(LayerAvailabilityEvent e) { |
| 157 | updateContent(true); |
161 | 158 | } |
162 | 159 | |
163 | 160 | @Override |
164 | | public void layerRemoving(final LayerRemoveEvent e) { |
165 | | // Delay main.map removal until after all listeners are finished. |
166 | | // Some components rely on this and e.g. get the MapView that way. |
167 | | SwingUtilities.invokeLater(new Runnable() { |
168 | | @Override |
169 | | public void run() { |
170 | | updateContent(); |
171 | | } |
172 | | }); |
| 161 | public void afterLastLayerRemoved(LayerAvailabilityEvent e) { |
| 162 | updateContent(false); |
173 | 163 | } |
174 | | |
| 164 | }); |
| 165 | GuiHelper.runInEDTAndWait(new Runnable() { |
175 | 166 | @Override |
176 | | public void layerOrderChanged(LayerOrderChangeEvent e) { |
177 | | // ignored |
| 167 | public void run() { |
| 168 | updateContent(!layerManager.getLayers().isEmpty()); |
178 | 169 | } |
179 | 170 | }); |
180 | 171 | } |
diff --git a/src/org/openstreetmap/josm/gui/layer/MainLayerManager.java b/src/org/openstreetmap/josm/gui/layer/MainLayerManager.java
index bd6a5ee..442a47d 100644
a
|
b
|
public class MainLayerManager extends LayerManager {
|
94 | 94 | } |
95 | 95 | |
96 | 96 | /** |
| 97 | * This event is fired for {@link LayerAvailabilityListener} |
| 98 | * @author Michael Zangl |
| 99 | * @since xxx |
| 100 | */ |
| 101 | public class LayerAvailabilityEvent extends LayerManagerEvent { |
| 102 | private final boolean hasLayers; |
| 103 | |
| 104 | LayerAvailabilityEvent(LayerManager source, boolean hasLayers) { |
| 105 | super(source); |
| 106 | this.hasLayers = hasLayers; |
| 107 | } |
| 108 | |
| 109 | /** |
| 110 | * Checks if this layer manager will have layers afterwards |
| 111 | * @return true if layers will be added. |
| 112 | */ |
| 113 | public boolean hasLayers() { |
| 114 | return hasLayers; |
| 115 | } |
| 116 | } |
| 117 | |
| 118 | /** |
| 119 | * A listener that gets informed before any layer is displayed and after all layers are removed. |
| 120 | * @author Michael Zangl |
| 121 | * @since xxx |
| 122 | */ |
| 123 | public interface LayerAvailabilityListener { |
| 124 | /** |
| 125 | * This method is called in the UI thread right before the first layer is added. |
| 126 | * @param e The event. |
| 127 | */ |
| 128 | void beforeFirstLayerAdded(LayerAvailabilityEvent e); |
| 129 | |
| 130 | /** |
| 131 | * This method is called in the UI thread after the last layer was removed. |
| 132 | * @param e The event. |
| 133 | */ |
| 134 | void afterLastLayerRemoved(LayerAvailabilityEvent e); |
| 135 | } |
| 136 | |
| 137 | /** |
97 | 138 | * The layer from the layers list that is currently active. |
98 | 139 | */ |
99 | 140 | private Layer activeLayer; |
… |
… |
public class MainLayerManager extends LayerManager {
|
104 | 145 | private OsmDataLayer editLayer; |
105 | 146 | |
106 | 147 | private final List<ActiveLayerChangeListener> activeLayerChangeListeners = new CopyOnWriteArrayList<>(); |
| 148 | private final List<LayerAvailabilityListener> layerAvailabilityListeners = new CopyOnWriteArrayList<>(); |
107 | 149 | |
108 | 150 | /** |
109 | 151 | * Adds a active/edit layer change listener |
… |
… |
public class MainLayerManager extends LayerManager {
|
155 | 197 | } |
156 | 198 | |
157 | 199 | /** |
| 200 | * Add a new {@link LayerAvailabilityListener}. |
| 201 | * @param listener The listener |
| 202 | * @since xxx |
| 203 | */ |
| 204 | public synchronized void addLayerAvailabilityListener(LayerAvailabilityListener listener) { |
| 205 | if (!layerAvailabilityListeners.add(listener)) { |
| 206 | throw new IllegalArgumentException("Attempted to add listener that was already in list: " + listener); |
| 207 | } |
| 208 | } |
| 209 | |
| 210 | /** |
| 211 | * Remove an {@link LayerAvailabilityListener}. |
| 212 | * @param listener The listener |
| 213 | * @since xxx |
| 214 | */ |
| 215 | public synchronized void removeLayerAvailabilityListener(LayerAvailabilityListener listener) { |
| 216 | if (!layerAvailabilityListeners.remove(listener)) { |
| 217 | throw new IllegalArgumentException("Attempted to remove listener that was not in list: " + listener); |
| 218 | } |
| 219 | |
| 220 | } |
| 221 | |
| 222 | /** |
158 | 223 | * Set the active layer. If the layer is an OsmDataLayer, the edit layer is also changed. |
159 | 224 | * @param layer The active layer. |
160 | 225 | */ |
… |
… |
public class MainLayerManager extends LayerManager {
|
197 | 262 | |
198 | 263 | @Override |
199 | 264 | protected synchronized void realAddLayer(Layer layer) { |
| 265 | if (getLayers().isEmpty()) { |
| 266 | LayerAvailabilityEvent e = new LayerAvailabilityEvent(this, true); |
| 267 | for (LayerAvailabilityListener l : layerAvailabilityListeners) { |
| 268 | l.beforeFirstLayerAdded(e); |
| 269 | } |
| 270 | } |
200 | 271 | super.realAddLayer(layer); |
201 | 272 | |
202 | 273 | // update the active layer automatically. |
… |
… |
public class MainLayerManager extends LayerManager {
|
213 | 284 | } |
214 | 285 | |
215 | 286 | super.realRemoveLayer(layer); |
| 287 | |
| 288 | if (getLayers().isEmpty()) { |
| 289 | LayerAvailabilityEvent e = new LayerAvailabilityEvent(this, false); |
| 290 | for (LayerAvailabilityListener l : layerAvailabilityListeners) { |
| 291 | l.afterLastLayerRemoved(e); |
| 292 | } |
| 293 | } |
216 | 294 | } |
217 | 295 | |
218 | 296 | /** |
… |
… |
public class MainLayerManager extends LayerManager {
|
318 | 396 | super.resetState(); |
319 | 397 | |
320 | 398 | activeLayerChangeListeners.clear(); |
| 399 | layerAvailabilityListeners.clear(); |
321 | 400 | } |
322 | 401 | } |