1. UndoConstantsクラス
戻る=>page top 
public class UndoConstants 
static定数からなるクラスで次のような意味に使う。 
∙ コマンドの操作コード: ADD, DELETE, CHANGE 
∙ 操作対象:CONTAINER(ShapeContainerオブジェクト), TEXTBOX(TextBoxオブジェクト), PAINTSTYLE(PaintStylelオブジェクト), SIZE_POSITION(位置、サイズ), SHAPE(図形データ) 
参照=>ContainerManager Undoサポート機能 
 
  
    
      | 
       フィールド 
       | 
      
       説明 
       | 
     
    
      | 
       ADD 
       | 
      
       public static final int ADD 
      新規作成、追加の操作コード 
       | 
     
    
      | 
       DELETE 
       | 
      
       public static final int DELETE 
      削除の操作コード 
       | 
     
    
      | 
       CONTAINER 
       | 
      
       public static final int CONTAINER 
      ShapeContainerオブジェクトを意味する。undoを実行すると変更前のShapeContainerに置き換えられる。 
       | 
     
    
      | 
       SHAPE 
       | 
      
       public static final int SHAPE 
      ShapeContainerの図形データ 
       | 
     
    
      | 
       SIZE_POSITION 
       | 
      
       public static final int SIZE_POSITION 
      ShapeContainer, TextBoxなどの位置、サイズ 
       | 
     
    
      | 
       TEXTBOX 
       | 
      
       public static final int TEXTBOX 
      TextBoxオブジェクトを意味する。undoを実行すると変更前のTextBoxに置き換えられる。 
       | 
     
    
      | 
       PAINTSTYLE 
       | 
      
       public static final int PAINTSTYLE 
      PaintStyleオブジェクトを意味する。undoを実行すると変更前のPaintStyleに置き換えられる。 
       | 
     
  
 
  
2. UndoDrawManagerクラス
戻る=>page top 
public class UndoDrawManager extends UndoManager 
Undoの設定とは、変更に対応するjavax.swing.undo.UndoableEditをインプリメントしたオブジェクトを、
	javax.swing.undo.UndoManagerに登録することである。本アプリケーションでは名前の重複を避けるため、
	UndoManager相当クラスをUndoDrawManager、UndoableEditインタフェースをインプリメントしたクラスを
	UndoableDrawEditと記す。 
UndoableDrawEditでDelimiterオブジェクトを定義し、
	Delimiterから次のDelimiterまで、一括してundo、redoを実行するように拡張する。
	これにより複数図形のundo、redo設定、複数の操作を組み合わせたコマンドのundo、redo設定が簡単になる。 
 
  
    
      | 
       メソッド 
       | 
      
       説明 
       | 
     
    
      | 
       コンストラクタ 
       | 
      
       public UndoDrawManager(int id) 
      上位クラスUndoManagerのコンストラクタを呼ぶ。 
       | 
     
    
      | 
       addEdit 
       | 
      
       public boolean addEdit(UndoableEdit anEdit) 
      UndoableEditオブジェクトの登録。このアプリではjavax.swing.undo.AbstractUndoableEditの拡張クラスUndoableDrawEditオブジェクトを登録する。 
       | 
     
    
      | 
       canUndo 
       | 
      
				 public boolean canUndo() 
				
				変更がある場合はtrueを返す。 
				Java Standard Edition UndoManagerのメソッド。
				 
       | 
     
    
      | 
       discardAllEdits 
       | 
      
       public void discardAllEdits() 
      登録されているUndoableEditオブジェクトを全て削除する。 
       | 
     
    
      | 
       undo 
       | 
      
       public void undo() 
      undo操作を実行。概要で述べたように、次のDelimiterまで実行する。 
       | 
     
    
      | 
       redo 
       | 
      
       public void redo() 
      redo操作を実行。概要で述べたように、次のDelimiterまで実行する。 
       | 
     
    
      | 
       changeButtonState 
       | 
      
       protected void changeButtonState() 
      メニューボタンの外観を変え、undo/redo操作ができるかどうかを示す。 
      上位クラスUndoDrawManagerのcanUndo()、canRedo()の結果をメニューボタンに反映する。 
       | 
     
  
 
  
