From 4b60be08087e264d601ff1e67cdc828a2e1cbd6e Mon Sep 17 00:00:00 2001 From: hneemann Date: Thu, 9 May 2019 20:19:15 +0200 Subject: [PATCH] Window size is stored and restored at startup; closes #275 --- .../de/neemann/digital/fsm/gui/FSMFrame.java | 3 +- .../java/de/neemann/digital/gui/Main.java | 11 ++- .../gui/components/CircuitComponent.java | 4 +- .../de/neemann/gui/WindowSizeStorage.java | 69 +++++++++++++++++++ 4 files changed, 81 insertions(+), 6 deletions(-) create mode 100644 src/main/java/de/neemann/gui/WindowSizeStorage.java diff --git a/src/main/java/de/neemann/digital/fsm/gui/FSMFrame.java b/src/main/java/de/neemann/digital/fsm/gui/FSMFrame.java index d9fb7bbca..ac3d61155 100644 --- a/src/main/java/de/neemann/digital/fsm/gui/FSMFrame.java +++ b/src/main/java/de/neemann/digital/fsm/gui/FSMFrame.java @@ -153,7 +153,8 @@ public class FSMFrame extends JFrame implements ClosingWindowListener.ConfirmSav setJMenuBar(bar); - pack(); + new WindowSizeStorage("fsm").setDefaultSize(600, 600).restore(this); + setFSM(new FSM()); SwingUtilities.invokeLater(() -> { diff --git a/src/main/java/de/neemann/digital/gui/Main.java b/src/main/java/de/neemann/digital/gui/Main.java index 24df81cee..a47f8d0c7 100644 --- a/src/main/java/de/neemann/digital/gui/Main.java +++ b/src/main/java/de/neemann/digital/gui/Main.java @@ -276,8 +276,8 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS enableClockShortcut(); - setPreferredSize(Screen.getInstance().scale(new Dimension(1024, 768))); - pack(); + new WindowSizeStorage(builder.mainFrame?"main":"sub").restore(this); + if (builder.parent != null) { Point p = builder.parent.getLocation(); final float d = 20 * Screen.getInstance().getScaling(); @@ -1798,7 +1798,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS } else if (file != null && file.getName().endsWith(".tru")) { TableDialog.openFile(file); } else { - MainBuilder builder = new MainBuilder(); + MainBuilder builder = new MainBuilder().setMainFrame(); if (file != null) builder.setFileToOpen(file); SwingUtilities.invokeLater(() -> { @@ -1826,6 +1826,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS private boolean allowAllFileActions = true; private File baseFileName; private boolean keepPrefMainFile; + private boolean mainFrame = false; /** * @param fileToOpen the file to open @@ -1909,6 +1910,10 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS SwingUtilities.invokeLater(() -> build().setVisible(true)); } + private MainBuilder setMainFrame() { + mainFrame = true; + return this; + } } private class ModelKeyListener extends KeyAdapter { diff --git a/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java b/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java index e7733cb35..11f452c7a 100644 --- a/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java +++ b/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java @@ -955,8 +955,8 @@ public class CircuitComponent extends JComponent implements Circuit.ChangedListe AffineTransform newTrans = new AffineTransform(); if (gr.getMin() != null && getWidth() != 0 && getHeight() != 0) { Vector delta = gr.getMax().sub(gr.getMin()); - double sx = ((double) getWidth()) / (delta.x + Style.NORMAL.getThickness() * 2); - double sy = ((double) getHeight()) / (delta.y + Style.NORMAL.getThickness() * 2); + double sx = ((double) getWidth()) / (delta.x + Style.NORMAL.getThickness() * 4); + double sy = ((double) getHeight()) / (delta.y + Style.NORMAL.getThickness() * 6); double s = Math.min(sx, sy); diff --git a/src/main/java/de/neemann/gui/WindowSizeStorage.java b/src/main/java/de/neemann/gui/WindowSizeStorage.java new file mode 100644 index 000000000..1a6eb58b9 --- /dev/null +++ b/src/main/java/de/neemann/gui/WindowSizeStorage.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2019 Helmut Neemann. + * Use of this source code is governed by the GPL v3 license + * that can be found in the LICENSE file. + */ +package de.neemann.gui; + +import java.awt.*; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; +import java.util.prefs.Preferences; + +/** + * Used to store the window size + */ +public final class WindowSizeStorage { + private static final Preferences PREFS = Preferences.userRoot().node("dig").node("win"); + private static final String WIDTH_KEY = "width"; + private static final String HEIGHT_KEY = "height"; + private final Preferences prefs; + private int defWidth = 1024; + private int defHeight = 768; + + /** + * Creates a new instance. + * + * @param key the key used to store the size, must be unique + */ + public WindowSizeStorage(String key) { + prefs = PREFS.node(key); + } + + /** + * Sets the default size. Used at the first startup + * + * @param width width + * @param height height + * @return this for chained calls + */ + public WindowSizeStorage setDefaultSize(int width, int height) { + this.defWidth = width; + this.defHeight = height; + return this; + } + + /** + * Restore the last used size. + * + * @param component the component to use + */ + public void restore(Component component) { + int width = prefs.getInt(WIDTH_KEY, 0); + int height = prefs.getInt(HEIGHT_KEY, 0); + + if (width < 100 || height < 80) + component.setSize(Screen.getInstance().scale(new Dimension(defWidth, defHeight))); + else + component.setSize(new Dimension(width, height)); + + component.addComponentListener(new ComponentAdapter() { + @Override + public void componentResized(ComponentEvent componentEvent) { + final Dimension size = component.getSize(); + prefs.putInt(WIDTH_KEY, size.width); + prefs.putInt(HEIGHT_KEY, size.height); + } + }); + } +}