3

我目前正在努力使用以下 Eclipse RCP 命令:

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

我将它们用作工具栏中的命令贡献,但是当handled这些命令的“”状态发生变化时,UIElements(工具栏项)不会更新。

为了测试,我使用轮询机制来验证这些命令的状态是否真的根据当前关注的元素而改变,我发现处理程序保持不变,但处理程序的“已处理”状态正确更改,导致命令“已处理”状态也可以正确更改。

唯一的问题是,这些状态更改中的任何一个都不会导致通知(无论是在命令的ICommandListener还是在处理程序的IHandlerListener),所以 UIElements 不会得到更新。

下面是一些用于观察命令状态的测试代码:

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);
    }
});

我是否遗漏了什么,或者这是剪切/复制/粘贴处理程序实现中的错误?有什么见解吗?

编辑: 命令一直处于启用状态,并且处理程序永远不会交换,只有处理程序的“ handled”状态(以及命令的“ handled”状态)根据哪个 ui 元素具有焦点而变化。但是,当此状态更改时没有通知。这会导致工具栏按钮始终处于启用状态,按下它们会导致org.eclipse.core.commands.NotHandledException: There is no handler to execute for command.

4

3 回答 3

1

为剪切/复制/粘贴命令注册的处理程序是org.eclipse.ui.internal.handlers.WidgetMethodHandler. 此处理程序检查是否在当前显示器的焦点​​控件上声明了给定方法。执行时,该处理程序将使用反射调用该方法。

来自 WidgetMethodHandler 的片段:

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

getMethodToExecute()使用 定位当前焦点控件Display.getCurrent().getFocusControl(),然后检查是否在其上声明了给定的触发方法。

诸如org.eclipse.swt.widgets.Texthavecut()和方法之类的小部件copy()paste()因此当焦点位于此类小部件上时,处理程序将为isHandled().

但是,此处理程序不知道当前焦点控件何时更改(我认为甚至没有办法在显示器上观察到这一点),因此无法通知其动态“isHandled”状态的更改。

这导致剪切/复制/粘贴命令适用于弹出菜单,但在工具栏中使用时会出现很大问题,因为当处理程序没有通知时,它们的 UI 元素无法正确更新。

这让我要么不使用工具栏中的这些命令,要么使用轮询机制来更新 ui 元素(这也很糟糕且容易出错)。:-(

于 2009-06-08T09:10:37.797 回答
-1

您的问题是您需要为非文本的任何内容注册处理程序,因为 Eclipse 需要知道如何将当前选择的“某事”复制到剪贴板。这就是处理程序所做的。Eclipse wiki 中的这篇文章将帮助您开始如何创建和注册处理程序。

于 2009-05-26T10:12:45.447 回答
-1

我可能是错的,但问题的根源是处理程序始终处于启用状态。

请参阅平台插件开发人员指南 > 程序员指南 > 插入工作台 > 使用命令的基本工作台扩展点 > 处理程序

<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>
      ...
于 2009-06-08T01:49:36.853 回答