Uudelleen kohdennettavat muokkausohjelman toiminnot

Huomaa, että readme-työkalu määrittää oman muokkausohjelmansa, joka lisää toiminnot työympäristön valikkopalkkiin ReadmeEditorActionBarContributor-luokallaan.  

<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>

Seuraavaksi tarkastellaan lähemmin sitä, mitä toimittajaluokassa tapahtuu.

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

Kun toimittaja luodaan, se luo kaksi uudelleen kohdennettavaa toimintoa (yhden, joka mahdollistaa nimiön päivityksen, ja yhden, joka ei).  Toimintojen luonti käyttää samaa tekniikkaa kuin työympäristö.  Se luo myös kaksi käsittelytoimintoa, joita käytetään toiminnoille, kun muokkausohjelma on aktiivinen osa.  

Entä mihin toimintojen käsittelytoiminnot rekisteröidään?  Yleisten käsittelytoimintojen asetus eroaa jonkin verran siitä, kun muokkausohjelma määrittää uudelleen kohdennetut toiminnot.  Miksi?  Koska toimittaja vastaa aktiivisen näkymän seurannasta ja eri käsittelytoimintojen ripustuksesta, kun eri näkymät tai muokkausohjelma itse tulevat aktiiviseksi.  (Työympäristö tekee tämän puolestasi, kun asetat käsittelytoiminnon jollekin sen yleistoiminnoista).  ReadmeEditorActionBarContributor asettaa kaiken näin:

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

Ensin toimittaja rekisteröi käsittelytoimintonsa uudelleen kohdennetuille toiminnoille.  Tämä varmistaa sen, että toimittajan toiminnot ajetaan, kun muokkausohjelma itse on aktiivinen.  Seuraava vaihe on kunkin RetargetAction -luokan rekisteröinti osan kuuntelutoimintona sivulle.

	...
	// Ripusta uudelleenkohdistamistoiminnot sivun kuuntelutoimintoina
	page.addPartListener(action2);
	page.addPartListener(action3);
	IWorkbenchPart activePart = page.getActivePart();
	if (activePart != null) {
		action2.partActivated(activePart);
		action3.partActivated(activePart);
	}
}

Jokaisen RetargetAction -luokan lisäys osan kuuntelutoiminnoksi tarkoittaa, että sille ilmoitetaan aktiivisen osan muuttumisesta.  Toiminto voi saada oikean yleiskäsittelytoiminnon juuri aktivoidusta osasta.  (Lisätietoja on RetargetAction -toteutuksen kohdalla.)   Huomaa, että aluksi toiminnolle annetaan parhaillaan aktiivinen osa.

Kun muokkausohjelman toimittaja poistetaan, sen pitäisi irrottaa uudelleen kohdennettavat toiminnot sivun kuuntelutoimintoina.

public void dispose() {
	// Poista uudelleenkohdennustoiminnot sivun kuuntelutoimintoina
	getPage().removePartListener(action2);
	getPage().removePartListener(action3);
}

Huomaa, että toimintopalkin toimittajat ovat saman muokkausohjelmaluokan ilmentymien yhteiskäytössä.  Tämän vuoksi käsittelytoiminnoille tulee ilmoittaa aktiivisen muokkausohjelman vaihtumisesta, että ne voivat kytkeytyä oikeaan muokkausohjelman ilmentymään.

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

Tämä saattaa asetukset päätökseen muokkausohjelman osalta.  Kun muokkausohjelma on avoinna ja aktiivinen, käsittelytoiminnot (ja niiden nimiöt) näkyvät työympäristön valikkopalkissa siten, kuin ReadmeEditorActionBarContributor on ne määrittänyt.

Readme-valikko, jossa on kolme muokkausohjelman toimintoa työympäristön valikkopalkissa

Nyt kun muokkausohjelman lisäykset ovat paikallaan, miten näkymä rekisteröi käsittelytoiminnon?  Työaseman puolelta koodi on samankaltainen kuin käsittelytoiminnon työympäristön toiminnolle rekisteröinnissä, paitsi että toiminnon tunnus on lisäosan muokkausohjelman määrittämä tunnus.  ReadmeContentOutlinePage rekisteröi käsittelytoiminnon näille toiminnoille.

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

Huomaa, että jäsentelytoiminto asettaa työkaluvihjeen tekstin ja nimiön toiselle toiminnolle, sillä se sallii uudelleen nimiöinnin.  Kun readme-jäsentelytoiminnon näkymästä tehdään aktiivinen, sen käsittelytoiminnot (ja niiden nimiöt) tulevat näkyviin työympäristön valikkopalkissa.

Readme-valikko, jossa on yksi uudelleennimetty muokkausohjelman toiminto

Huomaa, että uudelleen nimiöity toiminto näyttää uuden nimiön.