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