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

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

sonar - squid:S2301 - Public methods should not contain selector arguments

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