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.
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.
Observe que a ação que foi novamente rotulada mostra o novo rótulo.