U hebt al geleerd dat voor de readme-tool een aparte editor is gedefinieerd waarmee acties worden toegevoegd aan de menubalk van de workbench met 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>
De werking van de deelnemerklasse wordt nu verder uitgelegd.
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")); ...
Zodra de deelnemer wordt gemaakt, worden twee herbruikbare acties gecreëerd. (De eerste actie staat het bijwerken van het label toe, de tweede niet.) De acties worden op dezelfde manier gemaakt als in de workbench. Ook worden twee afhandelingsroutines voor de acties gemaakt die worden gebruikt wanneer de editor het actieve onderdeel is.
Waar worden de afhandelingsroutines voor de acties geregistreerd? Het instellen van de globale afhandelingsroutines gaat iets anders in zijn werk wanneer de herbruikbare acties door de editor worden gedefinieerd. Waarom? De reden hiervoor is dat de deelnemer de actieve view volgt en andere afhandelingsroutines toepast zodra andere views of de editor zelf actief worden. (Deze taak wordt door de workbench uitgevoerd als u een afhandelingsroutine instelt voor een van de globale acties.) De werking van ReadmeEditorActionBarContributor is als volgt:
public void init(IActionBars bars, IWorkbenchPage page) { super.init(bars, page); bars.setGlobalActionHandler(IReadmeConstants.RETARGET2, handler2); bars.setGlobalActionHandler(IReadmeConstants.LABELRETARGET3, handler3); ...
De deelnemer registreert eerst de afhandelingsroutines voor de herbruikbare acties. Zo worden de acties van de deelnemer uitgevoerd wanneer de editor zelf actief is. Vervolgens wordt iedere herbruikbare actie (RetargetAction) als onderdeel-listener geregistreerd op de pagina.
... // Herbruikbare acties instellen als pagina-listeners page.addPartListener(action2); page.addPartListener(action3); IWorkbenchPart activePart = page.getActivePart(); if (activePart != null) { action2.partActivated(activePart); action3.partActivated(activePart); } }
Elke herbruikbare actie die als onderdeel-listener wordt toegevoegd, reageert als het actieve onderdeel wordt gewijzigd. De actie haalt de juiste globale afhandelingsroutine op uit het geactiveerde onderdeel. (Raadpleeg de implementatie van RetargetAction voor meer informatie.) Om te beginnen wordt het actieve onderdeel aan de actie toegewezen.
Zodra de editor-deelnemer wordt beëindigd, worden de herbruikbare acties als pagina-listeners losgekoppeld.
public void dispose() { // Herbruikbare acties als pagina-listeners loskoppelen getPage().removePartListener(action2); getPage().removePartListener(action3); }
Ten slotte geldt dat deelnemers van actiebalken beschikbaar worden gesteld voor gemeenschappelijk gebruik in alle instances van dezelfde editor-klasse. Daarom moeten de afhandelingsroutines reageren wanneer de actieve editor wordt gewijzigd, zodat de juiste editor-instance wordt ingesteld.
public void setActiveEditor(IEditorPart editor) { ... handler2.setActiveEditor(editor); handler3.setActiveEditor(editor); ... }
De editor is hiermee ingesteld. Zodra de editor open en actief is, verschijnen de afhandelingsroutines en de bijbehorende labels (zoals gedefinieerd door ReadmeEditorActionBarContributor) in de menubalk van de workbench.
Nu de editor is ingesteld, wordt uitgelegd hoe afhandelingsroutines door views worden geregistreerd. De code voor de client is vergelijkbaar met de registratie van afhandelingsroutines voor workbenchacties. Alleen wordt het actie-ID gedefinieerd door de editor van de plugin. De afhandelingsroutines van deze acties worden door ReadmeContentOutlinePage geregistreerd.
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); ...
Merk op dat de voorgrondinfo en het label worden ingesteld bij de tweede instructie, omdat het opnieuw instellen van een label mogelijk is. Zodra de overzichtview actief wordt, verschijnen de afhandelingsroutines (met de bijbehorende labels) in de menubalk van de workbench.
Merk op dat de actie een nieuw label bevat.