カット、コピー、ペーストなどは、ビューがアクティブな場合とエディタがアクティブな場合で、実行するアクションクラスが異なると思います。でもメニューんなかに、「ビューのコピー」と「エディタのコピー」それぞれのメニューがあっても見栄えが悪いです。EclipseIDEでも当然コピーはメニュー上ひとつですよね。
ようするに表示上は全ウィジェットで共通だけれど、選択されているウィジェットによって異なるアクションを実行したいというニーズがあります。そんなときに、この再ターゲット(Retarget)可能なアクションというのを用います。これによって、あるビューが選択されているときはそのビューのアクションを実行する、なんていうべんりなメニューを作ることができます。
でやり方ですが、とりあえず宣言的に行う場合をやってみました。plugin.xmlを以下のようにします。
<actionSet label="ラベル"
visible="true" id="nu.mine.kino.plugin.samples.rcp.actionsets">
<action
id="nu.mine.kino.plugin.samples.rcp.actions.retargetaction01"
label="リターゲット可能アクション"
menubarPath="help/group01"
retarget="true"
style="push"/>
</actionSet>
retarget="true" とするだけです。クラスはそれぞれのウィジェットが動的に代入するため、ココでは指定しません。
次にビューの場合は、各クラスのcreatePartControlで以下のようにコーディングしておきます。
↓ SampleView1ってクラスです。
public void createPartControl(Composite parent) {
......
getViewSite().getActionBars().setGlobalActionHandler(
"nu.mine.kino.plugin.samples.rcp.actions.retargetaction01",
new Action() { ↑ これはactionタグのidです
public void run() {
System.out.println("hoge");
}
});
}
これで、このビューが選択されているときは、
nu.mine.kino.plugin.samples.rcp.actions.retargetaction01
というキー値のメニューはこのアクションクラスを使えよー、というのを指定したことになります。
実際、
の様にSampleView1がアクティブの場合はアクションがenableになっていて、
の様にSampleView2がアクティブの場合はアクションがdisableとなります。
これは便利!
この記事は
new RetargetAction(id,"Add &Contact");と、生成時にidというStringのキー値を設定します。 ビュー側でsetGlobalActionHandlerするのは同じです。キー値をこのidにするだけですね。 -- きの 2006-03-03 00:18:43 (金)
現在のアクセス:11038