/* * @(#)UndoableAdapter.java * * Project: JHotdraw - a GUI framework for technical drawings * http://www.jhotdraw.org * http://jhotdraw.sourceforge.net * Copyright: © by the original author(s) and all contributors * License: Lesser GNU Public License (LGPL) * http://www.opensource.org/licenses/lgpl-license.html */ package CH.ifa.draw.util; import CH.ifa.draw.framework.*; import CH.ifa.draw.standard.FigureEnumerator; import CH.ifa.draw.standard.StandardFigureSelection; import java.util.*; /** * Most basic implementation for an Undoable activity. Subclasses should override * methods to provide specialized behaviour when necessary. * * @author Wolfram Kaiser * @version <$CURRENT_VERSION$> */ public class UndoableAdapter implements Undoable { private Vector myAffectedFigures; private int myAffectedFiguresCount; private boolean myIsUndoable; private boolean myIsRedoable; private DrawingView myDrawingView; public UndoableAdapter(DrawingView newDrawingView) { setDrawingView(newDrawingView); } /** * Undo the activity * @return true if the activity could be undone, false otherwise */ public boolean undo() { return isUndoable(); } /* * Redo the activity * @return true if the activity could be redone, false otherwise */ public boolean redo() { return isRedoable(); } public boolean isUndoable() { return myIsUndoable; } public void setUndoable(boolean newIsUndoable) { myIsUndoable = newIsUndoable; } public boolean isRedoable() { return myIsRedoable; } public void setRedoable(boolean newIsRedoable) { myIsRedoable = newIsRedoable; } public void setAffectedFigures(FigureEnumeration newAffectedFigures) { // the enumeration is not reusable therefore a copy is made // to be able to undo-redo the command several time rememberFigures(newAffectedFigures); } public FigureEnumeration getAffectedFigures() { return new FigureEnumerator((Vector)myAffectedFigures.clone()); } public int getAffectedFiguresCount() { return myAffectedFiguresCount; } protected void rememberFigures(FigureEnumeration toBeRemembered) { myAffectedFigures = new Vector(); myAffectedFiguresCount = 0; while (toBeRemembered.hasMoreElements()) { myAffectedFigures.addElement(toBeRemembered.nextElement()); myAffectedFiguresCount++; } } /** * Releases all resources related to an undoable activity */ public void release() { FigureEnumeration fe = getAffectedFigures(); while (fe.hasMoreElements()) { fe.nextFigure().release(); } myAffectedFiguresCount = 0; setAffectedFigures(FigureEnumerator.getEmptyEnumeration()); } /** * Create new set of affected figures for redo operation because * deleting figures in an undo operation makes them unusable * Especially contained figures have been removed from their * observing container like CompositeFigure or DecoratorFigure. * Duplicating these figures re-establishes the dependencies. */ protected void duplicateAffectedFigures() { setAffectedFigures(StandardFigureSelection.duplicateFigures( getAffectedFigures(), getAffectedFiguresCount())); } public DrawingView getDrawingView() { return myDrawingView; } protected void setDrawingView(DrawingView newDrawingView) { myDrawingView = newDrawingView; } }