« コンテキストメニューへのアクションの追加 | トップページ | 3日間記事が作成できなかったのは・・・ »

2004.01.25

アクションの対象オブジェクト(Element)の取得方法

コンテキストメニューへのアクションの追加で,ビュー上で対象オブジェクトに対するアクションの追加方法を述べた。このアクションが実行されたときの対象オブジェクト(Elementというらしい)をどのように取得するのか?これは,IStructuredSelectionインタフェースがキーとなる。

アクションの実装となるクラスは,コンテキストメニューの場合はIObjectActionDelegateインタフェースの実装クラスとなる。で,対象オブジェクトが選択されたとき(遅延ロードのため,2.1.2の場合1回目はアクションが実行されたとき)に,対象オブジェクトがselectionChangedメソッドに渡されてくる

さて,第二引数のISelectionインタフェースの引数に渡されてくるのだが,対象オブジェクトをどのように取り出せばよいのだろうか?Elementを伴う選択オブジェクトは,IStructuredSelectionインタフェースの実装オブジェクトとして渡されてくる。つまり,引数をIStructuredSelectionインタフェースにキャストする。

  public void selectionChanged(IAction action, ISelection selection) {
    IStructuredSelection structured = (IStucturedSelection)selection;
  }

選択された対象オブジェクトは,一つとは限らない。これはプラグイン・マニフェストで記述されたenablesFor属性値とユーザの選択操作に依存する。IStructuredSelectionインタフェースとは,選択された複数の対象オブジェクトを取り出す方法が規定されたインタフェースなのである。

もしenablesFor属性値が1であれば,
  Object targetElement = structured.getFirstElement();
で取り出せばよい。また,enablesFor属性値によって複数個選択が許されているのであれば,
  IStructuredSelection#size() → 個数の取得
  IStructuredSelection#iterator() → 走査用のイテレータの取得
  IStructuredSelection#toArray() → オブジェクトの配列として取得
  IStructuredSelection#toList() → Listコレクションとして取得
を利用して対象オブジェクト群を取り出すことができる。

アクション実行時に呼び出されるrunメソッドに対象オブジェクトは渡されてこないので,runメソッド内で対象オブジェクトを扱わなければならないときは,予めselectionChangedメソッドが呼び出されたときにselection引数をインスタンスフィールドに保持しておく,という工夫が必要になる。

|

« コンテキストメニューへのアクションの追加 | トップページ | 3日間記事が作成できなかったのは・・・ »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/12631/132706

この記事へのトラックバック一覧です: アクションの対象オブジェクト(Element)の取得方法:

« コンテキストメニューへのアクションの追加 | トップページ | 3日間記事が作成できなかったのは・・・ »