Readme-værktøjets funktionssæt definerer også funktioner, som kan ændre mål. Funktionen er synlig, så længe Readme-funktionssættet er synligt, men den er kun aktiveret, når en oversigt eller editor, som implementerer funktionen, er aktiv. Når der bruges funktionssæt til at definere funktioner, som kan ændre mål, oprettes funktionerne i funktionssættets markup-kode i stedet for i koden. Følgende er hentet fra definitionen af Readme-værktøjets funktionssæt:
<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> ...
Funktioner, som har ændret mål, angives med attributten retarget="true". Det opretter en RetargetAction i funktionssættet. Bemærk, at funktioner, som kan ændre mål, ikke angiver en implementeringsklasse, fordi det er op til hver oversigt eller editor i plugin'en at klargøre en behandler, som implementerer hver funktion. Hvis allowLabelUpdate er sand, oprettes en LabelRetargetAction i stedet.
De funktioner, som har ændret mål, er synlige i vinduesmenuen, når Readme-funktionssættet er synligt. De aktiveres imidlertid ikke, hvis Readme-værktøjets editor eller strukturoversigt ikke er aktiv.
Hvad skal editoren og oversigten gøre? Klientsiden ligner det at registrere en behandler for arbejdsbænken eller en editorfunktion, som kan ændre mål. Den funktions-id, der er angivet i koden, skal bruges, når der registreres en global funktionsbehandler.
ReadmeEditorActionBarContributor tager sig af det for editoren. Den definerer først behandlerne for funktionerne.
public ReadmeEditorActionBarContributor() { ... handler4 = new EditorAction(MessageUtil.getString("Editor_Action4")); handler5 = new EditorAction(MessageUtil.getString("Editor_Action5")); handler5.setToolTipText(MessageUtil.getString("Readme_Editor_Action5")); ... }
Behandlerne registreres samtidig med registreringen af behandlerne for de editorfunktioner, der kan ændre mål.
public void init(IActionBars bars, IWorkbenchPage page) { ... bars.setGlobalActionHandler(IReadmeConstants.ACTION_SET_RETARGET4, handler4); bars.setGlobalActionHandler(IReadmeConstants.ACTION_SET_LABELRETARGET5, handler5); ... }
Husk, at funktionslinjebidragene deles af forskellige forekomster af den samme editor. Det betyder, at behandlerne skal have besked, hvis den aktive editor for ReadmeEditorActionBarContributor ændres.
public void setActiveEditor(IEditorPart editor) { ... handler4.setActiveEditor(editor); handler5.setActiveEditor(editor); ... }
Dermed er editoren færdig. Funktionerne aktiveres, når editoren startes.
Bemærk, at etiketten for den første funktion, som kan ændre mål ("Editor Action 4"), ikke er brugt, fordi funktionssættets XML-kode ikke angav allowLabelUpdate.
ReadmeContentOutlinePage definerer sine behandlere på det samme sted, som den definerede behandlere for de editorfunktioner, som kan ændre mål:
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); }
Funktionen med den nye etiket vises, når indholdsstrukturen er aktiv.