3. UndoableDrawEditクラス
戻る=>page top 
public class UndoableDrawEdit extends AbstractUndoableEdit 
UndoDrawManager(UndoManager拡張クラス)のaddEditメソッドで登録するオブジェクトを作成する。
	UndoDrawManager(UndoManager)でundo、redoを実行すると、登録されているUndoableDrawEditの
	undo、redoメソッドが実行される。つまりundo、redo操作のロジックはUndoableDrawEditのundo、redoメソッドに書けばよい。 
 
3.1 Delimiterサブクラス
戻る=>page top 
public static class Delimiter extends AbstractUndoableEdit 
 複数のUndo操作を一括して実行するために用意したオブジェクト。
	UndoDrawManagerはDelimiterとDelimiterで囲まれたUndoableDrawEditオブジェクトをまとめて実行する。 
 
  
    
      | 
       メソッド 
       | 
      
           説明 
           | 
     
    
      | 
       コンストラクタ 
       | 
      
       public Delimiter() 
      Delimiterオブジェクトを作成する。 
       | 
     
    
      | 
       getUndoPresentation 
      Name 
       | 
      
       public String getUndoPresentationName() 
      "Delimiter"を返す。 
       | 
     
    
      | 
       getRedoPresentation 
      Name 
       | 
      
       public String getRedoPresentationName() 
      "Delimiter"を返す。 
       | 
     
    
      | 
       isSignificant 
       | 
      
       public boolean isSignificant() 
      trueを返す。 
       | 
     
    
      | 
       undo 
       | 
      
       public void undo() throws CannotUndoException 
      上位クラスのundo>メソッド実行。 
       | 
     
    
      | 
       redo 
       | 
      
       public void redo() throws CannotRedoException 
      上位クラスのredoメソッド実行。 
       | 
     
    
      | 
       toString 
       | 
      
       public String toString() 
      "Delimiter"を返す。 
       | 
     
  
 
  
3.2 ChangeContainerサブクラス
戻る=>page top 
public static class ChangeContainer extends AbstractUndoableEdit 
図形コンテナ(ShapeContainer)が変更されたとき、
	変更前と変更後の図形コンテナを記録しておいて、undo, redoを実行する。典型的な例は、
	図形コンテナの移動∙ リサイズである。図形コンテナをそのまま記録するのではなく、
	コンパクトな形式(SerializableElement)で記録する。 
グループ図形は1つのSerializableElementで表せるので、
このオブジェクトに登録する図形はグループ図形でもよい。 
 
  
    
      | 
       フィールド 
       | 
      
       説明 
       | 
     
    
      | 
       oldData 
       | 
      
       SerializableElement oldData 
      変更前の図形コンテナ (ShapeContainerのSerializableElement形式)。 
       | 
     
    
      | 
       newData 
       | 
      
       SerializableElement newData 
      変更前の図形コンテナ(ShapeContainerのSerializableElement形式)。 
       | 
     
  
 
 
  
    
      | 
       メソッド 
       | 
      
       説明 
       | 
     
    
      | 
       コンストラクタ 
       | 
      
       public ChangeContainer(ShapeContainer oldContainer, ShapeContainer
      newContainer) 
      SerializableElementUtil.convertShapeContainerでSerializableElementに変換してフィールド変数oldData、newDataに設定する。 
       | 
     
    
      | 
       canUndo 
       | 
      
       public boolean canUndo() 
      常にtrueを返す。 
       | 
     
    
      | 
       canRedo 
       | 
      
       public boolean canRedo() 
      常にtrueを返す。 
       | 
     
    
      | 
       getUndoPresentation 
      Name 
       | 
      
       public String getUndoPresentationName() 
      "ChangeContainer Undo"を返す。 
       | 
     
    
      | 
       getRedoPresentation 
      Name 
       | 
      
       public String getRedoPresentationName() 
      "ChangeContainer Redo"を返す。 
       | 
     
    
      | 
       isSignificant 
       | 
      
       public boolean isSignificant() 
      常にtrueを返す。 
       | 
     
    
      | 
       undo 
       | 
      
       public void undo() throws CannotUndoException 
      ∙ oldDataのshapeIdフィールドを使い、ContainerManagerで図形コンテナ(container)を取得。 
      ∙ SerializableElementUtil.setToShapeContainerメソッドでcontainerに変更前の図形データを設定する。 
       | 
     
    
      | 
       redo 
       | 
      
       public void redo() throws CannotRedoException 
      undoと同様の操作。変更後の図形データを設定する。 
       | 
     
  
 
  
