diff --git a/src/main/java/de/neemann/digital/core/element/ElementAttributes.java b/src/main/java/de/neemann/digital/core/element/ElementAttributes.java index 96c0120d3..542e1edf2 100644 --- a/src/main/java/de/neemann/digital/core/element/ElementAttributes.java +++ b/src/main/java/de/neemann/digital/core/element/ElementAttributes.java @@ -254,4 +254,16 @@ public class ElementAttributes { public int hashCode() { return attributes != null ? attributes.hashCode() : 0; } + + /** + * Checks if the values in both attributes are equal + * + * @param key the key + * @param other the other attribute set + * @param the type og the value + * @return true if both values are equal + */ + public boolean equalsKey(Key key, ElementAttributes other) { + return get(key).equals(other.get(key)); + } } diff --git a/src/main/java/de/neemann/digital/gui/Main.java b/src/main/java/de/neemann/digital/gui/Main.java index 2435af21d..46c6dc8bb 100644 --- a/src/main/java/de/neemann/digital/gui/Main.java +++ b/src/main/java/de/neemann/digital/gui/Main.java @@ -43,7 +43,6 @@ import de.neemann.digital.lang.Lang; import de.neemann.digital.testing.TestCaseElement; import de.neemann.digital.testing.TestingDataException; import de.neemann.gui.*; -import de.neemann.gui.language.Language; import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; @@ -543,16 +542,15 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS ToolTipAction editSettings = new ToolTipAction(Lang.get("menu_editSettings")) { @Override public void actionPerformed(ActionEvent e) { - final Language oldLang = Settings.getInstance().get(Keys.SETTINGS_LANGUAGE); - final boolean oldIeeeShapes = Settings.getInstance().get(Keys.SETTINGS_IEEE_SHAPES); - if (new AttributeDialog(Main.this, Settings.SETTINGS_KEYS, Settings.getInstance().getAttributes()).showDialog()) { - FormatToExpression.setDefaultFormat(Settings.getInstance().get(Keys.SETTINGS_EXPRESSION_FORMAT)); - final Language newLang = Settings.getInstance().getAttributes().get(Keys.SETTINGS_LANGUAGE); - final boolean newIeeeShapes = Settings.getInstance().get(Keys.SETTINGS_IEEE_SHAPES); - if (!newLang.equals(oldLang) || (oldIeeeShapes != newIeeeShapes)) { - Lang.setLanguage(newLang); + ElementAttributes modified = new AttributeDialog(Main.this, Settings.SETTINGS_KEYS, Settings.getInstance().getAttributes()).showDialog(); + if (modified != null) { + FormatToExpression.setDefaultFormat(modified.get(Keys.SETTINGS_EXPRESSION_FORMAT)); + if (!Settings.getInstance().getAttributes().equalsKey(Keys.SETTINGS_LANGUAGE, modified) + || !Settings.getInstance().getAttributes().equalsKey(Keys.SETTINGS_IEEE_SHAPES, modified)) { + Lang.setLanguage(modified.get(Keys.SETTINGS_LANGUAGE)); JOptionPane.showMessageDialog(Main.this, Lang.get("msg_restartNeeded")); } + Settings.getInstance().getAttributes().getValuesFrom(modified); } } }.setToolTip(Lang.get("menu_editSettings_tt")); diff --git a/src/main/java/de/neemann/digital/gui/components/AttributeDialog.java b/src/main/java/de/neemann/digital/gui/components/AttributeDialog.java index 51ae5e6ce..17a6deb31 100644 --- a/src/main/java/de/neemann/digital/gui/components/AttributeDialog.java +++ b/src/main/java/de/neemann/digital/gui/components/AttributeDialog.java @@ -29,11 +29,12 @@ public class AttributeDialog extends JDialog { private final JPanel panel; private final Component parent; private final Point pos; - private final ElementAttributes elementAttributes; + private final ElementAttributes originalAttributes; + private final ElementAttributes modifiedAttributes; private final JPanel buttonPanel; private JComponent topMostTextComponent; private VisualElement visualElement; - private boolean changed = false; + private boolean okPressed = false; /** * Creates a new instance @@ -58,7 +59,8 @@ public class AttributeDialog extends JDialog { super(SwingUtilities.getWindowAncestor(parent), Lang.get("attr_dialogTitle"), ModalityType.APPLICATION_MODAL); this.parent = parent; this.pos = pos; - this.elementAttributes = elementAttributes; + this.originalAttributes = elementAttributes; + this.modifiedAttributes = new ElementAttributes(elementAttributes); setDefaultCloseOperation(DISPOSE_ON_CLOSE); panel = new JPanel(new DialogLayout()); @@ -112,8 +114,8 @@ public class AttributeDialog extends JDialog { * Closes the dialog and stores modified values */ public void fireOk() { - setEditedValues(elementAttributes); - changed = true; + storeEditedValues(); + okPressed = true; dispose(); } @@ -141,17 +143,20 @@ public class AttributeDialog extends JDialog { return this; } - private void setEditedValues(ElementAttributes attr) { + /** + * store gui fields to attributes + */ + public void storeEditedValues() { for (EditorHolder e : editors) - e.setTo(attr); + e.setTo(modifiedAttributes); } /** - * shows the dialog + * Shows the dialog * - * @return true if data was changed + * @return the new attributes of null if nothing has changed */ - public boolean showDialog() { + public ElementAttributes showDialog() { pack(); if (pos == null) @@ -163,7 +168,10 @@ public class AttributeDialog extends JDialog { SwingUtilities.invokeLater(() -> topMostTextComponent.requestFocusInWindow()); setVisible(true); - return changed; + if (okPressed && !originalAttributes.equals(modifiedAttributes)) + return modifiedAttributes; + else + return null; } /** 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 9c81e3952..1c2466f44 100644 --- a/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java +++ b/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java @@ -324,11 +324,9 @@ public class CircuitComponent extends JComponent implements Circuit.ChangedListe * @param parent the parent component */ public void editCircuitAttributes(Component parent) { - ElementAttributes edited = new ElementAttributes(circuit.getAttributes()); - if (new AttributeDialog(parent, ATTR_LIST, edited).showDialog()) { - if (!edited.equals(circuit.getAttributes())) - modify(circuit -> circuit.getAttributes().getValuesFrom(edited)); - } + ElementAttributes modifiedAttributes = new AttributeDialog(parent, ATTR_LIST, circuit.getAttributes()).showDialog(); + if (modifiedAttributes != null) + modify(circuit -> circuit.getAttributes().getValuesFrom(modifiedAttributes)); } /** @@ -823,10 +821,9 @@ public class CircuitComponent extends JComponent implements Circuit.ChangedListe } }.setToolTip(Lang.get("attr_help_tt"))); - ElementAttributes oldValues = new ElementAttributes(element.getElementAttributes()); - if (attributeDialog.showDialog()) - if (!oldValues.equals(element.getElementAttributes())) - addModificationAlreadyMade(new ModifyAttributes(element)); + ElementAttributes modified = attributeDialog.showDialog(); + if (modified != null) + modify(new ModifyAttributes(element, modified)); } } catch (ElementNotFoundException ex) { // do nothing if element not found! diff --git a/src/main/java/de/neemann/digital/gui/components/modification/ModifyAttributes.java b/src/main/java/de/neemann/digital/gui/components/modification/ModifyAttributes.java index d6494cf8f..6848f8771 100644 --- a/src/main/java/de/neemann/digital/gui/components/modification/ModifyAttributes.java +++ b/src/main/java/de/neemann/digital/gui/components/modification/ModifyAttributes.java @@ -15,11 +15,12 @@ public class ModifyAttributes extends ModificationOfVisualElement { /** * Creates a new instance * - * @param ve the already modified element + * @param ve the element to modify + * @param modified the new attributes */ - public ModifyAttributes(VisualElement ve) { + public ModifyAttributes(VisualElement ve, ElementAttributes modified) { super(ve); - attributes = new ElementAttributes(ve.getElementAttributes()); + attributes = modified; } @Override diff --git a/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java b/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java index 52a059c21..49d8389a5 100644 --- a/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java +++ b/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java @@ -227,10 +227,11 @@ public class TableDialog extends JDialog { final TreeMap pins = model.getTable().getPins(); if (pins.containsKey(name)) attr.set(Keys.PIN, pins.get(name).toString()); - if (new AttributeDialog(this, pos, LIST, attr).showDialog()) { + ElementAttributes modified = new AttributeDialog(this, pos, LIST, attr).showDialog(); + if (modified!=null) { pins.remove(name); - final String newName = attr.get(Keys.LABEL).trim().replace(' ', '_'); - final String pinStr = attr.get(Keys.PIN).trim(); + final String newName = modified.get(Keys.LABEL).trim().replace(' ', '_'); + final String pinStr = modified.get(Keys.PIN).trim(); if (pinStr.length() > 0) { try { int p = Integer.parseInt(pinStr);