diff --git a/src/main/java/de/neemann/digital/gui/Main.java b/src/main/java/de/neemann/digital/gui/Main.java index d9753476c..a1d83b076 100644 --- a/src/main/java/de/neemann/digital/gui/Main.java +++ b/src/main/java/de/neemann/digital/gui/Main.java @@ -24,6 +24,7 @@ import de.neemann.digital.draw.model.RealTimeClock; import de.neemann.digital.draw.shapes.ShapeFactory; import de.neemann.digital.gui.components.*; import de.neemann.digital.gui.components.data.DataSetDialog; +import de.neemann.digital.gui.components.expression.ExpressionDialog; import de.neemann.digital.gui.components.listing.ROMListingDialog; import de.neemann.digital.gui.components.table.TableDialog; import de.neemann.digital.gui.remote.DigitalHandler; @@ -538,6 +539,16 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E } .setToolTip(Lang.get("menu_synthesise_tt")) .createJMenuItem()); + + analyse.add(new ToolTipAction(Lang.get("menu_expression")) { + @Override + public void actionPerformed(ActionEvent e) { + new ExpressionDialog(Main.this, shapeFactory).setVisible(true); + } + } + .setToolTip(Lang.get("menu_expression_tt")) + .createJMenuItem()); + } private void orderMeasurements() { diff --git a/src/main/java/de/neemann/digital/gui/components/expression/ExpressionDialog.java b/src/main/java/de/neemann/digital/gui/components/expression/ExpressionDialog.java new file mode 100644 index 000000000..60d0d5675 --- /dev/null +++ b/src/main/java/de/neemann/digital/gui/components/expression/ExpressionDialog.java @@ -0,0 +1,57 @@ +package de.neemann.digital.gui.components.expression; + +import de.neemann.digital.analyse.expression.Expression; +import de.neemann.digital.analyse.parser.Parser; +import de.neemann.digital.builder.circuit.CircuitBuilder; +import de.neemann.digital.draw.elements.Circuit; +import de.neemann.digital.draw.shapes.ShapeFactory; +import de.neemann.digital.gui.Main; +import de.neemann.digital.lang.Lang; +import de.neemann.gui.ErrorMessage; +import de.neemann.gui.ToolTipAction; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; + +/** + * Dialog to enter an expression + * @author hneemann + */ +public class ExpressionDialog extends JDialog { + + /** + * Creates a new instance + * + * @param parent the parent + * @param shapeFactory the shapeFactory used for new circuits + */ + public ExpressionDialog(JFrame parent, ShapeFactory shapeFactory) { + super(parent, Lang.get("expression"), false); + + JTextField text = new JTextField("(C ∨ B) ∧ (A ∨ C) ∧ (B ∨ !C) * (C + !A)", 40); + getContentPane().add(text, BorderLayout.CENTER); + getContentPane().add(new JLabel(Lang.get("msg_enterAnExpression")), BorderLayout.NORTH); + + JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT)); + getContentPane().add(buttons, BorderLayout.SOUTH); + + buttons.add(new ToolTipAction(Lang.get("btn_create")) { + @Override + public void actionPerformed(ActionEvent e) { + try { + Expression exp = new Parser(text.getText()).parse(); + CircuitBuilder circuitBuilder = new CircuitBuilder(shapeFactory); + circuitBuilder.addCombinatorial("Y", exp); + Circuit circuit = circuitBuilder.createCircuit(); + SwingUtilities.invokeLater(() -> new Main(null, circuit).setVisible(true)); + } catch (Exception ex) { + new ErrorMessage().addCause(ex).show(ExpressionDialog.this); + } + } + }.setToolTip(Lang.get("btn_create_tt")).createJButton()); + + pack(); + setLocationRelativeTo(parent); + } +} diff --git a/src/main/java/de/neemann/digital/gui/components/expression/package-info.java b/src/main/java/de/neemann/digital/gui/components/expression/package-info.java new file mode 100644 index 000000000..5e0909dbc --- /dev/null +++ b/src/main/java/de/neemann/digital/gui/components/expression/package-info.java @@ -0,0 +1,6 @@ +/** + * Classes needed to enter an expression and to create a circuit representing the expression + * + * @author hneemann + */ +package de.neemann.digital.gui.components.expression; diff --git a/src/main/resources/lang/lang_de.xml b/src/main/resources/lang/lang_de.xml index a1599236e..96a2eeb8b 100644 --- a/src/main/resources/lang/lang_de.xml +++ b/src/main/resources/lang/lang_de.xml @@ -12,8 +12,11 @@ Neu Laden Letzte Datei noch einmal laden Speichern + Erzeugen + Erzeugt eine Schaltung in einem eigenen Fenster. Abbrechen Digital + Ausdruck Addierer Und Break @@ -312,6 +315,8 @@ Zur Analyse können Sie die Schaltung im Gatterschrittmodus ausführen. Ansicht Vergrößern Verkleinern + Ausdruck + Erzeugt eine Schaltung aus einem Ausdruck. Digital Ein einfacher Simulator für digitale Schaltkreise. @@ -339,6 +344,7 @@ Geschrieben von Helmut Neemann 2016 Pin {0}: {1} Die Änderung erfordert einen Neustart! Kein ROM im Model gefunden! Im ROM muss Automatisches Laden eingeschaltet sein! + Geben Sie einen Ausdruck ein: Ok 180° diff --git a/src/main/resources/lang/lang_en.xml b/src/main/resources/lang/lang_en.xml index 66920a076..27e2d7341 100644 --- a/src/main/resources/lang/lang_en.xml +++ b/src/main/resources/lang/lang_en.xml @@ -12,8 +12,11 @@ Reload Reload last hex file Save + Create + Create a circuit in a seperate window Cancel Digital + Expression Add And Break @@ -312,6 +315,8 @@ To analyse you can run the circuit in single gate step mode. View Zoom In Zoom Out + Expression + Create a circuit from an expression. Digital A simple simulator for digital circuits. @@ -339,6 +344,7 @@ Written bei H.Neemann in 2016 No ROM found! ROM needs to be set to auto reload mode. Could not find file: {0} Command {0} unknown! + Enter an expression: Ok 180°