BERDAFLEX Software Systems
Главная > Eclipse > Книги > Eclipse RCP. Файловый менеджер

13. Добавление «операций» на панель «Проводника»

ВебвизорСледующим этапом, в соответствии с первоначальной версией документа дизайна интерфейса пользователя, будет добавление кнопок файловых операций («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) панели проводника

Кнопки команд (toolbar buttons) панели проводника

Рисунок 4.38. Меню (pull-down menu) панели проводника

Меню (pull-down menu) панели проводника

13.1. Контекстное меню

Для включения команд в контекстное меню требуется создать аналогичное расширение точки расширения "org.eclipse.ui.popupMenus" и зарегистрировать (привязать) меню к конкретному элементу управления.

Рисунок 4.39. Контекстное (popup menu) меню панели проводника

Контекстное (popup menu) меню панели проводника

13.1.1. Регистрация контекстного меню

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" в файле манифеста, а динамически создаваемые команды будем добавлять до данной секции, чтобы привлечь внимание.

13.2. Рекомендуемые ресурсы

Rambler's Top100 Рейтинг@Mail.ru