From 6ff1b2d651d6c8aa361a45ba38622d402556fb97 Mon Sep 17 00:00:00 2001 From: hneemann Date: Fri, 7 Dec 2018 09:03:03 +0100 Subject: [PATCH] added a file history to the fsm dialog --- src/main/fsm/trafficLightBlink.fsm | 8 +-- src/main/fsm/trafficLightMedwedew.fsm | 22 ++++----- .../de/neemann/digital/fsm/gui/FSMFrame.java | 49 ++++++++++--------- .../de/neemann/digital/gui/FileHistory.java | 27 +++++++--- .../java/de/neemann/digital/gui/Main.java | 3 +- 5 files changed, 63 insertions(+), 46 deletions(-) diff --git a/src/main/fsm/trafficLightBlink.fsm b/src/main/fsm/trafficLightBlink.fsm index 794e25e41..3e11204ac 100644 --- a/src/main/fsm/trafficLightBlink.fsm +++ b/src/main/fsm/trafficLightBlink.fsm @@ -40,28 +40,28 @@ - + - + - + - + diff --git a/src/main/fsm/trafficLightMedwedew.fsm b/src/main/fsm/trafficLightMedwedew.fsm index b09c700f4..712889b96 100644 --- a/src/main/fsm/trafficLightMedwedew.fsm +++ b/src/main/fsm/trafficLightMedwedew.fsm @@ -2,76 +2,76 @@ + R=1 1 Red 70 - R=1 + R=1,Y=1 3 Red/Yellow 70 - R=1,Y=1 + G=1 4 Green 70 - G=1 + Y=1 2 Yellow 70 - Y=1 + 0 init 70 - + - + - + - + - - + + - \ No newline at end of file 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 dfd4d5406..b01b65bda 100644 --- a/src/main/java/de/neemann/digital/fsm/gui/FSMFrame.java +++ b/src/main/java/de/neemann/digital/fsm/gui/FSMFrame.java @@ -12,10 +12,7 @@ import de.neemann.digital.draw.library.ElementLibrary; import de.neemann.digital.draw.shapes.ShapeFactory; import de.neemann.digital.fsm.FSM; import de.neemann.digital.fsm.FSMDemos; -import de.neemann.digital.gui.Main; -import de.neemann.digital.gui.ModelCreationListener; -import de.neemann.digital.gui.SaveAsHelper; -import de.neemann.digital.gui.Settings; +import de.neemann.digital.gui.*; import de.neemann.digital.gui.components.table.TableDialog; import de.neemann.digital.lang.Lang; import de.neemann.gui.*; @@ -36,7 +33,7 @@ import java.util.prefs.Preferences; /** * The dialog to show the FSM */ -public class FSMFrame extends JFrame implements ClosingWindowListener.ConfirmSave, FSM.ModifiedListener, ModelCreationListener { +public class FSMFrame extends JFrame implements ClosingWindowListener.ConfirmSave, FSM.ModifiedListener, ModelCreationListener, FileHistory.OpenInterface { private static final Preferences PREFS = Preferences.userRoot().node("dig").node("fsm"); private static final String PREF_FOLDER = "folder"; private static final Icon ICON_NEW = IconCreator.create("document-new.png"); @@ -47,10 +44,11 @@ public class FSMFrame extends JFrame implements ClosingWindowListener.ConfirmSav private static final Icon ICON_ZOOM_IN = IconCreator.create("View-zoom-in.png"); private static final Icon ICON_ZOOM_OUT = IconCreator.create("View-zoom-out.png"); - private FSM fsm; + private final FileHistory fileHistory; private final FSMComponent fsmComponent; private final Timer timer; private final JComboBox moveControl; + private FSM fsm; private boolean moveStates = false; private ToolTipAction save; private File filename; @@ -60,17 +58,14 @@ public class FSMFrame extends JFrame implements ClosingWindowListener.ConfirmSav /** * Creates a new instance * - * @param parent the parents frame - * @param givenFsm the fsm to visualize - * @param library the library used to show the table + * @param parent the parents frame + * @param library the library used to show the table */ - public FSMFrame(JFrame parent, FSM givenFsm, ElementLibrary library) { + public FSMFrame(JFrame parent, ElementLibrary library) { super(Lang.get("fsm_title")); setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); - if (givenFsm == null) { - givenFsm = FSMDemos.rotDecoder(); - givenFsm.circle(); - } + + fileHistory = new FileHistory(this, PREFS.node("hist")); fsmComponent = new FSMComponent(); getContentPane().add(fsmComponent, BorderLayout.CENTER); @@ -135,7 +130,11 @@ public class FSMFrame extends JFrame implements ClosingWindowListener.ConfirmSav setJMenuBar(bar); pack(); - setFSM(givenFsm); + setFSM(new FSM()); + + File f = fileHistory.getMostRecent(); + if (f != null) + SwingUtilities.invokeLater(() -> loadFile(f)); setLocationRelativeTo(parent); } @@ -157,15 +156,14 @@ public class FSMFrame extends JFrame implements ClosingWindowListener.ConfirmSav if (ClosingWindowListener.checkForSave(FSMFrame.this, FSMFrame.this)) { JFileChooser fc = getJFileChooser(filename); if (fc.showOpenDialog(FSMFrame.this) == JFileChooser.APPROVE_OPTION) { - loadFile(fc.getSelectedFile()); + loadFile(SaveAsHelper.checkSuffix(fc.getSelectedFile(), "fsm")); } } } }.setAcceleratorCTRLplus('O'); -// JMenu openRecent = new JMenu(Lang.get("menu_openRecent")); -// JMenu openRecentNewWindow = new JMenu(Lang.get("menu_openRecentNewWindow")); -// fileHistory.setMenu(openRecent, openRecentNewWindow); + JMenu openRecent = new JMenu(Lang.get("menu_openRecent")); + fileHistory.setMenu(openRecent, null); ToolTipAction saveAs = new ToolTipAction(Lang.get("menu_saveAs"), ICON_SAVE_AS) { @Override @@ -195,6 +193,7 @@ public class FSMFrame extends JFrame implements ClosingWindowListener.ConfirmSav bar.add(file); file.add(newFile.createJMenuItem()); file.add(open.createJMenuItem()); + file.add(openRecent); file.add(save.createJMenuItem()); file.add(saveAs.createJMenuItem()); file.add(export); @@ -241,6 +240,8 @@ public class FSMFrame extends JFrame implements ClosingWindowListener.ConfirmSav setTitle(fsmTitle); this.filename = filename; + if (filename != null) + fileHistory.add(filename); } @Override @@ -292,6 +293,12 @@ public class FSMFrame extends JFrame implements ClosingWindowListener.ConfirmSav } } + @Override + public void open(File file, boolean newWindow) { + if (ClosingWindowListener.checkForSave(FSMFrame.this, FSMFrame.this)) + loadFile(file); + } + private void createViewMenu(JMenuBar menuBar, JToolBar toolBar) { ToolTipAction maximize = new ToolTipAction(Lang.get("menu_maximize"), ICON_EXPAND) { @Override @@ -468,12 +475,10 @@ public class FSMFrame extends JFrame implements ClosingWindowListener.ConfirmSav * @param args the programs arguments */ public static void main(String[] args) { - FSM fsm = FSMDemos.rotDecoder(); - ElementLibrary library = new ElementLibrary(); new ShapeFactory(library); - new FSMFrame(null, fsm.circle().setModified(false), library).setVisible(true); + new FSMFrame(null, library).setVisible(true); } } diff --git a/src/main/java/de/neemann/digital/gui/FileHistory.java b/src/main/java/de/neemann/digital/gui/FileHistory.java index 81c499327..7576ccc76 100644 --- a/src/main/java/de/neemann/digital/gui/FileHistory.java +++ b/src/main/java/de/neemann/digital/gui/FileHistory.java @@ -17,13 +17,13 @@ import java.util.prefs.Preferences; * History of last opened files */ public final class FileHistory { - private static final Preferences PREFS = Preferences.userRoot().node("dig").node("hist"); private static final String FILE_NUM = "fileNum"; private static final String FILE_NAME = "name"; private static final int MAX_SIZE = 15; private final ArrayList files; private final OpenInterface opener; + private final Preferences prefs; private JMenu menu; private JMenu menuNewWindow; @@ -33,11 +33,22 @@ public final class FileHistory { * @param opener the opene interface to be used to open a file */ public FileHistory(OpenInterface opener) { + this(opener, Preferences.userRoot().node("dig").node("hist")); + } + + /** + * Creates a new instance + * + * @param opener the opene interface to be used to open a file + * @param prefs the preferences node to store the history + */ + public FileHistory(OpenInterface opener, Preferences prefs) { this.opener = opener; - int n = PREFS.getInt(FILE_NUM, 0); + this.prefs = prefs; + int n = prefs.getInt(FILE_NUM, 0); files = new ArrayList(); for (int i = 0; i < n; i++) { - String pathname = PREFS.get(FILE_NAME + i, null); + String pathname = prefs.get(FILE_NAME + i, null); if (pathname != null && pathname.length() > 0) { final File file = new File(pathname); if (file.exists()) @@ -49,9 +60,9 @@ public final class FileHistory { } private void saveEntries() { - PREFS.putInt(FILE_NUM, files.size()); + prefs.putInt(FILE_NUM, files.size()); for (int i = 0; i < files.size(); i++) - PREFS.put(FILE_NAME + i, files.get(i).getPath()); + prefs.put(FILE_NAME + i, files.get(i).getPath()); } /** @@ -89,10 +100,12 @@ public final class FileHistory { private void updateMenu() { if (menu != null) { menu.removeAll(); - menuNewWindow.removeAll(); + if (menuNewWindow != null) + menuNewWindow.removeAll(); for (File f : files) { menu.add(new FileOpenEntry(f, opener, false).createJMenuItem()); - menuNewWindow.add(new FileOpenEntry(f, opener, true).createJMenuItem()); + if (menuNewWindow != null) + menuNewWindow.add(new FileOpenEntry(f, opener, true).createJMenuItem()); } } } diff --git a/src/main/java/de/neemann/digital/gui/Main.java b/src/main/java/de/neemann/digital/gui/Main.java index 2f15cc500..f7dae84ff 100644 --- a/src/main/java/de/neemann/digital/gui/Main.java +++ b/src/main/java/de/neemann/digital/gui/Main.java @@ -28,7 +28,6 @@ import de.neemann.digital.draw.model.ModelCreator; import de.neemann.digital.draw.model.RealTimeClock; import de.neemann.digital.draw.shapes.Drawable; import de.neemann.digital.draw.shapes.ShapeFactory; -import de.neemann.digital.fsm.FSM; import de.neemann.digital.fsm.gui.FSMFrame; import de.neemann.digital.gui.components.*; import de.neemann.digital.gui.components.data.GraphDialog; @@ -1138,7 +1137,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS analyse.add(new ToolTipAction(Lang.get("menu_fsm")) { @Override public void actionPerformed(ActionEvent e) { - new FSMFrame(Main.this, new FSM(), library) + new FSMFrame(Main.this, library) .setBaseFileName(filename) .registerTo(Main.this) .setVisible(true);