我們已經見過指定其動作位置路徑的動作構成要素。 現在,我們要仔細查看這些路徑代表什麼。
首先,我們將藉由查看工作台說明功能表來查看功能表路徑。
插入新功能表和功能表項目的位置是利用具名群組來定義的。 您可以將具名群組想成是一個槽或位置保留器,可讓您在功能表列或下拉功能表的某些點上插入您的功能表項目。
工作台會在類別 IWorkbenchActionConstants 和 IIDEActionConstants 中定義它的所有群組位置名稱。(使用兩個不同的類別,因為資源相關的功能表項目是由通用工作台所產生的)。對於每個工作台功能表,具名群組都會放在功能表中外掛程式應在其中插入新動作的位置上。
下列說明功能表的說明取自 IWorkbenchActionConstants 類別定義。
標準「說明」功能表動作 啟動群組 - HELP_START - "start" 結束群組 - HELP_END - "end"
標準工作台說明功能表定義名稱為 "start," 的具名群組,隨後跟隨名稱為 "end," 的具名群組。定義兩個群組給予外掛程式它們在說明功能表中的項目提供定位有更多一些控制權。 當您定義功能表時,您可以定義您需要的任意數目的位置。新增較多的位置會使外掛程式更能夠控制它們的構成要素相對於現有構成要素的出現位置。
新增功能表項目到說明功能表的外掛程式可以使用這些群組名稱來決定它們的功能表項目要放在什麼位置。例如,提要外掛程式將包含 "提要..." 功能表的動作集新增到工作台。 以下是 org.eclipse.ui.cheatsheets 外掛程式的 plugin.xml 中的標記。
<extension point="org.eclipse.ui.actionSets"> <actionSet label="%CHEAT_SHEETS" visible="true" id="org.eclipse.ui.cheatsheets.actionSet"> <action label="%CHEAT_SHEETS_MENU" class="org.eclipse.ui.internal.cheatsheets.actions.CheatSheetHelpMenuAction" menubarPath="help/helpStart" id="org.eclipse.ui.cheatsheets.actions.CheatSheetHelpMenuAction"> </action> </actionSet> </extension>
新說明動作會放在說明功能表的 helpStart 群組內。
完整功能表路徑只是「功能表名稱 / 群組名稱」。工作台大部分的功能表名稱定義於 IWorkbenchActionConstants。(資源相關功能表名稱是定義在 IIDEActionConstants。) 如果在這個類別中尋找說明功能表的名稱,將會發現說明動作的完整路徑名稱是 "help/helpEnd"。
有些功能表有巢狀子功能表。 這會帶來較長的路徑。 如果說明功能表以稱為 "submenuStart" 的具名群組定義了稱為 "submenu" 的子功能表, 新子功能表中之動作的完整功能表路徑會是 "help/submenu/submenuStart"。
上述範例會示範出現在 UI 中提出字串的技術。使用提出的字串,使得更容易將外掛程式 UI 翻譯成其他語言。 我們可以將 plugin.xml 檔案中的字串取代為某個鍵 (%CHEAT_SHEETS_MENU),並採用下列形式在 plugin.properties 檔中建立項目,藉此方式來提出字串︰
CHEAT_SHEETS_MENU = Cheat Sheets...
可以將 plugin.properties 檔翻譯成不同的語言,而不需要修改 plugin.xml。
在目前已見到的許多範例中,範例外掛程式所提供的動作已在功能表中,新增到現有的具名群組中。
actionSets、viewActions、editorActions 和popupMenus 延伸點也可讓您在構成要素內定義新的功能表和群組。 這表示您可以定義新的子功能表或新下拉功能表,並將您的動作新增到這些新功能表中。 在這個情況下,新動作的路徑會含有新定義的功能表的名稱。
當 Readme 工具定義其動作集的新功能表時,我們見過這個技術。現在,我們要再檢視一次這個標記,更詳細看看功能表路徑。
<extension point = "org.eclipse.ui.actionSets"> <actionSet id="org_eclipse_ui_examples_readmetool_actionSet" label="%ActionSet.name" visible="true"> <menu id="org_eclipse_ui_examples_readmetool" label="%ActionSet.menu" 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="%ReadmeAction.label" tooltip="%ReadmeAction.tooltip" helpContextId="org.eclipse.ui.examples.readmetool.open_browser_action_context" icon="icons/ctool16/openbrwsr.png" class="org.eclipse.ui.examples.readmetool.WindowActionDelegate" enablesFor="1"> <selection class="org.eclipse.core.resources.IFile" name="*.readme"> </selection> </action> ...
我們新增一個新的功能表,叫做 "org_eclipse_ui_examples_readmetool", 標籤是由內容檔中的 "%ActionSet.name" 鍵所定義。 在這個功能表中,我們定義三個命名群組: "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" 路徑來將動作新增至新定義的功能表中。
其他外掛程式也可以利用這個相同的路徑(或能是另一個槽)來將其本身的功能表新增至我們的功能表中。
在 readme 工具範例中,我們使用 separator 屬性來識別群組名稱。 當這些群組含有項目時,這將導致它們之間出現一條分隔線。 如果我們想要定義一個具名群組,但不想要在功能表中顯示任何分隔字元, 以區隔這些群組,我們可以改為使用 groupMarker 屬性。
工具列路徑的運作類似於功能表路徑。
工作台工具列是由不同外掛程式(包括工作台本身)提供的工具列所組成。 在任何特殊工具列內,有若干具名群組或槽,可用於插入新的工具列項目。
下列工作台工具的說明取自 IWorkbenchActionConstants 類別定義。
// 工作台工具列 ID public static final String TOOLBAR_FILE = "org.eclipse.ui.workbench.file" public static final String TOOLBAR_NAVIGATE = "org.eclipse.ui.workbench.navigate"; // 工作台工具列 ID。如果要在群組開始處新增項目, // 請使用 GROUP ID。如果要在群組的結尾處新增項目,請使用 EXT ID。 public static final String PIN_GROUP = "pin.group"; public static final String HISTORY_GROUP = "history.group"; public static final String NEW_GROUP = "new.group"; public static final String SAVE_GROUP = "save.group"; public static final String BUILD_GROUP = "build.group";
在最簡單的情況下,外掛程式可以在它自己的工具列中提供工具列項目。 舉例來說,提供給功能表的 readme 工具動作也會給定一個工具列路徑:
<action id="org_eclipse_ui_examples_readmetool_readmeAction" menubarPath="window/org_eclipse_ui_examples_readmetool/slot1" toolbarPath="readme" ...
既然沒有工作台工具列路徑或群組的參照,則 readme 動作就會出現在工具列上它們自己的群組中。 指定下列路徑反而會將檔案工具列中的項目置於儲存群組中:
... <action id="org_eclipse_ui_examples_readmetool_readmeAction" menubarPath="window/org_eclipse_ui_examples_readmetool/slot1" toolbarPath="org.eclipse.ui.workbench.file/save.group" ...
在其他外掛程式的工具列路徑中,可以參照 IWorkbenchActionConstants 中定義的路徑。
假設外掛程式想要它的工具列項目能與來自不同外掛程式的動作有更佳整合? 讓我們查看外部工具外掛程式 (org.eclipse.ui.externaltools) 如何整合它的動作與除錯器工具列。 除錯器 (org.eclipse.debug.ui) 的工具列動作定義如下:
<extension point="org.eclipse.ui.actionSets"> <actionSet label="%LaunchActionSet.label" visible="false" id="org.eclipse.debug.ui.launchActionSet"> ... <action toolbarPath="debug" id="org.eclipse.debug.internal.ui.actions.RunDropDownAction" hoverIcon="icons/full/ctool16/run_exc.png" class="org.eclipse.debug.internal.ui.actions.RunToolbarAction" disabledIcon="icons/full/dtool16/run_exc.png" icon="icons/full/etool16/run_exc.png" helpContextId="run_action_context" label="%RunDropDownAction.label" pulldown="true"> </action> ...
正如同 readme 工具一般,除錯器外掛程式會定義它自己的工具列路徑, 表示它的工具列項目將位於工作台上它們自己的工具列內。 外部工具外掛程式的作用為何?
<extension point="org.eclipse.ui.actionSets"> <actionSet id="org.eclipse.ui.externaltools.ExternalToolsSet" label="%ActionSet.externalTools" visible="true"> ... <action id="org.eclipse.ui.externaltools.ExternalToolMenuDelegateToolbar" definitionId= "org.eclipse.ui.externaltools.ExternalToolMenuDelegateToolbar" label="%Action.externalTools" toolbarPath="org.eclipse.debug.ui.launchActionSet/debug" disabledIcon="icons/full/dtool16/external_tools.png" icon="icons/full/etool16/external_tools.png" hoverIcon="icons/full/ctool16/external_tools.png" tooltip="%Action.externalToolsTip" pulldown="true" class="org.eclipse.ui.externaltools.internal.menu.ExternalToolMenuDelegate"> </action> </actionSet> </extension>
請注意,如何在工具列路徑中使用除錯器的動作集 ID。 在路徑中使用動作集 ID 表示工具列項目應該置於被參照的動作集所使用的工具列中。 在工具列群組中,項目係按照動作集 ID 來排序, 所以在我們的範例中,外部工具動作將出現在除錯器動作之後。
當新增至另一個動作集的工具列時,也可以定義新的群組。 如果外部工具外掛程式定義了它的 toolbarpath 作為 "org.eclipse.debug.ui.launchActionSet/external",則系統會為工具列上的動作建立新的群組。 如同功能表一般,工具列群組是以分隔字元來描述。
一般說來,藉由從 plugin.xml 衍生路徑名稱,來促成另一個外掛程式的功能表或工具列, 並不是一個好的做法,除非它已特別標示為可供用戶端使用。未來的外掛程式版本有可能可以變更路徑的名稱。兩個常用來將您的外掛程式動作集 ID 及路徑標示為目標的方法如下: