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

3. Добавление панели (View)

ВебвизорКроме стандартных действий (Actions) можно создавать и свои (custom) действия. Создадим действие, по которому будут добавляться панели (Views) разрабатываемого проводника файлов. Для вызова данного действия добавим кнопку быстрого запуска, а так же пункт системного меню. В результате мы должны получить показанное на рисунке приложение.

Рисунок 4.5. Аранжировщик файлов, добавление панелей

Аранжировщик файлов, добавление панелей

Для создания панели, в редакторе манифеста откроем закладку расширений (extensions) и добавим точку расширения org.eclipse.ui.views .

Для удобства группировки панелей по функциональности, добавим категорию “File Management Category” панели, которая будет связана с разрабатываемой панелью.

Для создания собственной панели требуется создать класс, реализующий интерфейс IViewPart . На практике обычно наследуют класс ViewPart , который включает базовую реализацию интерфейса IViewPart, а не реализовывать все методы с нуля.

Рисунок 4.6. Диаграмма иерархии классов ExplorerView

Диаграмма иерархии классов ExplorerView

Редактор манифеста автоматизирует операцию по вызову мастеров для создания требуемых классов. Добавим расширение панели (view) в точку расширения org.eclipse.ui.views .

Рисунок 4.7. Редактор манифеста. Закладка Extensions

Редактор манифеста. Закладка Extensions

Введем наименование панели и нажатием на гиперлинк class* вызовем мастер генерации пустой реализации класса панели ExplorerView. В сгенерированный код добавим статический идентификатор панели (ID), который будем использовать для идентификации панели в дальнейшем (идентификатор должен совпадать с объявленным в файле манифеста идентификатором панели).

public class ExplorerView extends ViewPart {

  public static final String ID = "com.berdaflex.filearranger.ExplorerView";

  public ExplorerView() {
    super();
    // TODO Auto-generated constructor stub
  }

  public void createPartControl(Composite parent) {
    // TODO Auto-generated method stub
  }

  public void setFocus() {
    // TODO Auto-generated method stub
  }
}

Для более быстрого визуального восприятия типа панели свяжем ее с графическим значком (icon). Для этого в редакторе манифеста, нажав кнопку “ Browse ” рядом с атрибутом icon и выберем значок из списка доступных картинок.

Блок кода (закладка plugin.xml ) объявления расширения в файле манифеста (редактор манифеста ассоциирован с файлами MANIFEST.MF и plugin.xml, и может быть вызван двойным кликом на один из указанных файлов) будет иметь вид:

. . .
<extension
      point="org.eclipse.ui.views">
   <category
         id="com.berdaflex.filearranger"
         name="File Management Category"/>
   <view
         allowMultiple="true"
         category="com.berdaflex.filearranger"
         class="com.berdaflex.filearranger.views.ExplorerView"
         icon="icons/obj16/explorerview.gif"
         id="com.berdaflex.filearranger.ExplorerView"
         name="Explorer View"/>
</extension>

В данном определении расширения указана категория панели (атрибут category ), которая содержит идентификатор и имя (атрибуты id и name). Далее идет определение атрибутов панели:

Атрибуты идентификатор, имя и наименование класса (атрибуты id, name и class ) являются обязательными (в редакторе манифеста обязательные атрибуты помечены звездочкой).

Добавим в класс проекции FileArrangerPerspective реализацию метода createInitialLayout для размещения панелей в соответствии с задуманным макетом.

public class FileArrangerPerspective implements IPerspectiveFactory {
  public void createInitialLayout(IPageLayout layout) {
    String editorArea = layout.getEditorArea();
    layout.setEditorAreaVisible(false);                    (1)
    IFolderLayout folder = layout.createFolder("Navigator",(2)
        IPageLayout.TOP, 0.5f, editorArea);
    folder.addPlaceholder(ExplorerView.ID + ":*");         (3)
    folder.addView(ExplorerView.ID);                       (4)
  }
}
1

Скрываем область редакторов.

