ビューは、情報の階層をナビゲート、またはオブジェクトのプロパティーを表示することができるワークベンチの一部です。 所定のビューのインスタンスは、1 つだけワークベンチ・ページに開くことができます。 ユーザーがビューで選択を行ったり、他の変更を加えたりすると、それらの変更は、即時にワークベンチに反映されます。 ビューはしばしば、対応するエディターをサポートするために提供されます。 例えば、アウトライン・ビューはエディター内の情報の構造ビューを表示します。 プロパティー・ビューは、現在編集中のオブジェクトのプロパティーを表示します。
org.eclipse.ui.views 拡張ポイントにより、プラグインはビューをワークベンチへ追加することができます。 ビューを組み込むプラグインは、plugin.xml ファイルにビューを登録して、実装クラス、 クラスが属するビューのカテゴリー (またはグループ)、メニューおよびラベルでビューを記述するために使用する名前、 およびアイコンなどのビューの構成情報を提供する必要があります。
ビューのインターフェースは、 IViewPart で定義されますが、プラグインは、 IViewPart を最初から実装するのではなく、 ViewPart クラスを 拡張するよう選択することができます。
Hello world の例では、最小限のビュー拡張を実装しました。 ここでは、他のワークベンチ・ビューを認識し、ワークベンチ内のユーザーのナビゲーションおよび選択変更に応答する拡張について説明します。 最初に、plugin.xml 内の拡張の宣言を見ます。
<extension point="org.eclipse.ui.views"> <category id="org.eclipse.ui.examples.readmetool" name="%Views.category"> </category> <view id="org.eclipse.ui.examples.readmetool.views.SectionsView" name="%Views.ReadmeSections" icon="icons/view16/sections.png" category="org.eclipse.ui.examples.readmetool" class="org.eclipse.ui.examples.readmetool.ReadmeSectionsView"> </view> </extension>
これは、非常になじみ深く見えることでしょう。 新規ビューの ReadmeSectionsView がワークベンチへ組み込まれていることがわかります。 view id、name、および category は、以前と同じように指定されます。 また、 icon もプラグインのインストール・ディレクトリーに関連したパスを使用して、ビューのために提供されます。
ReadmeSectionsView を見ましょう。 ワークベンチ内のビューは、「ウィンドウ」->「ビューの表示」->「その他...」 を選択し、 「ビューの表示」リストからビューを選ぶことにより表示することができます。
ReadmeSectionsView を表示すると、リストを中に持つビューがポップアップします。 リストは、拡張子 .readme の付いたファイルをクリックしないかぎり空です。 クリックすると、README ファイルからのセクションが付いたリストがファイルに取り込まれます。
プラグインはどのようにして README ファイルを認識したのでしょうか? また、どのようにして選択の変更がわかるのでしょうか? これらの質問の答を見付けることができれば、統合ワークベンチ・プラグインの作成方法について理解することができます。
最初に、以前にも使用した createPartControl メソッドから始めます。 Hello World の例でも説明したように、これはビューを表示するウィジェットが作成されるところです。 開始するにあたり、いくつかのコードを無視します。
public void createPartControl(Composite parent) { viewer = new ListViewer(parent); ... // add myself as a global selection listener getSite().getPage().addSelectionListener(this); // prime the selection selectionChanged(null, getSite().getPage().getSelection()); }
ビューは ListViewer を作成して保管し、自らをページの選択リスナーとして登録します。 これは、ワークベンチ・ウィンドウ、含んでいるページ、およびプラグインなど、ビューのコンテキストの情報を含んだ IViewSite からページを入手します。 選択の変更が通知されると、何が起きるのでしょうか。 以下のコードが実行されます。
public void selectionChanged(IWorkbenchPart part, ISelection sel) { //if the selection is a readme file, get its sections. AdaptableList input = ReadmeModelFactory.getInstance().getSections(sel); viewer.setInput(input); }
ReadmeModelFactory クラスは、選択を README セクションに変える責任があるように見えます。 また、これらのセクションは、createPartControl メソッドで作成したビューアーに対する入力と考えられます。
しかし、ビューアーはどのようにリスト・ウィジェットを取り込むのでしょうか? 現時点では、入力エレメントを通知された後、その情報 (つまり ListViewer) を使用してリスト・ウィジェットを取り込む方法を認識したと想定しましょう。 ビューアーとは一体何なのか、すぐに知る必要がある場合、ビューアーを参照してください。
README ファイルをどのように検出するか、またはファイルのセクション情報をどこから入手するかは、まだ分かりません。 ReadmeModelFactory を簡単に見てみると、いくつかが理解できます。
public AdaptableList getSections(ISelection sel) { // If sel is not a structured selection just return. if (!(sel instanceof IStructuredSelection)) return null; IStructuredSelection structured = (IStructuredSelection)sel; //if the selection is a readme file, get its sections. Object object = structured.getFirstElement(); if (object instanceof IFile) { IFile file = (IFile) object; String extension = file.getFileExtension(); if (extension != null && extension.equals(IReadmeConstants.EXTENSION)) { return getSections(file); } } //the selected object is not a readme file return null; }
選択が、構造化された (複数) 選択かどうかを調べるために、選択を検査します (構造化選択の概念は、JFace ビューアー から分かります)。 選択内の最初のオブジェクトに対して、 それがファイル (IFile) のリソースであるかどうかを検査します。 ファイル・リソースである場合、その拡張子が ".readme" 拡張子に一致するかどうかを調べます。 README ファイルであるとわかった場合、セクションを構文解析するために他のメソッドを使用することができます。 ファイル構文解析の詳細については、残りの ReadmeModelFactory、 MarkElement、 および DefaultSectionsParser を参照してください。
この拡張を学習することにより、多くの一般的なワークベンチの概念を学んできました。 次は、他のいくつかのワークベンチ拡張へ進み、プラグインがさらにワークベンチ UI に組み込みを行う方法について調べます。