Ações Reatingíveis do Editor

Lembre-se que a ferramenta Leia-me define seu próprio editor que contribui com ações na barra de menus do workbench utilizando seu ReadmeEditorActionBarContributor.  

<extension
    point = "org.eclipse.ui.editors">
	<editor
  	   id = "org.eclipse.ui.examples.readmetool.ReadmeEditor"
  	   name="%Editors.ReadmeEditor"
      	   icon="icons/obj16/editor.gif"
      	   class="org.eclipse.ui.examples.readmetool.ReadmeEditor"
	   extensions="readme"
           contributorClass="org.eclipse.ui.examples.readmetool.ReadmeEditorActionBarContributor">
	</editor>
</extension>

Vamos ver com mais detalhes o que acontece na classe de contribuidor.

public ReadmeEditorActionBarContributor() {
	...
	action2 = new RetargetAction(IReadmeConstants.RETARGET2, MessageUtil.getString("Editor_Action2"));
	action2.setToolTipText(MessageUtil.getString("Readme_Editor_Action2"));
	action2.setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION2_IMAGE_DISABLE);
	action2.setImageDescriptor(ReadmeImages.EDITOR_ACTION2_IMAGE_ENABLE);
	...
	action3 = new LabelRetargetAction(IReadmeConstants.LABELRETARGET3, MessageUtil.getString("Editor_Action3"));
	action3.setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION3_IMAGE_DISABLE);
	action3.setImageDescriptor(ReadmeImages.EDITOR_ACTION3_IMAGE_ENABLE);
	...  
	handler2 = new EditorAction(MessageUtil.getString("Editor_Action2"));
	...
	handler3 = new EditorAction(MessageUtil.getString("Editor_Action3"));
	...

Quando o contribuidor é criado, ele cria duas ações reatingíveis (uma que permite a atualização do rótulo e outra que não).  A criação das ações utiliza a mesma técnica utilizada pelo workbench.  Ela também cria duas rotinas de tratamento que serão utilizadas para as ações quando o editor for a parte ativa.  

Mas onde são registradas as rotinas de tratamento para as ações?  A definição das rotinas de tratamento globais é feita de maneira um pouco diferente quando o editor define as ações reatingíveis.  Por que?  Porque seu contribuidor é responsável por monitorar a exibição ativa e conectar rotinas de tratamento diferentes quando exibições diferentes ou o próprio editor se tornar ativo.  (O workbench faz isso para você quando você define uma rotina de tratamento para uma de suas ações globais).  Aqui está como o ReadmeEditorActionBarContributor configura as coisas:

public void init(IActionBars bars, IWorkbenchPage page) {
	super.init(bars, page);
	bars.setGlobalActionHandler(IReadmeConstants.RETARGET2, handler2);
	bars.setGlobalActionHandler(IReadmeConstants.LABELRETARGET3, handler3);
	...

Primeiro, o contribuidor registra suas rotinas de tratamento para as ações reatingíveis.  Isso assegura que as ações do contribuidor serão executadas quando o próprio editor estiver ativo.  A próxima etapa é registrar cada RetargetAction como um atendente da parte na página.

	...
	// Conectar ações reatingíveis como ouvintes de página
	page.addPartListener(action2);
	page.addPartListener(action3);
	IWorkbenchPart activePart = page.getActivePart();
	if (activePart != null) {
		action2.partActivated(activePart);
		action3.partActivated(activePart);
	}
}

Adicionar cada RetargetAction como um atendente da parte significa que ele será notificado quando a parte ativa for alterada.  A ação pode obter a rotina de tratamento global correta da parte recém-ativada.  (Consulte a implementação de RetargetAction para obter todos os detalhes.)   Observe que, para iniciar, a ação é semeada com a parte atualmente ativa.

Quando o contribuidor do editor for descartado, ele deverá desconectar as ações reatingíveis como ouvintes de página.

public void dispose() {
	// Remover ações reatingíveis como ouvintes de página
	getPage().removePartListener(action2);
	getPage().removePartListener(action3);
}

Finalmente, lembre-se que os contribuidores da barra de ações são compartilhados entre instâncias da mesma classe do editor.  Por esse motivo, as rotinas de tratamento deverão ser notificadas quando o editor ativo for alterado, para que possam conectar-se à instância apropriada do editor.

public void setActiveEditor(IEditorPart editor) {
	...
	handler2.setActiveEditor(editor);
	handler3.setActiveEditor(editor);
	...
}

Isso conclui a configuração do lado do editor.  Quando o editor estiver aberto e ativo, as rotinas de tratamento (e seus rótulos), conforme definido pelo ReadmeEditorActionBarContributor aparecerão na barra de menus do workbench.

Menu Leia-me com três ações do editor na barra de menus do workbench

Agora que as contribuições do editor foram feitas, o que uma exibição faz para registrar uma rotina de tratamento?  O código do lado do cliente é semelhante a registrar uma rotina de tratamento para uma ação do workbench, exceto que o ID da ação é aquele definido pelo editor do plug-in.  A ReadmeContentOutlinePage registra uma rotina de tratamento para essas ações.

public void createControl(Composite parent) {
	super.createControl(parent);
	...
	getSite().getActionBars().setGlobalActionHandler(
		IReadmeConstants.RETARGET2, 
		new OutlineAction(MessageUtil.getString("Outline_Action2")));

	OutlineAction action = new OutlineAction(MessageUtil.getString("Outline_Action3"));
	action.setToolTipText(MessageUtil.getString("Readme_Outline_Action3")); 
	getSite().getActionBars().setGlobalActionHandler(
		IReadmeConstants.LABELRETARGET3, 
		action);
	...

Observe que o descritor define texto de dicas da ferramenta e um rótulo na segunda ação, uma vez que permite outra rotulação.  Quando a exibição do descritor de Leia-me ficar ativa, suas rotinas de tratamento (e seus rótulos) aparecerão agora na barra de menus do workbench.

Menu Leia-me com uma ação renomeada do editor

Observe que a ação que foi novamente rotulada mostra o novo rótulo.

Copyright IBM Corporation e outros 2000, 2003.