Changeset 10340 in josm


Ignore:
Timestamp:
2016-06-08T09:33:20+02:00 (9 years ago)
Author:
Don-vip
Message:

fix #12927 - Move title management and main frame layout to new class (patch by michael2402) - gsoc-core

Location:
trunk
Files:
1 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/Main.java

    r10288 r10340  
    99import java.awt.GridBagLayout;
    1010import java.awt.Window;
    11 import java.awt.event.ComponentEvent;
    12 import java.awt.event.ComponentListener;
    1311import java.awt.event.KeyEvent;
    1412import java.awt.event.WindowAdapter;
     
    4745import javax.swing.InputMap;
    4846import javax.swing.JComponent;
    49 import javax.swing.JFrame;
    5047import javax.swing.JOptionPane;
    5148import javax.swing.JPanel;
     
    121118import org.openstreetmap.josm.tools.Shortcut;
    122119import org.openstreetmap.josm.tools.Utils;
    123 import org.openstreetmap.josm.tools.WindowGeometry;
    124120
    125121/**
     
    563559
    564560    /**
    565      * Constructs new {@code Main} object. A lot of global variables are initialized here.
     561     * Constructs new {@code Main} object.
     562     * @see #initialize()
    566563     */
    567564    public Main() {
    568565        main = this;
     566    }
     567
     568    /**
     569     * Initializes the main object. A lot of global variables are initialized here.
     570     * @since 10340
     571     */
     572    public void initialize() {
    569573        isOpenjdk = System.getProperty("java.vm.name").toUpperCase(Locale.ENGLISH).indexOf("OPENJDK") != -1;
    570574        fileWatcher.start();
     
    581585            @Override
    582586            public void initialize() {
    583                 contentPanePrivate.add(panel, BorderLayout.CENTER);
    584                 panel.add(gettingStarted, BorderLayout.CENTER);
    585                 menu = new MainMenu();
     587                initializeMainWindow();
    586588            }
    587589        }.call();
     
    715717    }
    716718
     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
    717727    private abstract static class InitializationTask implements Callable<Void> {
    718728
     
    936946     */
    937947    public static final JPanel panel = new JPanel(new BorderLayout());
    938 
    939     protected static volatile WindowGeometry geometry;
    940     protected static int windowState = JFrame.NORMAL;
    941948
    942949    private final CommandQueueListener redoUndoListener = new CommandQueueListener() {
     
    10161023        }
    10171024
    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));
    10211025    }
    10221026
     
    11071111    public static boolean exitJosm(boolean exit, int exitCode) {
    11081112        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();
    11331114
    11341115            if (exit) {
     
    11381119        }
    11391120        return false;
     1121    }
     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);
    11401144    }
    11411145
     
    12871291            platform = new PlatformHookUnixoid();
    12881292        }
    1289     }
    1290 
    1291     private static class WindowPositionSizeListener extends WindowAdapter implements ComponentListener {
    1292         @Override
    1293         public void windowStateChanged(WindowEvent e) {
    1294             Main.windowState = e.getNewState();
    1295         }
    1296 
    1297         @Override
    1298         public void componentHidden(ComponentEvent e) {
    1299             // Do nothing
    1300         }
    1301 
    1302         @Override
    1303         public void componentMoved(ComponentEvent e) {
    1304             handleComponentEvent(e);
    1305         }
    1306 
    1307         @Override
    1308         public void componentResized(ComponentEvent e) {
    1309             handleComponentEvent(e);
    1310         }
    1311 
    1312         @Override
    1313         public void componentShown(ComponentEvent e) {
    1314             // Do nothing
    1315         }
    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());
    13321293    }
    13331294
  • trunk/src/org/openstreetmap/josm/gui/MainApplication.java

    r10296 r10340  
    66
    77import 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;
    128import java.io.File;
    139import java.io.IOException;
     
    3329import java.util.Collection;
    3430import java.util.EnumMap;
    35 import java.util.LinkedList;
    3631import java.util.List;
    3732import java.util.Locale;
     
    4136import java.util.concurrent.Callable;
    4237
    43 import javax.swing.JFrame;
    4438import javax.swing.JOptionPane;
    4539import javax.swing.RepaintManager;
     
    7064import org.openstreetmap.josm.tools.HttpClient;
    7165import org.openstreetmap.josm.tools.I18n;
    72 import org.openstreetmap.josm.tools.ImageProvider;
    7366import org.openstreetmap.josm.tools.OsmUrlToBounds;
    7467import org.openstreetmap.josm.tools.PlatformHookWindows;
    7568import org.openstreetmap.josm.tools.Utils;
     69import org.openstreetmap.josm.tools.WindowGeometry;
    7670import org.openstreetmap.josm.tools.bugreport.BugReportExceptionHandler;
    7771
     
    8680public class MainApplication extends Main {
    8781
     82    private MainFrame mainFrame;
     83
    8884    /**
    89      * Constructs a new {@code MainApplication}.
     85     * Constructs a new {@code MainApplication} without a window.
    9086     */
    9187    public MainApplication() {
    92        // Allow subclassing (see JOSM.java)
     88        // Allow subclassing (see JOSM.java)
     89        this(null);
    9390    }
    9491
     
    9693     * Constructs a main frame, ready sized and operating. Does not display the frame.
    9794     * @param mainFrame The main JFrame of the application
     95     * @since 10340
    9896     */
    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);
     97    public MainApplication(MainFrame mainFrame) {
     98        this.mainFrame = mainFrame;
     99    }
     100
     101    @Override
     102    protected void initializeMainWindow() {
     103        if (mainFrame != null) {
     104            mainFrame.initialize();
     105
     106            menu = mainFrame.getMenu();
     107        } else {
     108            // required for running some tests.
     109            menu = new MainMenu();
     110        }
     111    }
     112
     113    @Override
     114    protected void shutdown() {
     115        mainFrame.storeState();
     116        super.shutdown();
    120117    }
    121118
     
    397394        I18n.setupLanguageFonts();
    398395
    399         final JFrame mainFrame = new JFrame(tr("Java OpenStreetMap Editor"));
     396        WindowGeometry geometry = WindowGeometry.mainWindow("gui.geometry",
     397                args.containsKey(Option.GEOMETRY) ? args.get(Option.GEOMETRY).iterator().next() : null,
     398                !args.containsKey(Option.NO_MAXIMIZE) && Main.pref.getBoolean("gui.maximized", false));
     399        final MainFrame mainFrame = new MainFrame(contentPanePrivate, geometry);
    400400        Main.parent = mainFrame;
    401401
     
    464464        monitor.indeterminateSubTask(tr("Creating main GUI"));
    465465        final Main main = new MainApplication(mainFrame);
     466        main.initialize();
    466467
    467468        if (!skipLoadingPlugins) {
     
    483484        boolean maximized = Main.pref.getBoolean("gui.maximized", false);
    484485        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             }
     486            mainFrame.setMaximized(true);
    491487        }
    492488        if (main.menu.fullscreenToggleAction != null) {
  • trunk/src/org/openstreetmap/josm/gui/MainMenu.java

    r10228 r10340  
    633633
    634634    /**
    635      * Constructs a new {@code MainMenu}.
    636      */
    637     public MainMenu() {
     635     * Initialize the main menu.
     636     * @since 10340
     637     */
     638    public void initialize() {
    638639        moreToolsMenu.setVisible(false);
    639640        dataMenu.setVisible(false);
  • trunk/src/org/openstreetmap/josm/gui/MapView.java

    r10332 r10340  
    3535import javax.swing.InputMap;
    3636import javax.swing.JComponent;
    37 import javax.swing.JFrame;
    3837import javax.swing.JPanel;
    3938
     
    9190 */
    9291public class MapView extends NavigatableComponent
    93 implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.LayerStateChangeListener,
     92implements PropertyChangeListener, PreferenceChangedListener,
    9493LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {
    9594    /**
     
    587586        }
    588587
    589         boolean isOsmDataLayer = layer instanceof OsmDataLayer;
    590         if (isOsmDataLayer) {
    591             ((OsmDataLayer) layer).addLayerStateChangeListener(this);
    592         }
    593 
    594588        layer.addPropertyChangeListener(this);
    595589        Main.addProjectionChangeListener(layer);
     
    674668    public void layerRemoving(LayerRemoveEvent e) {
    675669        Layer layer = e.getRemovedLayer();
    676         if (layer instanceof OsmDataLayer) {
    677             ((OsmDataLayer) layer).removeLayerPropertyChangeListener(this);
    678         }
    679670
    680671        Main.removeProjectionChangeListener(layer);
     
    10811072        }
    10821073        AudioPlayer.reset();
    1083         refreshTitle();
    10841074        repaint();
    10851075    }
     
    11641154                repaint();
    11651155            }
    1166         } else if (evt.getPropertyName().equals(OsmDataLayer.REQUIRES_SAVE_TO_DISK_PROP)
    1167                 || evt.getPropertyName().equals(OsmDataLayer.REQUIRES_UPLOAD_TO_SERVER_PROP)) {
    1168             OsmDataLayer layer = (OsmDataLayer) evt.getSource();
    1169             if (layer == getEditLayer()) {
    1170                 refreshTitle();
    1171             }
    11721156        }
    11731157    }
     
    11761160     * Sets the title of the JOSM main window, adding a star if there are dirty layers.
    11771161     * @see Main#parent
    1178      */
     1162     * @deprecated Replaced by {@link MainFrame#refreshTitle()}. The {@link MainFrame} should handle this by itself.
     1163     */
     1164    @Deprecated
    11791165    protected void refreshTitle() {
    11801166        if (Main.parent != null) {
    1181             OsmDataLayer editLayer = layerManager.getEditLayer();
    1182             boolean dirty = editLayer != null &&
    1183                     (editLayer.requiresSaveToFile() || (editLayer.requiresUploadToServer() && !editLayer.isUploadDiscouraged()));
    1184             ((JFrame) Main.parent).setTitle((dirty ? "* " : "") + tr("Java OpenStreetMap Editor"));
    1185             ((JFrame) Main.parent).getRootPane().putClientProperty("Window.documentModified", dirty);
     1167            ((MainFrame) Main.parent).refreshTitle();
    11861168        }
    11871169    }
     
    12131195        synchronized (temporaryLayers) {
    12141196            temporaryLayers.clear();
    1215         }
    1216     }
    1217 
    1218     @Override
    1219     public void uploadDiscouragedChanged(OsmDataLayer layer, boolean newValue) {
    1220         if (layer == layerManager.getEditLayer()) {
    1221             refreshTitle();
    12221197        }
    12231198    }
  • trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java

    r10300 r10340  
    269269
    270270    /**
    271      * Removes a layer property change listener
     271     * Removes a layer state change listener
    272272     *
    273273     * @param listener the listener. Ignored if null or already registered.
    274274     * @since 5519
    275      */
     275     * @deprecated Method name contains a typo, use {@link #removeLayerStateChangeListener(LayerStateChangeListener)}.
     276     */
     277    @Deprecated
    276278    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 10340
     287     */
     288    public void removeLayerStateChangeListener(LayerStateChangeListener listener) {
    277289        layerStateChangeListeners.remove(listener);
    278290    }
  • trunk/test/unit/org/openstreetmap/josm/JOSMFixture.java

    r10235 r10340  
    119119            }
    120120            if (Main.main == null) {
    121                 new MainApplication();
     121                new MainApplication().initialize();
    122122            }
    123123            if (Main.map == null) {
  • trunk/test/unit/org/openstreetmap/josm/MainTest.java

    r10222 r10340  
    77import static org.junit.Assert.assertTrue;
    88
    9 import java.awt.Dimension;
    10 import java.awt.Point;
    119import java.util.Collection;
    1210
     
    1513import org.openstreetmap.josm.Main.DownloadParamType;
    1614import org.openstreetmap.josm.gui.MainApplication;
    17 import org.openstreetmap.josm.tools.WindowGeometry;
    1815
    1916import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
     
    5249        Main.preConstructorInit(MainApplication.buildCommandLineArgumentMap(new String[0]));
    5350        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); // FIXME see #12927
    5552    }
    5653
Note: See TracChangeset for help on using the changeset viewer.