mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			324 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			324 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			Java
		
	
	
	
| /* AbstractUndoableEdit.java --
 | |
|    Copyright (C) 2002, 2003, 2004  Free Software Foundation, Inc.
 | |
| 
 | |
| This file is part of GNU Classpath.
 | |
| 
 | |
| GNU Classpath is free software; you can redistribute it and/or modify
 | |
| it under the terms of the GNU General Public License as published by
 | |
| the Free Software Foundation; either version 2, or (at your option)
 | |
| any later version.
 | |
| 
 | |
| GNU Classpath 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
 | |
| General Public License for more details.
 | |
| 
 | |
| You should have received a copy of the GNU General Public License
 | |
| along with GNU Classpath; see the file COPYING.  If not, write to the
 | |
| Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | |
| 02110-1301 USA.
 | |
| 
 | |
| Linking this library statically or dynamically with other modules is
 | |
| making a combined work based on this library.  Thus, the terms and
 | |
| conditions of the GNU General Public License cover the whole
 | |
| combination.
 | |
| 
 | |
| As a special exception, the copyright holders of this library give you
 | |
| permission to link this library with independent modules to produce an
 | |
| executable, regardless of the license terms of these independent
 | |
| modules, and to copy and distribute the resulting executable under
 | |
| terms of your choice, provided that you also meet, for each linked
 | |
| independent module, the terms and conditions of the license of that
 | |
| module.  An independent module is a module which is not derived from
 | |
| or based on this library.  If you modify this library, you may extend
 | |
| this exception to your version of the library, but you are not
 | |
| obligated to do so.  If you do not wish to do so, delete this
 | |
| exception statement from your version. */
 | |
| 
 | |
| 
 | |
| package javax.swing.undo;
 | |
| 
 | |
| import java.io.Serializable;
 | |
| 
 | |
| import javax.swing.UIManager;
 | |
| 
 | |
| /**
 | |
|  * A default implementation of <code>UndoableEdit</code> that can be
 | |
|  * used as a base for implementing editing operations.
 | |
|  *
 | |
|  * @author Andrew Selkirk (aselkirk@sympatico.ca)
 | |
|  * @author Sascha Brawer (brawer@dandelis.ch)
 | |
|  */
 | |
| public class AbstractUndoableEdit
 | |
|   implements UndoableEdit, Serializable
 | |
