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

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

see #15182 - move the Swing-based ProgressMonitor implementations from gui.progress to gui.progress.swing. Progress monitor concept is used in very large parts of JOSM, a console-based implementation could be added later

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