diff --git a/src/main/java/de/neemann/digital/draw/elements/Circuit.java b/src/main/java/de/neemann/digital/draw/elements/Circuit.java index 6d873d0b9..c0a5b4459 100644 --- a/src/main/java/de/neemann/digital/draw/elements/Circuit.java +++ b/src/main/java/de/neemann/digital/draw/elements/Circuit.java @@ -157,7 +157,6 @@ public class Circuit implements Copyable { */ public void save(File filename) throws IOException { save(new FileOutputStream(filename)); - origin = filename; } /** @@ -200,6 +199,8 @@ public class Circuit implements Copyable { if (original.measurementOrdering != null) measurementOrdering.addAll(original.measurementOrdering); + origin = original.origin; + version = 1; } @@ -219,6 +220,7 @@ public class Circuit implements Copyable { circuit.attributes = new ElementAttributes(attributes); circuit.wires.addAll(wires); circuit.visualElements.addAll(visualElements); + circuit.origin = origin; return circuit; } @@ -714,6 +716,15 @@ public class Circuit implements Copyable { return origin; } + /** + * Sets the file name + * + * @param filename the file name + */ + public void setOrigin(File filename) { + this.origin = filename; + } + /** * Visual element filter */ 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 e5c546937..758429804 100644 --- a/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java +++ b/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java @@ -490,6 +490,11 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib */ public void save(File filename) throws IOException { getCircuit().save(filename); + try { + undoManager.applyWithoutHistory(circuit -> circuit.setOrigin(filename)); + } catch (ModifyException e) { + throw new RuntimeException("internal error in save", e); + } undoManager.saved(); } diff --git a/src/main/java/de/neemann/digital/undo/UndoManager.java b/src/main/java/de/neemann/digital/undo/UndoManager.java index ad8aba3d1..32125fd9c 100644 --- a/src/main/java/de/neemann/digital/undo/UndoManager.java +++ b/src/main/java/de/neemann/digital/undo/UndoManager.java @@ -10,7 +10,8 @@ import java.util.ArrayList; /** * Class which implements Undo/Redo logic. * Uses an event sourcing approach. - * Make sure that no modifications are made beside the {@link UndoManager#apply(Modification)} method! + * Make sure that no modifications are made beside the {@link UndoManager#apply(Modification)} + * or {@link UndoManager#applyWithoutHistory(Modification)} method! * * @param the structure to modify */ @@ -198,4 +199,18 @@ public class UndoManager> { listeners.remove(listener); } + + /** + * Applies a modification to the object without a history record. + * Needs to be used to ensure all existing copies are modified. + * + * @param modification the modification + * @throws ModifyException ModifyException + */ + public void applyWithoutHistory(Modification modification) throws ModifyException { + if (actual != null) + modification.modify(actual); + modification.modify(initial); + } + }