source: josm/trunk/src/org/openstreetmap/josm/gui/MainPanel.java@ 12633

Last change on this file since 12633 was 12630, checked in by Don-vip, 7 years ago

see #15182 - deprecate Main.map and Main.isDisplayingMapView(). Replacements: gui.MainApplication.getMap() / gui.MainApplication.isDisplayingMapView()

  • Property svn:eol-style set to native
File size: 5.8 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui;
3
4import java.awt.BorderLayout;
5import java.util.List;
6import java.util.concurrent.CopyOnWriteArrayList;
7
8import javax.swing.JPanel;
9
10import org.openstreetmap.josm.Main;
11import org.openstreetmap.josm.actions.mapmode.MapMode;
12import org.openstreetmap.josm.gui.layer.Layer;
13import org.openstreetmap.josm.gui.layer.MainLayerManager;
14import org.openstreetmap.josm.gui.layer.MainLayerManager.LayerAvailabilityEvent;
15import org.openstreetmap.josm.gui.layer.MainLayerManager.LayerAvailabilityListener;
16import org.openstreetmap.josm.gui.util.GuiHelper;
17
18/**
19 * This is the content panel inside the {@link MainFrame}. It displays the content the user is working with.
20 * <p>
21 * If there is no active layer, there is no content displayed. As soon as there are active layers, the {@link MapFrame} is displayed.
22 *
23 * @author Michael Zangl
24 * @since 10432
25 */
26public class MainPanel extends JPanel {
27 private MapFrame map;
28 // Needs to be lazy because we need to wait for preferences to set up.
29 private GettingStarted gettingStarted;
30 private final CopyOnWriteArrayList<MapFrameListener> mapFrameListeners = new CopyOnWriteArrayList<>();
31 private final transient MainLayerManager layerManager;
32
33 /**
34 * Create a new main panel
35 * @param layerManager The layer manager to use to display the content.
36 */
37 public MainPanel(MainLayerManager layerManager) {
38 super(new BorderLayout());
39 this.layerManager = layerManager;
40 }
41
42 /**
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.
45 */
46 @SuppressWarnings("deprecation")
47 protected synchronized void updateContent(boolean showMap) {
48 GuiHelper.assertCallFromEdt();
49 MapFrame old = map;
50 if (old != null && showMap) {
51 // no state change
52 return;
53 }
54
55 // remove old content
56 setVisible(false);
57 removeAll();
58 if (old != null) {
59 old.destroy();
60 }
61
62 // create new content
63 if (showMap) {
64 map = createNewMapFrame();
65 } else {
66 map = null;
67 Main.map = map;
68 MainApplication.map = map;
69 add(getGettingStarted(), BorderLayout.CENTER);
70 }
71 setVisible(true);
72
73 if (old == null && !showMap) {
74 // listeners may not be able to handle this...
75 return;
76 }
77
78 // Notify map frame listeners, mostly plugins.
79 for (MapFrameListener listener : mapFrameListeners) {
80 listener.mapFrameInitialized(old, map);
81 }
82 if (map == null && Main.currentProgressMonitor != null) {
83 Main.currentProgressMonitor.showForegroundDialog();
84 }
85 }
86
87 @SuppressWarnings("deprecation")
88 private MapFrame createNewMapFrame() {
89 MapFrame mapFrame = new MapFrame(null);
90 // Required by many components.
91 Main.map = mapFrame;
92 MainApplication.map = mapFrame;
93
94 mapFrame.fillPanel(this);
95
96 //TODO: Move this to some better place
97 List<Layer> layers = Main.getLayerManager().getLayers();
98 if (!layers.isEmpty()) {
99 mapFrame.selectMapMode((MapMode) mapFrame.getDefaultButtonAction(), layers.get(0));
100 }
101 mapFrame.initializeDialogsPane();
102 mapFrame.setVisible(true);
103 return mapFrame;
104 }
105
106 /**
107 * Registers a new {@code MapFrameListener} that will be notified of MapFrame changes.
108 * <p>
109 * It will fire an initial mapFrameInitialized event
110 * when the MapFrame is present. Otherwise will only fire when the MapFrame is created
111 * or destroyed.
112 * @param listener The MapFrameListener
113 * @return {@code true} if the listeners collection changed as a result of the call.
114 */
115 public synchronized boolean addAndFireMapFrameListener(MapFrameListener listener) {
116 boolean changed = addMapFrameListener(listener);
117 if (changed && map != null) {
118 listener.mapFrameInitialized(null, map);
119 }
120 return changed;
121 }
122
123 /**
124 * Registers a new {@code MapFrameListener} that will be notified of MapFrame changes
125 * @param listener The MapFrameListener
126 * @return {@code true} if the listeners collection changed as a result of the call
127 */
128 public boolean addMapFrameListener(MapFrameListener listener) {
129 return listener != null && mapFrameListeners.add(listener);
130 }
131
132 /**
133 * Unregisters the given {@code MapFrameListener} from MapFrame changes
134 * @param listener The MapFrameListener
135 * @return {@code true} if the listeners collection changed as a result of the call
136 */
137 public boolean removeMapFrameListener(MapFrameListener listener) {
138 return listener != null && mapFrameListeners.remove(listener);
139 }
140
141 /**
142 * Gets the {@link GettingStarted} panel.
143 * @return The panel.
144 */
145 public synchronized GettingStarted getGettingStarted() {
146 if (gettingStarted == null) {
147 gettingStarted = new GettingStarted();
148 }
149 return gettingStarted;
150 }
151
152 /**
153 * Re-adds the layer listeners. Never call this in production, only needed for testing.
154 */
155 public void reAddListeners() {
156 layerManager.addLayerAvailabilityListener(new LayerAvailabilityListener() {
157 @Override
158 public void beforeFirstLayerAdded(LayerAvailabilityEvent e) {
159 updateContent(true);
160 }
161
162 @Override
163 public void afterLastLayerRemoved(LayerAvailabilityEvent e) {
164 updateContent(false);
165 }
166 });
167 GuiHelper.runInEDTAndWait(() -> updateContent(!layerManager.getLayers().isEmpty()));
168 }
169}
Note: See TracBrowser for help on using the repository browser.