tips/eclipse/plugin開発/GEF/DeleteAction 実行の流れ

2008-07-10 (木) 01:33:25 (6000d)

GEF : DeleteAction 実行の流れ

(書きかけ)

GEF の用意している DeleteAction は、 (標準的な EditPart, EditPolicy の構成をそのまま用いた場合) 次のような流れで処理を委譲し、実行します。

DeleteAction -> EditPart -> EditPolicy -> Command

DeleteAction#run()

内部で自分自身の createDeleteCommand(List) を呼び出し、 得られた Command をスーパークラスの WorkbenchPartAction#execute(Command) を呼び出すことで実行します。 (この中ではさらに Command#execute() が呼ばれます)

引数の List には、SelectionAction#getSelectedObjects() で取得した オブジェクトのリスト(=アクション実行時に選択されていた EditPart のリスト) を渡しています。

なお、Action が実行可能かどうかを確認するために DeleteAction#calculateEnabled() が呼ばれますが、 この場合 run() と同様に createDeleteCommand(List) を呼び、 得られた Command に対して execute() ではなく canExecute() を呼びます。 (したがって、利用者側は Command の canExecute() メソッドを必要に応じて オーバーライドすればよいようになっています)

DeleteAction#createDeleteCommand(List)

引数に渡された EditPart の getCommand(Request) で Command を取得します。

AbstractEditPart#getCommand(Request)

インストールされている EditPolicy の getCommand(Request) メソッドに 処理をそのまま委譲します。

ComponentEditPolicy#getCommand(Request)

DeleteAction の処理は、多くの場合 ComponentEditPolicy を継承した EditPolicy を独自に作成して処理させることになると思います。

ComponentEditPolicy#getCommand(Request) は、 Request の種類(Request#getType())が RequestConstants.REQ_DELETE だった場合、 自分自身の getDeleteCommand(GroupRequest)、 さらにその中で createDeleteCommand(GroupRequest) を呼び出して Command を取得します。 実際には利用者がこれらのメソッドを実装して、処理させたい Command を生成することになります。