Handlingssettet readme-verktøy definerer også målskiftende handlinger. Handlingen vises så lenge readme-handlingen vises, men aktiveres bare når en visning eller et redigeringsprogram som implementerer handlingen, er aktiv. Når du bruker handlingssett til å definere målskiftende handlinger, opprettes handlingene i handlingssettkodetypen og ikke i koden. Følgende er hentet fra handlingssettdefinisjonen for readme-verktøyet:
<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> ...
Målskiftende handlinger angis ved hjelp av attributtet retarget="true". Dette oppretter en RetargetAction i handlingssettet. Merk at de målskiftende handlingene ikke angir en implementeringsklasse (class) ettersom det er opp til hver enkelt visning eller redigeringsprogram i plugin-modulen å definere en behandler som implementerer hver handling. Hvis allowLabelUpdate er "true", opprettes i stedet en LabelRetargetAction.
De målskiftende handlingene vises på vindusmenyen når readme-handlingssettet vises. De vil imidlertid ikke bli aktivert hvis redigeringsprogrammet eller disposisjonsvisningen for readme-verktøyet ikke er aktivert.
Hva skal redigeringsprogrammet og visningen gjøre? Nok en gang likner klientsiden på registrering av en behandler for arbeidsbenken eller en målskiftende handling for et redigeringsprogram. Handlings-IDen som er angitt i kodetypen, må brukes ved registrering av en global handlingsbehandler.
ReadmeEditorActionBarContributor håndterer dette for redigeringsprogrammet. Først definerer den behandlere for handlingene.
public ReadmeEditorActionBarContributor() { ... handler4 = new EditorAction(MessageUtil.getString("Editor_Action4")); handler5 = new EditorAction(MessageUtil.getString("Editor_Action5")); handler5.setToolTipText(MessageUtil.getString("Readme_Editor_Action5")); ... }
Behandlerene registreres samtidig som behandlerene for de målskiftende handlingene ble registrert for redigeringsprogrammet.
public void init(IActionBars bars, IWorkbenchPage page) { ... bars.setGlobalActionHandler(IReadmeConstants.ACTION_SET_RETARGET4, handler4); bars.setGlobalActionHandler(IReadmeConstants.ACTION_SET_LABELRETARGET5, handler5); ... }
Husk at handlingslinjebidragsytere deles mellom ulike forekomster av det samme redigeringsprogrammet. Dette betyr at behandlere må underrettes hvis det aktive redigeringsprogrammet for ReadmeEditorActionBarContributor endres.
public void setActiveEditor(IEditorPart editor) { ... handler4.setActiveEditor(editor); handler5.setActiveEditor(editor); ... }
Det er det hele for redigeringsprogrammet. Disse handlingene skal aktiveres når redigeringsprogrammet aktiveres.
Merk at etiketten for den første målskiftende handlingen ("Editor Action 4") ikke ble brukt siden handlingssettets XML-kodetype ikke anga allowLabelUpdate.
ReadmeContentOutlinePage definerer sine behandlere samme sted som behandlere for redigeringsprogrammets målskiftende handlinger ble definert:
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); }
Handlingen med den nye etiketten skal vises når innholdsdisposisjonen er aktiv.