工作台功能表構成要素

我們已見過一些不同的延伸點會提供到工作台中不同功能表和工具列中。 您怎麼知道要用哪一個? 下表彙總各種功能表構成要素及其用法。

延伸點名稱

動作位置

詳細資料

viewActions

動作會出現在特定檢視畫面的本端工具列及本端下拉功能表中。

提供一個實作 IViewActionDelegate 的動作類別。 請指定構成要素的 ID 及應該顯示動作之目標檢視畫面的 ID。 標籤和影像指定 UI 中的動作外觀。 路徑指定相對於檢視畫面功能表及工具列項目的位置。

editorActions

動作會關聯於編輯器,且會出現在工作台功能表和/或工具列中。

提供一個實作 IEditorActionDelegate 的動作類別。 請指定構成要素的 ID 及結果會顯示動作的目標編輯器之 ID。 標籤和影像指定 UI 中的動作外觀。 請分開功能表和工具列路徑,請指定構成要素在工作台功能表及工具列中的存在及其位置。

popupMenu

動作會出現在編輯器或檢視畫面的蹦現功能表中。 物件類型所關聯的動作會出現在顯示這個物件類型之檢視畫面和編輯器的所有蹦現功能表中。 特定蹦現功能表所關聯的動作只會出現在這個蹦現功能表中。

物件構成要素會指定蹦現功能表應該出現動作之物件的類型。 動作會出現在含有物件類型的所有檢視畫面和編輯器蹦現功能表中。 請提供一個實作 IObjectActionDelegate 的動作類別。
檢視器構成要素指定功能表項目應該出現在其中之目標蹦現功能表的 ID。 請提供一個實作 IEditorActionDelegateIViewActionDelegate 的動作類別。

actionSets

動作會出現在工作台主功能表和工具列中。 動作會分組成動作集。 動作集中的所有動作都會根據使用者的動作集選項和工作台所顯示的現行視景而出現在工作台功能表及工具列中。

提供一個實作 IWorkbenchWindowActionDelegateIWorkbenchWindowPulldownDelegate 的動作類別。 請指定動作集的 nameid。 請列舉定義給這個動作集的所有動作。 對於每個動作,請分開其功能表和工具列路徑,以及指定構成要素在工作台功能表及工具列中的存在及其位置。

功能表和工具列路徑

我們已經見過指定其動作位置路徑的動作構成要素。 現在,我們要仔細看看這些路徑代表什麼。我們要檢視工作台的說明功能表來查看路徑。

具名群組

插入新功能表、功能表項目或工具列項目的位置是利用具名群組定義的。 您可以將具名群組想成是一個槽或位置保留器,可讓您在功能表和工具列的某點上插入您的功能表和工具列構成要素。

工作台會在 IWorkbenchActionConstants 中定義它的所有群組槽名稱。 對於每個工作台功能表,具名群組都會放在功能表中外掛程式應在其中插入新動作的位置上。

下列說明功能表的說明取自 IWorkbenchActionConstants 類別定義。

標準「說明」功能表動作
啟動群組 HELP_START "start"
結束群組 HELP_END "end"
關於動作 ABOUT "About"

標準工作台說明功能表依次稱為 "start"、稱為 "end" 的具名群組及 "About" 動作組成。 為什麼是兩個群組呢? 為了要讓外掛程式能夠控制它們在說明功能表中的出現位置。 當您定義功能表時,您可以定義您需要的任意數目的槽。 新增較多的槽會使外掛程式更能夠控制它們的構成要素相對於現有構成要素的出現位置。

但請等一下!我們知道,「說明」功能表中還有其它功能表項目。它們是外掛程式所新增的。 比方說,說明外掛程式會新增含有「說明內容」功能表的動作集到工作台中。以下是取自 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 群組內。 如果沒有提供其它外掛程式到說明功能表中,這表示「說明內容」功能表項目會出現為在「關於」項目上的功能表其中的第一個項目。 如果另一個外掛程式要提供一律出現「說明內容」上的項目,它可以在它的路徑中指定 helpStart 群組。

工具列路徑的運作方式也類似。 每當指定路徑時,它的結尾都必須是工具列中的群組名稱。

完整功能表和工具路徑

完整功能表或工具列路徑是一份功能表名稱和具名群組配對的清單。 工作台的功能表名稱也定義在 IWorkbenchActionConstants 中。 這是我們得知說明動作的完整路徑名稱是 "help/helpEnd" 的方式。

有些功能表有巢狀子功能表。 這會帶來較長的路徑。 如果說明功能表以稱為 "submenuStart" 的具名群組定義了稱為 "submenu" 的子功能表, 新子功能表中之動作的完整功能表路徑會是 "help/submenu/submenuStart"。

外部化 UI 標籤

上述範例也會示範外部化出現在 UI 中之字串的技術。如果要將外掛程式 UI 翻譯成其它語言,這非常有用。 我們可以將字串改成某個鍵(如 %help,%helpcontents),並採用下列形式在 plugin.properties 檔中建立項目,以在我們的 plugin.xml 檔中將字串外部化:

help = "說明"
helpContents = "說明內容"

在這個方式下,可以將 plugin.properties 檔翻譯成不同的語言,而不需要修改 plugin.xml

新增新的功能表和群組

在目前已見到的許多範例中,範例外掛程式所提供的動作已在功能表和工具列中,新增到現有的具名群組中。

actionSetsviewActionseditorActionspopupMenus 延伸點也可讓您在構成要素內定義新的功能表和群組。 這表示您可以定義新的子功能表或新下拉功能表,並將您的動作新增到這些新功能表中。 在這個情況下,新動作的路徑會含有新定義的功能表的名稱。

當 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 和檔案編輯器"。 在這個功能表內,我們定三個具名群組:  "slot1"、"slot2" 和 "slot3" 。 我們新增這個新功能表到 "window/additions" 路徑中。

如果我們回到 IWorkbenchActionConstants,我們會在 javadoc 中見到視窗功能表的這個定義:

* <h3>標準「視窗」功能表動作</h3>
* <ul>
* <li>額外視窗型動作群組 (<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"; // 群組。
...
public static final String WINDOW_EXT = MB_ADDITIONS; // 群組。

從這項資訊中,我們可以將新增內容到工作台「視窗」功能表的路徑拼合起來。 功能表本身稱為"視窗",它定義一個稱為"新增內容"的槽。 我們利用 "window/additions" 來新增我們的新功能表。

在動作集宣告中,我們利用 "window/org_eclipse_ui_examples_readmetool/slot1" 路徑來新增一個動作到新定義的功能表中。

其它外掛程式也可以利用這個相同的路徑(或能是另一個槽)來新增它們自己的功能表到我們的功能表中。

一般而言,從 plugin.xml 衍生路徑名稱來提供到另一外掛程式的功能表或工具列並不是好的作法。因為,未來的外掛程式版本可能會改變路徑的名稱。 建議的作法是定義一個 public 介面(類似 IWorkbenchActionConstants)來明確指定哪些功能表、工具列群組和槽可直接由其它外掛程式來使用。