Eclipse RCP: как наблюдать состояния команд вырезать / копировать / вставить? - PullRequest
3 голосов
/ 26 мая 2009

В настоящее время я борюсь со следующими командами Eclipse RCP:

  • org.eclipse.ui.edit.cut
  • org.eclipse.ui.edit.copy
  • org.eclipse.ui.edit.paste

Я использую их в качестве вкладов команд на панели инструментов, но элементы UIE (элементы панели инструментов) не обновляются при изменении состояния handled этих команд.

Для тестирования я использовал механизм опроса, чтобы убедиться, что состояние этих команд действительно изменяется в зависимости от текущего фокусированного элемента, и я обнаружил, что обработчик остается тем же, но состояние обработанного обработчика изменяется правильно, вызывая команды состояние «обработано», чтобы также измениться должным образом.

Единственная проблема заключается в том, что ни одно из этих изменений состояния не вызывает уведомление (ни у ICommandListener команды, ни у IHandlerListener обработчика), поэтому элементы UIE не будут обновляться .

Вот некоторый тестовый код для наблюдения за состоянием Команды:

ICommandService commandService = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);

final String commandId="org.eclipse.ui.edit.copy";
Command command = commandService.getCommand(commandId);
command.addCommandListener(new ICommandListener() {

    public void commandChanged (CommandEvent commandEvent) {
        System.out.println(">> Command changed: " + commandId);
    }
});

Я что-то упустил, или это ошибка в реализациях обработчика вырезки / копирования / вставки? Есть идеи?

EDIT: Команды включены все время, и обработчик никогда не изменяется, изменяется только состояние «handled» обработчика (и, следовательно, также состояние «handled» команды) в зависимости от того, какой элемент пользовательского интерфейса имеет фокус. Однако при изменении этого состояния уведомления нет. Это приводит к тому, что кнопки панели инструментов всегда включены, и нажатие на них вызовет org.eclipse.core.commands.NotHandledException: There is no handler to execute for command.

Ответы [ 3 ]

1 голос
/ 08 июня 2009

Обработчик, который зарегистрирован для команд вырезания / копирования / вставки, org.eclipse.ui.internal.handlers.WidgetMethodHandler. Этот обработчик проверяет, объявлен ли данный метод в элементе управления фокусом текущего дисплея. При выполнении этот обработчик вызовет метод с использованием отражения.

Фрагмент от WidgetMethodHandler:

 public final boolean isHandled() {
     return getMethodToExecute() != null;
 }

getMethodToExecute() найдет текущий элемент управления фокусом, используя Display.getCurrent().getFocusControl(), а затем проверит, объявлен ли на нем данный метод запуска.

Виджеты, такие как org.eclipse.swt.widgets.Text, имеют методы cut(), copy() и paste(), поэтому, когда фокус находится на таком виджете, обработчик вернет 'true' для isHandled().

Этот обработчик, однако, не знает, когда изменяется текущий элемент управления фокусом (я думаю, что даже нет способа наблюдать это на дисплее), и поэтому не может уведомлять об изменениях в его динамическом состоянии isHandled.

Это приводит к тому, что команды вырезать / копировать / вставить подходят для всплывающих меню, но они довольно проблематичны при использовании на панелях инструментов, поскольку их элементы пользовательского интерфейса не могут быть обновлены должным образом, когда обработчик не уведомляет.

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

0 голосов
/ 08 июня 2009

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

См. Руководство разработчика плагина платформы> Руководство программиста> Подключение к рабочей среде> Основные точки расширения рабочей среды с помощью команд> Обработчики .

Выражения <activeWhen/> в plugin.xml и программное ядро выражения используются, чтобы помочь определить область действия обработчиков активации. Например, конкретное окно, специфический Shell, тип активной части или активная часть.

   <extension
         point="org.eclipse.ui.handlers">
      ...
      <handler
            class="org.eclipse.ui.examples.contributions.view.SwapInfoHandler"
            commandId="org.eclipse.ui.examples.contributions.view.swap">
         <activeWhen>
            <reference
                  definitionId="org.eclipse.ui.examples.contributions.view.inView">
            </reference>
         </activeWhen>
         <enabledWhen>
            <count
                  value="2">
            </count>
         </enabledWhen>
      </handler>
      ...
0 голосов
/ 26 мая 2009

Ваша проблема в том, что вам нужно зарегистрировать обработчик для всего, что не является текстом, потому что Eclipse должен знать, как скопировать выбранное в данный момент «что-то» в буфер обмена. Это то, что делает обработчик. Эта статья в вики Eclipse поможет вам создать и зарегистрировать обработчик.

...