Voor de actieset readme-tool worden ook herbruikbare acties gedefinieerd. De actie blijft zichtbaar zolang de readme-actieset zichtbaar is, maar is alleen ingeschakeld als de view of de editor waarmee de actie wordt geïmplementeerd actief is. Als u actiesets gebruikt om herbruikbare acties te definiëren, worden de acties gemaakt in de markup van de actie in plaats van in de code. Hieronder ziet u de definitie van de actieset van de readme-tool:
<extension point = "org.eclipse.ui.actionSets"> <actionSet id="org_eclipse_ui_examples_readmetool_actionSet" label="%ActionSet.name" visible="true"> ... <action id="org_eclipse_ui_examples_readmetool_readmeRetargetAction" menubarPath="window/org_eclipse_ui_examples_readmetool/slot1" toolbarPath="readme" label="%ReadmeRetargetAction.label" tooltip="%ReadmeRetargetAction.tooltip" helpContextId="org.eclipse.ui.examples.readmetool.open_browser_action_context" icon="icons/ctool16/openbrwsr.png" retarget="true"> </action> <action id="org_eclipse_ui_examples_readmetool_readmeRelabelRetargetAction" menubarPath="window/org_eclipse_ui_examples_readmetool/slot1" toolbarPath="readme" label="%ReadmeRelabelRetargetAction.label" tooltip="%ReadmeRelabelRetargetAction.tooltip" helpContextId="org.eclipse.ui.examples.readmetool.open_browser_action_context" icon="icons/ctool16/openbrwsr.png" retarget="true" allowLabelUpdate="true"> </action> ...
Herbruikbare acties worden opgegeven met het kenmerk retarget="true". Zo wordt een herbruikbare actie (RetargetAction) gemaakt in de actieset. Merk op dat de er geen implementerende klasse wordt gedefinieerd door de herbruikbare acties, omdat elke view of editor in de plugin zelf vaststelt welke afhandelingsroutines worden ingesteld voor de implementaties van de acties. Als het kenmerk allowLabelUpdate waar is, wordt een LabelRetargetAction gemaakt.
De herbruikbare acties worden afgebeeld in het menu Venster als de readme-actieset zichtbaar is. Als de editor van de readme-tool of de overzichtview niet zichtbaar zijn, zijn de acties uitgeschakeld.
Wat is de taak van de editor en de view? Op de client gaat het registreren van een afhandelingsroutine voor de workbench of de herbruikbare actie van een editor op vergelijkbare wijze in zijn werk. Het actie-ID dat in de markup is opgegeven, moet worden gebruikt voor het registreren van een globale actie-afhandelingsroutine.
Deze taak wordt voor de editor uitgevoerd door ReadmeEditorActionBarContributor. Eerst worden de afhandelingsroutines van de acties gedefinieerd.
public ReadmeEditorActionBarContributor() { ... handler4 = new EditorAction(MessageUtil.getString("Editor_Action4")); handler5 = new EditorAction(MessageUtil.getString("Editor_Action5")); handler5.setToolTipText(MessageUtil.getString("Readme_Editor_Action5")); ... }
De afhandelingsroutines worden op hetzelfde punt geregistreerd als de afhandelingsroutines van de herbruikbare acties van de editor.
public void init(IActionBars bars, IWorkbenchPage page) { ... bars.setGlobalActionHandler(IReadmeConstants.ACTION_SET_RETARGET4, handler4); bars.setGlobalActionHandler(IReadmeConstants.ACTION_SET_LABELRETARGET5, handler5); ... }
Deelnemers van actiebalken worden beschikbaar gesteld voor gemeenschappelijk gebruik in alle instances van dezelfde editor. Daarom moeten afhandelingsroutines reageren als de actieve editor voor ReadmeEditorActionBarContributor wordt gewijzigd.
public void setActiveEditor(IEditorPart editor) { ... handler4.setActiveEditor(editor); handler5.setActiveEditor(editor); ... }
De editor is nu ingesteld. De acties worden ingeschakeld zodra de editor wordt geactiveerd.
Merk op dat het label van de eerste herbruikbare actie ("Editoractie 4 ") niet is gebruikt, omdat allowLabelUpdate niet is ingesteld in de XML-markup van de actieset.
De afhandelingsroutines worden door ReadmeContentOutlinePage op dezelfde positie gedefinieerd als de afhandelingsroutines van de herbruikbare acties van de editor:
public void createControl(Composite parent) { ... action = new OutlineAction(MessageUtil.getString("Outline_Action4")); getSite().getActionBars().setGlobalActionHandler( IReadmeConstants.ACTION_SET_RETARGET4, action); action = new OutlineAction(MessageUtil.getString("Outline_Action5")); action.setToolTipText(MessageUtil.getString("Readme_Outline_Action5")); getSite().getActionBars().setGlobalActionHandler( IReadmeConstants.ACTION_SET_LABELRETARGET5, action); }
Wanneer het contextoverzicht actief is, wordt de hernoemde actie zichtbaar.