- 追加された行はこの色です。
- 削除された行はこの色です。
// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。
#contents
** オブジェクトを選択したイベントに反応するリスナ [#q8123f09]
org.eclipse.ui.ISelectionListener はユーザのオペレーションのうち「オブジェクトを選択した」というオペレーションをListenするリスナです。「あるビューでオブジェクトを選択した」などのイベントに反応します。インタフェースは単純で
public interface ISelectionListener {
public void selectionChanged(IWorkbenchPart part, ISelection selection);
}
のみですね。メソッド引数のpartは「オブジェクトを選択した」イベントを発生させた、ビューやエディタへの参照です。selectionは選択されたオブジェクトを保持するインスタンスで、selectionChangedないで
if (selection instanceof IStructuredSelection) {
IStructuredSelection sselection = (IStructuredSelection) selection;
Object firstElement = sselection.getFirstElement();
... 選択されたオブジェクトにキャストしていろいろ....
}
などの様にして選択されたオブジェクトを取得します。
***リスナをワークベンチに登録・削除する [#q3a0594e]
さて、このリスナのインスタンスはorg.eclipse.ui.ISelectionServiceインタフェースのメソッド
public void addSelectionListener(ISelectionListener listener);
public void removeSelectionListener(ISelectionListener listener);
でワークベンチに登録・解除されます。ISelectionServiceってあまり聞き慣れないインタフェースだと思いましたが、 org.eclipse.ui.IWorkbenchPage がextendsしています。つまりこのリスナの使い方としては、ビューなどでこのリスナをimplementsして、ビュー内で
getSite().getPage().addSelectionListener(this);
getSite().getPage().removeSelectionListener(this);
などとすればよさそうです。典型的なのは、ViewPartの拡張クラスで
public void init(IViewSite site) throws PartInitException {
super.init(site);
site.getPage().addSelectionListener(this);
}
public void dispose() {
super.dispose();
getSite().getPage().removeSelectionListener(this);
}
とするんでしょうか。
また、これだと''「一回このビューが表示されるまでワークベンチに登録されない」''という状態になっちゃいます。たとえば
-HogeViewがあってこのビューはどっかで選択された、Fugaというモデルオブジェクトを表示したい
-HogeViewはパースペクティブAに配置されている
-あるパースペクティブBで、Fugaが選択された
という場合ですが、この時パースペクティブAに切り替えるとHogeViewはこの時にinitされて、そのメソッドでワークベンチにリスナとして登録されるため、Fugaが選択されたことを通知してもらえません((遡及して教えてくれーって感じ))。これだと困るので、とりあえず、HogeViewのcreatePartControlの最後で、
selectionChanged(null, getSite().getPage().getSelection());
と直接メソッドをコールしました。。。ほかにいい解法あったらだれか教えてください。
*** オブジェクトが選択されるということって [#bf208483]
*** ページに [#s372392a]
さて、
[[プロパティビュー>Eclipse/プラグイン開発のTIPS集/プロパティシートを使う]]などでも出てきましたが、
getSite().setSelectionProvider(viewer)
----
この記事は
#vote(おもしろかった,そうでもない)
#comment
#topicpath
SIZE(10){現在のアクセス:&counter;}