2c2 < * @(#)InsertImageCommand.java 5.2 --- > * @(#)InsertImageCommand.java 3a4,9 > * 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 8,10d13 < import java.util.*; < import java.awt.*; < import CH.ifa.draw.util.*; 12a16,19 > import CH.ifa.draw.util.*; > import java.awt.*; > import java.util.*; > import java.lang.ref.WeakReference; 15a23,24 > * > * @version <$CURRENT_VERSION$> 17c26 < public class InsertImageCommand extends Command { --- > public class InsertImageCommand extends AbstractCommand { 19,20c28 < private DrawingView fView; < private String fImage; --- > private String myImageName; 28,31c36,38 < public InsertImageCommand(String name, String image, DrawingView view) { < super(name); < fImage = image; < fView = view; --- > public InsertImageCommand(String name, String newImageName, DrawingView view) { > super(name, view); > myImageName = newImageName; 35,41c42,44 < // ugly cast to component, but AWT wants and Component instead of an ImageObserver... < Image image = Iconkit.instance().registerAndLoadImage((Component)fView, fImage); < ImageFigure figure = new ImageFigure(image, fImage, fView.lastClick()); < fView.add(figure); < fView.clearSelection(); < fView.addToSelection(figure); < fView.checkDamage(); --- > setUndoActivity(createUndoActivity()); > ((InsertImageCommand.UndoActivity)getUndoActivity()).insertImage(); > view().checkDamage(); 42a46,51 > > /** > * Factory method for undo activity > */ > protected Undoable createUndoActivity() { > return new InsertImageCommand.UndoActivity(view(), myImageName); 44a54,72 > public class UndoActivity extends UndoableAdapter { > > /** > * Use weak reference so if the command is the last one which references > * the ImageFigure then it might be garbage collected. Usually, the ImageFigure > * is referenced from the drawing it is inserted and might be only garbage > * collected after an undo operation (which removes the ImageFigure from > * the drawing). If it has been garbage collected but is requested again > * (e.g. during a redo operation) it is restored if possible. > */ > WeakReference myAffectedImageFigure; > private String myAffectedImageName; > > UndoActivity(DrawingView newDrawingView, String newAffectedImageName) { > super(newDrawingView); > myAffectedImageName = newAffectedImageName; > setUndoable(true); > setRedoable(true); > } 45a74,76 > protected void setImageFigure(ImageFigure newImageFigure) { > myAffectedImageFigure = new WeakReference(newImageFigure); > } 46a78,119 > protected ImageFigure getImageFigure() { > // load image if it has not been loaded so far > if ((myAffectedImageFigure == null) || (myAffectedImageFigure.get() == null)) { > // ugly cast to component, but AWT wants a Component instead of an ImageObserver... > Image image = Iconkit.instance().registerAndLoadImage( > (Component)getDrawingView(), myAffectedImageName); > setImageFigure(new ImageFigure( > image, myAffectedImageName, getDrawingView().lastClick())); > } > > return (ImageFigure)myAffectedImageFigure.get(); > } > > public boolean undo() { > if (super.undo()) { > getDrawingView().clearSelection(); > > getDrawingView().drawing().orphan(getImageFigure()); > > return true; > } > > return false; > } > > public boolean redo() { > // do not call execute directly as the selection might has changed > if (isRedoable()) { > insertImage(); > return true; > } > > return false; > } > > protected void insertImage() { > getDrawingView().add(getImageFigure()); > getDrawingView().clearSelection(); > getDrawingView().addToSelection(getImageFigure()); > } > } > }