PropertyTester的触发器评估

时间:2017-05-18 05:54:14

标签: eclipse-plugin e4

code from two years back必须升级到E4,现在一堆东西不再起作用了。其中一个是IEvaluationService如果这样使用:

<handler class="org.acme.PrintHandler" commandId="org.eclipse.ui.file.print">
  <activeWhen>
    <with variable="activePart">
      <test property="org.acme.printable" />
    </with>
  </activeWhen>
</handler>
IEvaluationService service = (IEvaluationService) PlatformUI.getWorkbench().getService(IEvaluationService.class);
service.requestEvaluation("org.acme.printable");

如何(重新)触发对PropertyTester的评估?由于E4实际上还没有准备好生产,我需要针对E3(兼容层)的解决方法。

Related question - 但此用户在E4中搜索等效内容,而我需要在E3中使用的内容。

有趣的是,如果我用<activeWhen>替换<enabledWhen>标签,它就可以了。在这种情况下,IEventBroker#postIEventBroker#send也可以。

这是similar question。该用户使用Eclipse 4.2 - 我用4.5,4.6和4.7测试了这个问题。

3 个答案:

答案 0 :(得分:0)

我将分享我的解决方法,这是不好的,并且在alles案例中不起作用。并且只有真正有效,因为在我的用例中我有一个IWorkbenchPart ISelectionProvider ...但也许它会帮助下一个人:

IWorkbenchPart activePart = // get active view or editor
ISelectionProvider selectionProvider = activePart.getSite().getSelectionProvider();
ISelection selection = selectionProvider.getSelection();
selectionProvider.setSelection(new StructuredSelection());
selectionProvider.setSelection(selection);

此代码仅重置选择,通常会触发PropertyTester。如果没有选择任何内容,我认为它不会起作用。

答案 1 :(得分:0)

答案 2 :(得分:0)

EvaluationService在E3兼容性层中与API兼容。但是E4中的实现完全不同,导致requestEvaluation的行为发生根本性的变化。

我能找到的最佳解决方案是手动停用并激活当前活动零件的所有上下文。这将导致内部重新评估,并在需要时重新呈现各个部分的所有UI元素。

一个人可能会说,这比要求评估非常特定的属性的效率低,正如EvaluationService应该做的那样。但是由于评估仅限于活动部件,因此不应产生过多的开销。而且它确实可以全局工作,因为不再需要特定的属性字符串。

此问题尚未涵盖的唯一用例可能是RCP应用程序的主工具栏。

/**
 * Triggers evaluation of all UI elements (buttons, etc.) of the active part.
 * Also causes test of all property testers of all opened parts implicitly.
 * Workaround of the broken <code>IEvaluationService.requestEvaluation</code>.
 */
public static void triggerUIElementsEvaluation() {
    try {
        final EPartService partService = PlatformUI.getWorkbench().getService(EPartService.class);
        final MPart activePart = partService.getActivePart();

        /* Toggle context of active part to trigger re-evaluation of its UI elements. */
        if (activePart != null) {
            activePart.getContext().deactivate();
            activePart.getContext().activateBranch();
        }
    } catch (IllegalStateException e) {
        /* Ignore "Application does not have an active window" exception to allow program to continue. */
    }
}