Husk at readme-verktøyet definerer sitt eget redigeringsprogram som bidrar med handlinger på arbeidsbenkens menylinje, ved hjelp av 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>
La oss se nærmere på hva som skjer i bidragsklassen.
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")); ...
Når bidragsyteren opprettes, oppretter den to målskiftende handlinger (en som tillater oppdatering av etiketter og en som ikke gjør det). Handlingene opprettes med samme teknikk som den som brukes i arbeidsbenken. Den oppretter også to behandlere som skal brukes for handlingene når redigeringsprogrammet er den aktive delen.
Men hvor registreres behandlere for handlingene? Defineringen av globale behandlere er litt annerledes når redigeringsprogrammet definerer de målskiftende handlingene. Hvorfor? Fordi bidragsyteren tar seg av sporing av den aktive visningen og binding av ulike behandlere når ulike visninger eller selve redigeringsprogrammet blir aktivt. (Arbeidsbenken gjør dette for deg når du definerer en behandler for en av de globale handlingene.) Slik konfigurerer ReadmeEditorActionBarContributor det hele:
public void init(IActionBars bars, IWorkbenchPage page) { super.init(bars, page); bars.setGlobalActionHandler(IReadmeConstants.RETARGET2, handler2); bars.setGlobalActionHandler(IReadmeConstants.LABELRETARGET3, handler3); ...
Først registrerer bidragsyteren behandlerne for de målskiftende handlingene. Dette sørger for at bidragsyterens handlinger kjøres når redigeringsprogrammet er aktivt. Neste trinn går ut på å registrere hver RetargetAction som en dellytter på siden.
... // Hook retarget actions as page listeners page.addPartListener(action2); page.addPartListener(action3); IWorkbenchPart activePart = page.getActivePart(); if (activePart != null) { action2.partActivated(activePart); action3.partActivated(activePart); } }
Ved å legge til hver RetargetAction som en dellytter, vil det bli underrettet når den aktive delen endres. Handlingen kan hente den riktige globale behandleren fra delen som nettopp er blitt aktivert. (Du finner all informasjon under RetargetAction .) Merk at handlingen mates med den delen som er aktiv for å kunne startes.
Når redigeringsprogrammets bidragsyter slettes, skal de målskiftende handlingene frigis fra rollen som sidelyttere.
public void dispose() { // Remove retarget actions as page listeners getPage().removePartListener(action2); getPage().removePartListener(action3); }
Husk også på at handlingslinjebidragsyterne deles mellom forekomster av den samme redigeringsprogramklassen. Dette er årsaken til at behandlere må underrettes når det aktive redigeringsprogrammet endres, slik at de kan tilknyttes den riktige forekomsten av redigeringsprogrammet.
public void setActiveEditor(IEditorPart editor) { ... handler2.setActiveEditor(editor); handler3.setActiveEditor(editor); ... }
Dette fullfører oppsettet på redigeringsprogramsiden. Når redigeringsprogrammet er åpent og aktivt, vises behandlerne (og etikettene) som definert av ReadmeEditorActionBarContributor, på arbeidsbenkens menylinje.
Nå når redigeringsprogrammets bidrag er på plass, hva gjør en visning for å registrere en behandler? Koden på klientsiden likner på registreringen av en behandler for en arbeidsbenkhandling, med den forskjell at handlings-IDen defineres av plugin-modulens redigeringsprogram. ReadmeContentOutlinePage registrerer en behandler for disse handlingene.
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 at disposisjonen definerer verktøytipstekst og en etikett for den andre handlingen, fordi etiketten kan endres. Når readme-disposisjonsvisningen aktiveres, vises behandlerne (og etikettene) på arbeidsbenkens menylinje.
Merk at handlingen med den endrede etiketten, viser den nye etiketten.