触发 PropertyTester 评估 [英] Trigger evaluation of PropertyTester

查看:22
本文介绍了触发 PropertyTester 评估的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

两年前的代码必须是升级到E4,现在一堆东西都不能用了.其中之一是 IEvaluationService 如果像这样使用:

The code from two years back had to be upgraded to E4, and now a bunch of stuff does not work anymore. One of these is the IEvaluationService if used like this:

<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(兼容层)的解决方法.

How do I (re)trigger the evaluation of a PropertyTester? Since E4 is really not even close to being production ready, I need a workaround for E3 (compatibility layer).

相关问题 - 但该用户正在 E4 中搜索等价物,而我需要在 E3 中工作的.

Related question - but this user was searching for the equivalent in E4, while I need one that works in E3.

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

Funnily enough, if I replace the <activeWhen> tags with <enabledWhen> it works. In that case IEventBroker#post and IEventBroker#send work, too.

这是一个类似问题.该用户使用 Eclipse 4.2 - 我测试了 4.5、4.6 和 4.7 的问题.

This is a similar question. That user used Eclipse 4.2 - I tested the problem with 4.5, 4.6 and 4.7.

推荐答案

EvaluationService 在 E3 兼容层兼容 API.但是 E4 中的实现完全不同,导致 requestEvaluation 的行为根本不同.

The EvaluationService is API compatible in the E3 Compatibility Layer. But the implementation in E4 is completely different, causing the behaviour of requestEvaluation to be fundamentally different.

我能找到的这个问题的最佳解决方案是手动停用和激活当前活动部件的所有上下文.这会导致内部重新评估,并在需要时重新渲染各个部分的所有 UI 元素.

The best solution to this problem I could find is to manually deactivate and activate all contexts of currently active parts. This causes internally to re-evaluate and, when required, re-render all UI elements of the respective parts.

有人可能会争辩说,这比请求评估非常具体的属性效率低,因为评估服务应该这样做.但由于评估仅限于活动部分,因此不应产生太多开销.而且它确实在全球范围内工作,因为不再需要特定的属性字符串.

One could argue this is less efficient than requesting the evaluation of a very specific property, as the EvaluationService is supposed to do. But since the evaluation is limited to active parts only, it should not create too much overhead. And it does work globally, as no specific property string is required anymore.

唯一未涵盖的用例可能是您的 RCP 应用程序的主工具栏.

The only usecase not covered by this yet may be the main toolbar of your RCP application.

/**
 * 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. */
    }
}

这篇关于触发 PropertyTester 评估的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