Eclipse RCP:如何观察剪切/复制/粘贴命令的状态?

时间:2009-05-26 09:59:15

标签: eclipse menu command toolbar rcp

我目前正在努力使用以下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

3 个答案:

答案 0 :(得分:1)

为剪切/复制/粘贴命令注册的处理程序是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' {1}}。

然而,这个处理程序不知道当前焦点控件何时发生变化(我认为甚至没有办法在Display上观察到这一点),因此无法通知其动态“isHandled”状态的变化。 / p>

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

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

答案 1 :(得分:-1)

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

答案 2 :(得分:-1)

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

请参阅Platform Plug-in Developer Guide > Programmer's Guide > Plugging into the workbench > Basic workbench extension points using commands > Handlers

  

中的<activeWhen/>表达式   plugin.xml和程序化核心   表达式用于帮助确定   处理程序激活的范围。   例如,一个特定的窗口,a   特定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>
      ...