Меню и действия Eclipse RCP: настройка или код? - PullRequest
12 голосов
/ 19 января 2011

Это общий вопрос, но моя текущая проблема связана с обработкой меню.

В обычном плагине с действиями для добавления меню вы должны настроить ActionSets и т. Д. В конфигурации plugin.xml.Это, очевидно, разумно.

Я работаю над приложением RCP (на самом деле RAP), и мне интересно, стоит ли прилагать усилия для настройки всего через plugin.xml.Мой плагин не должен взаимодействовать с другими неизвестными плагинами, поэтому, теоретически, у меня есть контроль.Я могу добавлять меню и действия программным способом.

Я пытался настроить меню, которое содержит подменю.Я попытался определить ActionSets и связать один внутри другого, но безуспешно.Некоторые элементы необходимо отключить в зависимости от роли пользователя.

Полагаю, я мог бы закодировать весь лот за несколько минут, но не уверен, что это соответствует затмению 'ethos'.

Какие мнения есть?Приложение станет довольно большим, поэтому я хотел бы получить подход с самого начала.Возможно, кто-то может указать мне пример настройки вложенного меню: -)

Ответы [ 4 ]

25 голосов
/ 25 мая 2011

Мое мнение таково, что реализация plugin.xml - это путь.

Мои две основные причины использования этого метода:

  • Действительно легко перенастроить и реорганизовать меню и кнопки без написания кода Java.
  • Очень четкая иерархическая визуализация деревьев меню.

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

Вы можете вставить это в свой файл plugin.xml:

<extension
         name="Main Menu Contributions"
         point="org.eclipse.ui.menus">
 <menuContribution
        allPopups="false"
        locationURI="menu:org.eclipse.ui.main.menu">
     <menu
           id="fileMenu"
           label="File">
        <command
              commandId="org.eclipse.ui.file.exit"
              label="Exit"
              style="push">
        </command>
     </menu>
     <menu
           label="Edit">
        <command
              commandId="org.eclipse.ui.edit.selectAll"
              label="Select All"
              style="push">
        </command>
        <menu
              label="Submenu">
           <command
                 commandId="org.eclipse.ui.edit.selectAll"
                 label="Select All Submenu"
                 style="push">
           </command>
           <command
                 commandId="org.eclipse.ui.edit.delete"
                 label="Delete submenu"
                 style="push">
           </command>
        </menu>
     </menu>
  </menuContribution>
</extension>

Для активации / деактивации меню вы должны использовать Core Expressionsвключить / отключить обработчики команд.Если к команде не подключены активные обработчики, она будет отключена.Таким образом, пункт меню, который вызывает эту команду, также будет отключен.

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

Создание кнопки на панели инструментов (plugin.xml):

   <extension
         name="View Toolbar Contributions"
         point="org.eclipse.ui.menus">
      <menuContribution
            allPopups="false"
            locationURI="toolbar:myapp.views.MyView">
       <command
             commandId="myapp.commands.PauseSound"
             icon=""
             label="Pause Playback Sound"
             style="push"
             tooltip="Pause">
       </command>
     </menuContribution>
</extension>

Создание команды (plugin.xml):

<extension
         id="myapp.commands.PauseSound"
         name="Pause sound command"
         point="org.eclipse.ui.commands">
      <command
            id="myapp.commands.PauseSound"
            name="Pause Sound">
      </command>
</extension> 

Создание обработчика команды (plugin.xml):

<extension
         point="org.eclipse.ui.handlers">
      <handler
            commandId="myapp.commands.PauseSound">
         <activeWhen>
            <with
                  variable="myapp.commands.sourceprovider.active">
               <or>
                  <equals
                        value="PLAYING">
                  </equals>
                  <equals
                        value="PAUSED">
                  </equals>
               </or>
            </with>
         </activeWhen>
         <class
               class="myapp.rcp.commands.toolbar.PausePlayback">
         </class>
      </handler>
</extension> 

Создание переменной состояния для команды (plugin.xml):

   <extension
         point="org.eclipse.ui.services">
      <sourceProvider
            provider="myapp.commands.sourceprovider.CommandState">
         <variable
               name="myapp.commands.sourceprovider.active"
               priorityLevel="workbench">
         </variable>
      </sourceProvider>
   </extension>

