Editorfunktioner, som kan ændre mål

Husk, at Readme-værktøjet definerer sin egen editor, som bidrager med funktioner til arbejdsbænkens menulinje vha. dens 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>

Lad os se nærmere på, hvad der sker i bidragyderklassen.

   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 bidragyderen oprettes, opretter den to funktioner, som kan ændre mål (én som tillader opdatering af etiketter, og én som ikke tillader det). Ved oprettelsen af funktionerne bruges samme teknik som på arbejdsbænken. Den opretter også to behandlere, som skal bruges til funktionerne, når editoren er den aktive del.   

Men hvor er behandlerne til funktionerne registreret? Angivelsen af de globale behandlere foregår på en lidt anden måde, når din editor definerer de funktioner, som har ændret mål. Hvorfor? Fordi din bidragyder har ansvaret for at spore den aktive oversigt og tilslutte forskellige behandlere, når forskellige oversigter eller selve editoren bliver aktive. Arbejdsbænken udfører dette for dig, når du angiver en behandler for en af dens globale funktioner. Sådan konfigurerer ReadmeEditorActionBarContributor elementerne:

public void init(IActionBars bars, IWorkbenchPage page) {
	super.init(bars, page);
	bars.setGlobalActionHandler(IReadmeConstants.RETARGET2, handler2);
	bars.setGlobalActionHandler(IReadmeConstants.LABELRETARGET3, handler3);
	...

Bidragyderen registrerer først sine behandlere for de funktioner, der har ændret mål. Det sikrer, at bidragyderens funktioner udføres, når selve editoren er aktiv. Næste trin er at 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);
	}
}

Når du tilføjer hver RetargetAction som en dellytter, medfører det, at den får besked, når den aktive del ændres. Funktionen kan hente den korrekte globale behandler fra den nyligt aktiverede del. Der er flere oplysninger i implementeringen af RetargetAction. Bemærk, at funktionen som start er seedet med den aktuelt aktive del. 

Når editorbidragyderen kasseres, skal den fjerne tilkoblingen af de funktioner, som kan ændre mål, som sidelyttere.

public void dispose() {
	// Remove retarget actions as page listeners
	getPage().removePartListener(action2);
	getPage().removePartListener(action3);
}

Husk til sidst, at funktionslinjebidragene deles af forekomster af den samme editorklasse. Behandlerne skal derfor have besked, når den aktive editor ændres, så de kan oprette forbindelse til den rigtige editorforekomst.

public void setActiveEditor(IEditorPart editor) {
	...
	handler2.setActiveEditor(editor);
	handler3.setActiveEditor(editor);
	...
}

Det fuldender konfigurationen på editorsiden. Når editoren er åben og aktiv, vises behandlerne og deres etiketter på arbejdsbænkens menulinje, som de er defineret med ReadmeEditorActionBarContributor.

Readme-menu med tre editorfunktioner på arbejdsbænkens menulinje

Hvad gør en oversigt for at registrere en behandler, nu hvor editorens bidrag er på plads? Koden på klientsiden ligner registreringen af en behandler for en arbejdsbænksfunktion, bortset fra at funktions-id'en er den, der er defineret med plugin'ens editor. ReadmeContentOutlinePage registrerer en behandler for disse funktioner.

    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);  
	...

Bemærk, at strukturen angiver værktøjstiptekst og et etiket for den anden funktion, fordi den tillader ændring af etiket. Når Readme-strukturoversigten aktiveres, vises dens behandlere og deres etiketter på arbejdsbænkens menulinje.

Readme-menu med en omdøbt editorfunktion

Bemærk, at funktionen viser den nye etiket.