3.3 CreateContainerサブクラス
戻る=>page top 
public static class CreateContainer extends AbstractUndoableEdit 
図形作成に対するundo設定である。Copy&Pasteで図形が複写される場合にも適用する。 
 
  
    
      | 
       フィールド 
       | 
      
       説明 
       | 
     
    
      | 
       data 
       | 
      
       SerializableElement data 
      作成された図形データ(SerializableElement形式) 
       | 
     
  
 
 
  
3.4 DeleteContainerサブクラス
戻る=>page top 
public static class DeleteContainer extends AbstractUndoableEdit 
図形の削除に対するUndoオブジェクトを作成する。 
 
  
    
      | 
       フィールド 
       | 
      
       説明 
       | 
     
    
      | 
       data 
       | 
      
       SerializableElement data 
      削除された図形データ(SerializableElement形式) 
       | 
     
  
 
 
  
    
      | 
       メソッド 
       | 
      
       説明 
       | 
     
    
      | 
       コンストラクタ 
       | 
      
       public DeleteContainer (ShapeContainer container) 
      containerをSerializableElementUtil.convertShapeContainerでSerializableElementに変換してフィールド変数dataに設定する。 
      (注)ContainerListから削除した後に、引数のcontainerを指定してこのコンストラクタを呼ぶと、SerializableElementオブジェクトに記録されるcontainerIndexが全て-1になり、元の位置に戻らないので注意。 
       | 
     
    
      | 
       canUndo 
       | 
      
       public boolean canUndo() 
      常にtrueを返す。 
       | 
     
    
      | 
       canRedo 
       | 
      
       public boolean canRedo() 
      常にtrueを返す。 
       | 
     
    
      | 
       getUndoPresentation 
      Name 
       | 
      
       public String getUndoPresentationName() 
      "DeleteContainer Undo"を返す。 
       | 
     
    
      | 
       getRedoPresentation 
      Name 
       | 
      
       public String getRedoPresentationName() 
      "DeleteContainer Redo"を返す。 
       | 
     
    
      | 
       isSignificant 
       | 
      
       public boolean isSignificant() 
      常にtrueを返す。 
       | 
     
    
      | 
       undo 
       | 
      
       public void undo() throws CannotUndoException 
      ∙ フィールド変数dataから新規作成図形(ShapeContainer)を再構成する。次のメソッド。 
      ShapeContainer container= SerializableElementUtil.invertShapeContainer(this.data) 
      ∙ ContainerManager.addContainer(container.getContainerIndex(), container)でContainerListに再登録。 
      container.getContainerIndex()を指定しているのは、ContainerListの元の位置へ戻すためである。 
      これは図形の重なりの順番に関係する。 
       | 
     
    
      | 
       redo 
       | 
      
       public void redo() throws CannotRedoException 
      ∙ フィールド変数dataのshapeIdフィールドを使い、ContainerManagerで削除図形(ShapeContainer)を検索。 
      ∙ ContainerManager.deleteContainerで削除図形を再度削除する。 
       | 
     
  
 
  
