source: josm/trunk/src/org/openstreetmap/josm/gui/MainFrame.java@ 13656

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

see #16204 - make the missing icon detector script happy

  • Property svn:eol-style set to native
File size: 8.4 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.BorderLayout;
7import java.awt.Component;
8import java.awt.Image;
9import java.awt.Rectangle;
10import java.awt.Toolkit;
11import java.awt.event.ComponentEvent;
12import java.awt.event.ComponentListener;
13import java.awt.event.WindowAdapter;
14import java.awt.event.WindowEvent;
15import java.beans.PropertyChangeListener;
16import java.util.LinkedList;
17import java.util.List;
18
19import javax.swing.ImageIcon;
20import javax.swing.JFrame;
21import javax.swing.JPanel;
22
23import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
24import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
25import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
26import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
27import org.openstreetmap.josm.gui.layer.OsmDataLayer;
28import org.openstreetmap.josm.gui.layer.OsmDataLayer.LayerStateChangeListener;
29import org.openstreetmap.josm.gui.util.WindowGeometry;
30import org.openstreetmap.josm.spi.preferences.Config;
31import org.openstreetmap.josm.tools.ImageProvider;
32import org.openstreetmap.josm.tools.Logging;
33
34/**
35 * This is the JOSM main window. It updates it's title.
36 * @author Michael Zangl
37 * @since 10340
38 */
39public class MainFrame extends JFrame {
40 private final transient LayerStateChangeListener updateTitleOnLayerStateChange = (layer, newValue) -> onLayerChange(layer);
41
42 private final transient PropertyChangeListener updateTitleOnSaveChange = evt -> {
43 if (evt.getPropertyName().equals(OsmDataLayer.REQUIRES_SAVE_TO_DISK_PROP)
44 || evt.getPropertyName().equals(OsmDataLayer.REQUIRES_UPLOAD_TO_SERVER_PROP)) {
45 OsmDataLayer layer = (OsmDataLayer) evt.getSource();
46 onLayerChange(layer);
47 }
48 };
49
50 protected transient WindowGeometry geometry;
51 protected int windowState = JFrame.NORMAL;
52 private final MainPanel panel;
53 private MainMenu menu;
54
55 /**
56 * Create a new main window.
57 */
58 public MainFrame() {
59 this(new WindowGeometry(new Rectangle(10, 10, 500, 500)));
60 }
61
62 /**
63 * Create a new main window. The parameter will be removed in the future.
64 * @param geometry The inital geometry to use.
65 * @since 12127
66 */
67 public MainFrame(WindowGeometry geometry) {
68 super();
69 this.geometry = geometry;
70 this.panel = new MainPanel(MainApplication.getLayerManager());
71 setContentPane(new JPanel(new BorderLayout()));
72 }
73
74 /**
75 * Initializes the content of the window and get the current status panel.
76 */
77 public void initialize() {
78 menu = new MainMenu();
79 addComponentListener(new WindowPositionSizeListener());
80 addWindowStateListener(new WindowPositionSizeListener());
81
82 setJMenuBar(menu);
83 geometry.applySafe(this);
84 List<Image> l = new LinkedList<>();
85 for (ImageIcon img : new ImageIcon[] {
86 ImageProvider.getIfAvailable("logo_16x16x32"),
87 ImageProvider.getIfAvailable("logo_16x16x8"),
88 ImageProvider.getIfAvailable("logo_32x32x32"),
89 ImageProvider.getIfAvailable("logo_32x32x8"),
90 ImageProvider.getIfAvailable("logo_48x48x32"),
91 ImageProvider.getIfAvailable("logo_48x48x8"),
92 ImageProvider.getIfAvailable("logo")}) {
93 if (img != null) {
94 l.add(img.getImage());
95 }
96 }
97 setIconImages(l);
98 addWindowListener(new ExitWindowAdapter());
99 setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
100
101 // This listener is never removed, since the main frame exists forever.
102 MainApplication.getLayerManager().addActiveLayerChangeListener(e -> refreshTitle());
103 MainApplication.getLayerManager().addAndFireLayerChangeListener(new ManageLayerListeners());
104
105 refreshTitle();
106
107 getContentPane().add(panel, BorderLayout.CENTER);
108 menu.initialize();
109 }
110
111 /**
112 * Stores the current state of the main frame.
113 */
114 public void storeState() {
115 if (geometry != null) {
116 geometry.remember("gui.geometry");
117 }
118 Config.getPref().putBoolean("gui.maximized", (windowState & JFrame.MAXIMIZED_BOTH) != 0);
119 }
120
121 /**
122 * Gets the main menu used for this window.
123 * @return The main menu.
124 * @throws IllegalStateException if the main frame has not been initialized yet
125 * @see #initialize
126 */
127 public MainMenu getMenu() {
128 if (menu == null) {
129 throw new IllegalStateException("Not initialized.");
130 }
131 return menu;
132 }
133
134 /**
135 * Gets the main panel.
136 * @return The main panel.
137 * @since 12125
138 */
139 public MainPanel getPanel() {
140 return panel;
141 }
142
143 /**
144 * Sets this frame to be maximized.
145 * @param maximized <code>true</code> if the window should be maximized.
146 */
147 public void setMaximized(boolean maximized) {
148 if (maximized) {
149 if (Toolkit.getDefaultToolkit().isFrameStateSupported(JFrame.MAXIMIZED_BOTH)) {
150 windowState = JFrame.MAXIMIZED_BOTH;
151 setExtendedState(windowState);
152 } else {
153 Logging.debug("Main window: maximizing not supported");
154 }
155 } else {
156 throw new UnsupportedOperationException("Unimplemented.");
157 }
158 }
159
160 /**
161 * Update the title of the window to reflect the current content.
162 */
163 public void refreshTitle() {
164 OsmDataLayer editLayer = MainApplication.getLayerManager().getEditLayer();
165 boolean dirty = editLayer != null && (editLayer.requiresSaveToFile()
166 || (editLayer.requiresUploadToServer() && !editLayer.isUploadDiscouraged()));
167 setTitle((dirty ? "* " : "") + tr("Java OpenStreetMap Editor"));
168 getRootPane().putClientProperty("Window.documentModified", dirty);
169 }
170
171 private void onLayerChange(OsmDataLayer layer) {
172 if (layer == MainApplication.getLayerManager().getEditLayer()) {
173 refreshTitle();
174 }
175 }
176
177 static final class ExitWindowAdapter extends WindowAdapter {
178 @Override
179 public void windowClosing(final WindowEvent evt) {
180 MainApplication.exitJosm(true, 0, null);
181 }
182 }
183
184 /**
185 * Manages the layer listeners, adds them to every layer.
186 */
187 private final class ManageLayerListeners implements LayerChangeListener {
188 @Override
189 public void layerAdded(LayerAddEvent e) {
190 if (e.getAddedLayer() instanceof OsmDataLayer) {
191 OsmDataLayer osmDataLayer = (OsmDataLayer) e.getAddedLayer();
192 osmDataLayer.addLayerStateChangeListener(updateTitleOnLayerStateChange);
193 }
194 e.getAddedLayer().addPropertyChangeListener(updateTitleOnSaveChange);
195 }
196
197 @Override
198 public void layerRemoving(LayerRemoveEvent e) {
199 if (e.getRemovedLayer() instanceof OsmDataLayer) {
200 OsmDataLayer osmDataLayer = (OsmDataLayer) e.getRemovedLayer();
201 osmDataLayer.removeLayerStateChangeListener(updateTitleOnLayerStateChange);
202 }
203 e.getRemovedLayer().removePropertyChangeListener(updateTitleOnSaveChange);
204 }
205
206 @Override
207 public void layerOrderChanged(LayerOrderChangeEvent e) {
208 // not used
209 }
210 }
211
212 private class WindowPositionSizeListener extends WindowAdapter implements ComponentListener {
213 @Override
214 public void windowStateChanged(WindowEvent e) {
215 windowState = e.getNewState();
216 }
217
218 @Override
219 public void componentHidden(ComponentEvent e) {
220 // Do nothing
221 }
222
223 @Override
224 public void componentMoved(ComponentEvent e) {
225 handleComponentEvent(e);
226 }
227
228 @Override
229 public void componentResized(ComponentEvent e) {
230 handleComponentEvent(e);
231 }
232
233 @Override
234 public void componentShown(ComponentEvent e) {
235 // Do nothing
236 }
237
238 private void handleComponentEvent(ComponentEvent e) {
239 Component c = e.getComponent();
240 if (c instanceof JFrame && c.isVisible()) {
241 if (windowState == JFrame.NORMAL) {
242 geometry = new WindowGeometry((JFrame) c);
243 } else {
244 geometry.fixScreen((JFrame) c);
245 }
246 }
247 }
248 }
249
250}
Note: See TracBrowser for help on using the repository browser.