【问题标题】:Eclipse Editor: automatically switch context when parts get active/inactiveEclipse 编辑器:当部件处于活动/非活动状态时自动切换上下文
【发布时间】:2018-03-04 10:58:23
【问题描述】:

我正在开发自己的 Eclipse 编辑器,需要在不同的上下文之间切换以进行键绑定。目前我在部分激活时手动进行上下文激活/停用。

这个页面 https://help.eclipse.org/mars/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Fguide%2Fworkbench_advext_contexts.htm 说:

如果您要在您的零件中激活更具体的上下文(无论是 查看或编辑器)您可以使用零件站点服务定位器来激活 你的上下文。该部分的 IContextService 将负责激活 并在您的部件被激活或停用时停用上下文。 当部件被释放时,它也会释放上下文。

看来这正是我想要的。但是页面没有说如何。谁能给我提示一下文中提到的“部分站点服务定位器”是什么以及如何使用它?

【问题讨论】:

    标签: eclipse-plugin


    【解决方案1】:

    我会解释文本,以便您应该使用与您的(编辑器)部分对应的站点的服务定位器。在以下示例中,part 引用您的编辑器。通过从部件站点获取上下文服务,您可以获得该特定部件的子上下文服务,您可以在其中激活专门的编辑器上下文。

    IContextService contextService = part.getSite().getService( IContextService.class );
    contextService.activateContext( "your.editor.context.id" );
    

    【讨论】:

    • 所以我只是写你在创建我的部分时提到的代码,而不需要在切换到其他部分时停用上下文?这听起来不错!我会试试这个。
    • 不确定,您可能仍需要从编辑器的激活和停用事件中激活/停用上下文。
    • 我明白了。我会做一些实验并在这里更新结果。
    【解决方案2】:

    在挖掘 Eclipse 代码之后,这是我对自己问题的回答。

    首先,调用就足够了

    IContextService contextService = part.getSite().getService( IContextService.class );
    contextService.activateContext( "your.editor.context.id" );
    

    init 之后的任何地方(你会得到PartSite),就像@Rüdiger Herrmann 在他的回答中提到的那样。

    并且(这是我的发现)不需要做任何其他事情。 当部件被激活/停用时,Eclipse 将自动激活/停用上下文,正如我参考的文本中所述。另外,当部分站点被释放时,所有上下文都会被释放。

    如果你对如何做感兴趣,这里有更多的挖掘。

    激活/停用

    当我们调用getSite().getService(IContextService.class) 时,我们得到的是SlaveContextService 的一个实例。 当我们在其上调用activateContext(String contextId) 时,我们的请求将自动转换为具有默认表达式ActivePartExpression 的请求。

    从它的名字我们可以很容易地猜到这个表达式会检查一个部件是否处于活动状态并做一些改变。它所做的更改可以在ContextService.UpdateExpression.changed 看到。这是代码(ContextService:124-128)

    if (result != EvaluationResult.FALSE) {
        runExternalCode(() -> contextService.activateContext(contextId));
    } else if (cached != null) {
        runExternalCode(() -> contextService.deactivateContext(contextId));
    }
    

    每当 Eclipse 上下文发生变化(激活/停用部分会触发上下文变化),UpdateExpression.changed 将被调用并检查目标部分是否仍然处于活动状态,然后相应地激活/停用上下文。

    处置

    SlaveContextService.dispose 中,通过它注册的所有上下文都将在服务释放时被释放。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多