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

Last change on this file since 10611 was 10611, checked in by Don-vip, 8 years ago

see #11390 - sonar - squid:S1604 - Java 8: Anonymous inner classes containing only one method should become lambdas

  • Property svn:eol-style set to native
File size: 5.7 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 protected void updateContent(boolean showMap) {
47 GuiHelper.assertCallFromEdt();
48 MapFrame old = map;
49 if (old != null && showMap) {
50 // no state change
51 return;
52 }
53
54 // remove old content
55 setVisible(false);
56 removeAll();
57 if (old != null) {
58 old.destroy();
59 }
60
61 // create new content
62 if (showMap) {
63 map = createNewMapFrame();
64 } else {
65 map = null;
66 Main.map = map;
67 add(getGettingStarted(), BorderLayout.CENTER);
68 }
69 setVisible(true);
70
71 if (old == null && !showMap) {
72 // listeners may not be able to handle this...
73 return;
74 }
75
76 // Notify map frame listeners, mostly plugins.
77 for (MapFrameListener listener : mapFrameListeners) {
78 MapView.fireDeprecatedListenerOnAdd = true;
79 listener.mapFrameInitialized(old, map);
80 MapView.fireDeprecatedListenerOnAdd = false;
81 }
82 if (map == null && Main.currentProgressMonitor != null) {
83 Main.currentProgressMonitor.showForegroundDialog();
84 }
85 }
86
87 private MapFrame createNewMapFrame() {
88 MapFrame mapFrame = new MapFrame(null, null);
89 // Required by many components.
90 Main.map = mapFrame;
91
92 mapFrame.fillPanel(this);
93
94 //TODO: Move this to some better place
95 List<Layer> layers = Main.getLayerManager().getLayers();
96 if (!layers.isEmpty()) {
97 mapFrame.selectMapMode((MapMode) mapFrame.getDefaultButtonAction(), layers.get(0));
98 }
99 mapFrame.initializeDialogsPane();
100 mapFrame.setVisible(true);
101 return mapFrame;
102 }
103
104 /**
105 * Registers a new {@code MapFrameListener} that will be notified of MapFrame changes.
106 * <p>
107 * It will fire an initial mapFrameInitialized event
108 * when the MapFrame is present. Otherwise will only fire when the MapFrame is created
109 * or destroyed.
110 * @param listener The MapFrameListener
111 * @return {@code true} if the listeners collection changed as a result of the call.
112 */
113 public boolean addAndFireMapFrameListener(MapFrameListener listener) {
114 boolean changed = addMapFrameListener(listener);
115 if (changed && map != null) {
116 listener.mapFrameInitialized(null, map);
117 }
118 return changed;
119 }
120
121 /**
122 * Registers a new {@code MapFrameListener} that will be notified of MapFrame changes
123 * @param listener The MapFrameListener
124 * @return {@code true} if the listeners collection changed as a result of the call
125 */
126 public boolean addMapFrameListener(MapFrameListener listener) {
127 return listener != null && mapFrameListeners.add(listener);
128 }
129
130 /**
131 * Unregisters the given {@code MapFrameListener} from MapFrame changes
132 * @param listener The MapFrameListener
133 * @return {@code true} if the listeners collection changed as a result of the call
134 */
135 public boolean removeMapFrameListener(MapFrameListener listener) {
136 return listener != null && mapFrameListeners.remove(listener);
137 }
138
139 /**
140 * Gets the {@link GettingStarted} panel.
141 * @return The panel.
142 */
143 public GettingStarted getGettingStarted() {
144 if (gettingStarted == null) {
145 gettingStarted = new GettingStarted();
146 }
147 return gettingStarted;
148 }
149
150 /**
151 * Re-adds the layer listeners. Never call this in production, only needed for testing.
152 */
153 public void reAddListeners() {
154 layerManager.addLayerAvailabilityListener(new LayerAvailabilityListener() {
155 @Override
156 public void beforeFirstLayerAdded(LayerAvailabilityEvent e) {
157 updateContent(true);
158 }
159
160 @Override
161 public void afterLastLayerRemoved(LayerAvailabilityEvent e) {
162 updateContent(false);
163 }
164 });
165 GuiHelper.runInEDTAndWait(() -> updateContent(!layerManager.getLayers().isEmpty()));
166 }
167}
Note: See TracBrowser for help on using the repository browser.