上下文可以用来影响用户在任何给定时间可以执行哪些命令。上下文比活动具有更强的动态性。活动表示用户在大多数时间都可以使用的大量功能,而上下文描述用户在特定时间点的焦点。例如,编辑文本时用户可以执行的命令与编辑 Java 文本或者浏览包资源管理器中的包时用户可以执行的命令可能有所不同。
上下文是在 org.eclipse.ui.contexts 扩展点中声明的。考虑以下上下文,它是为了编辑文本而定义的:
<extension point="org.eclipse.ui.contexts"> <context name="%context.editingText.name" description="%context.editingText.description" id="org.eclipse.ui.textEditorScope" parentId="org.eclipse.ui.contexts.window"> </context>为上下文指定了在对用户显示有关上下文的信息时将使用的名称和描述。当将 UI 添加项(例如,命令)绑定至特定上下文时将使用该上下文的标识。
上下文在实质上是分层的。当上下文活动时,命令在该上下文中可用,在它的父代上下文中也可用。这对于定义从很一般的情况一直到更具体的上下文的各种级别的上下文是很有用的。在上述上下文定义中,要注意为该上下文指定的父代的标识:
<context name="%context.editingText.name" description="%context.editingText.description" id="org.eclipse.ui.textEditorScope" parentId="org.eclipse.ui.contexts.window"> </context>父代上下文定义在窗口中起作用的更一般的上下文。它的父代定义在窗口或对话框中起作用的更一般的上下文。
<context name="%context.window.name" description="%context.window.description" id="org.eclipse.ui.contexts.window" parentId="org.eclipse.ui.contexts.dialogAndWindow"> </context> <context name="%context.dialogAndWindow.name" description="%context.dialogAndWindow.description" id="org.eclipse.ui.contexts.dialogAndWindow"> </context>
到目前为止,我们已经完成了定义上下文的层次结构。当在另一个 UI 添加项的描述中引用到上下文时,上下文就变得很有用。上下文的最常见用法就是用于键绑定。当上下文与键绑定相关联时,仅当用户处于该上下文中时键绑定才是活动的。例如,以下标记将根对话框和窗口上下文指定为键绑定的上下文:
<extension point="org.eclipse.ui.bindings"> <key sequence="M1+X" contextId="org.eclipse.ui.contexts.dialogAndWindow" commandId="org.eclipse.ui.edit.cut" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/> </extension>
工作台上下文支持包括一个 API 来使用已定义的上下文和定义特定上下文在哪种条件下将变为已启用状态。大多数插件不需要牵涉到此 API,但是它对于定义用来定义新的上下文的专用视图或编辑器是很有用的。
使用工作台中的上下文的起始点是 IContextService。插件可以从工作台中获得全局上下文支持实例。
IContextService contextService = (IContextService)PlatformUI.getWorkbench() .getService(IContextService.class);
可以使用 IServiceLocator 来检索诸如 IContextService、IHandlerService 和 IBindingService 之类的服务。IWorkbench、IWorkbenchWindow 和 IWorkbenchSite 全都是 IServiceLocator。
IContextService 定义了一种协议来获取所有已定义或已启用的上下文标识以及获取特定标识的相关 Context。可以使用这些对象来遍历 API 中的上下文的定义,例如,获取标识、名称或者父代上下文的标识。可以对上下文管理器或者上下文本身注册侦听器,以检测特定上下文的定义中或者上下文管理器中的更改。要了解更多信息,请参阅 org.eclipse.core.commands.contexts包。
可以通过编程来启用上下文:
IContextActivation activation = contextService.activateContext("org.eclipse.ui.textEditorScope");
IContextActivation 是一个标记,它可用来将活动上下文取消激活。您应该确保只激活已定义的上下文。
如果激活部件(视图或编辑器)中更具体的上下文,则可使用部件站点服务定位器来激活上下文。该部件的 IContextService 将负责在该部件被激活或取消激活时激活和取消激活上下文。它还将在该部件被废弃时废弃上下文。