3.5 ChangeTextBoxサブクラス
戻る=>page top 
public static class ChangeTextBox extends AbstractUndoableEdit
TextBoxの変更を記録する。 
 
 
  
    
      | 
       メソッド 
       | 
      
       説明 
       | 
     
    
      | 
       コンストラクタ 
       | 
      
       public ChangeTextBox(String shapeId, TextBox oldTextBox, TextBox newTextBox) 
      [引数] 
      ∙ shapeId:変更されたTextBoxを所有するShapeContainerのshapeId。 
      ∙ oldTextBox、newTextBox:変更前と後のTextBox。 
       TextBox.getSerializableTextBoxメソッドでSerializableTextBoxを取得して、フィールド変数に設定する。 
       | 
     
    
      | 
       canUndo 
       | 
      
       public boolean canUndo() 
      常にtrueを返す。 
       | 
     
    
      | 
       canRedo 
       | 
      
       public boolean canRedo() 
      常にtrueを返す。 
       | 
     
    
      | 
       getUndoPresentation 
      Name 
       | 
      
       public String getUndoPresentationName() 
      "ChangeTextBox Undo"を返す。 
       | 
     
    
      | 
       getRedoPresentation 
      Name 
       | 
      
       public String getRedoPresentationName() 
      "ChangeTextBox Redo"を返す。 
       | 
     
    
      | 
       isSignificant 
       | 
      
       public boolean isSignificant() 
      常にtrueを返す。 
       | 
     
    
      | 
       undo 
       | 
      
       public void undo() throws CannotUndoException 
      ∙ フィールド変数shapeIdを使い、ContainerManagerでTextBoxを持つShapeContainerを検索。 
      ∙ ShapeContainerがグループ図形の場合も考慮し、次のステップでTextBoxを直下にもつShapeContainerを求める。 
      ∙ TextBoxを変更前に戻す。 
      TextBox.setSerializableTextBox(this.oldStextBox); 
       | 
     
    
      | 
       redo 
       | 
      
       public void redo() throws CannotRedoException 
      targetContainerを見つけるまでの処理はundoと同じ。 
      ∙ TextBoxを変更後に戻す。 
      textBox.setSerializableTextBox(this.newStextBox); 
       | 
     
  
 
  
3.6 ChangePaintStyle
戻る=>page top 
public static class ChangePaintStyle extends AbstractUndoableEdit
PaintStyleの変更を記録する。 
 
  
    
      | 
       フィールド 
       | 
      
       説明 
       | 
     
    
      | 
       shapeId 
       | 
      
       String shapeId 
      挿入する文字列を持つShapeContainerのshapeId。ShapeContainerはグループ図形も可。 
       | 
     
    
      | 
       oldSpaintStyle 
       | 
      
       public SerializablePaintStyle oldPaintStyle 
      変更前のPaintStyle (SerializablePaintStyle形式) 
       | 
     
    
      | 
       newSpaintStyle 
       | 
      
       public SerializablePaintStyle newPaintStyle 
      変更後のPaintStyle (SerializablePaintStyle形式) 
       | 
     
  
 
 
  
    
      | 
       メソッド 
       | 
      
       説明 
       | 
     
    
      | 
       コンストラクタ 
       | 
      
       public ChangePaintStyle(String shapeId, PaintStyle oldPaintStyle, PaintStyle
      newPaintStylee) 
      [引数] 
      ∙ shapeId:変更されたPaintStyleを所有するShapeContainerのshapeId。 
      ∙ oldPaintStyle、newPaintStyle:変更前と後のPaintStyle。 
      PaintStyle.getSerializablePaintStyleメソッドでSerializablePaintStyleに変換してフィールド変数に設定する。 
       | 
     
    
      | 
       canUndo 
       | 
      
       public boolean canUndo() 
      常にtrueを返す。 
       | 
     
    
      | 
       canRedo 
       | 
      
       public boolean canRedo() 
      常にtrueを返す。 
       | 
     
    
      | 
       getUndoPresentation 
      Name 
       | 
      
       public String getUndoPresentationName() 
      "ChangePaintStyle Undo"を返す。 
       | 
     
    
      | 
       getRedoPresentation 
      Name 
       | 
      
       public String getRedoPresentationName() 
      "ChangePaintStyle Redo"を返す。 
       | 
     
    
      | 
       isSignificant 
       | 
      
       public boolean isSignificant() 
      常にtrueを返す。 
       | 
     
    
      | 
       undo 
       | 
      
       public void undo() throws CannotUndoException 
      ∙ フィールド変数shapeIdを使い、ContainerManagerでPaintStyleを持つShapeContainerを検索。 
      ∙ ShapeContainerがグループ図形の場合も考慮し、次のステップでPaintStyleを直下にもつShapeContainerを求める。 
      ∙ PaintStyleを変更前に戻す。 
      paintStyle.setSerializablePaintStyle(this.oldSpaintStyle); 
       | 
     
    
      | 
       redo 
       | 
      
       public void redo() throws CannotRedoException 
      targetContainerを見つけるまでの処理はundoと同じ。 
      ∙ PaintStyleを変更後に戻す。 
      paintStyle.setSerializablePaintStyle(this.newSpaintStyle); 
       | 
     
  
 
  