2

Для группировки панелей в папки с вкладками создаем папку размещения панелей реализующую интерфейс IFolderLayout.

3

Для размещения нескольких экземпляров панелей одного типа используется формат вида primaryId [':' secondaryId] . Для поддержки такого режима панель должна создаваться с флагом allowMultiple="true" . Как для первичного, так и для вторичного идентификатора допустимо применять регулярные выражения (“*” – означает любую подстроку, “?” – одиночный символ).

4

Создаем один экземпляр панели.

Для выполнения непосредственной работы по созданию панели создадим действие (Action). Для этого, создадим класс NewExplorerViewAction , наследник класса Action .

public class NewExplorerViewAction extends Action {

  private final IWorkbenchWindow window;

  private final String viewId;

  private int instanceNum = 0;

  public static final String ID = "com.berdaflex.filearranger.actions.NewExplorerViewAction";

  public static final String IMAGE_KEY = "/icons/obj16/explorerview.gif";

  public NewExplorerViewAction(IWorkbenchWindow window, String label,
      String viewId) {

    this.window = window;
    this.viewId = viewId;
    setText(label);
    // The id is used to refer to the action in a menu or toolbar
    setId(NewExplorerViewAction.ID);
    // Associate the action with a pre-defined command, to allow key
    // bindings.
    setActionDefinitionId(NewExplorerViewAction.ID);
    setImageDescriptor(Activator
        .getImageDescriptor(NewExplorerViewAction.IMAGE_KEY));
  }

  public void run() {
    if (window != null) {
      try {
        window.getActivePage().showView(viewId,
                Integer.toString(instanceNum++),
                IWorkbenchPage.VIEW_ACTIVATE);
      } catch (PartInitException e) {
        MessageDialog.openError(window.getShell(), "Error",
                "Error opening view:" + e.getMessage());
      }
    }
  }
}

В методе run() для активного окна создается новый экземпляр панели. Тип панели определяется идентификатором vieweId (будет указан при инициализации действия). Для дополнительной идентификации панелей применяется внутренний счетчик instanceNum экземпляров.

Непосредственно привязка действия к меню и панели быстрого запуска выполняется в классе ApplicationActionBarAdvisor.

public class ApplicationActionBarAdvisor extends ActionBarAdvisor {

. . .

  // custom actions
  private NewExplorerViewAction newExplorerAction;

  protected void makeActions(IWorkbenchWindow window) {
    . . .

    newExplorerAction = new NewExplorerViewAction(window, "New Explorer",
        ExplorerView.ID);
    register(newExplorerAction);
  }
  . . .

  private IContributionItem createFileMenu() {
    MenuManager menu = new MenuManager("&File",
        IWorkbenchActionConstants.M_FILE); //$NON-NLS-1$
    menu.add(new GroupMarker(IWorkbenchActionConstants.FILE_START));
    menu.add(new GroupMarker(IWorkbenchActionConstants.NEW_EXT));
    menu.add(new Separator());
    menu.add(newExplorerAction);
    menu.add(new GroupMarker(IWorkbenchActionConstants.FILE_END));
    menu.add(new Separator());
    menu.add(quitAction);
    return menu;
  }
  . . .

  protected void fillCoolBar(ICoolBarManager coolBar) {
    IToolBarManager toolbar = new ToolBarManager(SWT.FLAT | SWT.RIGHT);
    coolBar.add(new ToolBarContributionItem(toolbar, "main"));
    toolbar.add(newExplorerAction);
  }

  public void dispose() {
    . . .
    newExplorerAction = null;
    super.dispose();
  }
}

Рисунок 4.8. Действие "New Explorer" в меню

Действие "New Explorer" в меню

Рисунок 4.9. Действие "New Explorer" в панели быстрого запуска

Действие "New Explorer" в панели быстрого запуска

В результате, в меню и панель быстрого запуска будут добавлено действие по которому в текущее активное окно будут последовательно добавляться панели разрабатываемого проводника файлов.

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