2,2c2,2 < * @(#)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 7a16,17 > import CH.ifa.draw.util.*; > import java.awt.*; 8,8c18,18 < import java.util.*; --- > import java.util.*; 9,9c19,19 < import java.awt.*; --- > import java.lang.ref.WeakReference; 10,10d19 < import CH.ifa.draw.util.*; 15a23,24 > * > * @version <$CURRENT_VERSION$> 17,17c26,26 < public class InsertImageCommand extends Command { --- > public class InsertImageCommand extends AbstractCommand { 19,19d27 < private DrawingView fView; 20,20c28,28 < private String fImage; --- > private String myImageName; 28,28c36,36 < public InsertImageCommand(String name, String image, DrawingView view) { --- > public InsertImageCommand(String name, String newImageName, DrawingView view) { 29,29c37,37 < super(name); --- > super(name, view); 30,30c38,38 < fImage = image; --- > myImageName = newImageName; 31,31d38 < fView = view; 34a42,44 > setUndoActivity(createUndoActivity()); > ((InsertImageCommand.UndoActivity)getUndoActivity()).insertImage(); > view().checkDamage(); 35,41d41 < // 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(); 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()); > } > } > }