3.7 ChangeTextサブクラス
戻る=>page top 
public static class ChangeText extends AbstractUndoableEdit 
TextBoxの確定テキストの変更を記録する。現在このサブクラスは使っていない。 
 
  
    
      | 
       フィールド 
       | 
      
       説明 
       | 
     
    
      | 
       shapeId 
       | 
      
       String shapeId 
      挿入する文字列を持つShapeContainerのshapeId。ShapeContainerはグループ図形も可。 
       | 
     
    
      | 
       oldStr 
       | 
      
       AttributedString oldStr 
      変更前のAttributedString。 
       | 
     
    
      | 
       newStr 
       | 
      
       AttributedString newStr 
      変更後のAttributedString。 
       | 
     
  
 
 
  
    
      | 
       メソッド 
       | 
      
       説明 
       | 
     
    
      | 
       コンストラクタ 
       | 
      
       public ChangeText(String shapeId, AttributedString oldStr, AttributedString
      newStr) 
      [引数] 
      ∙ shapeId:削除する文字列を持つShapeContainerのshapeId。フィールド変数に設定する。 
      ∙ oldStr、newStr:変更前後のAttributedString。フィールド変数に設定する。 
       | 
     
    
      | 
       getContainer 
       | 
      
       public ShapeContainer getContainer() 
      フィールド変数shapeIdをキーとしてContainerManagerで検索しShapeContainerを返す。 
       | 
     
    
      | 
       canUndo 
       | 
      
       public boolean canUndo() 
      常にtrueを返す。 
       | 
     
    
      | 
       canRedo 
       | 
      
       public boolean canRedo() 
      常にtrueを返す。 
       | 
     
    
      | 
       getUndoPresentation 
      Name 
       | 
      
       public String getUndoPresentationName() 
      "ChangeText Undo"を返す。 
       | 
     
    
      | 
       getRedoPresentation 
      Name 
       | 
      
       public String getRedoPresentationName() 
      "ChangeText Redo"を返す。 
       | 
     
    
      | 
       isSignificant 
       | 
      
       public boolean isSignificant() 
      常にtrueを返す。 
       | 
     
    
      | 
       undo 
       | 
      
       public void undo() throws CannotUndoException 
      ∙ フィールド変数shapeIdを使い、ContainerManagerでTextBoxを持つShapeContainerを検索。 
      ∙ TextBox のAttributedStringを変更前に戻す。 
      shapeContainer.getTextBox().replaceText(TextBox.UNDO_REDO, this.oldStr) 
       | 
     
    
      | 
       redo 
       | 
      
       public void redo() throws CannotRedoException 
      ShapeContainerの検索はundoと同じ。 
      ∙ TextBox のAttributedStringを変更後に戻す。 
      shapeContainer.getTextBox().replaceText(TextBox.UNDO_REDO, this.newStr) 
       | 
     
  
 
  
