Добавление "операций" на панель "Проводника"
Следующим этапом в соответствии с первоначальной версией документа дизайна интерфейса пользователя будет добавление кнопок файловых операций (Copy to (Копировать в...), Move to (Переместить в...), Delete (Удалить) и Properties (Свойства объекта) на панель файлового менеджера. Открываем файл манифеста и в закладке Extensions создаем расширение для точки расширения "org.eclipse.ui.viewActions" при помощи мастера выбора точки расширения (см. рис. 1).
Для созданного элемента укажем идентификатор "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 (Свойства объекта). После запуска программы созданные команды будут доступны на панели проводника (см. рис. 2) и в (pull-down menu) меню панели проводника (см. рис. 3).
Контекстное меню
Для включения команд в контекстное меню требуется создать аналогичное расширение точки расширения "org.eclipse.ui.popupMenus" и зарегистрировать (привязать) меню к конкретному элементу управления.
Рис. 4. Контекстное (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" в файле манифеста, а динамически создаваемые команды будем добавлять до данной секции, чтобы привлечь внимание.
private void fillTreeViewerContextMenu(IMenuManager manager) {
manager.add(collapseAction);
manager.add(expandAction);
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
Рекомендуемые ресурсы
. Сайт проекта FileArranger, сайт
. FAQ How to create a context menu & add actions to the same?
сайт
Сергей Бердачук,
сайт
Для созданного элемента укажем идентификатор "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 (Свойства объекта). После запуска программы созданные команды будут доступны на панели проводника (см. рис. 2) и в (pull-down menu) меню панели проводника (см. рис. 3).
Контекстное меню
Для включения команд в контекстное меню требуется создать аналогичное расширение точки расширения "org.eclipse.ui.popupMenus" и зарегистрировать (привязать) меню к конкретному элементу управления.
Рис. 4. Контекстное (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" в файле манифеста, а динамически создаваемые команды будем добавлять до данной секции, чтобы привлечь внимание.
private void fillTreeViewerContextMenu(IMenuManager manager) {
manager.add(collapseAction);
manager.add(expandAction);
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
Рекомендуемые ресурсы
. Сайт проекта FileArranger, сайт
. FAQ How to create a context menu & add actions to the same?
сайт
Сергей Бердачук,
сайт
Компьютерная газета. Статья была опубликована в номере 01 за 2008 год в рубрике программирование