#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 を生成することになります。