3.8 InsertTextサブクラス
戻る=>page top 
public static class InsertText extends AbstractUndoableEdit 
文字列の追加 
テキストを挿入する場合、一文字またはword単位にUndoableDrawEditオブジェクトを作成するのは効率が悪い。このオブジェクトを呼び出して、挿入文字列を追加できるようにしてある。このためのメソッドが、getContainer、getPosition、setPosition、getAttribString、setAttribStringである。 
参照=>TextUndoSetup.InsertText
  
 
  
    
      | 
       フィールド 
       | 
      
       説明 
       | 
     
    
      | 
       shapeId 
       | 
      
       String shapeId 
      TextBoxを持つShapeContainerのshapeId。 
       | 
     
    
      | 
       attribStr 
       | 
      
       AttributedString attribStr 
      挿入された属性つき文字列。 
       | 
     
    
      | 
       position 
       | 
      
       int position 
      属性つき文字列での挿入開始位置。 
       | 
     
  
 
 
  
    
      | 
           メソッド 
           | 
      
       説明 
       | 
     
    
      | 
       コンストラクタ 
       | 
      
       public InsertText(String shapeId, AttributedString attribStr, int position) 
      [引数] 
      ∙ shapeId:削除する文字列を持つShapeContainerのshapeId。フィールド変数に設定する。 
      ∙ attribStr:属性つき文字列。 
      ∙ position:挿入開始位置。 
       | 
     
    
      | 
       getContainer 
       | 
      
       public ShapeContainer getContainer() 
      フィールド変数shapeIdをキーとしてContainerManagerで検索しShapeContainerを返す。 
       | 
     
    
      | 
       getPosition 
       | 
      
       public int getPosition() 
      フィールド変数positionを返す。 
       | 
     
    
      | 
       setPosition 
       | 
      
       public void setPosition(int position) 
      フィールド変数positionに引数を設定。 
       | 
     
    
      | 
       getAttribString 
       | 
      
       public AttributedString getAttribString() 
      フィールド変数attribStrを返す。 
       | 
     
    
      | 
       setAttribString 
       | 
      
       public void setAttribString(AttributedString attribStr) 
      フィールド変数attribStrに引数を設定。 
       | 
     
    
      | 
       canUndo 
       | 
      
       public boolean canUndo() 
      常にtrueを返す。 
       | 
     
    
      | 
       canRedo 
       | 
      
       public boolean canRedo() 
      常にtrueを返す。 
       | 
     
    
      | 
       getUndoPresentation 
      Name 
       | 
      
       public String getUndoPresentationName() 
      "InsertText Undo"を返す。 
       | 
     
    
      | 
       getRedoPresentation 
      Name 
       | 
      
       public String getRedoPresentationName() 
      "InsertText Redo"を返す。 
       | 
     
    
      | 
       isSignificant 
       | 
      
       public boolean isSignificant() 
      常にtrueを返す。 
       | 
     
    
      | 
       undo 
       | 
      
       public void undo() throws CannotUndoException 
      ∙ フィールド変数shapeIdを使い、ContainerManagerでTextBoxを持つShapeContainerを検索。 
      ∙ TextBox からフィールド変数attribStrを削除する。 
      shapeContainer.getTextBox().deleteText(TextBox.UNDO_REDO, this.position, this.position+length) 
       | 
     
    
      | 
       redo 
       | 
      
       public void redo() throws CannotRedoException 
      ∙ フィールド変数shapeIdを使い、ContainerManagerでTextBoxを持つShapeContainerを検索。 
      ∙ TextBox にフィールド変数attribStrを追加する。 
      shapeContainer.getTextBox().insertText(TextBox.UNDO_REDO, this.position, this.attribStr.getIterator()) 
       | 
     
  
 
  
