我正在开发自己的 eclipse 编辑器,需要在不同的上下文之间切换以进行键绑定。目前,我正在部分激活时手动进行上下文激活/停用。
本页 https://help.eclipse.org/mars/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Fguide%2Fworkbench_advext_contexts.htm 说:
如果要在零件中激活更具体的上下文(要么 查看或编辑器),您可以使用部件站点服务定位器激活 您的上下文。该部件的 IContextService 将负责激活 并在您的部件被激活或停用时停用上下文。 它还将在处置部件时释放上下文。
似乎这正是我想要的。但该页面没有说明如何。谁能给我一个提示,文中提到的"零件站点服务定位器"是什么以及如何使用它?
我会解释文本,以便您应该使用与您的(编辑器)部分对应的站点的服务定位器。在以下示例中,part
引用编辑器。通过从部件的站点获取上下文服务,您可以获得该特定部件的子上下文服务,从而激活专用编辑器上下文。
IContextService contextService = part.getSite().getService( IContextService.class );
contextService.activateContext( "your.editor.context.id" );
在挖掘了 Eclipse 代码之后,这是我对自己问题的回答。
首先,它足以调用
IContextService contextService = part.getSite().getService( IContextService.class );
contextService.activateContext( "your.editor.context.id" );
init
之后的任何地方(你得到PartSite
),正如赫尔曼@Rüdiger在他的回答中提到的那样。
而且(这是我的发现)不需要做任何其他事情。 当部分被激活/停用时,Eclipse 将自动激活/停用上下文,就像我引用的文本中所述。此外,当零件站点被释放时,所有上下文都将被释放。
如果你对如何做感兴趣,这里有更多的挖掘。
激活/停用
当我们调用getSite().getService(IContextService.class)
时,我们得到的是SlaveContextService
的实例。 当我们调用activateContext(String contextId)
时,我们的请求将自动转换为默认表达式的请求ActivePartExpression
.
从它的名字中,我们可以很容易地猜到这个表达式将检查一个部分是否处于活动状态并进行一些更改。它所做的更改可以在ContextService.UpdateExpression.changed
.这是代码(上下文服务:124-128)
if (result != EvaluationResult.FALSE) {
runExternalCode(() -> contextService.activateContext(contextId));
} else if (cached != null) {
runExternalCode(() -> contextService.deactivateContext(contextId));
}
每当 Eclipse 上下文更改(激活/停用部分将触发上下文更改)时,将调用UpdateExpression.changed
并检查目标部分是否仍处于活动状态,然后相应地激活/停用上下文。
处理
在SlaveContextService.dispose
中,通过它注册的所有上下文都将在服务的处置时被释放。