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

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

fix #12937 - Use the new LayerChangeListener (patch by michael2402) - gsoc-core

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