From 61d5922a762123b6be001d151b08ff0f709cf9f7 Mon Sep 17 00:00:00 2001 From: hneemann Date: Mon, 28 Mar 2016 09:49:36 +0200 Subject: [PATCH] restricted nested editing --- .../neemann/digital/gui/LibrarySelector.java | 19 ++++++++- .../java/de/neemann/digital/gui/Main.java | 39 +++++++++++-------- .../de/neemann/digital/gui/SavedListener.java | 10 +++++ .../gui/components/CircuitComponent.java | 9 ++++- .../java/de/neemann/gui/ToolTipAction.java | 5 +++ 5 files changed, 63 insertions(+), 19 deletions(-) create mode 100644 src/main/java/de/neemann/digital/gui/SavedListener.java diff --git a/src/main/java/de/neemann/digital/gui/LibrarySelector.java b/src/main/java/de/neemann/digital/gui/LibrarySelector.java index 8e072e5a2..705291f27 100644 --- a/src/main/java/de/neemann/digital/gui/LibrarySelector.java +++ b/src/main/java/de/neemann/digital/gui/LibrarySelector.java @@ -124,11 +124,18 @@ public class LibrarySelector implements ElementNotFoundNotification { circuit.getInputNames(library)) .setShortName(createShortName(file)); library.addDescription(description); + JMenuItem menuEntry = new InsertAction(description.getName(), insertHistory, circuitComponent).createJMenuItem(); + ImportedItem item = findImportedItem(description.getName()); + if (item != null) { + if (customMenu != null) { + customMenu.remove(item.menuEntry); + } + importedElements.remove(item); + } + importedElements.add(new ImportedItem(description.getName(), menuEntry)); if (customMenu != null) customMenu.add(menuEntry); - - importedElements.add(new ImportedItem(description.getName(), menuEntry)); return description; } catch (Exception e) { SwingUtilities.invokeLater(new ErrorMessage(Lang.get("msg_errorImportingModel")).addCause(e)); @@ -136,6 +143,14 @@ public class LibrarySelector implements ElementNotFoundNotification { return null; } + private ImportedItem findImportedItem(String name) { + for (ImportedItem i : importedElements) { + if (i.name.equals(name)) + return i; + } + return null; + } + private String createShortName(File file) { String name = file.getName(); if (name.endsWith(".dig")) name = name.substring(0, name.length() - 4); diff --git a/src/main/java/de/neemann/digital/gui/Main.java b/src/main/java/de/neemann/digital/gui/Main.java index 5cc9cf014..5cc4cd1b5 100644 --- a/src/main/java/de/neemann/digital/gui/Main.java +++ b/src/main/java/de/neemann/digital/gui/Main.java @@ -49,31 +49,35 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave { private final JCheckBoxMenuItem runClock; private final LibrarySelector librarySelector; private final ShapeFactory shapeFactory; + private final SavedListener savedListener; private File lastFilename; private File filename; private Model model; private ModelDescription modelDescription; public Main() { - this(null, null); + this(null, null, null); } - public Main(Component parent, File fileToOpen) { + public Main(Component parent, File fileToOpen, SavedListener savedListener) { super(Lang.get("digital")); + this.savedListener = savedListener; setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); library = new ElementLibrary(); shapeFactory = new ShapeFactory(library); + boolean normalMode = savedListener == null; + Circuit cr = new Circuit(); circuitComponent = new CircuitComponent(cr, library); if (fileToOpen != null) { - SwingUtilities.invokeLater(() -> loadFile(fileToOpen)); + SwingUtilities.invokeLater(() -> loadFile(fileToOpen, false)); } else { String name = prefs.get("name", null); if (name != null) { - SwingUtilities.invokeLater(() -> loadFile(new File(name))); + SwingUtilities.invokeLater(() -> loadFile(new File(name), false)); } } @@ -88,11 +92,11 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave { @Override public void actionPerformed(ActionEvent e) { if (ClosingWindowListener.checkForSave(Main.this, Main.this)) { - setFilename(null); + setFilename(null, true); circuitComponent.setCircuit(new Circuit()); } } - }; + }.setActive(normalMode); ToolTipAction open = new ToolTipAction(Lang.get("menu_open"), iconOpen) { @Override @@ -100,11 +104,11 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave { if (ClosingWindowListener.checkForSave(Main.this, Main.this)) { JFileChooser fc = getjFileChooser(lastFilename); if (fc.showOpenDialog(Main.this) == JFileChooser.APPROVE_OPTION) { - loadFile(fc.getSelectedFile()); + loadFile(fc.getSelectedFile(), true); } } } - }; + }.setActive(normalMode); ToolTipAction openWin = new ToolTipAction(Lang.get("menu_openWin"), iconOpenWin) { @Override @@ -112,13 +116,13 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave { if (ClosingWindowListener.checkForSave(Main.this, Main.this)) { JFileChooser fc = getjFileChooser(lastFilename); if (fc.showOpenDialog(Main.this) == JFileChooser.APPROVE_OPTION) { - Main m = new Main(Main.this, fc.getSelectedFile()); + Main m = new Main(Main.this, fc.getSelectedFile(), null); m.setLocationRelativeTo(Main.this); m.setVisible(true); } } } - }.setToolTip(Lang.get("menu_openWin_tt")); + }.setToolTip(Lang.get("menu_openWin_tt")).setActive(normalMode); ToolTipAction saveas = new ToolTipAction(Lang.get("menu_saveAs"), iconSaveAs) { @@ -129,7 +133,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave { saveFile(fc.getSelectedFile()); } } - }; + }.setActive(normalMode); save = new ToolTipAction(Lang.get("menu_save"), iconSave) { @Override @@ -333,12 +337,12 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave { save.actionPerformed(null); } - private void loadFile(File filename) { + private void loadFile(File filename, boolean toPrefs) { try { librarySelector.setFilePath(filename.getParentFile()); Circuit circ = Circuit.loadCircuit(filename, shapeFactory); circuitComponent.setCircuit(circ); - setFilename(filename); + setFilename(filename, toPrefs); } catch (Exception e) { circuitComponent.setCircuit(new Circuit()); new ErrorMessage(Lang.get("msg_errorReadingFile")).addCause(e).show(this); @@ -351,17 +355,20 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave { try { circuitComponent.getCircuit().save(filename); - setFilename(filename); + if (savedListener != null) + savedListener.saved(filename); + setFilename(filename, false); } catch (IOException e) { new ErrorMessage(Lang.get("msg_errorWritingFile")).addCause(e).show(); } } - private void setFilename(File filename) { + private void setFilename(File filename, boolean toPrefs) { this.filename = filename; if (filename != null) { this.lastFilename = filename; - prefs.put("name", filename.getPath()); + if (toPrefs) + prefs.put("name", filename.getPath()); setTitle(filename + " - " + Lang.get("digital")); } else setTitle(Lang.get("digital")); diff --git a/src/main/java/de/neemann/digital/gui/SavedListener.java b/src/main/java/de/neemann/digital/gui/SavedListener.java new file mode 100644 index 000000000..a4d16ce1e --- /dev/null +++ b/src/main/java/de/neemann/digital/gui/SavedListener.java @@ -0,0 +1,10 @@ +package de.neemann.digital.gui; + +import java.io.File; + +/** + * @author hneemann + */ +public interface SavedListener { + void saved(File filename); +} 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 3a74198aa..ce5755baa 100644 --- a/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java +++ b/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java @@ -14,6 +14,7 @@ import de.neemann.digital.draw.shapes.Drawable; import de.neemann.digital.draw.shapes.GenericShape; import de.neemann.digital.gui.LibrarySelector; import de.neemann.digital.gui.Main; +import de.neemann.digital.gui.SavedListener; import javax.swing.*; import java.awt.*; @@ -21,6 +22,7 @@ import java.awt.event.*; import java.awt.geom.AffineTransform; import java.awt.geom.NoninvertibleTransformException; import java.awt.geom.Point2D; +import java.io.File; import java.util.ArrayList; /** @@ -321,7 +323,12 @@ public class CircuitComponent extends JComponent implements Observer { String name = vp.getElementName(); ElementTypeDescription elementType = library.getElementType(name); if (elementType instanceof LibrarySelector.ElementTypeDescriptionCustom) { - new Main(this, ((LibrarySelector.ElementTypeDescriptionCustom) elementType).getFile()).setVisible(true); + new Main(this, ((LibrarySelector.ElementTypeDescriptionCustom) elementType).getFile(), new SavedListener() { + @Override + public void saved(File filename) { + library.removeElement(filename.getName()); + } + }).setVisible(true); } else { ArrayList list = elementType.getAttributeList(); if (list.size() > 0) { diff --git a/src/main/java/de/neemann/gui/ToolTipAction.java b/src/main/java/de/neemann/gui/ToolTipAction.java index 4c2554ab1..ed15513ea 100644 --- a/src/main/java/de/neemann/gui/ToolTipAction.java +++ b/src/main/java/de/neemann/gui/ToolTipAction.java @@ -24,6 +24,11 @@ public abstract class ToolTipAction extends AbstractAction { return this; } + public ToolTipAction setActive(boolean newValue) { + super.setEnabled(newValue); + return this; + } + public JButton createJButton() { JButton b = new JButton(this); if (toolTipText != null) {