Eclipse Editor:当部件变为活动/非活动时自动切换上下文

时间:2018-03-02 20:11:22

标签: eclipse-plugin

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

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

  

如果您要在您的部分中激活更具体的上下文(或者       查看或编辑)您可以使用零件站点服务定位器激活       你的背景。该部件的IContextService将负责激活       当您的部件被激活或停用时,停用上下文。       它还将在部件处理时处理Context。

这似乎就是我想要的。但该页面没有说明如何。任何人都可以给我一个提示,说明文中提到的“部分网站服务定位器”是什么以及如何使用它?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

在深入研究Eclipse代码之后,这是我对自己问题的回答。

首先,它必须足以调用

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

init之后的任何地方(你得到PartSite),正如@RüdigerHerrmann在答案中提到的那样。

AND(这是我的发现)不需要做任何事情。 当部件被激活/停用时,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中,通过它注册的所有上下文将在服务处置时处理。