diff --git a/jhotdraw-actions/src/main/java/org/jhotdraw/action/edit/UndoAction.java b/jhotdraw-actions/src/main/java/org/jhotdraw/action/edit/UndoAction.java index 74c4f2cea..96c18e328 100644 --- a/jhotdraw-actions/src/main/java/org/jhotdraw/action/edit/UndoAction.java +++ b/jhotdraw-actions/src/main/java/org/jhotdraw/action/edit/UndoAction.java @@ -19,7 +19,7 @@ * Undoes the last user action. *

* This action requires that the View returns a project - * specific undo action when invoking getActionMap("redo") on a View. + * specific Undo.java action when invoking getActionMap("redo") on a View. *

* This action is called when the user selects the Undo item in the Edit * menu. The menu item is automatically created by the application. @@ -34,7 +34,7 @@ public class UndoAction extends AbstractViewAction { private static final long serialVersionUID = 1L; - public static final String ID = "edit.undo"; + public static final String ID = "edit.Undo.java"; private ResourceBundleUtil labels = ResourceBundleUtil.getBundle("org.jhotdraw.action.Labels"); private PropertyChangeListener redoActionPropertyListener = new PropertyChangeListener() { @Override diff --git a/jhotdraw-core/src/main/java/org/jhotdraw/draw/AttributeKey.java b/jhotdraw-core/src/main/java/org/jhotdraw/draw/AttributeKey.java index e08b6a159..656e5f84c 100644 --- a/jhotdraw-core/src/main/java/org/jhotdraw/draw/AttributeKey.java +++ b/jhotdraw-core/src/main/java/org/jhotdraw/draw/AttributeKey.java @@ -185,7 +185,7 @@ public void set(Figure f, T value) { /** * Sets the attribute and returns an UndoableEditEvent which can be used - * to undo it. + * to Undo.java it. *

* Note: Unlike in previous versions of JHotDraw 7, this method does * not call {@code f.willChange()} before setting the value, and diff --git a/jhotdraw-core/src/main/java/org/jhotdraw/draw/event/AttributeChangeEdit.java b/jhotdraw-core/src/main/java/org/jhotdraw/draw/event/AttributeChangeEdit.java index adc4747c4..8af5f4685 100644 --- a/jhotdraw-core/src/main/java/org/jhotdraw/draw/event/AttributeChangeEdit.java +++ b/jhotdraw-core/src/main/java/org/jhotdraw/draw/event/AttributeChangeEdit.java @@ -12,7 +12,7 @@ import org.jhotdraw.draw.*; /** - * An {@code UndoableEdit} event which can undo a change of a {@link Figure} + * An {@code UndoableEdit} event which can Undo.java a change of a {@link Figure} * attribute. * * @author Werner Randelshofer diff --git a/jhotdraw-core/src/main/java/org/jhotdraw/draw/event/BezierNodeEdit.java b/jhotdraw-core/src/main/java/org/jhotdraw/draw/event/BezierNodeEdit.java index c07d174c0..e77dae307 100644 --- a/jhotdraw-core/src/main/java/org/jhotdraw/draw/event/BezierNodeEdit.java +++ b/jhotdraw-core/src/main/java/org/jhotdraw/draw/event/BezierNodeEdit.java @@ -16,7 +16,7 @@ import org.jhotdraw.util.ResourceBundleUtil; /** - * An {@code UndoableEdit} event which can undo a change of a node in + * An {@code UndoableEdit} event which can Undo.java a change of a node in * a {@link BezierFigure}. * * @version $Id: BezierNodeEdit.java -1 $ diff --git a/jhotdraw-core/src/main/java/org/jhotdraw/draw/event/TransformEdit.java b/jhotdraw-core/src/main/java/org/jhotdraw/draw/event/TransformEdit.java index 3fa3b444e..d462b5336 100644 --- a/jhotdraw-core/src/main/java/org/jhotdraw/draw/event/TransformEdit.java +++ b/jhotdraw-core/src/main/java/org/jhotdraw/draw/event/TransformEdit.java @@ -15,7 +15,7 @@ import org.jhotdraw.util.*; /** - * An {@code UndoableEdit} event which can undo a lossless transform of + * An {@code UndoableEdit} event which can Undo.java a lossless transform of * {@link Figure}s by applying the inverse of the transform to the figures. *

* This object is useful for undoing lossless transformations, such as the diff --git a/jhotdraw-core/src/main/java/org/jhotdraw/draw/event/TransformRestoreEdit.java b/jhotdraw-core/src/main/java/org/jhotdraw/draw/event/TransformRestoreEdit.java index 971bad72f..274374659 100644 --- a/jhotdraw-core/src/main/java/org/jhotdraw/draw/event/TransformRestoreEdit.java +++ b/jhotdraw-core/src/main/java/org/jhotdraw/draw/event/TransformRestoreEdit.java @@ -13,7 +13,7 @@ import org.jhotdraw.util.*; /** - * An {@code UndoableEdit} event which can undo a lossy transform of a single + * An {@code UndoableEdit} event which can Undo.java a lossy transform of a single * {@link Figure} by restoring the figure using its transform restore data. *

* This object is useful for undoing lossy transformations, such as the diff --git a/jhotdraw-core/src/main/java/org/jhotdraw/draw/figure/Figure.java b/jhotdraw-core/src/main/java/org/jhotdraw/draw/figure/Figure.java index 2e9b9ab11..0ed45f30e 100644 --- a/jhotdraw-core/src/main/java/org/jhotdraw/draw/figure/Figure.java +++ b/jhotdraw-core/src/main/java/org/jhotdraw/draw/figure/Figure.java @@ -274,7 +274,7 @@ public interface Figure extends Cloneable, Serializable { * Transforms the shape of the Figure. Transformations using double * precision arithmethics are inherently lossy operations. Therefore it is * recommended to use getTransformRestoreData() restoreTransformTo() to - * provide lossless undo/redo functionality. + * provide lossless Undo.java/redo functionality. *

* This is a basic operation which does not fire events. Use the following * code sequence, if you need event firing: diff --git a/jhotdraw-core/src/main/java/org/jhotdraw/draw/figure/LineConnectionFigure.java b/jhotdraw-core/src/main/java/org/jhotdraw/draw/figure/LineConnectionFigure.java index df413a988..8aaf4c464 100644 --- a/jhotdraw-core/src/main/java/org/jhotdraw/draw/figure/LineConnectionFigure.java +++ b/jhotdraw-core/src/main/java/org/jhotdraw/draw/figure/LineConnectionFigure.java @@ -306,7 +306,7 @@ public void removeNotify(Drawing drawing) { } // Note: we do not set the connectors to null here, because we // need them when we are added back to a drawing again. For example, - // when an undo is performed, after the LineConnection has been + // when an Undo.java is performed, after the LineConnection has been // deleted. /* setStartConnector(null); diff --git a/jhotdraw-core/src/main/java/org/jhotdraw/draw/handle/ResizeHandleKit.java b/jhotdraw-core/src/main/java/org/jhotdraw/draw/handle/ResizeHandleKit.java index 87b1d3255..21add24e6 100644 --- a/jhotdraw-core/src/main/java/org/jhotdraw/draw/handle/ResizeHandleKit.java +++ b/jhotdraw-core/src/main/java/org/jhotdraw/draw/handle/ResizeHandleKit.java @@ -112,7 +112,7 @@ private static class ResizeHandle extends LocatorHandle { */ private int sx, sy; /** - * Geometry for undo. + * Geometry for Undo.java. */ private Object geometry; /** diff --git a/jhotdraw-gui/src/main/java/org/jhotdraw/gui/plaf/palette/PaletteFontChooserUI.java b/jhotdraw-gui/src/main/java/org/jhotdraw/gui/plaf/palette/PaletteFontChooserUI.java index ae38e1a61..c6180b0a7 100644 --- a/jhotdraw-gui/src/main/java/org/jhotdraw/gui/plaf/palette/PaletteFontChooserUI.java +++ b/jhotdraw-gui/src/main/java/org/jhotdraw/gui/plaf/palette/PaletteFontChooserUI.java @@ -131,7 +131,7 @@ protected void installListeners(JFontChooser fc) { * Reverses configuration which was done on the specified component during * installUI. This method is invoked when this * UIComponent instance is being removed as the UI delegate - * for the specified component. This method should undo the + * for the specified component. This method should Undo.java the * configuration performed in installUI, being careful to * leave the JComponent instance in a clean state (no * extraneous listeners, look-and-feel-specific property objects, etc.). diff --git a/jhotdraw-samples/jhotdraw-samples-misc/src/main/java/org/jhotdraw/samples/draw/DrawView.java b/jhotdraw-samples/jhotdraw-samples-misc/src/main/java/org/jhotdraw/samples/draw/DrawView.java index ef2f80d99..9bd832875 100644 --- a/jhotdraw-samples/jhotdraw-samples-misc/src/main/java/org/jhotdraw/samples/draw/DrawView.java +++ b/jhotdraw-samples/jhotdraw-samples-misc/src/main/java/org/jhotdraw/samples/draw/DrawView.java @@ -53,7 +53,7 @@ public class DrawView extends AbstractView { private static final long serialVersionUID = 1L; /** - * Each DrawView uses its own undo redo manager. + * Each DrawView uses its own Undo.java redo manager. * This allows for undoing and redoing actions per view. */ private UndoRedoManager undo; diff --git a/jhotdraw-samples/jhotdraw-samples-misc/src/main/java/org/jhotdraw/samples/net/NetView.java b/jhotdraw-samples/jhotdraw-samples-misc/src/main/java/org/jhotdraw/samples/net/NetView.java index 380d42e72..96a64a9d6 100644 --- a/jhotdraw-samples/jhotdraw-samples-misc/src/main/java/org/jhotdraw/samples/net/NetView.java +++ b/jhotdraw-samples/jhotdraw-samples-misc/src/main/java/org/jhotdraw/samples/net/NetView.java @@ -50,7 +50,7 @@ public class NetView extends AbstractView { private static final long serialVersionUID = 1L; public static final String GRID_VISIBLE_PROPERTY = "gridVisible"; /** - * Each NetView uses its own undo redo manager. + * Each NetView uses its own Undo.java redo manager. * This allows for undoing and redoing actions per view. */ private UndoRedoManager undo; diff --git a/jhotdraw-samples/jhotdraw-samples-misc/src/main/java/org/jhotdraw/samples/odg/ODGView.java b/jhotdraw-samples/jhotdraw-samples-misc/src/main/java/org/jhotdraw/samples/odg/ODGView.java index 83a1eba02..f7c17ebf0 100644 --- a/jhotdraw-samples/jhotdraw-samples-misc/src/main/java/org/jhotdraw/samples/odg/ODGView.java +++ b/jhotdraw-samples/jhotdraw-samples-misc/src/main/java/org/jhotdraw/samples/odg/ODGView.java @@ -62,7 +62,7 @@ public class ODGView extends AbstractView { public static final String GRID_VISIBLE_PROPERTY = "gridVisible"; protected JFileURIChooser exportChooser; /** - * Each ODGView uses its own undo redo manager. + * Each ODGView uses its own Undo.java redo manager. * This allows for undoing and redoing actions per view. */ private UndoRedoManager undo; diff --git a/jhotdraw-samples/jhotdraw-samples-misc/src/main/java/org/jhotdraw/samples/pert/PertView.java b/jhotdraw-samples/jhotdraw-samples-misc/src/main/java/org/jhotdraw/samples/pert/PertView.java index e50c022e2..8031ad44a 100644 --- a/jhotdraw-samples/jhotdraw-samples-misc/src/main/java/org/jhotdraw/samples/pert/PertView.java +++ b/jhotdraw-samples/jhotdraw-samples-misc/src/main/java/org/jhotdraw/samples/pert/PertView.java @@ -49,7 +49,7 @@ public class PertView extends AbstractView { private static final long serialVersionUID = 1L; public static final String GRID_VISIBLE_PROPERTY = "gridVisible"; /** - * Each view uses its own undo redo manager. + * Each view uses its own Undo.java redo manager. * This allows for undoing and redoing actions per view. */ private UndoRedoManager undo; diff --git a/jhotdraw-samples/jhotdraw-samples-misc/src/main/java/org/jhotdraw/samples/svg/SVGView.java b/jhotdraw-samples/jhotdraw-samples-misc/src/main/java/org/jhotdraw/samples/svg/SVGView.java index c09b41fef..a341ae090 100644 --- a/jhotdraw-samples/jhotdraw-samples-misc/src/main/java/org/jhotdraw/samples/svg/SVGView.java +++ b/jhotdraw-samples/jhotdraw-samples-misc/src/main/java/org/jhotdraw/samples/svg/SVGView.java @@ -45,7 +45,7 @@ public class SVGView extends AbstractView { public static final String GRID_VISIBLE_PROPERTY = "gridVisible"; protected JFileURIChooser exportChooser; /** - * Each SVGView uses its own undo redo manager. + * Each SVGView uses its own Undo.java redo manager. * This allows for undoing and redoing actions per view. */ private UndoRedoManager undo; diff --git a/jhotdraw-samples/jhotdraw-samples-misc/src/main/java/org/jhotdraw/samples/svg/gui/ActionsToolBar.java b/jhotdraw-samples/jhotdraw-samples-misc/src/main/java/org/jhotdraw/samples/svg/gui/ActionsToolBar.java index 0a40d2f6a..81087e7c8 100644 --- a/jhotdraw-samples/jhotdraw-samples-misc/src/main/java/org/jhotdraw/samples/svg/gui/ActionsToolBar.java +++ b/jhotdraw-samples/jhotdraw-samples-misc/src/main/java/org/jhotdraw/samples/svg/gui/ActionsToolBar.java @@ -130,7 +130,7 @@ protected JComponent createDisclosedComponent(int state) { btn = new JButton(undoManager.getUndoAction()); btn.setUI((PaletteButtonUI) PaletteButtonUI.createUI(btn)); btn.setText(null); - labels.configureToolBarButton(btn, "edit.undo"); + labels.configureToolBarButton(btn, "edit.Undo.java"); btn.putClientProperty("hideActionText", Boolean.TRUE); gbc = new GridBagConstraints(); gbc.gridy = 0; diff --git a/jhotdraw-samples/jhotdraw-samples-misc/src/main/java/org/jhotdraw/samples/teddy/TeddyView.java b/jhotdraw-samples/jhotdraw-samples-misc/src/main/java/org/jhotdraw/samples/teddy/TeddyView.java index 137b88dbd..77ef1688f 100755 --- a/jhotdraw-samples/jhotdraw-samples-misc/src/main/java/org/jhotdraw/samples/teddy/TeddyView.java +++ b/jhotdraw-samples/jhotdraw-samples-misc/src/main/java/org/jhotdraw/samples/teddy/TeddyView.java @@ -96,7 +96,7 @@ public boolean getScrollableTracksViewportHeight() { } protected EditorPanel editorViewport; /** - * The undo/redo manager. + * The Undo.java/redo manager. */ protected UndoRedoManager undoManager; /** diff --git a/jhotdraw-utils/src/main/java/org/jhotdraw/undo/CompositeEdit.java b/jhotdraw-utils/src/main/java/org/jhotdraw/undo/CompositeEdit.java index dc097d75f..9f7446ca3 100644 --- a/jhotdraw-utils/src/main/java/org/jhotdraw/undo/CompositeEdit.java +++ b/jhotdraw-utils/src/main/java/org/jhotdraw/undo/CompositeEdit.java @@ -10,7 +10,7 @@ import javax.swing.undo.*; /** - * This is basically the same like javax.swing.undo.CompoundEdit but + * This is basically the same like javax.swing.Undo.java.CompoundEdit but * it has a slightly different behaviour: * The compound edit ends, when it is added to itself. This way it * can be fired two times to an UndoManager: The first time, when @@ -105,7 +105,7 @@ public String getPresentationName() { } /** - * Returns the undo presentation name. + * Returns the Undo.java presentation name. * If the presentation name is null, then CompoundEdit.getUndoPresentationName * is returned. * diff --git a/jhotdraw-utils/src/main/java/org/jhotdraw/undo/PropertyChangeEdit.java b/jhotdraw-utils/src/main/java/org/jhotdraw/undo/PropertyChangeEdit.java index c2eaeb0cf..da4c8dc42 100644 --- a/jhotdraw-utils/src/main/java/org/jhotdraw/undo/PropertyChangeEdit.java +++ b/jhotdraw-utils/src/main/java/org/jhotdraw/undo/PropertyChangeEdit.java @@ -15,7 +15,7 @@ import javax.swing.undo.UndoableEdit; /** - * An {@code UndoableEdit} event which can undo a change of a JavaBeans property. + * An {@code UndoableEdit} event which can Undo.java a change of a JavaBeans property. * * @author Werner Randelshofer * @version $Id$ 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..7000c8640 100644 --- a/jhotdraw-utils/src/main/java/org/jhotdraw/undo/UndoRedoManager.java +++ b/jhotdraw-utils/src/main/java/org/jhotdraw/undo/UndoRedoManager.java @@ -10,18 +10,19 @@ import java.awt.event.*; import java.beans.*; import java.util.*; +import java.util.logging.Logger; import javax.swing.*; import javax.swing.undo.*; import org.jhotdraw.util.*; /** - * Same as javax.swing.UndoManager but provides actions for undo and + * Same as javax.swing.UndoManager but provides actions for Undo.java and * redo operations. * * @author Werner Randelshofer * @version $Id$ */ -public class UndoRedoManager extends UndoManager { //javax.swing.undo.UndoManager { +public class UndoRedoManager extends UndoManager { //javax.swing.Undo.java.UndoManager { private static final long serialVersionUID = 1L; protected PropertyChangeSupport propertySupport = new PropertyChangeSupport(this); @@ -38,7 +39,7 @@ public class UndoRedoManager extends UndoManager { //javax.swing.undo.UndoManage */ private boolean hasSignificantEdits = false; /** - * This flag is set to true when an undo or redo + * This flag is set to true when an Undo.java or redo * operation is in progress. The UndoRedoManager * ignores all incoming UndoableEdit events while * this flag is true. @@ -71,7 +72,7 @@ private class UndoAction private static final long serialVersionUID = 1L; public UndoAction() { - labels.configureAction(this, "edit.undo"); + labels.configureAction(this, "edit.Undo.java"); setEnabled(false); } @@ -83,7 +84,7 @@ public void actionPerformed(ActionEvent evt) { try { undo(); } catch (CannotUndoException e) { - System.err.println("Cannot undo: " + e); + System.err.println("Cannot Undo.java: " + e); e.printStackTrace(); } } @@ -115,7 +116,7 @@ public void actionPerformed(ActionEvent evt) { } } /** - * The undo action instance. + * The Undo.java action instance. */ private UndoAction undoAction; /** @@ -125,7 +126,7 @@ public void actionPerformed(ActionEvent evt) { public static ResourceBundleUtil getLabels() { if (labels == null) { - labels = ResourceBundleUtil.getBundle("org.jhotdraw.undo.Labels"); + labels = ResourceBundleUtil.getBundle("org.jhotdraw.Undo.java.Labels"); } return labels; } @@ -139,8 +140,8 @@ public UndoRedoManager() { redoAction = new RedoAction(); } - public void setLocale(Locale l) { - labels = ResourceBundleUtil.getBundle("org.jhotdraw.undo.Labels", l); + public static void setLocale(Locale l) { + labels = ResourceBundleUtil.getBundle("org.jhotdraw.Undo.java.Labels", l); } /** @@ -203,7 +204,7 @@ public boolean addEdit(UndoableEdit anEdit) { } /** - * Gets the undo action for use as an Undo menu item. + * Gets the Undo.java action for use as an Undo menu item. */ public Action getUndoAction() { return undoAction; @@ -250,7 +251,7 @@ private void updateActions() { /** * Undoes the last edit event. * The UndoRedoManager ignores all incoming UndoableEdit events, - * while undo is in progress. + * while Undo.java is in progress. */ @Override public void undo() @@ -284,7 +285,7 @@ public void redo() /** * Undoes or redoes the last edit event. * The UndoRedoManager ignores all incoming UndoableEdit events, - * while undo or redo is in progress. + * while Undo.java or redo is in progress. */ @Override public void undoOrRedo() diff --git a/jhotdraw-utils/src/main/java/org/jhotdraw/undo/package-info.java b/jhotdraw-utils/src/main/java/org/jhotdraw/undo/package-info.java index a1f1760cb..4dae4f60a 100644 --- a/jhotdraw-utils/src/main/java/org/jhotdraw/undo/package-info.java +++ b/jhotdraw-utils/src/main/java/org/jhotdraw/undo/package-info.java @@ -8,7 +8,7 @@ * @version $Id$ */ /** - * Provides undo/redo support leveraging the javax.swing.undo package. + * Provides Undo.java/redo support leveraging the javax.swing.Undo.java package. * */ package org.jhotdraw.undo; diff --git a/jhotdraw-utils/src/main/java/org/jhotdraw/util/ResourceBundleUtil.java b/jhotdraw-utils/src/main/java/org/jhotdraw/util/ResourceBundleUtil.java index 2945c8223..a2df1653c 100644 --- a/jhotdraw-utils/src/main/java/org/jhotdraw/util/ResourceBundleUtil.java +++ b/jhotdraw-utils/src/main/java/org/jhotdraw/util/ResourceBundleUtil.java @@ -25,9 +25,9 @@ * property name and format type between "${" and "}". *

* For example, if there is a {@code "imagedir"} property with the value - * {@code "/org/jhotdraw/undo/images"}, then this could be used in an attribute + * {@code "/org/jhotdraw/Undo.java/images"}, then this could be used in an attribute * like this: ${imagedir}/editUndo.png. This is resolved at run-time - * as {@code /org/jhotdraw/undo/images/editUndo.png}. + * as {@code /org/jhotdraw/Undo.java/images/editUndo.png}. *

* Property names in placeholders can contain modifiers. Modifiers are written * between @code "[$"} and {@code "]"}. Each modifier has a fallback chain. diff --git a/jhotdraw-utils/src/test/java/org/jhotdraw/geom/BezierPathNGTest.java b/jhotdraw-utils/src/test/java/org/jhotdraw/geom/BezierPathNGTest.java deleted file mode 100644 index c798f13fc..000000000 --- a/jhotdraw-utils/src/test/java/org/jhotdraw/geom/BezierPathNGTest.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright (C) 2015 JHotDraw. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301 USA - */ -package org.jhotdraw.geom; - -import java.awt.geom.Path2D; -import java.awt.geom.PathIterator; -import java.awt.geom.Point2D; -import static org.testng.Assert.*; -import org.testng.annotations.AfterClass; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -/** - * - * @author toben - */ -public class BezierPathNGTest { - - public BezierPathNGTest() { - } - - @BeforeClass - public static void setUpClass() throws Exception { - } - - @AfterClass - public static void tearDownClass() throws Exception { - } - - @BeforeMethod - public void setUpMethod() throws Exception { - } - - @AfterMethod - public void tearDownMethod() throws Exception { - } - - @Test - public void testToGeneralPath() { - BezierPath instance = new BezierPath(); - Point2D.Double c0 = new Point2D.Double(0.0004, 0.002); - instance.add(c0); - c0 = new Point2D.Double(21.0004, 56.92827); - instance.add(c0); - Path2D.Double gp = instance.toGeneralPath(); - PathIterator pathIterator = gp.getPathIterator(null); - double[] coords = new double[2]; - int i = 0; - while (pathIterator.isDone() == false) { - pathIterator.currentSegment(coords); - for (int j = 0; j < 3; j++) { - assertEquals(coords[0], instance.get(i).getControlPoint(j).x); - assertEquals(coords[1], instance.get(i).getControlPoint(j).y); - } - i++; - pathIterator.next(); - } - } - - /** - * Test of toPolygonArray method, of class BezierPath. - */ - @Test - public void testToPolygonArray() { - BezierPath instance = new BezierPath(); - Point2D.Double c0 = new Point2D.Double(0.0004, 0.002); - instance.add(c0); - c0 = new Point2D.Double(21.0004, 56.92827); - instance.add(c0); - Point2D.Double[] toPolygonArray = instance.toPolygonArray(); - assertEquals(toPolygonArray.length, 2); - for (int i = 0; i < toPolygonArray.length; i++) { - for (int j = 0; j < 3; j++) { - assertEquals(toPolygonArray[i], instance.get(i).getControlPoint(j)); - } - } - } - - @Test - public void testPathIterator() { - BezierPath instance = new BezierPath(); - Point2D.Double c0 = new Point2D.Double(0.0004, 0.002); - instance.add(c0); - c0 = new Point2D.Double(21.0004, 56.92827); - instance.add(c0); - PathIterator pathIterator = instance.getPathIterator(null); - double[] coords = new double[2]; - int i = 0; - while (pathIterator.isDone() == false) { - pathIterator.currentSegment(coords); - for (int j = 0; j < 3; j++) { - assertEquals(coords[0], instance.get(i).getControlPoint(j).x); - assertEquals(coords[1], instance.get(i).getControlPoint(j).y); - } - i++; - pathIterator.next(); - } - } - - @Test - public void testPathIterator2() { - BezierPath instance = new BezierPath(); - Point2D.Double c0 = new Point2D.Double(0.0004, 0.002); - instance.add(c0); - c0 = new Point2D.Double(21.0004, 56.92827); - instance.add(c0); - PathIterator pathIterator = instance.getPathIterator(null, 4); - double[] coords = new double[2]; - int i = 0; - while (pathIterator.isDone() == false) { - pathIterator.currentSegment(coords); - for (int j = 0; j < 3; j++) { - assertEquals(coords[0], instance.get(i).getControlPoint(j).x); - assertEquals(coords[1], instance.get(i).getControlPoint(j).y); - } - i++; - pathIterator.next(); - } - } -} diff --git a/jhotdraw-utils/test/java/org.jhotdraw/undo/ReentrantEdit.java b/jhotdraw-utils/test/java/org.jhotdraw/undo/ReentrantEdit.java new file mode 100644 index 000000000..fbbc43743 --- /dev/null +++ b/jhotdraw-utils/test/java/org.jhotdraw/undo/ReentrantEdit.java @@ -0,0 +1,22 @@ +package org.jhotdraw.undo; + +import javax.swing.undo.AbstractUndoableEdit; +import javax.swing.undo.CannotUndoException; + +/** Edit that tries to register another edit while being undone (BR7). */ +class ReentrantEdit extends AbstractUndoableEdit { + private static final long serialVersionUID = 1L; + private final UndoRedoManager manager; + private final TestEdit nested; + + ReentrantEdit(UndoRedoManager manager, TestEdit nested) { + this.manager = manager; + this.nested = nested; + } + + @Override public void undo() throws CannotUndoException { + super.undo(); + manager.addEdit(nested); // must be ignored & killed by the manager + } + @Override public boolean isSignificant() { return true; } +} \ No newline at end of file diff --git a/jhotdraw-utils/test/java/org.jhotdraw/undo/TestEdit.java b/jhotdraw-utils/test/java/org.jhotdraw/undo/TestEdit.java new file mode 100644 index 000000000..5a2b87f4f --- /dev/null +++ b/jhotdraw-utils/test/java/org.jhotdraw/undo/TestEdit.java @@ -0,0 +1,38 @@ +package org.jhotdraw.undo + +import javax.swing.undo.AbstractUndoableEdit; +import javax.swing.undo.CannotRedoException; +import javax.swing.undo.CannotUndoException; + +class TestEdit extends AbstractUndoableEdit { + private static final long serialVersionUID = 1L; + private final StringBuilder model; private final String token; + private final boolean significant; + int undoCount = 0, redoCount = 0, dieCount = 0; + + TestEdit(StringBuilder model, String token) { this(model, token, true); } + + TestEdit(StringBuilder model, String token, boolean significant) { + this.model = model; + this.token = token; + this.significant = significant; + this.model.append(token); // simulate the original "do" + } + + @Override public void undo() throws CannotUndoException { + super.undo(); + undoCount++; + int idx = model.lastIndexOf(token); + if (idx >= 0) model.delete(idx, idx + token.length()); + } + + @Override public void redo() throws CannotRedoException { + super.redo(); + redoCount++; + model.append(token); + } + + @Override public void die() { super.die(); dieCount++; } + @Override public boolean isSignificant() { return significant; } + @Override public String getPresentationName() { return token; } +} \ No newline at end of file diff --git a/jhotdraw-utils/test/java/org.jhotdraw/undo/UndoRedoManagerTest.java b/jhotdraw-utils/test/java/org.jhotdraw/undo/UndoRedoManagerTest.java new file mode 100644 index 000000000..a5c24b8f4 --- /dev/null +++ b/jhotdraw-utils/test/java/org.jhotdraw/undo/UndoRedoManagerTest.java @@ -0,0 +1,184 @@ +import org.junit.Before; +import org.junit.Test; + +import javax.swing.Action; +import javax.swing.undo.CannotRedoException; +import javax.swing.undo.CannotUndoException; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.*; + +/** * Class-level unit tests for the Undo/Redo feature (UndoRedoManager). * Each test is mapped to a business rule (BRx) documented in the test plan. */ +public class UndoRedoManagerTest { + private UndoRedoManager manager; + private StringBuilder model; + @Before + public void setUp() { + manager = new UndoRedoManager(); + model = new StringBuilder(); + } + + // ===== BR1 : Undo reverts the most recent edit ======================= + @Test + public void undo_revertsLastEdit() { + manager.addEdit(new TestEdit(model, "A")); + assertEquals("A", model.toString()); + + manager.undo(); + + assertEquals("Undo must revert the last edit", "", model.toString()); + } + + // ===== BR2 : Multiple undos revert in reverse order ================== + @Test + public void undo_revertsInReverseOrder() { + manager.addEdit(new TestEdit(model, "A")); + manager.addEdit(new TestEdit(model, "B")); + manager.addEdit(new TestEdit(model, "C")); + assertEquals("ABC", model.toString()); + + manager.undo(); + assertEquals("AB", model.toString()); + manager.undo(); + assertEquals("A", model.toString()); + manager.undo(); + assertEquals("", model.toString()); + } + + // ===== BR3 : Redo re-applies the most recently undone edit =========== + @Test + public void redo_reappliesUndoneEdit() { + manager.addEdit(new TestEdit(model, "A")); + manager.undo(); + assertEquals("", model.toString()); + + manager.redo(); + assertEquals("Redo must re-apply the undone edit", "A", model.toString()); + } + + // ===== BR4 : Multiple redos re-apply in original order =============== + @Test + public void redo_reappliesInOriginalOrder() { + manager.addEdit(new TestEdit(model, "A")); + manager.addEdit(new TestEdit(model, "B")); + manager.undo(); + manager.undo(); + assertEquals("", model.toString()); + + manager.redo(); + assertEquals("A", model.toString()); + manager.redo(); + assertEquals("AB", model.toString()); + } + + // ===== BR5 : New edit after undo discards redo history =============== + @Test + public void addEdit_afterUndo_clearsRedoHistory() { + manager.addEdit(new TestEdit(model, "A")); + manager.addEdit(new TestEdit(model, "B")); + manager.undo(); // -> "A", redo available + assertTrue(manager.canRedo()); + + manager.addEdit(new TestEdit(model, "C")); // -> "AC" + assertFalse("A new edit must clear the redo stack", manager.canRedo()); + assertEquals("AC", model.toString()); + } + + // ===== BR6 : Undo/redo fail safely when unavailable ================== + @Test(expected = CannotUndoException.class) + public void undo_withNothingToUndo_throws() { + manager.undo(); + } + + @Test(expected = CannotRedoException.class) + public void redo_withNothingToRedo_throws() { + manager.addEdit(new TestEdit(model, "A")); + manager.redo(); // nothing has been undone + } + + // ===== BR7 : Edits during undo are ignored and killed ================ + @Test + public void editsAddedDuringUndo_areIgnoredAndDie() { + TestEdit nested = new TestEdit(new StringBuilder(), "N"); + manager.addEdit(new ReentrantEdit(manager, nested)); + + manager.undo(); + + assertEquals("Edit added during undo must be die()'d", 1, nested.dieCount); + assertEquals("Killed edit must not run its undo logic", 0, nested.undoCount); + } + + // ===== BR8 : canUndo / canRedo reflect state ========================= + @Test + public void canUndoCanRedo_reflectAvailableOperations() { + assertFalse(manager.canUndo()); + assertFalse(manager.canRedo()); + + manager.addEdit(new TestEdit(model, "A")); + assertTrue(manager.canUndo()); + assertFalse(manager.canRedo()); + + manager.undo(); + assertFalse(manager.canUndo()); + assertTrue(manager.canRedo()); + + manager.redo(); + assertTrue(manager.canUndo()); + assertFalse(manager.canRedo()); + } + + // ===== BR9 : Significant-edit flag + change event ==================== + @Test + public void significantEdit_setsFlagAndFiresEvent() { + final List events = new ArrayList<>(); + manager.addPropertyChangeListener(new PropertyChangeListener() { + @Override public void propertyChange(PropertyChangeEvent e) { + if ("hasSignificantEdits".equals(e.getPropertyName())) events.add(e); + } + }); + + assertFalse(manager.hasSignificantEdits()); + manager.addEdit(new TestEdit(model, "A", true)); + + assertTrue("Flag must be set", manager.hasSignificantEdits()); + assertEquals("Exactly one event expected", 1, events.size()); + assertEquals(Boolean.FALSE, events.get(0).getOldValue()); + assertEquals(Boolean.TRUE, events.get(0).getNewValue()); + } + + // ===== Supporting behaviour : Actions reflect state ================== + @Test + public void actions_reflectUndoRedoAvailability() { + Action undoAction = manager.getUndoAction(); + Action redoAction = manager.getRedoAction(); + + assertFalse(undoAction.isEnabled()); + assertFalse(redoAction.isEnabled()); + + manager.addEdit(new TestEdit(model, "A")); + assertTrue(undoAction.isEnabled()); + + undoAction.actionPerformed(null); // perform undo via Action + assertEquals("", model.toString()); + assertTrue(redoAction.isEnabled()); + + redoAction.actionPerformed(null); // perform redo via Action + assertEquals("A", model.toString()); + } + + // ===== discardAllEdits resets everything ============================= + @Test + public void discardAllEdits_resetsState() { + manager.addEdit(new TestEdit(model, "A")); + manager.addEdit(new TestEdit(model, "B")); + + manager.discardAllEdits(); + + assertFalse(manager.canUndo()); + assertFalse(manager.canRedo()); + assertFalse(manager.hasSignificantEdits()); + } +} diff --git a/jhotdraw-utils/test/java/org.jhotdraw/undo/bdd/GivenAnEdit.java b/jhotdraw-utils/test/java/org.jhotdraw/undo/bdd/GivenAnEdit.java new file mode 100644 index 000000000..a578d1da3 --- /dev/null +++ b/jhotdraw-utils/test/java/org.jhotdraw/undo/bdd/GivenAnEdit.java @@ -0,0 +1,38 @@ +package org.jhotdraw.undo.bdd; + +import com.tngtech.jgiven.Stage; +import com.tngtech.jgiven.annotation.AfterStage; +import com.tngtech.jgiven.annotation.ProvidedScenarioState; +import org.assertj.swing.edt.GuiActionRunner; +import org.assertj.swing.fixture.FrameFixture; + +import static org.assertj.swing.edt.GuiActionRunner.execute; + +public class GivenAnEdit extends Stage { + + @ProvidedScenarioState + UndoRedoTestFrame frame; + + @ProvidedScenarioState + FrameFixture window; + + public GivenAnEdit the_application_is_running() { + frame = GuiActionRunner.execute(UndoRedoTestFrame::new); + window = new FrameFixture(frame); + window.show(); + return self(); + } + + public GivenAnEdit I_have_made_an_edit() { + the_application_is_running(); + execute(() -> frame.performEdit("Hello")); + return self(); + } + + public GivenAnEdit I_have_undone_an_edit() { + I_have_made_an_edit(); + // press undo once so there is something to redo + window.button("undoButton").click(); + return self(); + } +} \ No newline at end of file diff --git a/jhotdraw-utils/test/java/org.jhotdraw/undo/bdd/ThenTheEdit.java b/jhotdraw-utils/test/java/org.jhotdraw/undo/bdd/ThenTheEdit.java new file mode 100644 index 000000000..a3d96fd90 --- /dev/null +++ b/jhotdraw-utils/test/java/org.jhotdraw/undo/bdd/ThenTheEdit.java @@ -0,0 +1,45 @@ +package org.jhotdraw.undo.bdd; + +import com.tngtech.jgiven.Stage; +import com.tngtech.jgiven.annotation.AfterScenario; +import com.tngtech.jgiven.annotation.ExpectedScenarioState; +import com.tngtech.jgiven.annotation.Quoted; +import org.assertj.swing.fixture.FrameFixture; + +import static org.assertj.core.api.Assertions.assertThat; + +public class ThenTheEdit extends Stage { + @ExpectedScenarioState + UndoRedoTestFrame frame; + + @ExpectedScenarioState + FrameFixture window; + + public ThenTheEdit my_edit_should_be_undone() { + // The "Hello" edit must have been removed from the document. + assertThat(frame.documentText()) + .as("document after undo") + .isEmpty(); + return self(); + } + + public ThenTheEdit my_edit_should_be_redone() { + // The previously-undone "Hello" edit must be re-applied. + assertThat(frame.documentText()) + .as("document after redo") + .isEqualTo("Hello"); + return self(); + } + + public ThenTheEdit the_document_should_contain(@Quoted String expected) { + assertThat(frame.documentText()).isEqualTo(expected); + return self(); + } + + @AfterScenario + public void tearDown() { + if (window != null) { + window.cleanUp(); + } + } +} \ No newline at end of file diff --git a/jhotdraw-utils/test/java/org.jhotdraw/undo/bdd/WhenIPress.java b/jhotdraw-utils/test/java/org.jhotdraw/undo/bdd/WhenIPress.java new file mode 100644 index 000000000..9f30b72d2 --- /dev/null +++ b/jhotdraw-utils/test/java/org.jhotdraw/undo/bdd/WhenIPress.java @@ -0,0 +1,20 @@ +package org.jhotdraw.undo.bdd; + +import com.tngtech.jgiven.Stage; +import com.tngtech.jgiven.annotation.ExpectedScenarioState; +import org.assertj.swing.fixture.FrameFixture; + +public class WhenIPress extends Stage { + @ExpectedScenarioState + FrameFixture window; + + public WhenIPress I_press_the_undo_button() { + window.button("undoButton").click(); + return self(); + } + + public WhenIPress I_press_the_redo_button() { + window.button("redoButton").click(); + return self(); + } +} \ No newline at end of file