代码之家  ›  专栏  ›  技术社区  ›  Peter Walser

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

  •  3
  • Peter Walser  · 技术社区  · 17 年前

    我目前正在努力处理以下Eclipse RCP命令:

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

    我将它们用作工具栏中的命令贡献,但是当 handled

    为了进行测试,我使用了一种轮询机制来验证这些命令的状态是否真的根据当前的焦点元素而更改,我发现处理程序保持不变,但处理程序的“handled”状态会正确更改,从而导致命令的“handled”状态也会正确更改。

    这些状态更改都不会导致通知 (命令上也没有 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);
        }
    });
    

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

    编辑: 处理 处理 'state)根据哪个ui元素具有焦点而更改。但是,当此状态更改时,不会发出通知。 org.eclipse.core.commands.NotHandledException: There is no handler to execute for command

    3 回复  |  直到 17 年前
        1
  •  1
  •   Peter Walser    17 年前

    为剪切/复制/粘贴命令注册的处理程序是 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”状态的更改。

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

        2
  •  -1
  •   Aaron Digulla    17 年前

    您的问题是,您需要为任何不是文本的内容注册一个处理程序,因为Eclipse需要知道如何将当前选定的“内容”复制到剪贴板。这就是处理者的工作。 This article 在EclipseWiki中,您将了解如何创建和注册处理程序。

        3
  •  -1
  •   Eugene Yokota    17 年前

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

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

    这个 <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>
          ...
    
    推荐文章