ワークベンチ・メニューの組み込み

ワークベンチでさまざまなメニューおよびツールバーを組み込むいくつかの異なる拡張ポイントを学習してきました。 では、どの拡張ポイントを使用すればよいのでしょうか。以下のテーブルに、 さまざまなメニュー組み込みとそれらの使用法について要約します。

拡張ポイント名

アクションのロケーション

詳細

viewActions

アクションは、特定のビューのローカル・ツールバーおよびローカル・プルダウン・メニュー内に表示されます。

IViewActionDelegate を インプリメントするアクション・クラスを組み込みます。 組み込みの ID およびアクションを表示するターゲット・ビューの ID を指定します。 ラベルおよびイメージにより、UI 内のアクションの外観が決まります。 パスは、ビューのメニューおよびツールバー項目に関連するロケーションを指定します。

editorActions

アクションは、エディターと関連付けられ、ワークベンチ・メニューおよび (または) ツールバーに表示されます。

IEditorActionDelegate を インプリメントするアクション・クラスを組み込みます。 組み込みの ID およびアクションを表示させるターゲット・エディターの ID を指定します。 ラベルおよびイメージにより、UI 内のアクションの外観が指定されます。 個々のメニューおよびツールバー・パスにより、 ワークベンチ・メニューおよびツールバーの組み込みの存在およびロケーションが指定されます。

popupMenu

アクションは、エディターまたはビューのポップアップ・メニューに表示されます。 オブジェクト・タイプと関連付けられたアクションは、 オブジェクト・タイプを表示するビューおよびエディターのすべてのポップアップに表示されます。 特定のポップアップ・メニューと関連付けられたアクションは、そのポップアップ・メニュー内にしか表示されません。

オブジェクト組み込みは、アクションがポップアップ・メニューに表示されるオブジェクトのタイプを指定します。 アクションは、そのオブジェクト・タイプを含むすべてのビューおよびエディター・ポップアップに表示されます。  IObjectActionDelegate を インプリメントするアクション・クラスを提供します。 
ビューアー組み込みは、中にメニュー項目が表示されるターゲット・ポップアップ・メニューの ID を指定します。  IEditorActionDelegate または IViewActionDelegate を インプリメントするアクション・クラスを提供します。 

actionSets

アクションは、ワークベンチのメインメニューおよびツールバーに表示されます。 アクションは、アクション・セットへグループ化されます。アクション・セットのすべてのアクションは、 ユーザーのアクション・セット選択およびワークベンチに表示される現行パースペクティブに応じて、 ワークベンチのメニューおよびツールバーに表示されます。

IWorkbenchWindowActionDelegate または IWorkbenchWindowPulldownDelegate を インプリメントするアクション・クラスを組み込みます。アクション・セットの名前および ID を指定します。 そのアクション・セットに対して定義されたすべてのアクションを列挙します。 アクションごとに、個々のメニューおよびツールバー・パスにより、 ワークベンチ・メニューおよびツールバーの組み込みの存在およびロケーションが指定されます。

メニューおよびツールバー・パス

アクションのロケーション用のパスを指定する多くのアクション組み込みについて説明しました。 では、これらのパスがどのような意味を持つのか詳しく説明します。  ワークベンチの「ヘルプ」メニューを見ることによって、パスについて説明していきます。

名前付きグループ

新規メニュー、メニュー項目、またはツールバー項目を挿入するロケーションは、 名前付きグループを使用して定義されます。名前付きグループは、 メニューまたはツールバーの特定のポイントで、 メニューおよびツールバー組み込みを挿入することができるスロットまたはプレースホルダーとして考えることができます。

ワークベンチは、 IWorkbenchActionConstants クラス内の グループ・スロット名のすべてを定義します。名前付きグループは、ワークベンチ・メニューごとに、 プラグインが新規アクションを挿入すると予期されているロケーションのメニューに配置されます。

以下のヘルプ・メニューの説明は、 IWorkbenchActionConstants クラス定義を基に作り替えたものです。

Standard Help menu actions
Start group HELP_START "start"
End group HELP_END "end"
About action ABOUT "About"

標準ワークベンチ・ヘルプ・メニューは、"start" と呼ばれる名前付きグループで構成されています。 このグループには、"end" と呼ばれる名前付きグループが続き、 その後に "About" アクションが続きます。なぜ、2 つのグループなのでしょうか。 これは、ヘルプ・メニューでどのくらい下方にプラグインが表示されるかについて、プラグイン用コントロールを提供するためです。 メニューを定義すると、好みに応じた数のスロットを定義することができます。さらにスロットを追加することにより、 他のプラグインに、それらの組み込みが既存の組み込みに関連して表示される場所について、より多くのコントロールを与えます。

ただし、待ってください。  ヘルプ・メニューに他のメニュー項目があることは知っています。  これらは、プラグインによって追加されます。 たとえば、ヘルプ・プラグインは、 "Help Contents" メニューを含むアクション・セットをワークベンチへ追加します。  以下は、org.eclipse.help.ui プラグインの plugin.xml からのマークアップです。

<extension 
    point="org.eclipse.ui.actionSets">
    <actionSet
        id="org.eclipse.help.internal.ui.HelpActionSet"
        label="%help"
        visible="true">
        <action id="org.eclipse.help.internal.ui.HelpAction"
            menubarPath="help/helpEnd"
            label="%helpcontents"
            class="org.eclipse.help.internal.ui.ShowHelp"/>
    </actionSet>
</extension>