| {
 | |
|   /**
 | |
|    * The serialization ID.  Verified using the <code>serialver</code>
 | |
|    * tool of Apple/Sun JDK 1.3.1 on MacOS X 10.1.5, and Sun JDK
 | |
|    * 1.4.1_01 on GNU/Linux.
 | |
|    */
 | |
|   static final long serialVersionUID = 580150227676302096L;
 | |
| 
 | |
| 
 | |
|   /**
 | |
|    * The constant string “Undo”, which was returned by
 | |
|    * {@link #getUndoPresentationName()} on early versions of the
 | |
|    * platform. However, this field has become obsolete with version
 | |
|    * 1.3.1.  That method now retrieves a localized string from the
 | |
|    * {@link javax.swing.UIManager}, using the key
 | |
|    * <code>“AbstractUndoableEdit.undoText”</code>.
 | |
|    */
 | |
|   protected static final String UndoName = "Undo";
 | |
| 
 | |
| 
 | |
|   /**
 | |
|    * The constant string “Redo”, which was returned by
 | |
|    * {@link #getRedoPresentationName()} on early versions of the
 | |
|    * platform. However, this field has become obsolete with version
 | |
|    * 1.3.1.  That method now retrieves a localized string from the
 | |
|    * {@link javax.swing.UIManager}, using the key
 | |
|    * <code>“AbstractUndoableEdit.redoText”</code>.
 | |
|    */
 | |
|   protected static final String RedoName = "Redo";
 | |
| 
 | |
| 
 | |
|   /**
 | |
|    * Indicates whether this editing action has been executed.  A value
 | |
|    * of <code>true</code> means that the action was performed, or that
 | |
|    * a redo operation was successful. A value of <code>false</code>
 | |
|    * means that the action has not yet performed, or that an undo
 | |
|    * operation was successful.
 | |
|    */
 | |
|   private boolean hasBeenDone;
 | |
| 
 | |
| 
 | |
|   /**
 | |
|    * Indicates whether this editing action is still alive. The value
 | |
|    * is set to <code>true</code> by the constructor, and to
 | |
|    * <code>false</code> by the {@link #die()} method.
 | |
|    */
 | |
|   private boolean alive;
 | |
| 
 | |
| 
 | |
|   /**
 | |
|    * Constructs a new <code>AbstractUndoableEdit</code>. The initial
 | |
|    * state is that the editing action is alive, and
 | |
|    * <code>hasBeenDone</code> is <code>true</code>.
 | |
|    */
 | |
|   public AbstractUndoableEdit()
 | |
|   {
 | |
|     // The API specification is not clear, but Mauve test code has
 | |
|     // determined that hasBeenDone is initially set to true.
 | |
|     alive = hasBeenDone = true;
 | |
|   }
 | |
| 
 | |
| 
 | |
|   /**
 | |
|    * Undoes this editing action.
 | |
|    *
 | |
|    * @throws CannotUndoException if {@link #canUndo()} returns
 | |
|    * <code>false</code>, for example because this action has already
 | |
|    * been undone.
 | |
|    *
 | |
|    * @see #canUndo()
 | |
|    * @see #redo()
 | |
|    */
 | |
|   public void undo()
 | |
|     throws CannotUndoException
 | |
|   {
 | |
|     if (!canUndo())
 | |
|       throw new CannotUndoException();
 | |
|     hasBeenDone = false;
 | |
|   }
 | |
| 
 | |
| 
 | |
|   /**
 | |
|    * Determines whether it would be possible to undo this editing
 | |
|    * action.
 | |
|    *
 | |
|    * @return <code>true</code> to indicate that this action can be
 | |
|    * undone, <code>false</code> otherwise.
 | |
|    *
 | |
|    * @see #undo()
 | |
|    * @see #canRedo()
 | |
|    */
 | |
|   public boolean canUndo()
 | |
|   {
 | |
|     return alive && hasBeenDone;
 | |
|   }
 | |
| 
 | |
| 
 | |
|   /**
 | |
|    * Redoes this editing action.
 | |
|    *
 | |
|    * @throws CannotRedoException if {@link #canRedo()} returns
 | |
|    * <code>false</code>, for example because this action has not
 | |
|    * yet been undone.
 | |
|    *
 | |
|    * @see #canRedo()
 | |
|    * @see #undo()
 | |
|    */
 | |
|   public void redo()
 | |
|     throws CannotRedoException
 | |
|   {
 | |
|     if (!canRedo())
 | |
|       throw new CannotRedoException();
 | |
|     hasBeenDone = true;
 | |
|   }
 | |
| 
 | |
| 
 | |
|   /**
 | |
|    * Determines whether it would be possible to redo this editing
 | |
|    * action.
 | |
|    *
 | |
|    * @return <code>true</code> to indicate that this action can be
 | |
|    * redone, <code>false</code> otherwise.
 | |
|    *
 | |
|    * @see #redo()
 | |
|    * @see #canUndo()
 | |
|    */
 | |
|   public boolean canRedo()
 | |
|   {
 | |
|     return alive && !hasBeenDone;
 | |
|   }
 | |
| 
 | |
| 
 | |
|   /**
 | |
|    * Informs this edit action that it will no longer be used. Some
 | |
|    * actions might use this information to release resources, for
 | |
|    * example open files.  Called by {@link UndoManager} before this
 | |
|    * action is removed from the edit queue.
 | |
|    */
 | |
|   public void die()
 | |
|   {
 | |
|     alive = false;
 | |
|   }
 | |
| 
 | |
| 
 | |
|   /**
 | |
|    * Incorporates another editing action into this one, thus forming a
 | |
|    * combined action.
 | |
|    *
 | |
|    * <p>The default implementation always returns <code>false</code>,
 | |
|    * indicating that the editing action could not be incorporated.
 | |
|    *
 | |
|    * @param edit the editing action to be incorporated.
 | |
|    */
 | |
|   public boolean addEdit(UndoableEdit edit)
 | |
|   {
 | |
|     return false;
 | |
|   }
 | |
| 
 | |
| 
 | |
|   /**
 | |
|    * Incorporates another editing action into this one, thus forming a
 | |
|    * combined action that replaces the argument action.
 | |
|    *
 | |
|    * <p>The default implementation always returns <code>false</code>,
 | |
|    * indicating that the argument action should not be replaced.
 | |
|    *
 | |
|    * @param edit the editing action to be replaced.
 | |
|    */
 | |
|   public boolean replaceEdit(UndoableEdit edit)
 | |
|   {
 | |
|     return false;
 | |
|   }
 | |
| 
 | |
| 
 | |
|   /**
 | |
|    * Determines whether this editing action is significant enough for
 | |
|    * being seperately undoable by the user. A typical significant
 | |
|    * action would be the resizing of an object. However, changing the
 | |
|    * selection in a text document would usually not be considered
 | |
|    * significant.
 | |
|    *
 | |
|    * <p>The default implementation returns <code>true</code>.
 | |
|    *
 | |
|    * @return <code>true</code> to indicate that the action is
 | |
|    * significant enough for being separately undoable, or
 | |
|    * <code>false</code> otherwise.
 | |
|    */
 | |
|   public boolean isSignificant()
 | |
|   {
 | |
|     return true;
 | |
|   }
 | |
| 
 | |
| 
 | |
|   /**
 | |
|    * Returns a human-readable, localized name that describes this
 | |
|    * editing action and can be displayed to the user.
 | |
|    *
 | |
|    * <p>The default implementation returns an empty string.
 | |
|    */
 | |
|   public String getPresentationName()
 | |
|   {
 | |
|     return "";
 | |
|   }
 | |
| 
 | |
| 
 | |
|   /**
 | |
|    * Calculates a localized name for presenting the undo action to the
 | |
|    * user.
 | |
|    *
 | |
|    * <p>The default implementation returns the concatenation of the
 | |
|    * string “Undo” and the action name, which is
 | |
|    * determined by calling {@link #getPresentationName()}.
 | |
|    *
 | |
|    * <p>The string “Undo” is retrieved from the {@link
 | |
|    * javax.swing.UIManager}, using the key
 | |
|    * <code>“AbstractUndoableEdit.undoText”</code>.  This
 | |
|    * allows the text to be localized.
 | |
|    */
 | |
|   public String getUndoPresentationName()
 | |
|   {
 | |
|     String msg, pres;
 | |
| 
 | |
|     msg = UIManager.getString("AbstractUndoableEdit.undoText");
 | |
|     if (msg == null)
 | |
|       msg = UndoName;
 | |
| 
 | |
|     pres = getPresentationName();
 | |
|     if ((pres == null) || (pres.length() == 0))
 | |
|       return msg;
 | |
|     else
 | |
|       return msg + ' ' + pres;
 | |
|   }
 | |
| 
 | |
| 
 | |
|   /**
 | |
|    * Calculates a localized name for presenting the redo action to the
 | |
|    * user.
 | |
|    *
 | |
|    * <p>The default implementation returns the concatenation of the
 | |
|    * string “Redo” and the action name, which is
 | |
|    * determined by calling {@link #getPresentationName()}.
 | |
|    *
 | |
|    * <p>The string “Redo” is retrieved from the {@link
 | |
|    * javax.swing.UIManager}, using the key
 | |
|    * <code>“AbstractUndoableEdit.redoText”</code>.  This
 | |
|    * allows the text to be localized.
 | |
|    */
 | |
|   public String getRedoPresentationName()
 | |
|   {
 | |
|     String msg, pres;
 | |
| 
 | |
|     msg = UIManager.getString("AbstractUndoableEdit.redoText");
 | |
|     if (msg == null)
 | |
|       msg = RedoName;
 | |
| 
 | |
|     pres = getPresentationName();
 | |
|     if ((pres == null) || (pres.length() == 0))
 | |
|       return msg;
 | |
|     else
 | |
|       return msg + ' ' + pres;
 | |
|   }
 | |
| 
 | |
| 
 | |
|   public String toString()
 | |
|   {
 | |
|     return super.toString()
 | |
|       + " hasBeenDone: " + hasBeenDone
 | |
|       + " alive: " + alive;
 | |
|   }
 | |
| }
 |