Eclipseプラグインを作ってみよう!

第5回 PDEのソースを読む

この記事を読むのに必要な時間:およそ 3.5 分

addPages()メソッドの検索

それではManifestEditorクラスを開いて,addPages()メソッドの実装を探します。しかし,ManifestEditorクラスにはaddPages()メソッドがありません。そこで,スーパークラスを順番に辿っていったところ,PDEFormEditorクラスで下記の実装がありました。

PDEFormEditorクラスのaddPages()メソッドの実装

protected final void addPages() {
    fError = getAggregateModel() == null;
    if (fError) {
        try {
            addPage(new MissingResourcePage(this));
        } catch (PartInitException e) {
            PDEPlugin.logException(e);
        }
    } else
        addEditorPages();
}
    
protected abstract void addEditorPages();

この実装から,実際のページの追加はaddEditorPages()メソッドで行われていることがわかります。このメソッドは抽象メソッドとして定義されているので,ManifestEditorクラスに戻って,addEditorPages()メソッドを探したところ,下記の実装を見つけました。

マニフェストエディターにページを追加しているaddEditorPages()メソッドの実装

protected void addEditorPages() {
    try {
        addPage(new OverviewPage(this));
        addPage(new DependenciesPage(this));
        addPage(new RuntimePage(this));
        if (showExtensionTabs()) {
            addExtensionTabs();
        }
        if (fInputContextManager.hasContext(BuildInputContext.CONTEXT_ID))
            addPage(new BuildPage(this));
    } catch (PartInitException e) {
        PDEPlugin.logException(e);
    }
    addSourcePage(BundleInputContext.CONTEXT_ID);
    addSourcePage(PluginInputContext.CONTEXT_ID);
    addSourcePage(BuildInputContext.CONTEXT_ID);
}

第3回で設計の参考にしたのはマニフェストエディターの「拡張」タブでしたので,その実装を参照することにします。addExtensionTabs()メソッドの中でExtensionPointsPageクラスとExtensionsPageクラスが追加されています。名前からそれぞれ「拡張ポイント」タブ,⁠拡張」タブに対応していることがわかります。

ExtensionsPageクラス

それでは「拡張」タブの実装であるExtensionsPageクラスを見てみましょう。ExtensionsPageクラスのcreateFormContent()メソッドがコントロールの生成と配置を行っているので,このメソッドを参照します。

ExtensionsPageクラスのcreateFormContent()メソッド

protected void createFormContent(IManagedForm managedForm) {
    ScrolledForm form = managedForm.getForm();
    form.setText(PDEUIMessages.ExtensionsPage_title);
    form.setImage(PDEPlugin.getDefault().getLabelProvider().get(PDEPluginImages.DESC_EXTENSIONS_OBJ));
    fBlock.createContent(managedForm);
    //refire selection
    fSection.fireSelection();
    PlatformUI.getWorkbench().getHelpSystem().setHelp(form.getBody(), IHelpContextIds.MANIFEST_PLUGIN_EXTENSIONS);
    super.createFormContent(managedForm);
}

このメソッドではfBlockのcreateContent()メソッドを呼び出しています。fBlockは内部クラスのExtensionsBlockクラスのインスタンスです。前述したようにcreateFormContent()メソッドはコントロールの生成と配置を行うメソッドですので,ExtentionsBlockクラスもなんらかのコントロールのはずです。そこでExtensionsBlockクラスの型階層を表示するとMasterDetailsBlockクラスのサブクラスであることがわかります。

Master/Detailsパターン

MasterDetailsBlockクラスはEclipse Formsのクラスですので,ヘルプからAPIリファレンスを参照してみましょう。このクラスはMaster/Detailsと呼ばれるユーザーインタフェースパターンを実装するためのクラスであることがわかります。Master/DetailsパターンはMaster(一覧)とDetails(詳細)のふたつのパートに分かれており,Master(一覧)で選択されたデータの詳細がDetails(詳細)に表示されるパターンで,ユーザーインタフェースにおいてもっともよく使用されるパターンのひとつです。

マニフェストエディターはMaster(一覧)とDetails(詳細)を独自の方法で実装していたのではなく,MasterDetailsBlockクラスを使って実装していたことがわかりました。フォームデザイナーでもこのクラスを利用して実装していくことにします。

おわりに

今回はPDEのプロジェクトのチェックアウトからマニフェストエディターの実装方法を調べるところまでを説明しました。Eclipseプラグインの開発に限ったことではありませんが,ほかの人のソースコードを読むことは大変勉強になります。今回,CVSリポジトリーの設定を行ったことで,Eclipseのさまざまなプロジェクトをチェックアウトできるようになりましたので,ぜひ興味のあるプラグインのソースコードを読んでみてください。

次回はPDEのソースを参考にしながら,フォームデザイナーの実装を行っていきます。

著者プロフィール

松藤秀治(まつふじひではる)

Piece Frameworkのプログラマー。担当はEclipseのプラグインとして開発されているPiece Frameworkの統合開発環境Piece_IDE。2007年5月に株式会社アイテマンを設立。