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


#navi(../../)

* GEF : DeleteAction 実行の流れ [#ibde4b38]


(書きかけ)

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

DeleteAction -> EditPart -> EditPolicy -> Command


** DeleteAction#run() [#mc08c6c6]

内部で自分自身の 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) [#zcee211f]

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


** AbstractEditPart#getCommand(Request) [#sd0f404c]

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


** ComponentEditPolicy#getCommand(Request) [#n8016ec0]

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

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