Lembremos que a ferramenta readme define o seu próprio editor, o qual contribui com acções para a barra de menus da área de trabalho através de ReadmeEditorActionBarContributor.
<extension point = "org.eclipse.ui.editors"> <editor id = "org.eclipse.ui.examples.readmetool.ReadmeEditor" name="%Editors.ReadmeEditor" icon="icons/obj16/editor.png" class="org.eclipse.ui.examples.readmetool.ReadmeEditor" extensions="readme" contributorClass="org.eclipse.ui.examples.readmetool.ReadmeEditorActionBarContributor"> </editor> </extension>
Vejamos melhor o que acontece na classe do contribuinte.
public ReadmeEditorActionBarContributor() { ... action2 = new RetargetAction(IReadmeConstants.RETARGET2, MessageUtil.getString("Acção_Editor2")); 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("Acção_Editor3")); action3.setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION3_IMAGE_DISABLE); action3.setImageDescriptor(ReadmeImages.EDITOR_ACTION3_IMAGE_ENABLE); ... handler2 = new EditorAction(MessageUtil.getString("Acção_Editor2")); ... handler3 = new EditorAction(MessageUtil.getString("Acção_Editor3")); ...
Quando o contribuinte é criado, cria também duas acções redestináveis (uma que permite actualização de etiquetas e outra não). A criação das acções usa a mesma técnica que a área de trabalho. Cria também duas rotinas de tratamento que serão usadas para as acções quando o editor for a parte activa.
Posto isto, onde se registam as rotinas de tratamento para as acções? A definição das rotinas de tratamento globais é um pouco diferente quando o editor define as acções redestináveis. E isto porquê? Porque o contribuinte se encarrega de acompanhar a vista activa e de ligar via ganchos diferentes rotinas de tratamento, à medida que diferentes vistas ou o próprio editor, ficarem activas. (É a área de trabalho a tratar disto em vez do utilizador quando se define uma rotina de tratamento para uma das suas acções globais). De seguida é apresentado como o ReadmeEditorActionBarContributor configura tudo:
public void init(IActionBars bars, IWorkbenchPage page) { super.init(bars, page); bars.setGlobalActionHandler(IReadmeConstants.RETARGET2, handler2); bars.setGlobalActionHandler(IReadmeConstants.LABELRETARGET3, handler3); ...
Primeiro, o contribuinte regista as suas rotinas de tratamento para as acções redestinadas. Assim se garante que as acções do contribuidor serão executadas quando o próprio editor estiver activo. O próximo passo é registar cada RetargetAction como ouvinte de partes na página.
... // Ligar via gancho acções redestináveis como ouvintes de partes page.addPartListener(action2); page.addPartListener(action3); IWorkbenchPart activePart = page.getActivePart(); if (activePart != null) { action2.partActivated(activePart); action3.partActivated(activePart); } }
Adicionar cada RetargetAction como ouvinte de partes significa que será notificada quando a parte activa se alterar. A acção pode obter a rotina de tratamento global correcta junto da parte acabada de activar. (Consulte a implementação de RetargetAction para todos os detalhes.) Repare que, para começar, a acção é alimentada pela parte actualmente activa.
Quando o contribuinte do editor for inutilizado, deverá desligar do gancho as acções redestináveis na qualidade de ouvintes de páginas.
public void dispose() { // Remover acções redestináveis como ouvintes de páginas getPage().removePartListener(action2); getPage().removePartListener(action3); }
Por fim, lembre-se que os contribuintes de barras de acções são partilhados entre diferentes instâncias da mesma classe de editor. Por isso, as rotinas de tratamento devem ser notificadas quando o editor activo se alterar, de modo a poderem ligar-se à instância de editor correcta.
public void setActiveEditor(IEditorPart editor) { ... handler2.setActiveEditor(editor); handler3.setActiveEditor(editor); ... }
Isto conclui a configuração do lado do editor. Quando o editor está aberto e activo, as rotinas de tratamento (e respectivas etiquetas), consoante definidas pelo ReadmeEditorActionBarContributor aparecem na barra de menus da área de trabalho.
Agora que os contributos do editor estão colocados, que faz uma vista para registar uma rotina de tratamento? O código do lado do cliente é semelhante a registar uma rotina de tratamento para uma acção de área de trabalho, salvo que o ID da acção é aquele definido pelo editor do plug-in. A ReadmeContentOutlinePage regista uma rotina de tratamento para estas acções.
public void createControl(Composite parent) { super.createControl(parent); ... getSite().getActionBars().setGlobalActionHandler( IReadmeConstants.RETARGET2, new OutlineAction(MessageUtil.getString("Acção_Destaque2"))); OutlineAction action = new OutlineAction(MessageUtil.getString("Acção_Destaque3")); action.setToolTipText(MessageUtil.getString("Acção_Destaque_Readme3")); getSite().getActionBars().setGlobalActionHandler( IReadmeConstants.LABELRETARGET3, action); ...
Repare que o destacador define texto de sugestão de ferramenta e uma etiqueta na segunda acção, dado que esta permite reetiquetagem. Quando a vista do destacador readme fica activa, as respectivas rotinas de tratamento (e suas etiquetas) aparecem agora na barra de menus da área de trabalho.
Repare que a acção reetiquetada mostra a nova etiqueta.