diff --git a/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java b/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java index 11ab0cab0..5bbad76f9 100644 --- a/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java +++ b/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java @@ -33,7 +33,7 @@ public final class ShapeFactory { return InstanceHolder.INSTANCE; } - public HashMap map = new HashMap<>(); + private HashMap map = new HashMap<>(); private ElementLibrary library; private ShapeFactory() { diff --git a/src/main/java/de/neemann/digital/gui/LibrarySelector.java b/src/main/java/de/neemann/digital/gui/LibrarySelector.java index c9c0bb9b1..e4c34bf4b 100644 --- a/src/main/java/de/neemann/digital/gui/LibrarySelector.java +++ b/src/main/java/de/neemann/digital/gui/LibrarySelector.java @@ -1,5 +1,6 @@ package de.neemann.digital.gui; +import de.neemann.digital.core.element.ElementFactory; import de.neemann.digital.core.element.ElementTypeDescription; import de.neemann.digital.draw.elements.Circuit; import de.neemann.digital.draw.elements.VisualElement; @@ -13,6 +14,7 @@ import de.neemann.gui.ErrorMessage; import de.neemann.gui.ToolTipAction; import javax.swing.*; +import javax.swing.filechooser.FileNameExtensionFilter; import java.awt.event.ActionEvent; import java.io.File; import java.util.ArrayList; @@ -22,7 +24,6 @@ import java.util.ArrayList; */ public class LibrarySelector implements ElementNotFoundNotification { private final ElementLibrary library; - private File lastFile; private File filePath; private JMenu customMenu; private InsertHistory insertHistory; @@ -46,7 +47,8 @@ public class LibrarySelector implements ElementNotFoundNotification { customMenu.add(new ToolTipAction(Lang.get("menu_import")) { @Override public void actionPerformed(ActionEvent e) { - JFileChooser fc = Main.getjFileChooser(lastFile); + JFileChooser fc = new JFileChooser(filePath); + fc.addChoosableFileFilter(new FileNameExtensionFilter("Circuit", "dig")); if (fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { importElement(fc.getSelectedFile()); } @@ -79,10 +81,6 @@ public class LibrarySelector implements ElementNotFoundNotification { return parts; } - public void setLastFile(File lastFile) { - this.lastFile = lastFile; - } - public void setFilePath(File filePath) { this.filePath = filePath; } @@ -118,7 +116,7 @@ public class LibrarySelector implements ElementNotFoundNotification { System.out.println("load element " + file); Circuit circuit = Circuit.loadCircuit(file); ElementTypeDescription description = - new ElementTypeDescription(file.getName(), + new ElementTypeDescriptionCustom(file, attributes -> new CustomElement(circuit, library, file.getName()), circuit.getInputNames(library)) .setShortName(createShortName(file)); @@ -150,4 +148,17 @@ public class LibrarySelector implements ElementNotFoundNotification { this.menuEntry = menuEntry; } } + + public static class ElementTypeDescriptionCustom extends ElementTypeDescription { + private final File file; + + public ElementTypeDescriptionCustom(File file, ElementFactory elementFactory, String... inputNames) { + super(file.getName(), elementFactory, inputNames); + this.file = file; + } + + public File getFile() { + return file; + } + } } diff --git a/src/main/java/de/neemann/digital/gui/Main.java b/src/main/java/de/neemann/digital/gui/Main.java index 94628e7fb..a8943c96f 100644 --- a/src/main/java/de/neemann/digital/gui/Main.java +++ b/src/main/java/de/neemann/digital/gui/Main.java @@ -53,7 +53,11 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave { private Model model; private ModelDescription modelDescription; - public Main(File fileToOpen) { + public Main() { + this(null, null); + } + + public Main(Component parent, File fileToOpen) { super(Lang.get("digital")); setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); @@ -73,10 +77,6 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave { addWindowListener(new ClosingWindowListener(this, this)); - setPreferredSize(new Dimension(800, 600)); - pack(); - setLocationRelativeTo(null); - JMenuBar bar = new JMenuBar(); @@ -108,7 +108,7 @@ 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(fc.getSelectedFile()); + Main m = new Main(Main.this, fc.getSelectedFile()); m.setLocationRelativeTo(Main.this); m.setVisible(true); } @@ -261,10 +261,14 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave { setJMenuBar(bar); InfoDialog.getInstance().addToFrame(this, MESSAGE); + + setPreferredSize(new Dimension(800, 600)); + pack(); + setLocationRelativeTo(parent); } public static void main(String[] args) { - SwingUtilities.invokeLater(() -> new Main(null).setVisible(true)); + SwingUtilities.invokeLater(() -> new Main().setVisible(true)); } private void createAndStartModel(boolean runClock) { @@ -309,7 +313,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave { } } - public static JFileChooser getjFileChooser(File filename) { + private static JFileChooser getjFileChooser(File filename) { JFileChooser fileChooser = new JFileChooser(filename == null ? null : filename.getParentFile()); fileChooser.addChoosableFileFilter(new FileNameExtensionFilter("Circuit", "dig")); return fileChooser; @@ -352,7 +356,6 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave { private void setFilename(File filename) { this.filename = filename; if (filename != null) { - librarySelector.setLastFile(filename); this.lastFilename = filename; prefs.put("name", filename.getPath()); setTitle(filename + " - " + Lang.get("digital")); 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 b8cfc82a5..3a74198aa 100644 --- a/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java +++ b/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java @@ -2,6 +2,7 @@ package de.neemann.digital.gui.components; import de.neemann.digital.core.Observer; import de.neemann.digital.core.element.AttributeKey; +import de.neemann.digital.core.element.ElementTypeDescription; import de.neemann.digital.draw.elements.Circuit; import de.neemann.digital.draw.elements.Moveable; import de.neemann.digital.draw.elements.VisualElement; @@ -11,6 +12,8 @@ import de.neemann.digital.draw.graphics.Polygon; import de.neemann.digital.draw.library.ElementLibrary; 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 javax.swing.*; import java.awt.*; @@ -316,15 +319,20 @@ public class CircuitComponent extends JComponent implements Observer { VisualElement vp = circuit.getElementAt(getPosVector(e)); if (vp != null) { String name = vp.getElementName(); - ArrayList list = library.getElementType(name).getAttributeList(); - if (list.size() > 0) { - Point p = new Point(e.getX(), e.getY()); - SwingUtilities.convertPointToScreen(p, CircuitComponent.this); - if (new AttributeDialog(p, list, vp.getElementAttributes()).showDialog()) { - circuit.modified(); - repaint(); + ElementTypeDescription elementType = library.getElementType(name); + if (elementType instanceof LibrarySelector.ElementTypeDescriptionCustom) { + new Main(this, ((LibrarySelector.ElementTypeDescriptionCustom) elementType).getFile()).setVisible(true); + } else { + ArrayList list = elementType.getAttributeList(); + if (list.size() > 0) { + Point p = new Point(e.getX(), e.getY()); + SwingUtilities.convertPointToScreen(p, CircuitComponent.this); + if (new AttributeDialog(p, list, vp.getElementAttributes()).showDialog()) { + circuit.modified(); + repaint(); + } + return true; } - return true; } } return false;