/* * @(#)CompositeModel.java * * Copyright (c) 1996-2010 The authors and contributors of JHotDraw. * You may not use, copy or modify this file, except in compliance with the * accompanying license terms. */ package org.jhotdraw.undo; import javax.swing.undo.*; /** * This is basically the same like javax.swing.undo.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 * a sequence of compoundable edits starts, end the last time, when * the sequence is over. * <p> * For example: * <pre> * // fire CompositeEdit at start of sequence * CompositeEdit ce = new CompositeEdit(); * fireUndoableEditEvent(ce); * * ...fire edits which shall compounded here... * * // fire CompositeEdit at end of sequence again, to end it. * fireUndoableEditEvent(ce); * </pre> * * @author Werner Randelshofer * @version $Id$ */ public class CompositeEdit extends CompoundEdit { private static final long serialVersionUID = 1L; private String presentationName; private boolean isSignificant; private boolean isVerbose; public void setVerbose(boolean b) { isVerbose = b; } /** * Creates a new {@code CompositeEdit} which uses CompoundEdit#getPresentationName() * and is significant.. * * @see javax.swing.undo.CompoundEdit#getPresentationName() */ public CompositeEdit() { isSignificant = true; } /** * Creates a new {@code CompositeEdit} which uses the specified significance. * <p> * The presentation name is used from CompoundEdit#getPresentationName(). * * @see javax.swing.undo.CompoundEdit#getPresentationName() */ public CompositeEdit(boolean isSignificant) { this.isSignificant = isSignificant; } /** * Creates a new {@code CompositeEdit} which uses the specified * presentation name. * <p> * If the presentation name is null, then CompoundEdit.getPresentatioName * is used. * @see javax.swing.undo.CompoundEdit#getPresentationName() */ public CompositeEdit(String presentationName) { this.presentationName = presentationName; isSignificant = true; } /** * Creates a new {@code CompositeEdit} which uses the given presentation name * and significance. * <p> * If the presentation name is null, then CompoundEdit.getPresentatioName * is used. * @see javax.swing.undo.CompoundEdit#getPresentationName() */ public CompositeEdit(String presentationName, boolean isSignificant) { this.presentationName = presentationName; this.isSignificant = isSignificant; } /** * Returns the presentation name. * If the presentation name is null, then CompoundEdit.getPresentatioName * is returned. * @see javax.swing.undo.CompoundEdit#getPresentationName() */ @Override public String getPresentationName() { return (presentationName != null) ? presentationName : super.getPresentationName(); } /** * Returns the undo presentation name. * If the presentation name is null, then CompoundEdit.getUndoPresentationName * is returned. * @see javax.swing.undo.CompoundEdit#getUndoPresentationName() */ @Override public String getUndoPresentationName() { return ((presentationName != null) ? UndoRedoManager.getLabels().getString("edit.undo.text")+" "+presentationName : super.getUndoPresentationName()); } /** * Returns the redo presentation name. * If the presentation name is null, then CompoundEdit.getRedoPresentationName * is returned. * @see javax.swing.undo.CompoundEdit#getRedoPresentationName() */ @Override public String getRedoPresentationName() { return ((presentationName != null) ? UndoRedoManager.getLabels().getString("edit.redo.text")+" "+presentationName : super.getRedoPresentationName()); } /** * If this edit is inProgress, accepts anEdit and returns * true. * * <p>The last edit added to this CompositeEdit is given a * chance to addEdit(anEdit). If it refuses (returns false), anEdit is * given a chance to replaceEdit the last edit. If anEdit returns * false here, it is added to edits.</p> * * <p>If the CompositeEdit is added to itself, then method end() * is called, and true is returned.</p> */ @Override public boolean addEdit(UndoableEdit anEdit) { if (anEdit == this) { end(); return true; } else if (isInProgress() && (anEdit instanceof CompositeEdit)) { return true; } else { return super.addEdit(anEdit); } } /** * Returns false if this edit is insignificant - for example one * that maintains the user's selection, but does not change * any model state. */ @Override public boolean isSignificant() { return (isSignificant) ? super.isSignificant() : false; //return isSignificant; } public void setSignificant(boolean newValue) { isSignificant = newValue; } }