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設定は不要。
|
|