Следующим этапом, в соответствии с первоначальной версией документа дизайна интерфейса пользователя, будет добавление кнопок файловых операций («Copy to (Копировать в ...)», «Move to (Переместить в ...)», «Delete (Удалить)» и «Properties (Свойства объекта)» ) на панель файлового менеджера. Открываем файл манифеста и в закладке «Extensions» создаем расширение для точки расширения «org.eclipse.ui.viewActions» при помощи мастера выбора точки расширения см. рисунок:
Рисунок 4.36. Мастер выбора точки расширения
Для созданного элемента укажем идентификатор «id» и идентификатор «targetID» панели (View) к которой будем привязывать действия. Выбрав созданный элемент, создадим действие (Action), и с помощью мастера создадим класс с реализацией интерфейса «org.eclipse.ui.IViewActionDelegate».
На данном этапе не будем реализовывать непосредственно операции копирования и т.д.. Для тестирования воспользуемся просто отображением диалогового окна с описанием вызванной команды. Код реализации для операции копирования примет вид:
package com.berdaflex.filearranger.actions; . . . public class CopyAction implements IViewActionDelegate { public IViewPart view; /** * Конструктор нового класса CopyAction. */ public CopyAction() { super(); } public void init(IViewPart view) { this.view = view; } public void run(IAction action) { MessageDialog.openInformation(view.getSite().getShell(), "File manager", "Copy action executed"); } public void selectionChanged(IAction action, ISelection selection) { // TODO Auto-generated method stub } }
Пример сформированного кода регистрации операции копирования в панель кнопок быстрого доступа проводника и меню данной панели.
<extension point="org.eclipse.ui.viewActions"> <viewContribution id="com.berdaflex.filearranger.explorerViewContribution" targetID="com.berdaflex.filearranger.views.ExplorerView"> . . . helpContextId="com.berdaflex.filearranger.copy_action_context" icon="$nl$/icons/obj16/file_copy.gif" id="com.berdaflex.filearranger.copyAction" label="%actions.copyAction" menubarPath="additions" toolbarPath="additions" tooltip="%actions.copyActionTooltip"> </action> </viewContribution> </extension>
Аналогично пропишем команды «Move to (Переместить в ...)», «Delete (Удалить)» и «Properties (Свойства объекта)».
После запуска программы созданные команды будут доступны на панели проводника и в (pull-down menu) меню панели проводника, см. рисунок:
Рисунок 4.37. Кнопки команд (toolbar buttons) панели проводника
Рисунок 4.38. Меню (pull-down menu) панели проводника
Для включения команд в контекстное меню требуется создать аналогичное расширение точки расширения "org.eclipse.ui.popupMenus" и зарегистрировать (привязать) меню к конкретному элементу управления.
Рисунок 4.39. Контекстное (popup menu) меню панели проводника
public void createPartControl(Composite parent) { . . . //добавляем регистрацию контекстных меню hookContextMenu(); } . . . private void hookContextMenu() { // tree viewer context menu MenuManager treeViewerMenuMgr = new MenuManager("#PopupMenu"); treeViewerMenuMgr.setRemoveAllWhenShown(true); treeViewerMenuMgr.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager manager) { ExplorerView.this.fillTreeViewerContextMenu(manager); } }); Menu ttreeViewerPopupMenu = treeViewerMenuMgr .createContextMenu(vfsExplorerComposite.getTreeViewer() .getControl()); vfsExplorerComposite.getTreeViewer().getControl().setMenu( ttreeViewerPopupMenu); getSite().registerContextMenu(treeViewerMenuMgr, vfsExplorerComposite.getTreeViewer()); // table viewer context menu . . . } . . . /* * Добавляем специфичные для панели каталогов команды. */ private void fillTreeViewerContextMenu(IMenuManager manager) { . . . manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); }
Обращаем внимание на установку свойства RemoveAllWhenShow в значение true, что позволяет динамически регенерировать контекстное меню при вызове. Еще одна интересная деталь в возможности создавать команды (Actions) динамически, и в зависимости от текущего контекста управлять их статусом и поведением. Описанные ранее команды будут группироваться начиная с секции IworkbenchActionConstants.MB_ADDITIONS, так как мы указали menubarPath="additions" в файле манифеста, а динамически создаваемые команды будем добавлять до данной секции, чтобы привлечь внимание.
FAQ How to create a context menu & add actions to the same? http://wiki.eclipse.org/index.php/FAQ_How_to_create_a_context_menu_%26_add_actions_to_the_same%3F