Мы рассмотрели много дополнений действий, задающих путь к расположению действия. Рассмотрим подробнее эти пути.
Знакомство с путями меню начнем с меню Справка рабочей среды.
Место для вставки новых пунктов меню задается с помощью именованных групп. Именованные группы - это заготовки или заменители, позволяющие вставить элементы меню в определенные места в главном или выпадающем меню.
Рабочая среда определяет имена всех групп меню в классах IWorkbenchActionConstants и IIDEActionConstants. Используются два разных класса, так как относящиеся к ресурсам элементы меню выделяются из общей рабочей среды. Для каждого меню рабочей среды именованные группы размещаются в меню там, где предполагается вставка новых действий модулями.
Ниже приведено описание меню Справка из определения класса IWorkbenchActionConstants.
Standard Help menu actions Start group - HELP_START - "start" End group - HELP_END - "end"
Стандартное меню Справка рабочей среды определяет именованную группу "start," после которой следует именованная группа "end,". Определение двух групп предоставляет модулям больше контроль над расположением добавленных пунктов в меню. При определении меню можно указать столько заготовок, сколько необходимо. Добавление большего числа заготовок предоставляет модулям больший выбор при размещении своих дополнений относительно имеющихся дополнений.
Модули, добавляющие пункт в меню Справка, могут использовать имена этих групп для определения расположения своих элементов меню. Например, модуль памяток добавляет набор действий, содержащий пункт меню "Памятки...". Ниже приведен фрагмент кода из файла plugin.xml модуля org.eclipse.ui.cheatsheets.
<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."
В некоторых пунктах содержатся вложенные подменю. В таких случаях используются более длинные пути. Если в меню Справка определено подменю с именем "submenu" с именованной группой "submenuStart", то полный путь меню для действия в новом подменю будет выглядеть так: "help/submenu/submenuStart."
Приведенный выше пример демонстрирует прием для экспорта строк, отображающихся в пользовательском интерфейсе. Экспортированные строки используются для перевода пользовательского интерфейса модуля на другие языки. Можно экспортировать строки файла plugin.xml , заменив строку с ключом (%CHEAT_SHEETS_MENU) и создав записи в файле plugin.properties следующего вида:
CHEAT_SHEETS_MENU = Памятки...
Файл 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>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/org_eclipse_ui_examples_readmetool/slot1."
Другие модули могут добавить собственные элементы к нашему меню, используя этот же путь (или же другие заготовки).
В примере с утилитой readme атрибут separator служит для идентификации имен групп. Благодаря этому между данными группами появится линия-разделитель, когда они будут содержать свои элементы. Вместо этого мы могли использовать атрибут groupMarker для определения именных групп без отображения линии-разделителя в меню между группами.
Пути панели инструментов работают практически также, как и пути меню.
Панель инструментов рабочей среды состоит из панелей инструментов, добавленных различными модулями, включая и саму рабочую среду. В каждой панели инструментов есть именованные группы или заготовки, которые можно использовать для вставки новых элементов панели инструментов.
Ниже приведено описание панелей инструментов рабочей среды из определения класса IWorkbenchActionConstants.
// ИД панели инструментов рабочей среды public static final String TOOLBAR_FILE = "org.eclipse.ui.workbench.file" public static final String TOOLBAR_NAVIGATE = "org.eclipse.ui.workbench.navigate"; // ИД групп панели инструментов рабочей среды. Для добавления элемента в начало // группы используйте ИД GROUP. Для добавления элемента в конец группы используйте ИД EXT. 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 отображаются в собственной группе на панели инструментов. Использование вместо этого приведенного ниже пути позволит поместить элемент в панели инструментов файла в группе save:
... <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>
Обратите внимание на использование ИД набора действий отладчика в пути панели инструментов. Использование ИД набора действий в пути означает, что элемент панели инструментов будет помещен в панель инструментов, используемую этим набором действий. В группе панели инструментов элементы упорядочиваются по ИД набора действий, таким образом, для нашего примера действие внешних инструментов отобразится после действий отладчика.
При добавлении панели инструментов набора действий можно также задать новые группы. Если модуль внешних инструментов задает свой toolbarpath в виде "org.eclipse.debug.ui.launchActionSet/external", будет создана новая группа для действия в панели инструментов. Также как и в меню, группы панелей инструментов отделены разделителями.
Обычно не следует вносить дополнения в меню или панель инструментов другого модуля, используя путь из plugin.xml если только он явно не помечен как доступный для клиентов. Есть вероятность, то будущая версия модуля может изменить имена путей. Есть два общепринятых способа пометить ИД и пути наборов действий: