Ticket #12927: patch-main-add-main-frame.patch
File patch-main-add-main-frame.patch, 29.0 KB (added by , 8 years ago) |
---|
-
src/org/openstreetmap/josm/Main.java
diff --git a/src/org/openstreetmap/josm/Main.java b/src/org/openstreetmap/josm/Main.java index ac883f4..19fce6a 100644
a b import java.awt.Component; 8 8 import java.awt.GridBagConstraints; 9 9 import java.awt.GridBagLayout; 10 10 import java.awt.Window; 11 import java.awt.event.ComponentEvent;12 import java.awt.event.ComponentListener;13 11 import java.awt.event.KeyEvent; 14 12 import java.awt.event.WindowAdapter; 15 13 import java.awt.event.WindowEvent; … … import java.util.logging.Logger; 46 44 import javax.swing.Action; 47 45 import javax.swing.InputMap; 48 46 import javax.swing.JComponent; 49 import javax.swing.JFrame;50 47 import javax.swing.JOptionPane; 51 48 import javax.swing.JPanel; 52 49 import javax.swing.JTextArea; … … import org.openstreetmap.josm.tools.PlatformHookUnixoid; 120 117 import org.openstreetmap.josm.tools.PlatformHookWindows; 121 118 import org.openstreetmap.josm.tools.Shortcut; 122 119 import org.openstreetmap.josm.tools.Utils; 123 import org.openstreetmap.josm.tools.WindowGeometry;124 120 125 121 /** 126 122 * Abstract class holding various static global variables and methods used in large parts of JOSM application. … … public abstract class Main { 562 558 } 563 559 564 560 /** 565 * Constructs new {@code Main} object. A lot of global variables are initialized here. 561 * Constructs new {@code Main} object. 562 * @see #initalize() 566 563 */ 567 564 public Main() { 568 565 main = this; 566 } 567 568 /** 569 * Initialize the main object. A lot of global variables are initialized here. 570 * @since xxx 571 */ 572 public void initalize() { 569 573 isOpenjdk = System.getProperty("java.vm.name").toUpperCase(Locale.ENGLISH).indexOf("OPENJDK") != -1; 570 574 fileWatcher.start(); 571 575 … … public abstract class Main { 580 584 581 585 @Override 582 586 public void initialize() { 583 contentPanePrivate.add(panel, BorderLayout.CENTER); 584 panel.add(gettingStarted, BorderLayout.CENTER); 585 menu = new MainMenu(); 587 initializeMainWindow(); 586 588 } 587 589 }.call(); 588 590 … … public abstract class Main { 714 716 }.call(); 715 717 } 716 718 719 /** 720 * Called once at startup to initialize the main window content. 721 * Should set {@link #menu} 722 */ 723 protected void initializeMainWindow() { 724 // can be implementd by subclasses 725 } 726 717 727 private abstract static class InitializationTask implements Callable<Void> { 718 728 719 729 private final String name; … … public abstract class Main { 936 946 */ 937 947 public static final JPanel panel = new JPanel(new BorderLayout()); 938 948 939 protected static volatile WindowGeometry geometry;940 protected static int windowState = JFrame.NORMAL;941 942 949 private final CommandQueueListener redoUndoListener = new CommandQueueListener() { 943 950 @Override 944 951 public void commandChanged(final int queueSize, final int redoSize) { … … public abstract class Main { 1015 1022 CoordinateFormat.setCoordinateFormat(CoordinateFormat.DECIMAL_DEGREES); 1016 1023 } 1017 1024 1018 geometry = WindowGeometry.mainWindow("gui.geometry",1019 args.containsKey(Option.GEOMETRY) ? args.get(Option.GEOMETRY).iterator().next() : null,1020 !args.containsKey(Option.NO_MAXIMIZE) && Main.pref.getBoolean("gui.maximized", false));1021 1025 } 1022 1026 1023 1027 protected static void postConstructorProcessCmdLine(Map<Option, Collection<String>> args) { … … public abstract class Main { 1106 1110 */ 1107 1111 public static boolean exitJosm(boolean exit, int exitCode) { 1108 1112 if (Main.saveUnsavedModifications()) { 1109 worker.shutdown(); 1110 ImageProvider.shutdown(false); 1111 JCSCacheManager.shutdown(); 1112 if (geometry != null) { 1113 geometry.remember("gui.geometry"); 1114 } 1115 if (map != null) { 1116 map.rememberToggleDialogWidth(); 1117 } 1118 pref.put("gui.maximized", (windowState & JFrame.MAXIMIZED_BOTH) != 0); 1119 // Remove all layers because somebody may rely on layerRemoved events (like AutosaveTask) 1120 if (Main.isDisplayingMapView()) { 1121 Collection<Layer> layers = new ArrayList<>(getLayerManager().getLayers()); 1122 for (Layer l: layers) { 1123 Main.main.removeLayer(l); 1124 } 1125 } 1126 try { 1127 pref.saveDefaults(); 1128 } catch (IOException ex) { 1129 Main.warn(tr("Failed to save default preferences.")); 1130 } 1131 worker.shutdownNow(); 1132 ImageProvider.shutdown(true); 1113 Main.main.shutdown(); 1133 1114 1134 1115 if (exit) { 1135 1116 System.exit(exitCode); … … public abstract class Main { 1139 1120 return false; 1140 1121 } 1141 1122 1123 protected void shutdown() { 1124 worker.shutdown(); 1125 ImageProvider.shutdown(false); 1126 JCSCacheManager.shutdown(); 1127 if (map != null) { 1128 map.rememberToggleDialogWidth(); 1129 } 1130 // Remove all layers because somebody may rely on layerRemoved events (like AutosaveTask) 1131 if (Main.isDisplayingMapView()) { 1132 Collection<Layer> layers = new ArrayList<>(getLayerManager().getLayers()); 1133 for (Layer l: layers) { 1134 Main.main.removeLayer(l); 1135 } 1136 } 1137 try { 1138 pref.saveDefaults(); 1139 } catch (IOException ex) { 1140 Main.warn(tr("Failed to save default preferences.")); 1141 } 1142 worker.shutdownNow(); 1143 ImageProvider.shutdown(true); 1144 } 1145 1142 1146 /** 1143 1147 * The type of a command line parameter, to be used in switch statements. 1144 1148 * @see #paramType … … public abstract class Main { 1288 1292 } 1289 1293 } 1290 1294 1291 private static class WindowPositionSizeListener extends WindowAdapter implements ComponentListener {1292 @Override1293 public void windowStateChanged(WindowEvent e) {1294 Main.windowState = e.getNewState();1295 }1296 1297 @Override1298 public void componentHidden(ComponentEvent e) {1299 // Do nothing1300 }1301 1302 @Override1303 public void componentMoved(ComponentEvent e) {1304 handleComponentEvent(e);1305 }1306 1307 @Override1308 public void componentResized(ComponentEvent e) {1309 handleComponentEvent(e);1310 }1311 1312 @Override1313 public void componentShown(ComponentEvent e) {1314 // Do nothing1315 }1316 1317 private static void handleComponentEvent(ComponentEvent e) {1318 Component c = e.getComponent();1319 if (c instanceof JFrame && c.isVisible()) {1320 if (Main.windowState == JFrame.NORMAL) {1321 Main.geometry = new WindowGeometry((JFrame) c);1322 } else {1323 Main.geometry.fixScreen((JFrame) c);1324 }1325 }1326 }1327 }1328 1329 protected static void addListener() {1330 parent.addComponentListener(new WindowPositionSizeListener());1331 ((JFrame) parent).addWindowStateListener(new WindowPositionSizeListener());1332 }1333 1334 1295 /** 1335 1296 * Determines if JOSM currently runs with Java 8 or later. 1336 1297 * @return {@code true} if the current JVM is at least Java 8, {@code false} otherwise -
src/org/openstreetmap/josm/gui/MainApplication.java
diff --git a/src/org/openstreetmap/josm/gui/MainApplication.java b/src/org/openstreetmap/josm/gui/MainApplication.java index 400c83f..1861960 100644
a b import static org.openstreetmap.josm.tools.I18n.tr; 5 5 import static org.openstreetmap.josm.tools.I18n.trn; 6 6 7 7 import java.awt.Dimension; 8 import java.awt.Image;9 import java.awt.Toolkit;10 import java.awt.event.WindowAdapter;11 import java.awt.event.WindowEvent;12 8 import java.io.File; 13 9 import java.io.IOException; 14 10 import java.io.InputStream; … … import java.util.ArrayList; 32 28 import java.util.Arrays; 33 29 import java.util.Collection; 34 30 import java.util.EnumMap; 35 import java.util.LinkedList;36 31 import java.util.List; 37 32 import java.util.Locale; 38 33 import java.util.Map; … … import java.util.Set; 40 35 import java.util.TreeSet; 41 36 import java.util.concurrent.Callable; 42 37 43 import javax.swing.JFrame;44 38 import javax.swing.JOptionPane; 45 39 import javax.swing.RepaintManager; 46 40 import javax.swing.SwingUtilities; … … import org.openstreetmap.josm.plugins.PluginInformation; 69 63 import org.openstreetmap.josm.tools.FontsManager; 70 64 import org.openstreetmap.josm.tools.HttpClient; 71 65 import org.openstreetmap.josm.tools.I18n; 72 import org.openstreetmap.josm.tools.ImageProvider;73 66 import org.openstreetmap.josm.tools.OsmUrlToBounds; 74 67 import org.openstreetmap.josm.tools.PlatformHookWindows; 75 68 import org.openstreetmap.josm.tools.Utils; 69 import org.openstreetmap.josm.tools.WindowGeometry; 76 70 import org.openstreetmap.josm.tools.bugreport.BugReportExceptionHandler; 77 71 78 72 import gnu.getopt.Getopt; … … import gnu.getopt.LongOpt; 85 79 */ 86 80 public class MainApplication extends Main { 87 81 82 private MainFrame mainFrame; 83 88 84 /** 89 * Constructs a new {@code MainApplication} .85 * Constructs a new {@code MainApplication} without a window. 90 86 */ 91 87 public MainApplication() { 92 // Allow subclassing (see JOSM.java) 88 // Allow subclassing (see JOSM.java) 89 this(null); 93 90 } 94 91 95 92 /** 96 93 * Constructs a main frame, ready sized and operating. Does not display the frame. 97 94 * @param mainFrame The main JFrame of the application 98 95 */ 99 public MainApplication(JFrame mainFrame) { 100 addListener(); 101 mainFrame.setContentPane(contentPanePrivate); 102 mainFrame.setJMenuBar(menu); 103 geometry.applySafe(mainFrame); 104 List<Image> l = new LinkedList<>(); 105 l.add(ImageProvider.get("logo_16x16x32").getImage()); 106 l.add(ImageProvider.get("logo_16x16x8").getImage()); 107 l.add(ImageProvider.get("logo_32x32x32").getImage()); 108 l.add(ImageProvider.get("logo_32x32x8").getImage()); 109 l.add(ImageProvider.get("logo_48x48x32").getImage()); 110 l.add(ImageProvider.get("logo_48x48x8").getImage()); 111 l.add(ImageProvider.get("logo").getImage()); 112 mainFrame.setIconImages(l); 113 mainFrame.addWindowListener(new WindowAdapter() { 114 @Override 115 public void windowClosing(final WindowEvent arg0) { 116 Main.exitJosm(true, 0); 117 } 118 }); 119 mainFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 96 public MainApplication(MainFrame mainFrame) { 97 this.mainFrame = mainFrame; 98 } 99 100 @Override 101 protected void initializeMainWindow() { 102 if (mainFrame != null) { 103 mainFrame.initialize(); 104 105 menu = mainFrame.getMenu(); 106 } else { 107 // required for running some tests. 108 menu = new MainMenu(); 109 } 110 } 111 112 @Override 113 protected void shutdown() { 114 mainFrame.storeState(); 115 super.shutdown(); 120 116 } 121 117 122 118 /** … … public class MainApplication extends Main { 396 392 397 393 I18n.setupLanguageFonts(); 398 394 399 final JFrame mainFrame = new JFrame(tr("Java OpenStreetMap Editor")); 395 WindowGeometry geometry = WindowGeometry.mainWindow("gui.geometry", 396 args.containsKey(Option.GEOMETRY) ? args.get(Option.GEOMETRY).iterator().next() : null, 397 !args.containsKey(Option.NO_MAXIMIZE) && Main.pref.getBoolean("gui.maximized", false)); 398 final MainFrame mainFrame = new MainFrame(contentPanePrivate, geometry); 400 399 Main.parent = mainFrame; 401 400 402 401 if (args.containsKey(Option.LOAD_PREFERENCES)) { … … public class MainApplication extends Main { 463 462 464 463 monitor.indeterminateSubTask(tr("Creating main GUI")); 465 464 final Main main = new MainApplication(mainFrame); 465 main.initalize(); 466 466 467 467 if (!skipLoadingPlugins) { 468 468 loadLatePlugins(splash, monitor, pluginsToLoad); … … public class MainApplication extends Main { 482 482 483 483 boolean maximized = Main.pref.getBoolean("gui.maximized", false); 484 484 if ((!args.containsKey(Option.NO_MAXIMIZE) && maximized) || args.containsKey(Option.MAXIMIZE)) { 485 if (Toolkit.getDefaultToolkit().isFrameStateSupported(JFrame.MAXIMIZED_BOTH)) { 486 Main.windowState = JFrame.MAXIMIZED_BOTH; 487 mainFrame.setExtendedState(Main.windowState); 488 } else { 489 Main.debug("Main window: maximizing not supported"); 490 } 485 mainFrame.setMaximized(true); 491 486 } 492 487 if (main.menu.fullscreenToggleAction != null) { 493 488 main.menu.fullscreenToggleAction.initial(); -
new file src/org/openstreetmap/josm/gui/MainFrame.java
diff --git a/src/org/openstreetmap/josm/gui/MainFrame.java b/src/org/openstreetmap/josm/gui/MainFrame.java new file mode 100644 index 0000000..9593097
- + 1 // License: GPL. For details, see LICENSE file. 2 package org.openstreetmap.josm.gui; 3 4 import static org.openstreetmap.josm.tools.I18n.tr; 5 6 import java.awt.BorderLayout; 7 import java.awt.Component; 8 import java.awt.Container; 9 import java.awt.Image; 10 import java.awt.Rectangle; 11 import java.awt.Toolkit; 12 import java.awt.event.ComponentEvent; 13 import java.awt.event.ComponentListener; 14 import java.awt.event.WindowAdapter; 15 import java.awt.event.WindowEvent; 16 import java.beans.PropertyChangeEvent; 17 import java.beans.PropertyChangeListener; 18 import java.util.LinkedList; 19 import java.util.List; 20 21 import javax.swing.JFrame; 22 import javax.swing.JPanel; 23 24 import org.openstreetmap.josm.Main; 25 import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent; 26 import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener; 27 import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent; 28 import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent; 29 import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent; 30 import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener; 31 import org.openstreetmap.josm.gui.layer.OsmDataLayer; 32 import org.openstreetmap.josm.gui.layer.OsmDataLayer.LayerStateChangeListener; 33 import org.openstreetmap.josm.tools.ImageProvider; 34 import 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 xxx 40 */ 41 public 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 } 116 }, false); 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 } -
src/org/openstreetmap/josm/gui/MainMenu.java
diff --git a/src/org/openstreetmap/josm/gui/MainMenu.java b/src/org/openstreetmap/josm/gui/MainMenu.java index 15115e1..5b02ec9 100644
a b public class MainMenu extends JMenuBar { 632 632 } 633 633 634 634 /** 635 * Constructs a new {@code MainMenu}.635 * Initialize the main menu. 636 636 */ 637 public MainMenu() {637 public void initialize() { 638 638 moreToolsMenu.setVisible(false); 639 639 dataMenu.setVisible(false); 640 640 gpsMenu.setVisible(false); -
src/org/openstreetmap/josm/gui/MapView.java
diff --git a/src/org/openstreetmap/josm/gui/MapView.java b/src/org/openstreetmap/josm/gui/MapView.java index d32dc94..d2859f7 100644
a b import javax.swing.AbstractButton; 34 34 import javax.swing.ActionMap; 35 35 import javax.swing.InputMap; 36 36 import javax.swing.JComponent; 37 import javax.swing.JFrame;38 37 import javax.swing.JPanel; 39 38 40 39 import org.openstreetmap.josm.Main; … … import org.openstreetmap.josm.tools.bugreport.BugReportExceptionHandler; 90 89 * @author imi 91 90 */ 92 91 public class MapView extends NavigatableComponent 93 implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.LayerStateChangeListener,92 implements PropertyChangeListener, PreferenceChangedListener, 94 93 LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener { 95 94 /** 96 95 * Interface to notify listeners of a layer change. … … LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener { 578 577 playHeadMarker = PlayHeadMarker.create(); 579 578 } 580 579 581 boolean isOsmDataLayer = layer instanceof OsmDataLayer;582 if (isOsmDataLayer) {583 ((OsmDataLayer) layer).addLayerStateChangeListener(this);584 }585 586 580 layer.addPropertyChangeListener(this); 587 581 Main.addProjectionChangeListener(layer); 588 582 invalidatedListener.addTo(layer); … … LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener { 665 659 @Override 666 660 public void layerRemoving(LayerRemoveEvent e) { 667 661 Layer layer = e.getRemovedLayer(); 668 if (layer instanceof OsmDataLayer) {669 ((OsmDataLayer) layer).removeLayerPropertyChangeListener(this);670 }671 662 672 663 Main.removeProjectionChangeListener(layer); 673 664 layer.removePropertyChangeListener(this); … … LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener { 1072 1063 }); 1073 1064 } 1074 1065 AudioPlayer.reset(); 1075 refreshTitle();1076 1066 repaint(); 1077 1067 } 1078 1068 … … LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener { 1155 1145 changedLayer = l; 1156 1146 repaint(); 1157 1147 } 1158 } else if (evt.getPropertyName().equals(OsmDataLayer.REQUIRES_SAVE_TO_DISK_PROP)1159 || evt.getPropertyName().equals(OsmDataLayer.REQUIRES_UPLOAD_TO_SERVER_PROP)) {1160 OsmDataLayer layer = (OsmDataLayer) evt.getSource();1161 if (layer == getEditLayer()) {1162 refreshTitle();1163 }1164 1148 } 1165 1149 } 1166 1150 1167 1151 /** 1168 1152 * Sets the title of the JOSM main window, adding a star if there are dirty layers. 1169 1153 * @see Main#parent 1154 * @deprecated Replaced by {@link MainFrame#refreshTitle()}. The {@link MainFrame} should handle this by itself. 1170 1155 */ 1156 @Deprecated 1171 1157 protected void refreshTitle() { 1172 1158 if (Main.parent != null) { 1173 OsmDataLayer editLayer = layerManager.getEditLayer(); 1174 boolean dirty = editLayer != null && 1175 (editLayer.requiresSaveToFile() || (editLayer.requiresUploadToServer() && !editLayer.isUploadDiscouraged())); 1176 ((JFrame) Main.parent).setTitle((dirty ? "* " : "") + tr("Java OpenStreetMap Editor")); 1177 ((JFrame) Main.parent).getRootPane().putClientProperty("Window.documentModified", dirty); 1159 ((MainFrame) Main.parent).refreshTitle(); 1178 1160 } 1179 1161 } 1180 1162 … … LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener { 1207 1189 } 1208 1190 } 1209 1191 1210 @Override1211 public void uploadDiscouragedChanged(OsmDataLayer layer, boolean newValue) {1212 if (layer == layerManager.getEditLayer()) {1213 refreshTitle();1214 }1215 }1216 1217 1192 /** 1218 1193 * Get a string representation of all layers suitable for the {@code source} changeset tag. 1219 1194 * @return A String of sources separated by ';' -
src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
diff --git a/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java b/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java index 6cd3c50..624c16c 100644
a b public class OsmDataLayer extends AbstractModifiableLayer implements Listener, S 268 268 } 269 269 270 270 /** 271 * Removes a layer propertychange listener271 * Removes a layer state change listener 272 272 * 273 273 * @param listener the listener. Ignored if null or already registered. 274 274 * @since 5519 275 * @deprecated Method name contains a typo, use {@link #removeLayerStateChangeListener(LayerStateChangeListener)}. 275 276 */ 277 @Deprecated 276 278 public void removeLayerPropertyChangeListener(LayerStateChangeListener listener) { 279 removeLayerStateChangeListener(listener); 280 } 281 282 /** 283 * Removes a layer state change listener 284 * 285 * @param listener the listener. Ignored if null or already registered. 286 * @since xxx 287 */ 288 public void removeLayerStateChangeListener(LayerStateChangeListener listener) { 277 289 layerStateChangeListeners.remove(listener); 278 290 } 279 291 -
test/unit/org/openstreetmap/josm/JOSMFixture.java
diff --git a/test/unit/org/openstreetmap/josm/JOSMFixture.java b/test/unit/org/openstreetmap/josm/JOSMFixture.java index 21ec5c7..66db5e5 100644
a b public class JOSMFixture { 119 119 Main.toolbar = new ToolbarPreferences(); 120 120 } 121 121 if (Main.main == null) { 122 new MainApplication() ;122 new MainApplication().initalize(); 123 123 } 124 124 if (Main.map == null) { 125 125 Main.main.createMapFrame(null, null); -
test/unit/org/openstreetmap/josm/MainTest.java
diff --git a/test/unit/org/openstreetmap/josm/MainTest.java b/test/unit/org/openstreetmap/josm/MainTest.java index 3e6f015..ca80f24 100644
a b import static org.junit.Assert.assertFalse; 6 6 import static org.junit.Assert.assertNull; 7 7 import static org.junit.Assert.assertTrue; 8 8 9 import java.awt.Dimension;10 import java.awt.Point;11 9 import java.util.Collection; 12 10 13 11 import org.junit.BeforeClass; 14 12 import org.junit.Test; 15 13 import org.openstreetmap.josm.Main.DownloadParamType; 16 14 import org.openstreetmap.josm.gui.MainApplication; 17 import org.openstreetmap.josm.tools.WindowGeometry;18 15 19 16 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; 20 17 … … public class MainTest { 51 48 public void testPreConstructorInit() { 52 49 Main.preConstructorInit(MainApplication.buildCommandLineArgumentMap(new String[0])); 53 50 Main.preConstructorInit(MainApplication.buildCommandLineArgumentMap(new String[]{"--geometry=400x300+10+5", "--no-maximize"})); 54 assertEquals(new WindowGeometry(new Point(10, 5), new Dimension(400, 300)), Main.geometry);51 //assertEquals(new WindowGeometry(new Point(10, 5), new Dimension(400, 300)), Main.geometry); 55 52 } 56 53 57 54 /**