Contextos

Um contexto pode ser utilizado para influenciar quais comandos estão disponíveis para o usuário a qualquer momento. Os contextos são muito mais dinâmicos que as atividades. Enquanto uma atividade representa um amplo conjunto de funções que está disponível para o usuário a maior parte do tempo, os contextos descrevem um foco do usuário em um momento específico. Por exemplo, os comandos disponíveis para um usuário ao editar texto podem ser diferentes dos que estão disponíveis para um usuário ao editar texto Java ou procurar pacotes no explorador de pacotes.

Definindo um Contexto

Os contextos são declarados no ponto de extensão org.eclipse.ui.contexts. Considere o seguinte contexto que é definido para edição de texto:

<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>
Os contextos recebem um nome e descrição que são utilizados ao mostrar informações sobre o contexto para o usuário. O id do contexto é utilizado ao ligar contribuições de UI como comandos a um contexto específico.

Hierarquias de Contexto

Os contextos são hierárquicos por natureza. Quando um contexto está ativo, os comandos disponíveis no contexto e nos contextos pais também estão disponíveis. Isso é útil para definir níveis de contextos que movem de situações muito gerais para contextos mais específicos. Na definição de contexto acima, observe que há um id de um pai designado para o contexto:

	<context
		name="%context.editingText.name"
		description="%context.editingText.description"
		id="org.eclipse.ui.textEditorScope"
		parentId="org.eclipse.ui.contexts.window">
	</context>
O contexto pai define o contexto mais geral de trabalhar em uma janela. Seu pai define um contexto ainda mais geral de trabalhar em uma janela ou um diálogo.
<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>

Associando uma Contribuição a um Contexto

Até agora, tudo que temos feito é definir uma hierarquia de contextos. O contexto se torna útil quando é utilizado como referência na descrição de outra contribuição de UI. O uso mais comum de contextos está nas ligações de tecla. Quando um contexto está associado a uma ligação de tecla, a ligação de tecla estará ativa somente quando o usuário estiver naquele contexto. Por exemplo, a seguinte marcação especifica o diálogo de raiz e o contexto de janela como o contexto para uma ligação de tecla:

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

Utilizando a API de Contexto

O suporte de contexto do ambiente de trabalho inclui uma API para trabalhar com os contextos definidos e definir critérios sob os quais um contexto específico deve ser ativado. A maioria dos plug-ins não precisa se preocupar com essa API, mas é útil ao definir visualizações ou editores especializados que definem novos contextos.

O ponto inicial para trabalhar com contextos no ambiente de trabalho é IContextService. Os plug-ins podem obter do ambiente de trabalho a instância de suporte de contexto global.

IContextService contextService = (IContextService)PlatformUI.getWorkbench()
	.getService(IContextService.class);

Serviços como IContextService, IHandlerService e IBindingService podem ser recuperados utilizando um IServiceLocator. IWorkbench, IWorkbenchWindow e IWorkbenchSite são todos IServiceLocator.

IContextService define o protocolo para obtenção de todos os ids de contexto definidos ou ativados, bem como para a obtenção do Contexto associado para um id específico. Esses objetos podem ser utilizados para atravessar a definição para um contexto em API, como obter o id, nome ou id do contexto pai. Os listeners podem ser registrados no gerenciador de contexto ou nos próprios contextos para detectar alterações na definição de um contexto específico ou no próprio gerenciador de contexto. Consulte o pacote org.eclipse.core.commands.contexts para obter mais informações.

Contextos podem ser ativados por programa:

IContextActivation activation = contextService.activateContext("org.eclipse.ui.textEditorScope");

O IContextActivation é um token que pode ser utilizado para desativar um contexto ativo. Assegure-se de ativar somente Contextos definidos.

Se você estiver ativando um Contexto mais específico em sua parte (seja Visualização ou Editor), poderá utilizar o localizador de serviços da parte do site para ativar seu Contexto. O IContextService da parte cuidará de ativar e desativar o Contexto conforme sua parte é ativada ou desativada. Ele ainda descartará o Contexto quando a parte for descartada.