3.9 DeleteTextサブクラス
戻る=>page top 
public static class DeleteText extends AbstractUndoableEdit
削除文字列の追加 
特にBack spaceキーでテキストを削除する場合、一文字削除ごとにこのオブジェクトを作成するのは効率が悪い。このオブジェクトを呼び出して、削除文字列を追加できるようにしてある。このためのメソッドが、getShapeContainer、getPosition、setPosition、getAttribString、setAttribStringである。 
参照=> TextUndoSetup.DeleteText 
 
  
    
      | 
       フィールド 
       | 
      
       説明 
       | 
     
    
      | 
       shapeId 
       | 
      
       String shapeId 
      TextBoxを持つShapeContainerのshapeId。 
       | 
     
    
      | 
       attribStr 
       | 
      
       AttributedString attribStr 
      削除する属性つき文字列。 
       | 
     
    
      | 
       position 
       | 
      
       int position 
      属性つき文字列での削除開始位置。 
       | 
     
  
 
 
  
    
      | 
       メソッド 
       | 
      
       説明 
       | 
     
    
      | 
       コンストラクタ 
       | 
      
       public DeleteText(String shapeId, AttributedString attribStr, int position) 
      [引数] 
      ∙ shapeId:削除する文字列を持つShapeContainerのshapeId。フィールド変数に設定する。 
      ∙ attribStr:属性つき文字列。 
      ∙ position:削除開始位置。 
       | 
     
    
      | 
       getContainer 
       | 
      
       public ShapeContainer getContainer() 
      フィールド変数shapeIdをキーとしてContainerManagerで検索しShapeContainerを返す。 
       | 
     
    
      | 
       getPosition 
       | 
      
       public int getPosition() 
      フィールド変数positionを返す。 
       | 
     
    
      | 
       setPosition 
       | 
      
       public void setPosition(int position) 
      フィールド変数positionに引数を設定。 
       | 
     
    
      | 
       getAttribString 
       | 
      
       public AttributedString getAttribString() 
      フィールド変数attribStrを返す。 
       | 
     
    
      | 
       setAttribString 
       | 
      
       public void setAttribString(AttributedString attribStr) 
      フィールド変数attribStrに引数を設定。 
       | 
     
    
      | 
       canUndo 
       | 
      
       public boolean canUndo() 
      常にtrueを返す。 
       | 
     
    
      | 
       canRedo 
       | 
      
       public boolean canRedo() 
      常にtrueを返す。 
       | 
     
    
      | 
       getUndoPresentation 
      Name 
       | 
      
       public String getUndoPresentationName() 
      "DeleteString Undo"を返す。 
       | 
     
    
      | 
       getRedoPresentation 
      Name 
       | 
      
       public String getRedoPresentationName() 
      "DeleteString Redo"を返す。 
       | 
     
    
      | 
       isSignificant 
       | 
      
       public boolean isSignificant() 
      常にtrueを返す。 
       | 
     
    
      | 
       undo 
       | 
      
       public void undo() throws CannotUndoException 
      ∙ フィールド変数shapeIdを使い、ContainerManagerでTextBoxを持つShapeContainerを検索。 
      ∙ TextBox にフィールド変数attribStrを追加する。 
      shapeContainer.getTextBox().insertText(TextBox.UNDO_REDO, this.position, this.attribStr.getIterator()) 
       | 
     
    
      | 
       redo 
       | 
      
       public void redo() throws CannotRedoException 
      ∙ フィールド変数shapeIdを使い、ContainerManagerでTextBoxを持つShapeContainerを検索。 
      ∙ TextBox からフィールド変数attribStrを削除する。 
      shapeContainer.getTextBox().deleteText(TextBox.UNDO_REDO, this.position, this.position+length) 
       | 
     
  
 
  
