Redigeringsåtgärder som kan byta mål

Kommer du ihåg att readme-verktyget definierar en egen redigerare som bidrar med åtgärder till arbetsmiljöns meny med 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>

Låt oss ta en närmare titt på vad som händer i contributor-klassen.

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 contributor-elementet skapas, skapas två åtgärder som kan växla mål (en som gör det möjligt att uppdatera etiketter och en som inte gör det).  När du skapar åtgärderna använder du samma teknik som arbetsmiljön gör.  Den skapar också två hanterare som används för åtgärderna när redigeraren är den aktiva delen.  

Men var är hanterarna för åtgärderna registrerade?  De globala hanterarna anges på ett lite annorlunda sätt när redigeraren definierar åtgärderna som kan växla mål.  Varför?  Eftersom bidragsgivaren ansvarar för att spåra den aktiva vyn och ansluta olika hanterare när olika vyer eller själva redigeraren blir aktiv.  (Arbetsmiljön för detta åt dig när du konfigurerar en hanterar för en av dess globala åtgärder).  Så här konfigurerar ReadmeEditorActionBarContributor saker:

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

Först registrerar bidragsgivaren dess hanterare för åtgärderna som kan växla mål.  Detta säkerställer att bidragsgivarens åtgärder körs när själva redigeraren är aktiv.  Nästa steg är att registrera varje RetargetAction som en dellyssnare på sidan.

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

Om du lägger till varje RetargetAction som en dellyssnare betyder att den meddelas när den aktiva delen ändras.  Åtgärden kan få rätt global hanterare från de del som nyss aktiverades.  (Se implementationen avRetargetAction för alla detaljer.)   Lägg märke till att åtgärden genereras med den aktuella aktiva delen för att kunna startas.

När redigerarens bidragsgivare tas bort, ska den koppla loss åtgärderna som kan växla mål från rollen som sidlyssnare.

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

Slutligen kommer du nog ihåg att bidragsgivare till åtgärdslisten delas mellan förekomster av samma redigerarklass.  Av denna anledning måste hanterarna meddelas när den aktiva redigeraren ändras så att de kan ansluta till rätt redigerarförekomst.

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

Detta slutför konfigurationen på redigerarsidan.  När redigeraren är öppen och aktiv visas hanterarna (och deras etiketter) som de definieras av ReadmeEditorActionBarContributor på arbetsmiljöns menyrad.

Readme.meny med tre redigeraråtgärder på arbetsmiljöns menyrad

Nu när redigerarens bidrag är på plats, vad behöver en vy göra för att registrera en hanterare?  Koden på klientsidan påminner om att registrera en hanterare för en arbetsmiljöåtgärd, med skillnaden att åtgärds-IDt är det som definieras av insticksprogrammets redigerare.  ReadmeContentOutlinePage registrerar en hanterare för dessa åtgärder.

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

Lägg märke till att dispositionsverktyget anger knappbeskrivningstext och en etikett för den andra åtgärden eftersom dess etikett kan ändras.  När readme-verktygets dispositionsvy aktiveras visas dess hanterare (och deras etiketter) på arbetsmiljöns menyrad.

Readme-meny med en omdöpt redigeraråtgärd

Lägg märke till att den omdöpta åtgärden uppvisar den nya etiketten.