Контексты

Контекст отвечает за то, какие команды доступны пользователю в каждый момент времени. Контексты гораздо более динамичны, чем группы действий. В то время как группа действий представляет обширный набор функций, доступных пользователю в большинстве случаев, контексты описывают текущие доступные пользователю функции в определенный отрезок времени. Например, набор команд, доступный пользователю во время редактирования текстовых документов, может отличаться от команд, доступных при редактировании документов 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, описывающего критерии, с помощью которых определенный контекст становится доступен. Критерии включают в себя различные сведения, например об активном компоненте или оболочке. Рабочая среда также предоставляет доступ к IContextManager.
IContextManager contextManager = workbenchContextSupport.getContextManager();

IContextManager задает протокол для получения ИД всех заданных или активных контекстов и для привязки IContext к определенному ИД. Эти объекты можно использовать для работы с контекстом в API, например для получения ИД, имени или ИД родительского контекста. Можно создать получателей запроса в диспетчере контекстов или в самих контекстах для обнаружения изменений в определениях каких-либо контекстов или в самом диспетчере контекстов. Дополнительные сведения содержатся в пакете org.eclipse.ui.contexts.