4. The undo setup for each command
戻る=>page top 
 
  
    
      | 
       コマンド 
       | 
      
       説明 
       | 
     
    
      | 
       ファイル 
      (NEW, OPEN, SAVE, SAVE, SAVEAS) 
       | 
      
       Undo設定は不要。 
       | 
     
    
      | 
       ページ設定 
      (NEXT_PAGE, PREVIOUS_PAGE, INSERT_NEW_PAGE, DELETE_PAGE, PAGE_SETUP, PAGE_LAYOUT) 
       | 
      
       Undo設定は不要。 
       | 
     
    
      | 
       印刷 
      (PRINT) 
       | 
          
       Undo設定は不要。 
       | 
         
    
      | 
       テキスト編集 
      (CUT, COPY, PASTE, DELETE) 
       | 
      
       CUT, DELETEに対するUndo設定はTextBoxのdeleteTextメソッドで行う。 
      PASTEに対するUndo設定はTextBoxのinsertTextメソッドで行う。 
      COPYに対するUndo設定は不要。 
       | 
     
    
      | 
       図形編集  
      (CUT, COPY, PASTE, DELETE, SELECT_ALL) 
       | 
      Undo設定はContainerManagerのUndoサポート機能を使い、undoSetupStartとundoSetupEndを呼んで行う。 
      CUT, PASTE, DELETEに対してはEditのcopyContainers, pasteContainers, deleteメソッドでUndo設定を行う。 
      COPY, SELECT_ALLに対するUndo設定は不要。 
       | 
     
    
      | 
       図形作成 
      (TEXT_BOX, RECTANGLE, ROUND_RECTANGLE, ELLIPSE, LINE, ARROW, DOUBLE_ARROW,
      POLYLINE, CUBIC_CURVE, COMPONENT_SHAPE) 
       | 
      
       Undo設定はContainerManagerのUndoサポート機能を使い、undoSetupStartとundoSetupEndをCreateShapeLSのcreatingEndから呼んで行う。 
       
       | 
     
    
      | 
       部品ライブラリ 
      (LIB) 
       | 
      
       Undo設定は不要。 
       | 
     
    
      | 
       移動/リサイス 
      (MOVE, RESIZE) 
       | 
      
       Undo設定はContainerManagerのUndoサポート機能を使い、undoSetupStartとundoSetupEndをMoverResizeShapeLSのstart, endメソッドから呼んで行う。 
      もしリサイズコマンドをダイアログ(図形フォーマットダイアログ)から呼ぶ場合、Undo設定はConnectorUtilのresizeContainerで行う。 
       : コネクター(connectors)に対してもUndo設定がなされる。 
       | 
     
    
      | 
       テキストボックス追加/図形の変換/加工 
      (ADD_TEXT_BOX, TRANSLATE, ROTATE, FLIP, MODIFY_SHAPE, CUT_SHAPE, CONNECT_CURVES) 
       | 
      
       Undo設定はContainerManagerのUndoサポート機能を使い、undoSetupStartとundoSetupEndを次のメソッドから呼んで行う。 
      ∙ ADD_TEXT_BOX: ExecCommandのexecメソッド。 
      ∙ TRANSLATE: TranslateActionの actionPerformed メソッド。 
      ∙ ROTATE: RotateActionの actionPerformed メソッド。 
      ∙ FLIP: FlipActionの actionPerformed メソッド。 
      ∙ MODIFY_SHAPE: ModifyShapeLSのstart, end メソッド。 
      ∙ CUT_SHAPE: CutShapeActionの cutShapes メソッド。 
      ∙ CONNECT_CURVES: ConnectCurvesActionの connect メソッド。 
       | 
     
    
      設定 
      (AUTO_ALIGN, CONNECTOR_ENABLE, DISPLAY_NODE_POINTS) | 
      Undo設定は不要。 | 
     
    
      | 
       情報表示 
      (SHAPE_FORMAT, DRAW_PANEL_INFORMATION) 
       | 
      
       Undo設定は不要。 
       | 
     
    
      | 
       フォント属性 
      (FONT_FAMILY, FONT_SIZE, FONT_COLOR, BOLD, ITALIC, UNDERLINE, SUBSCRIPT/SUPERSCRIPT
      ) 
       | 
      
       Undo設定はContainerManagerのUndoサポート機能を使い、undoSetupStartとundoSetupEndをExecCommandUtil.setFontStyleメソッドから呼んで行う。 
       
       | 
     
    
      | 
       テキストボックス 
      (TEXTBOX_LAYOUT, TEXT_ALIGN) 
       | 
      Undo設定はContainerManagerのUndoサポート機能を使い、undoSetupStartとundoSetupEndを次のメソッドから呼んで行う。 
      ∙ TEXTBOX_LAYOUT: ExecCommandUtil.setTextBoxLayoutメソッド。 
      ∙ TEXT_ALIGN: ExecCommandUtil.setTextBoxLayoutメソッド。 
       | 
     
    
      | 
       図形の属性 
      (FILL_COLOR, LINE_COLOR, LINE_WIDTH, LINE_STROKE, ARROW_STYLE) 
       | 
      
       Undo設定はContainerManagerのUndoサポート機能を使い、undoSetupStartとundoSetupEndをExecCommandのexecメソッドから呼んで行う。 
       | 
     
    
      | 
       図形表示の順番(Z-order) 
      (MOVE_TO_FRONT, MOVE_TO_BACK, MOVE_FORWARD, MOVE_BACKWARD) 
       | 
      Undo設定はContainerManagerのUndoサポート機能を使い、undoSetupStartとundoSetupEndをExecCommandUtil.moveZorderメソッドから呼んで行う。 | 
     
    
      | 
       整列 
      (ALIGN_LEFT, ALIGN_CENTER, ALIGN_RIGHT, ALIGN_TOP, ALIGN_MIDDLE, ALIGN_BOTTOM) 
       | 
      Undo設定はContainerManagerのUndoサポート機能を使い、undoSetupStartとundoSetupEndをExecCommandUtil.alignメソッドから呼んで行う。 | 
     
    
      | 
       グループ化 
      (GROUP, UNGROUP) 
       | 
      Undo設定はContainerManagerのUndoサポート機能を使い、undoSetupStartとundoSetupEndをExecCommandのexecメソッドから呼んで行う。 
       | 
     
    
      | 
       表示倍率 
      (ZOOM, ZOOM_TO) 
       | 
      
       Undo設定は不要。 
       | 
     
  
 
 |