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

EclipseRCP:如何观察剪切/复制/粘贴命令的状态?,eclipse,menu,command,toolbar,rcp,Eclipse,Menu,Command,Toolbar,Rcp,我目前正在努力使用以下Eclipse RCP命令: org.eclipse.ui.edit.cut org.eclipse.ui.edit.copy org.eclipse.ui.edit.paste 我将它们用作工具栏中的命令贡献,但当这些命令的“handled”状态更改时,UIElements(工具栏项)不会更新 为了进行测试,我使用了轮询机制来验证这些命令的状态是否确实会根据当前聚焦的元素而改变,并且我发现处理程序保持不变,但处理程序的“已处理”状态会正确更改,从而导致命令的“已处理”

我目前正在努力使用以下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:没有可执行命令的处理程序

您的问题是,您需要为任何非文本的内容注册处理程序,因为eclipse需要知道如何复制当前选定的内容将“某物”添加到剪贴板。处理程序就是这样做的。在Eclipse wiki中,您将了解如何创建和注册处理程序。

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

中的
表达式
plugin.xml
和编程核心 表达式用于帮助确定 处理程序激活的范围。 例如,一个特定的窗口 特定的
外壳
,活动零件类型或 主动部分


...
...

为剪切/复制/粘贴命令注册的处理程序是
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()
方法,因此当焦点集中在此类小部件上时,处理程序将为
isHandled()
返回“true”

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

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


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

我感兴趣的是“已处理”状态。当焦点不在文本字段上时,所有三个命令都已启用,但未处理(已设置处理程序,但未处理)当通过按下工具栏按钮调用该命令时,它将导致“org.eclipse.core.commands.NotHandledException:没有要为命令执行的处理程序”当命令暂时不被处理时(例如,当焦点从文本字段更改为按钮时,则没有要剪切/复制/粘贴的内容),我完全可以,但在这种情况下,我希望得到通知,以便在未处理命令的情况下禁用toobar项。我当然可以为所述命令注册一个虚拟处理程序,以便在尝试执行命令时至少不会引发异常,但我宁愿禁用工具栏/菜单项。这很奇怪。在这种情况下,命令框架应该ld已经为您禁用了按钮(这就是条件)。启用处理程序是有效的,但不是“已处理”。“activeWhen”条件是可选的,如果未指定,则处理程序将始终处于活动状态。问题仍然是未通知处理程序中的更改,并且无法观察剪切/复制/粘贴的特定处理程序。
 public final boolean isHandled() {
     return getMethodToExecute() != null;
 }