Azioni dell'editor ridestinabili

Si ricordi che lo strumento readme definisce il proprio editor, il quale aggiunge azioni alla barra dei menu del workbench utilizzando ReadmeEditorActionBarContributor.  

<extension
    point = "org.eclipse.ui.editors">
	<editor
  id = "org.eclipse.ui.examples.readmetool.ReadmeEditor"
  	   name="%Editors.ReadmeEditor"
      	   icon="icons/obj16/editor.gif"
      	   class="org.eclipse.ui.examples.readmetool.ReadmeEditor"
	   extensions="readme"
           contributorClass="org.eclipse.ui.examples.readmetool.ReadmeEditorActionBarContributor">
	</editor>
</extension>

Le righe di codice che seguono riguardano in particolare la classe del contributor.

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

Quando viene creato un contributor, questo crea a sua volta due azioni ridestinabili (una consente l'aggiornamento dell'etichetta, l'altra no).  Per la creazione delle azioni si utilizza la stessa tecnica adoperata dal workbench.  Vengono creati anche due gestori che serviranno per le azioni quando l'editor diventa la parte attiva.  

Ma dove vengono registrati i gestori per le azioni?  L'impostazione dei gestori globali viene eseguita in maniera leggermente diversa quando un editor definisce le azioni ridestinabili.  Questo  perché il contributor ha il compito di controllare la vista attiva e di associare differenti gestori a seconda della vista o dell'editor che viene attivato.  (Questa operazione viene eseguita dal workbench quando si imposta un gestore per una delle sue azioni globali).  Qui di seguito è riportato il modo in cui ReadmeEditorActionBarContributor esegue le impostazioni:

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

Prima di tutto, il contributor registra i gestori per le azioni ridestinabili.  Questo assicura che le azioni del contributor siano eseguite quando l'editor stesso è attivo.  Successivamente ogni RetargetAction viene registrata come listener di parte sulla pagina.

	...
	// Agganciare le azioni ridestinate come listener della pagina
	page.addPartListener(action2);
	page.addPartListener(action3);
	IWorkbenchPart activePart = page.getActivePart();
	if (activePart != null) {
		action2.partActivated(activePart);
		action3.partActivated(activePart);
	}
}

Aggiungere ciascuna RetargetAction come listener di parte significa che verrà notificata al cambiamento della parte attiva.  L'azione può recuperare il gestore globale corretto dalla nuova parte attiva.  (Per i dettagli, consultare la sezione relativa all'implementazione di RetargetAction.   Si noti che, per iniziare, l'azione viene impostata con la parte attiva corrente.

Quando il contributor dell'editor viene eliminato, deve sganciare le azioni ridestinabili come listener di pagina.

public void dispose() {
	// Rimuovere le azioni ridestinabili come listener di pagina
	getPage().removePartListener(action2);
	getPage().removePartListener(action3);
}

Infine, è importante ricordare che i contributor della barra delle azioni sono condivisi tra le istanze di una stessa classe di editor.  Per questa ragione, se l'editor attivo cambia, i gestori ne devono essere informati per consentire loro di connettersi all'istanza di editor corretta.

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

Con questa operazione l'impostazione dal lato editor è completata.  Quando l'editor è aperto e attivo, i gestori (e le relative etichette) verranno visualizzate nella barra dei menu del workbench, secondo quanto definito da ReadmeEditorActionBarContributor.

Menu di readme con tre azioni di editor nella barra dei menu del workbench

Una volta sistemati i contributi all'editor, come avviene la registrazione di un gestore da parte di una vista?  Il codice sul lato client è simile a quello per la registrazione di un gestore per un'azione di workbench, tranne che l'id dell'azione è quello definito dall'editor del plug-in.  ReadmeContentOutlinePage registra un gestore per tali azioni.

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

Si noti che la funzione di struttura imposta il testo di suggerimento dello strumento e un'etichetta sulla seconda azione, poiché consente la modifica dell'etichetta.  Quando la vista di struttura viene attivata, i gestori (e le relative etichette) non saranno visualizzati nella barra dei menu del workbench.

Menu di readme con una azione di editor rinominata

Si noti che l'azione mostra la nuova etichetta assegnata.

Copyright IBM Corporation e altri 2000, 2003.