上下文

上下文可以用来影响用户在任何给定时间可以执行哪些命令。上下文比活动具有更强的动态性。活动表示用户在大多数时间都可以使用的大量功能,而上下文描述用户在特定时间点的焦点。例如,编辑文本时用户可以执行的命令与编辑 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>
为上下文指定了在对用户显示有关上下文的信息时将使用的名称和描述。当将用户界面添加项(例如,命令)绑定至特定上下文时将使用该上下文的标识。

上下文层次结构

上下文在实质上是分层的。当上下文活动时,命令在该上下文中可用,在它的父代上下文中也可用。这对于定义从很一般的情况一直到更具体的上下文的各种级别的上下文是很有用的。在上述上下文定义中,要注意为该上下文指定的父代的标识:

	<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>

使添加项与上下文相关联

到目前为止,我们已经完成了定义上下文的层次结构。当在另一个用户界面添加项的描述中引用到上下文时,上下文就变得很有用。上下文的最常见用法就是用于键绑定。当上下文与键绑定相关联时,仅当用户处于该上下文中时键绑定才是活动的。例如,以下标记将根对话框和窗口上下文指定为键绑定的上下文:

<keyBinding
	commandId="org.eclipse.ui.edit.cut"
	contextId="org.eclipse.ui.contexts.dialogAndWindow"
	keySequence="M1+X"
	keyConfigurationId="org.eclipse.ui.defaultAcceleratorConfiguration">
</keyBinding>

使用上下文 API

工作台上下文支持包括一个 API 来使用已定义的上下文和定义特定上下文在哪种条件下将变为已启用状态。大多数插件不需要牵涉到此 API,但是它对于定义用来定义新的上下文的专用视图或编辑器是很有用的。

使用工作台中的上下文的起始点是 IWorkbenchContextSupport。插件可以从工作台中获得上下文支持实例。

IWorkbenchContextSupport workbenchContextSupport = PlatformUI.getWorkbench().getContextSupport();
工作台上下文支持 API 可以用来添加或除去 EnabledSubmission(它描述使特定上下文变为已启用状态需要满足的条件)。该条件包括一些信息,例如,活动部件或活动 shell。工作台支持还提供了对 IContextManager 的访问权。
IContextManager contextManager = workbenchContextSupport.getContextManager();

IContextManager 定义一种协议来获取所有已定义或已启用的上下文标识,还获取特定标识的相关联 IContext。可以使用这些对象来遍历 API 中的上下文的定义,例如,获取标识、名称或者父代上下文的标识。可以对上下文管理器或者上下文本身注册侦听器,以检测特定上下文的定义中或者上下文管理器中的更改。有关更多信息,请参阅 org.eclipse.ui.contexts 包。