2011-07-16 5 views
3

ユーザーの操作に基づいて複数のエディタインスタンスを開くことができる、シンプルなEclipse RCPアプリケーションを作成しました。私は別のビュー(ViewPart)を持っています。そこで、エディタで選択変更を聞きます。 問題は、最後に開いたエディタから選択されたものだけがビューに通知され、以前に開いた他のエディタはイベントをこれ以上提供しないか、またはビューは最後に開いたエディタだけをリッスンします。これは、以前に開いたエディタにフォーカスがあっても発生します。Eclipse RCP - エディタからの選択をリッスンする方法

他のエディタのタブをクリックすると、以前開いていたものの1つをクリックしたときに変更が反映されるように、エディタ領域内の最新のエディタだけが選択イベントを提供します。編集者。私が使用して私の見解で

DocumentEditorは、アプリケーション・エディタ領域で開かれた編集者の一人である
IWorkbench workbench = PlatformUI.getWorkbench(); 
     workbench.getActiveWorkbenchWindow().getActivePage().addSelectionListener(DocumentsEditor.ID,(ISelectionListener)this); 

ISelectionService.addSelectionListener(String partId, ISelectionListener listener)のJavaDocから

答えて

9

(強調は私です):

は、与えられたIDを持つ部分の場合、選択の変更を通知された部分に特異的な選択リスナーを追加します。これは部品の起動とは無関係です。通知を送信するために部品をアクティブにする必要はありません。

部品が作成されると、部品の初期選択がリスナーに渡されます。パーツが配置されると、リスナーにはnull選択が渡されますが、リスナーがINullSelectionListenerを実装する場合のみです。

注:これは、各エディタに固有のpartIdがないため、エディタ部品を正しくトラッキングしません。

エディタの選択内容をトラッキングする場合は、この方法を使用しないでください。代わりに... ISelectionService.addSelectionListener(ISelectionListener listener)を使用してinstanceof使用ISelectionListener.selectionChanged(IWorkbenchPart part, ISelection selection)内の指定された部分をチェックし

コードに小型ノート:選択サービスは、ウィンドウごとに存在する複数のワークベンチウィンドウを持っている場合、彼らはそれぞれ独自のサービスインスタンスを持っているので、 。私は通常私のビューとエディタに次のコードを使用します。このため

ISelectionService ss = getSite().getWorkbenchWindow().getSelectionService(); 
ss.addPostSelectionListener(listener); 

使用し、リスナーが正しい窓から来るこの方法です。

+0

ありがとう、これは私が探していたものです。 – Kris

+0

申し訳ありませんが、最後の例で* post * SelectionListenerを使用するのはなぜですか?残りの答えは通常の選択リスナーですか?それは何らかの理由で、またはタイプミスを意図していますか? – Alex

+0

'ss.addPostSelectionListener(リスナー)'と 'ss.addSelectionListener(リスナー)'は、選択がテーブルのような「スクロール可能な」ウィジェットから来る場合を除いて等しいです。ここで 'ss.addSelectionListener(リスナー)'はリスナーに各選択の変更を通知しますが、 'ss.addPostSelectionListener(リスナー)'は最後の変更後にリスナーに400msだけ通知します。私はいつもポストバージョンを使います。 –

関連する問題