新規のヘルプ・アクションは、helpEnd グループ内のヘルプ・メニューに配置されます。 他のどのプラグインもヘルプ・メニューに組み込まれていない場合、"About" 項目の上のメニューの最初の項目として、 "Help Contents" メニュー項目が表示されることを意味します。別のプラグインにより、 "Help Contents" 項目の上に常に表示される項目を組み込む場合、 パス上に helpStart グループを指定することができます。

ツールバー・パスも同様に機能します。パスが指定される場合は常に、ツールバー内のグループ名で終了する必要があります。

完全修飾メニューおよびツールバー・パス

完全メニューまたはツールバー・パスは、単にメニュー名および名前付きグループのペアのリストです。 ワークベンチのメニュー名は、 IWorkbenchActionConstants でも 定義されます。この方法で、 以前も、ヘルプ・アクションの完全修飾パス名が" help/helpEnd" であることがわかりました。

メニューの中には、ネストされたサブメニューを持つものもあります。 これが、長いパスが効果を表すところです。ヘルプ・メニューが、 "submenuStart" という名前付きグループを持つ" submenu" というサブメニューを定義した場合、 新規サブメニュー内のアクションの完全修飾メニュー・パスは、"help/submenu/submenuStart" になります。

UI ラベルの外部化

上記の例は、UI に表示されるストリングを外部化するための技法についても示しています。  これは、プラグインの UI を他の言語へ変換するときに役立ちます。  ストリングをキー (%help、%helpcontents など) で置換し、 plugin.properties ファイル内に次の形式のエントリーを作成することにより、 plugin.xml ファイル内のストリングを外部化することができます。

help = "Help"
helpContents = "Help Contents"

このようにして、plugin.properties ファイルは、異なる言語用に変換することができ、 plugin.xml を変更する必要はありません。

新規メニューおよびグループの追加

これまでに説明した多くの例で、サンプル・プラグインによって組み込まれたアクションは、 メニューおよびツールバー内の既存の名前付きグループへ追加されました。

actionSetsviewActionseditorActions、および popupMenus の各拡張ポイントを 使用しても、組み込み内で新規メニューおよびグループを定義することができます。 つまり、新規サブメニューまたは新規プルダウン・メニューを定義し、 アクションをこれらの新規メニューへ組み込むことができます。 この場合、新規アクションのパスには、新規に定義したメニューの名前が含まれます。

この技法は、README ツールがアクション・セット用に新規メニューを定義したときに説明しました。  より詳細にメニュー・パスを見てきたところで、そのマークアップをもう一度見てみましょう。

<extension 
    point = "org.eclipse.ui.actionSets">
    <actionSet id="org_eclipse_ui_examples_readmetool_actionSet"
        label="ReadMe Actions"
        visible="true">
        <menu id="org_eclipse_ui_examples_readmetool"
            label="Readme &amp;File Editor"
            path="window/additions"> 
            <separator name="slot1"/>
            <separator name="slot2"/>
            <separator name="slot3"/>
        </menu>
        <action id="org_eclipse_ui_examples_readmetool_readmeAction"
            menubarPath="window/org_eclipse_ui_examples_readmetool/slot1"
            toolbarPath="readme"
            label="&amp;Open Readme Browser@Ctrl+R"
            tooltip="Open Readme Browser"
            helpContextId="org.eclipse.ui.examples.readmetool.open_browser_action_context"
            icon="icons/basic/ctool16/openbrwsr.gif"
            class="org.eclipse.ui.examples.readmetool.WindowActionDelegate"
            enablesFor="1">
            <selection class="org.eclipse.core.resources.IFile"
                name="*.readme">
            </selection>
        </action>
    </actionSet>
</extension>

ここでは、新規のメニュー  "org_eclipse_ui_examples_readmetool" を追加しました。 そのラベルはストリング "Readme &File Editor" です。 このメニュー内で、 "slot1"、"slot2"、 および "slot3" の 3 つの名前付きグループを定義します。 この新規メニューを、パス "window/additions" へ追加します。

IWorkbenchActionConstants へ戻ると、javadoc 内のウィンドウ・メニューのこの定義が見られます。

* <h3>Standard Window menu actions</h3>
* <ul>
* <li>Extra Window-like action group (<code>WINDOW_EXT</code>)</li> 

クラス定義をさらに見ていくと、以下の関連定義が見えるでしょう。

public static final String MENU_PREFIX = "";
...
public static final String M_WINDOW = MENU_PREFIX+"window";
...
public static final String MB_ADDITIONS = "additions"; // Group.
...
public static final String WINDOW_EXT = MB_ADDITIONS; // Group.

この情報から、ワークベンチ "Window" メニューへ何かを追加するために、パスをつなぎ合わせることができます。  メニュー自体は、"window" と呼ばれ、"additions "というスロットを 1 つ定義します。  新規メニューを追加するには、パス "window/additions" を使用します。

アクション・セット宣言で、 パス "window/org_eclipse_ui_examples_readmetool/slot1" を使用して、 アクションを新規に定義されたメニューへ追加します。

他のプラグインは、独自のメニューの 1 つを追加するために、 この同じパス (または他のスロットのうちの 1 つ) を使用することにより、メニューに追加することができます。  

通常、plugin.xml からパス名を引き出すことにより、 別のプラグインのメニューまたはツールバーを組み込むことは良い例ではありません。 プラグインの今後のバージョンでパス名が変更される可能性があるからです。  正確にどのメニュー、ツールバー・グループ、およびスロットが、 他のプラグインによる使用のために適切なものと考えられるかを指定するパブリック・インターフェース (IWorkbenchActionConstants と 同じようなもの) を定義することをお勧めします。