ビューは、情報の階層をナビゲートすることや、オブジェクトのプロパティーを表示することができるワークベンチの一部です。 ビューは、しばしば、対応するエディターをサポートするために提供されます。 たとえば、アウトライン・ビューはエディター内の情報の構造ビューを表示します。 プロパティー・ビューは、現在、編集中のオブジェクトのプロパティーを表示します。
ユーザーがビュー内で選択または変更を行った場合、 その変更内容は即時にユーザー・インターフェースの他の関連部分に反映されます。 特定のビューの 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="&Readme">
</category>
<view
id="org.eclipse.ui.examples.readmetool.views.SectionsView"
name="Readme Sections"
icon="icons/basic/view16/sections.gif"
category="org.eclipse.ui.examples.readmetool"
class="org.eclipse.ui.examples.readmetool.ReadmeSectionsView">
</view>
</extension>
これは、非常になじみ深く見えることでしょう。 新規ビューの ReadmeSectionsView がワークベンチへ組み込まれていることがわかります。 view id、name、および category は、以前と同じように指定されます。 また、 icon もプラグインのインストール・ディレクトリーに関連したパスを使用して、ビューのために提供されます。
ReadmeSectionsView を見ましょう。ワークベンチ内のビューは、 「パースペクティブ (Perspective)」->「ビューを表示 (Show View)」->「その他 (Other...)」を選択し、 「ビューを表示 (Show View)」リストからビューを選ぶことにより表示することができます。
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 に組み込みを行う方法について調べます。