From db3f27e53923567b96d84879a14c58e655bac845 Mon Sep 17 00:00:00 2001 From: mikkel1510 <144017496+mikkel1510@users.noreply.github.com> Date: Tue, 16 Sep 2025 14:46:59 +0200 Subject: [PATCH 01/19] Create CI.yml --- .github/workflows/CI.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 .github/workflows/CI.yml diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml new file mode 100644 index 000000000..0bfd9dfde --- /dev/null +++ b/.github/workflows/CI.yml @@ -0,0 +1,25 @@ +name: CI +on: + pull_request: + branches: ["develop"] +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Build project + - run: mvn clean install -DskipTests + + execute: + runs-on: ubuntu-latest + needs: build + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Run project + - run: cd jhotdraw-samples/jhotdraw-samples-misc && mvn exec:java "-Dexec.mainClass=org.jhotdraw.samples.svg.Main" From 66ae6a9c16be8d80a626a9b624683f8e516d8cf3 Mon Sep 17 00:00:00 2001 From: Mikkel Nielsen Date: Tue, 16 Sep 2025 14:48:34 +0200 Subject: [PATCH 02/19] Added installation and execution to README.md --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index d3da3d6ae..3e6186e2d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,12 @@ # jhotdraw +## Install and Run +Install (**in project root**): +mvn clean install -DskipTests + +Run (**in jhotdraw-samples-misc**): +mvn exec:java "-Dexec.mainClass=org.jhotdraw.samples.svg.Main" + * maven build process * restructured project layout * introduced submodules From 2915af5adf39564e57310af7de945db45a5923a3 Mon Sep 17 00:00:00 2001 From: mikkel1510 <144017496+mikkel1510@users.noreply.github.com> Date: Tue, 16 Sep 2025 14:55:18 +0200 Subject: [PATCH 03/19] Update CI.yml --- .github/workflows/CI.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 0bfd9dfde..0f2c88fce 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -11,7 +11,7 @@ jobs: uses: actions/checkout@v4 - name: Build project - - run: mvn clean install -DskipTests + run: mvn clean install -DskipTests execute: runs-on: ubuntu-latest @@ -22,4 +22,4 @@ jobs: uses: actions/checkout@v4 - name: Run project - - run: cd jhotdraw-samples/jhotdraw-samples-misc && mvn exec:java "-Dexec.mainClass=org.jhotdraw.samples.svg.Main" + run: cd jhotdraw-samples/jhotdraw-samples-misc && mvn exec:java "-Dexec.mainClass=org.jhotdraw.samples.svg.Main" From 03f4555a7ada47ee99903b27ddf51b2eea64acc4 Mon Sep 17 00:00:00 2001 From: Mikkel Nielsen Date: Tue, 16 Sep 2025 14:57:22 +0200 Subject: [PATCH 04/19] Made README.md even better --- README.md | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 3e6186e2d..6f4d907c3 100644 --- a/README.md +++ b/README.md @@ -2,17 +2,12 @@ ## Install and Run Install (**in project root**): -mvn clean install -DskipTests +* mvn clean install -DskipTests Run (**in jhotdraw-samples-misc**): -mvn exec:java "-Dexec.mainClass=org.jhotdraw.samples.svg.Main" - -* maven build process -* restructured project layout - * introduced submodules +* mvn exec:java "-Dexec.mainClass=org.jhotdraw.samples.svg.Main" ## License - * LGPL V2.1 * Creative Commons Attribution 2.5 License From 279ea148f4fb87bb30fb2f6b8e9c53b714919e8e Mon Sep 17 00:00:00 2001 From: mikkel1510 <144017496+mikkel1510@users.noreply.github.com> Date: Tue, 16 Sep 2025 15:23:36 +0200 Subject: [PATCH 05/19] Update CI.yml Now uses GitHub Packages --- .github/workflows/CI.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 0f2c88fce..4bbc2cc97 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -11,7 +11,10 @@ jobs: uses: actions/checkout@v4 - name: Build project - run: mvn clean install -DskipTests + run: mvn clean install -DskipTests --settings maven-settings.xml + env: + USERNAME: ${{ secrets.USERNAME }} + ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} execute: runs-on: ubuntu-latest From e90cbc397fe5d20c53fc7be9626afddabe257258 Mon Sep 17 00:00:00 2001 From: Mikkel Nielsen Date: Tue, 16 Sep 2025 15:26:48 +0200 Subject: [PATCH 06/19] Added maven-settings.xml --- maven-settings.xml | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 maven-settings.xml diff --git a/maven-settings.xml b/maven-settings.xml new file mode 100644 index 000000000..24dfae216 --- /dev/null +++ b/maven-settings.xml @@ -0,0 +1,36 @@ + + + + github + + + + + github + + + central + https://repo.maven.apache.org/maven2 + + + github + https://maven.pkg.github.com/umh99/JHotDraw + + true + + + + + + + + + github + ${env.USERNAME} + ${env.ACCESS_TOKEN} + + + \ No newline at end of file From 03c2cd7f896719cd8eddbf99f1e9acd3fd737e3a Mon Sep 17 00:00:00 2001 From: Mikkel Nielsen Date: Tue, 16 Sep 2025 15:30:37 +0200 Subject: [PATCH 07/19] Changed repo url --- maven-settings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maven-settings.xml b/maven-settings.xml index 24dfae216..0aa9f36f7 100644 --- a/maven-settings.xml +++ b/maven-settings.xml @@ -17,7 +17,7 @@ github - https://maven.pkg.github.com/umh99/JHotDraw + https://maven.pkg.github.com/sweat-tek/MavenRepository true From eea065cb08b443d8121db9a9560ead63102fa6e4 Mon Sep 17 00:00:00 2001 From: mikkel1510 <144017496+mikkel1510@users.noreply.github.com> Date: Tue, 16 Sep 2025 15:38:19 +0200 Subject: [PATCH 08/19] Update CI.yml Cleaned up workflow --- .github/workflows/CI.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 4bbc2cc97..951536ee7 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -11,10 +11,7 @@ jobs: uses: actions/checkout@v4 - name: Build project - run: mvn clean install -DskipTests --settings maven-settings.xml - env: - USERNAME: ${{ secrets.USERNAME }} - ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} + run: mvn clean install -DskipTests execute: runs-on: ubuntu-latest @@ -25,4 +22,4 @@ jobs: uses: actions/checkout@v4 - name: Run project - run: cd jhotdraw-samples/jhotdraw-samples-misc && mvn exec:java "-Dexec.mainClass=org.jhotdraw.samples.svg.Main" + run: mvn -pl jhotdraw-samples/jhotdraw-samples-misc exec:java -Dexec.mainClass=org.jhotdraw.samples.svg.Main From a7a99167a7f74e2c38c474258c08a9d7293d83f9 Mon Sep 17 00:00:00 2001 From: Mikkel Nielsen Date: Tue, 16 Sep 2025 15:39:22 +0200 Subject: [PATCH 09/19] Cleanup in pom.xml --- maven-settings.xml | 36 ------------------------------------ pom.xml | 7 ------- 2 files changed, 43 deletions(-) delete mode 100644 maven-settings.xml diff --git a/maven-settings.xml b/maven-settings.xml deleted file mode 100644 index 0aa9f36f7..000000000 --- a/maven-settings.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - github - - - - - github - - - central - https://repo.maven.apache.org/maven2 - - - github - https://maven.pkg.github.com/sweat-tek/MavenRepository - - true - - - - - - - - - github - ${env.USERNAME} - ${env.ACCESS_TOKEN} - - - \ No newline at end of file diff --git a/pom.xml b/pom.xml index 5f6c7eef5..6f99681c3 100644 --- a/pom.xml +++ b/pom.xml @@ -8,13 +8,6 @@ JHotDraw - - - github - GitHub external Packages - https://maven.pkg.github.com/sweat-tek/MavenRepository - - GNU Library or Lesser General Public License (LGPL) V2.1 From 7ae55530bbf378c3dc902f460837d58ad50c7e0f Mon Sep 17 00:00:00 2001 From: mikkel1510 <144017496+mikkel1510@users.noreply.github.com> Date: Tue, 16 Sep 2025 15:47:32 +0200 Subject: [PATCH 10/19] Update CI.yml --- .github/workflows/CI.yml | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 951536ee7..67ccb1b9c 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -3,7 +3,7 @@ on: pull_request: branches: ["develop"] jobs: - build: + build-and-run: runs-on: ubuntu-latest steps: @@ -12,12 +12,7 @@ jobs: - name: Build project run: mvn clean install -DskipTests - - execute: - runs-on: ubuntu-latest - needs: build - - steps: + - name: Checkout repository uses: actions/checkout@v4 From 2a7c20136a4b0b1232bf5940a4e252dcb77373c9 Mon Sep 17 00:00:00 2001 From: mikkel1510 <144017496+mikkel1510@users.noreply.github.com> Date: Tue, 16 Sep 2025 15:48:10 +0200 Subject: [PATCH 11/19] Update CI.yml --- .github/workflows/CI.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 67ccb1b9c..1a6f61b48 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -13,8 +13,5 @@ jobs: - name: Build project run: mvn clean install -DskipTests - - name: Checkout repository - uses: actions/checkout@v4 - - name: Run project run: mvn -pl jhotdraw-samples/jhotdraw-samples-misc exec:java -Dexec.mainClass=org.jhotdraw.samples.svg.Main From 86c8c056b96ec3fed7f5b7adb44a99b7c4c06266 Mon Sep 17 00:00:00 2001 From: mikkel1510 <144017496+mikkel1510@users.noreply.github.com> Date: Tue, 16 Sep 2025 15:54:12 +0200 Subject: [PATCH 12/19] Update CI.yml --- .github/workflows/CI.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 1a6f61b48..55d3e9e75 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -14,4 +14,5 @@ jobs: run: mvn clean install -DskipTests - name: Run project - run: mvn -pl jhotdraw-samples/jhotdraw-samples-misc exec:java -Dexec.mainClass=org.jhotdraw.samples.svg.Main + run: mvn -pl jhotdraw-samples/jhotdraw-samples-misc exec:java -Dexec.mainClass=org.jhotdraw.samples.svg.Main -Djava.awt.headless=true + From a2bc8bf74eac09ff201daeef5a4fa43020c585a5 Mon Sep 17 00:00:00 2001 From: mikkel1510 <144017496+mikkel1510@users.noreply.github.com> Date: Tue, 16 Sep 2025 16:08:00 +0200 Subject: [PATCH 13/19] Update CI.yml Run tests instead of executing --- .github/workflows/CI.yml | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 55d3e9e75..c88238280 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -3,8 +3,15 @@ on: pull_request: branches: ["develop"] jobs: - build-and-run: + build-and-test: runs-on: ubuntu-latest + strategy: + matrix: + module: [jhotdraw-core, jhotdraw-utils] + defaults: + run: + working-directory: ${{ matrix.module }} + steps: - name: Checkout repository @@ -13,6 +20,6 @@ jobs: - name: Build project run: mvn clean install -DskipTests - - name: Run project - run: mvn -pl jhotdraw-samples/jhotdraw-samples-misc exec:java -Dexec.mainClass=org.jhotdraw.samples.svg.Main -Djava.awt.headless=true + - name: Run tests + run: mvn tests From 0414a0502f8bdcd01f3a5c3beab62ce35278da56 Mon Sep 17 00:00:00 2001 From: mikkel1510 <144017496+mikkel1510@users.noreply.github.com> Date: Tue, 16 Sep 2025 16:12:36 +0200 Subject: [PATCH 14/19] Update CI.yml Fixed test workflow --- .github/workflows/CI.yml | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index c88238280..12e088d94 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -2,24 +2,14 @@ name: CI on: pull_request: branches: ["develop"] + jobs: build-and-test: runs-on: ubuntu-latest - strategy: - matrix: - module: [jhotdraw-core, jhotdraw-utils] - defaults: - run: - working-directory: ${{ matrix.module }} - steps: - name: Checkout repository uses: actions/checkout@v4 - - name: Build project - run: mvn clean install -DskipTests - - - name: Run tests - run: mvn tests - + - name: Build and run tests + run: mvn clean verify -B From 40354f9aa94a0d321f653c933db665f05041ea30 Mon Sep 17 00:00:00 2001 From: EmilSlotsvang Date: Sun, 28 Dec 2025 15:36:25 +0100 Subject: [PATCH 15/19] clean-up-dead-code --- .../org/jhotdraw/undo/UndoRedoManager.java | 29 +++---------------- 1 file changed, 4 insertions(+), 25 deletions(-) diff --git a/jhotdraw-utils/src/main/java/org/jhotdraw/undo/UndoRedoManager.java b/jhotdraw-utils/src/main/java/org/jhotdraw/undo/UndoRedoManager.java index 40ac0b4ce..a712ee22f 100644 --- a/jhotdraw-utils/src/main/java/org/jhotdraw/undo/UndoRedoManager.java +++ b/jhotdraw-utils/src/main/java/org/jhotdraw/undo/UndoRedoManager.java @@ -255,6 +255,7 @@ private void updateActions() { @Override public void undo() throws CannotUndoException { + System.out.println("UndoCalled"); undoOrRedoInProgress = true; try { super.undo(); @@ -286,43 +287,21 @@ public void redo() * The UndoRedoManager ignores all incoming UndoableEdit events, * while undo or redo is in progress. */ - @Override - public void undoOrRedo() - throws CannotUndoException, CannotRedoException { - undoOrRedoInProgress = true; - try { - super.undoOrRedo(); - } finally { - undoOrRedoInProgress = false; - updateActions(); - } - } + public void addPropertyChangeListener(PropertyChangeListener listener) { propertySupport.addPropertyChangeListener(listener); } - public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { - propertySupport.addPropertyChangeListener(propertyName, listener); - } +// has a use public void removePropertyChangeListener(PropertyChangeListener listener) { propertySupport.removePropertyChangeListener(listener); } - public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { - propertySupport.removePropertyChangeListener(propertyName, listener); - } - +// has a use protected void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) { propertySupport.firePropertyChange(propertyName, oldValue, newValue); } - protected void firePropertyChange(String propertyName, int oldValue, int newValue) { - propertySupport.firePropertyChange(propertyName, oldValue, newValue); - } - - protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) { - propertySupport.firePropertyChange(propertyName, oldValue, newValue); - } } From 9560f2750a8c5c2a76da2739b8e46af2bcd1c765 Mon Sep 17 00:00:00 2001 From: EmilSlotsvang Date: Tue, 30 Dec 2025 12:08:48 +0100 Subject: [PATCH 16/19] moved-redo&undo-into-separat-classes --- .../java/org/jhotdraw/undo/RedoAction.java | 36 +++++++++++++ .../java/org/jhotdraw/undo/UndoAction.java | 33 ++++++++++++ .../org/jhotdraw/undo/UndoRedoManager.java | 52 +------------------ 3 files changed, 71 insertions(+), 50 deletions(-) create mode 100644 jhotdraw-utils/src/main/java/org/jhotdraw/undo/RedoAction.java create mode 100644 jhotdraw-utils/src/main/java/org/jhotdraw/undo/UndoAction.java diff --git a/jhotdraw-utils/src/main/java/org/jhotdraw/undo/RedoAction.java b/jhotdraw-utils/src/main/java/org/jhotdraw/undo/RedoAction.java new file mode 100644 index 000000000..66dc0c8cf --- /dev/null +++ b/jhotdraw-utils/src/main/java/org/jhotdraw/undo/RedoAction.java @@ -0,0 +1,36 @@ +package org.jhotdraw.undo; + +import javax.swing.*; +import javax.swing.undo.CannotRedoException; +import java.awt.event.ActionEvent; + +import static org.jhotdraw.undo.UndoRedoManager.getLabels; + +/** + * Redo Action for use in a menu bar. + */ +class RedoAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + private final UndoRedoManager manager; + + public RedoAction(UndoRedoManager undoRedoManger) { + manager = undoRedoManger; + getLabels().configureAction(this, "edit.redo"); + setEnabled(false); +// ....... +// ....... + } + + /** + * Invoked when an action occurs. + */ + @Override + public void actionPerformed(ActionEvent evt) { + try { + manager.redo(); + } catch (CannotRedoException e) { + System.out.println("Cannot redo: " + e); + } + } +} \ No newline at end of file diff --git a/jhotdraw-utils/src/main/java/org/jhotdraw/undo/UndoAction.java b/jhotdraw-utils/src/main/java/org/jhotdraw/undo/UndoAction.java new file mode 100644 index 000000000..a56d81fc2 --- /dev/null +++ b/jhotdraw-utils/src/main/java/org/jhotdraw/undo/UndoAction.java @@ -0,0 +1,33 @@ +package org.jhotdraw.undo; + +import javax.swing.*; +import javax.swing.undo.CannotUndoException; +import java.awt.event.ActionEvent; + +/** + * Undo Action for use in a menu bar. + */ +class UndoAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + private final UndoRedoManager manager; + + public UndoAction(UndoRedoManager undoRedoManger) { + manager = undoRedoManger; + UndoRedoManager.getLabels().configureAction(this, "edit.undo"); + setEnabled(false); + } + + /** + * Invoked when an action occurs. + */ + @Override + public void actionPerformed(ActionEvent evt) { + try { + manager.undo(); + } catch (CannotUndoException e) { + System.err.println("Cannot undo: " + e); + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/jhotdraw-utils/src/main/java/org/jhotdraw/undo/UndoRedoManager.java b/jhotdraw-utils/src/main/java/org/jhotdraw/undo/UndoRedoManager.java index a712ee22f..370e22c72 100644 --- a/jhotdraw-utils/src/main/java/org/jhotdraw/undo/UndoRedoManager.java +++ b/jhotdraw-utils/src/main/java/org/jhotdraw/undo/UndoRedoManager.java @@ -65,55 +65,7 @@ public boolean canRedo() { /** * Undo Action for use in a menu bar. */ - private class UndoAction - extends AbstractAction { - private static final long serialVersionUID = 1L; - - public UndoAction() { - labels.configureAction(this, "edit.undo"); - setEnabled(false); - } - - /** - * Invoked when an action occurs. - */ - @Override - public void actionPerformed(ActionEvent evt) { - try { - undo(); - } catch (CannotUndoException e) { - System.err.println("Cannot undo: " + e); - e.printStackTrace(); - } - } - } - - /** - * Redo Action for use in a menu bar. - */ - private class RedoAction - extends AbstractAction { - - private static final long serialVersionUID = 1L; - - public RedoAction() { - labels.configureAction(this, "edit.redo"); - setEnabled(false); - } - - /** - * Invoked when an action occurs. - */ - @Override - public void actionPerformed(ActionEvent evt) { - try { - redo(); - } catch (CannotRedoException e) { - System.out.println("Cannot redo: " + e); - } - } - } /** * The undo action instance. */ @@ -135,8 +87,8 @@ public static ResourceBundleUtil getLabels() { */ public UndoRedoManager() { getLabels(); - undoAction = new UndoAction(); - redoAction = new RedoAction(); + undoAction = new UndoAction(this); + redoAction = new RedoAction(this); } public void setLocale(Locale l) { From 2ab76994c72907355b114ebe3212e32056ed2fb0 Mon Sep 17 00:00:00 2001 From: EmilSlotsvang Date: Fri, 2 Jan 2026 16:25:26 +0100 Subject: [PATCH 17/19] abstract-super-class --- .../jhotdraw/undo/AbstractUndoRedoAction.java | 26 ++++++++++++++++ .../java/org/jhotdraw/undo/RedoAction.java | 30 ++++++------------- .../java/org/jhotdraw/undo/UndoAction.java | 16 +++------- 3 files changed, 39 insertions(+), 33 deletions(-) create mode 100644 jhotdraw-utils/src/main/java/org/jhotdraw/undo/AbstractUndoRedoAction.java diff --git a/jhotdraw-utils/src/main/java/org/jhotdraw/undo/AbstractUndoRedoAction.java b/jhotdraw-utils/src/main/java/org/jhotdraw/undo/AbstractUndoRedoAction.java new file mode 100644 index 000000000..63aba33ca --- /dev/null +++ b/jhotdraw-utils/src/main/java/org/jhotdraw/undo/AbstractUndoRedoAction.java @@ -0,0 +1,26 @@ +package org.jhotdraw.undo; + +import javax.swing.*; +import java.awt.event.ActionEvent; + +public abstract class AbstractUndoRedoAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + private final UndoRedoManager manager; + + public AbstractUndoRedoAction(UndoRedoManager undoRedoManager, String ID) { + this.manager = undoRedoManager; + UndoRedoManager.getLabels().configureAction(this, "edit." + ID); + setEnabled(false); + } + @Override + public void actionPerformed(ActionEvent evt) { + performAction(); + } + + protected abstract void performAction(); + + protected UndoRedoManager getManager() { + return this.manager; + } +} \ No newline at end of file diff --git a/jhotdraw-utils/src/main/java/org/jhotdraw/undo/RedoAction.java b/jhotdraw-utils/src/main/java/org/jhotdraw/undo/RedoAction.java index 66dc0c8cf..25369cc2a 100644 --- a/jhotdraw-utils/src/main/java/org/jhotdraw/undo/RedoAction.java +++ b/jhotdraw-utils/src/main/java/org/jhotdraw/undo/RedoAction.java @@ -1,36 +1,24 @@ package org.jhotdraw.undo; -import javax.swing.*; -import javax.swing.undo.CannotRedoException; -import java.awt.event.ActionEvent; - -import static org.jhotdraw.undo.UndoRedoManager.getLabels; +import javax.swing.undo.CannotUndoException; /** * Redo Action for use in a menu bar. */ -class RedoAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - private final UndoRedoManager manager; - +class RedoAction extends AbstractUndoRedoAction { public RedoAction(UndoRedoManager undoRedoManger) { - manager = undoRedoManger; - getLabels().configureAction(this, "edit.redo"); - setEnabled(false); -// ....... -// ....... + super(undoRedoManger, "redo"); } - /** * Invoked when an action occurs. */ @Override - public void actionPerformed(ActionEvent evt) { + protected void performAction() { try { - manager.redo(); - } catch (CannotRedoException e) { - System.out.println("Cannot redo: " + e); - } + super.getManager().redo(); + } catch (CannotUndoException e) { + System.err.println("Cannot undo: " + e); + e.printStackTrace(); } +} } \ No newline at end of file diff --git a/jhotdraw-utils/src/main/java/org/jhotdraw/undo/UndoAction.java b/jhotdraw-utils/src/main/java/org/jhotdraw/undo/UndoAction.java index a56d81fc2..3139cd16a 100644 --- a/jhotdraw-utils/src/main/java/org/jhotdraw/undo/UndoAction.java +++ b/jhotdraw-utils/src/main/java/org/jhotdraw/undo/UndoAction.java @@ -1,30 +1,22 @@ package org.jhotdraw.undo; -import javax.swing.*; import javax.swing.undo.CannotUndoException; -import java.awt.event.ActionEvent; /** * Undo Action for use in a menu bar. */ -class UndoAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - private final UndoRedoManager manager; +class UndoAction extends AbstractUndoRedoAction { public UndoAction(UndoRedoManager undoRedoManger) { - manager = undoRedoManger; - UndoRedoManager.getLabels().configureAction(this, "edit.undo"); - setEnabled(false); + super(undoRedoManger, "undo"); } - /** * Invoked when an action occurs. */ @Override - public void actionPerformed(ActionEvent evt) { + protected void performAction() { try { - manager.undo(); + super.getManager().undo(); } catch (CannotUndoException e) { System.err.println("Cannot undo: " + e); e.printStackTrace(); From 8d70cfc663060faf0fade62234a8123b05e857db Mon Sep 17 00:00:00 2001 From: EmilSlotsvang Date: Tue, 6 Jan 2026 11:22:39 +0100 Subject: [PATCH 18/19] added-logger-removed-println --- .../java/org/jhotdraw/undo/AbstractUndoRedoAction.java | 7 +++++-- .../src/main/java/org/jhotdraw/undo/RedoAction.java | 4 ++-- .../src/main/java/org/jhotdraw/undo/UndoAction.java | 4 ++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/jhotdraw-utils/src/main/java/org/jhotdraw/undo/AbstractUndoRedoAction.java b/jhotdraw-utils/src/main/java/org/jhotdraw/undo/AbstractUndoRedoAction.java index 63aba33ca..ee34e0b10 100644 --- a/jhotdraw-utils/src/main/java/org/jhotdraw/undo/AbstractUndoRedoAction.java +++ b/jhotdraw-utils/src/main/java/org/jhotdraw/undo/AbstractUndoRedoAction.java @@ -2,15 +2,18 @@ import javax.swing.*; import java.awt.event.ActionEvent; +import java.util.logging.Logger; public abstract class AbstractUndoRedoAction extends AbstractAction { private static final long serialVersionUID = 1L; private final UndoRedoManager manager; - public AbstractUndoRedoAction(UndoRedoManager undoRedoManager, String ID) { + protected final Logger logger = Logger.getLogger(this.getClass().getName()); + + AbstractUndoRedoAction(UndoRedoManager undoRedoManager, String id) { this.manager = undoRedoManager; - UndoRedoManager.getLabels().configureAction(this, "edit." + ID); + UndoRedoManager.getLabels().configureAction(this, "edit." + id); setEnabled(false); } @Override diff --git a/jhotdraw-utils/src/main/java/org/jhotdraw/undo/RedoAction.java b/jhotdraw-utils/src/main/java/org/jhotdraw/undo/RedoAction.java index 25369cc2a..bf3237aaa 100644 --- a/jhotdraw-utils/src/main/java/org/jhotdraw/undo/RedoAction.java +++ b/jhotdraw-utils/src/main/java/org/jhotdraw/undo/RedoAction.java @@ -1,6 +1,7 @@ package org.jhotdraw.undo; import javax.swing.undo.CannotUndoException; +import java.util.logging.Level; /** * Redo Action for use in a menu bar. @@ -17,8 +18,7 @@ protected void performAction() { try { super.getManager().redo(); } catch (CannotUndoException e) { - System.err.println("Cannot undo: " + e); - e.printStackTrace(); + logger.log(Level.SEVERE, "Cannot redo: ", e); } } } \ No newline at end of file diff --git a/jhotdraw-utils/src/main/java/org/jhotdraw/undo/UndoAction.java b/jhotdraw-utils/src/main/java/org/jhotdraw/undo/UndoAction.java index 3139cd16a..1676655c4 100644 --- a/jhotdraw-utils/src/main/java/org/jhotdraw/undo/UndoAction.java +++ b/jhotdraw-utils/src/main/java/org/jhotdraw/undo/UndoAction.java @@ -1,6 +1,7 @@ package org.jhotdraw.undo; import javax.swing.undo.CannotUndoException; +import java.util.logging.Level; /** * Undo Action for use in a menu bar. @@ -18,8 +19,7 @@ protected void performAction() { try { super.getManager().undo(); } catch (CannotUndoException e) { - System.err.println("Cannot undo: " + e); - e.printStackTrace(); + logger.log(Level.SEVERE, "Cannot undo: ", e); } } } \ No newline at end of file From a39b5dc94f95b08bf7e1c140c69c3e0c8ddd0d27 Mon Sep 17 00:00:00 2001 From: EmilSlotsvang Date: Wed, 7 Jan 2026 16:32:29 +0100 Subject: [PATCH 19/19] BDD-Testing --- .../undo/UndoMostRecentActionBddTest.java | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 jhotdraw-utils/src/test/java/org/jhotdraw/undo/UndoMostRecentActionBddTest.java diff --git a/jhotdraw-utils/src/test/java/org/jhotdraw/undo/UndoMostRecentActionBddTest.java b/jhotdraw-utils/src/test/java/org/jhotdraw/undo/UndoMostRecentActionBddTest.java new file mode 100644 index 000000000..93b9fe88e --- /dev/null +++ b/jhotdraw-utils/src/test/java/org/jhotdraw/undo/UndoMostRecentActionBddTest.java @@ -0,0 +1,70 @@ +package org.jhotdraw.undo; + +import com.tngtech.jgiven.Stage; +import com.tngtech.jgiven.annotation.ProvidedScenarioState; +import com.tngtech.jgiven.junit.ScenarioTest; +import org.junit.Test; + +import javax.swing.undo.AbstractUndoableEdit; + +import static org.junit.Assert.assertTrue; + +public class UndoMostRecentActionBddTest extends ScenarioTest< + UndoMostRecentActionBddTest.Given, + UndoMostRecentActionBddTest.When, + UndoMostRecentActionBddTest.Then> { + + @Test + public void undo_the_most_recent_action() { + given().an_undo_manager_with_one_action(); + when().the_user_clicks_undo(); + then().the_action_is_undone_and_redo_is_available(); + } + + public static class Given extends Stage { + @ProvidedScenarioState UndoRedoManager manager; + @ProvidedScenarioState TestEdit edit; + + public Given an_undo_manager_with_one_action() { + manager = new UndoRedoManager(); + edit = new TestEdit(); + manager.addEdit(edit); + return self(); + } + } + + public static class When extends Stage { + @ProvidedScenarioState UndoRedoManager manager; + + public When the_user_clicks_undo() { + manager.undo(); + return self(); + } + } + + public static class Then extends Stage { + @ProvidedScenarioState UndoRedoManager manager; + @ProvidedScenarioState TestEdit edit; + + public Then the_action_is_undone_and_redo_is_available() { + assertTrue("Undo should be called on the edit", edit.undoCalled); + assertTrue("Redo should be available after undo", manager.canRedo()); + return self(); + } + } + + static class TestEdit extends AbstractUndoableEdit { + boolean undoCalled = false; + + @Override + public void undo() { + super.undo(); + undoCalled = true; + } + + @Override + public boolean isSignificant() { + return true; + } + } +}