Реализациякласс, который изменяет состояние переменной:

public class CommandState extends AbstractSourceProvider {
    public final static String STATE = "myapp.commands.sourceprovider.active";
    public final static String STOPPED = "STOPPED";
    public final static String PLAYING = "PLAYING";
    public final static String PAUSED = "PAUSED";
    public final static String NOT_LOADED = "NOT_LOADED";

enum State {
        NOT_LOADED, PLAYING, PAUSED, STOPPED
    };
    private State curState = State.NOT_LOADED;

    @Override
    public void dispose() {
    }

    @Override
    public String[] getProvidedSourceNames() {
        return new String[] { STATE };
    }

    // You cannot return NULL
    @SuppressWarnings("unchecked")
    @Override
    public Map getCurrentState() {
        Map map = new HashMap(1);
        if (curState == State.PLAYING)
            map.put(STATE, PLAYING);
        else if (curState == State.STOPPED)
            map.put(STATE, STOPPED);
        else if (curState == State.PAUSED)
            map.put(STATE, PAUSED);

        return map;
    }

    public void setPlaying() {
        fireSourceChanged(ISources.WORKBENCH, STATE, PLAYING);
    }

    public void setPaused() {
        fireSourceChanged(ISources.WORKBENCH, STATE, PAUSED);
    }

    public void setStopped() {
        fireSourceChanged(ISources.WORKBENCH, STATE, STOPPED);
    }

    public void setNotLoaded() {
        fireSourceChanged(ISources.WORKBENCH, STATE, NOT_LOADED);
    }

}

Более подробную информацию о том, как реализовать эти функции, можно найти в следующих местах:

1 голос
/ 17 октября 2012

Для Eclipse есть два различных способа внести свой вклад в Workbench: Действия и Команды.

Я определенно рекомендую Команды как более новые и более продвинутые, чем Действия.Недостатки действий, как указано здесь (1):

  • Пользовательский интерфейс и обработка всегда связаны.Невозможно разделить друг друга
  • Хотя действия могут быть добавлены в разные части рабочей среды (всплывающее меню / панель инструментов), все они были разными точками расширения, поэтому в итоге вы дублируете XML внесколько мест.Хуже всего то, что не все точки расширения ожидают одинаковую конфигурацию.
  • Указание действий в нескольких местах - это кошмар обслуживания.Если вам нужно изменить значок действия, вам нужно изменить его во всех местах.
  • Другая проблема с дублированием действий в файле plugin.xml заключается в том, что в экземпляре одного и того же действия будет создано несколькопамять

    (1) Действия против команд

0 голосов
/ 03 мая 2013

Для добавления действий в RCP вы также можете использовать ApplicationActinBarAcvisor. Это проще, чем вышеупомянутое решение. В этом вам просто нужно сначала объявить действие как объект IWorkbenchAction, а затем в методе «protected void makeActions (окно IWorkbenchWindow)» вы можете зарегистрировать его. И последний шаг - добавить его в меню. Следующий код поможет вам.

1. Сначала объявите действие: -

private IWorkbenchAction newAction

2.Регистрационное действие: -

protected void makeActions(IWorkbenchWindow window) {
newAction = ActionFactory.NEW_WIZARD_DROP_DOWN.create(window);
    register(newAction);
    newAction.setText("New");

3.Последний шаг - добавить действие в меню: -

MenuManager filemenu = new MenuManager("&File", "file");
    filemenu.add(newAction);

Вы также можете добавить действие на панели инструментов следующим образом: -

protected void fillCoolBar(ICoolBarManager coolBar) {
    IToolBarManager toolbar = new ToolBarManager(coolBar.getStyle());
    coolBar.add(toolbar);
    toolbar.add(newAction);
0 голосов
/ 18 марта 2011

Если вы пишете приложение RCP, рекомендуется создать заполнители в вашем ActionBarAdvisor. Хотя это будет определять основную структуру ваших меню и панелей инструментов, вы можете расширять menuContributions и использовать команды для добавления фактических пунктов меню / инструментов.

...