L'insieme delle azioni dello strumento readme definisce anche le azioni ridestinabili. L'azione rimane visibile finché l'insieme delle azioni readme è visibile, ma è attiva soltanto quando una vista o un editor che la implementano sono attivi. Quando per definire azioni ridestinabili si utilizzano insiemi di azioni, le azioni vengono create nel tag dell'insieme piuttosto che nel codice. Il codice di seguito riportato è tratto dalla definizione dell'insieme di azioni dello strumento readme:
<extension point = "org.eclipse.ui.actionSets"> <actionSet id="org_eclipse_ui_examples_readmetool_actionSet" label="%ActionSet.name" visible="true"> ... <action id="org_eclipse_ui_examples_readmetool_readmeRetargetAction" menubarPath="window/org_eclipse_ui_examples_readmetool/slot1" toolbarPath="readme" label="%ReadmeRetargetAction.label" tooltip="%ReadmeRetargetAction.tooltip" helpContextId="org.eclipse.ui.examples.readmetool.open_browser_action_context" icon="icons/ctool16/openbrwsr.gif" retarget="true"> </action> <action id="org_eclipse_ui_examples_readmetool_readmeRelabelRetargetAction" menubarPath="window/org_eclipse_ui_examples_readmetool/slot1" toolbarPath="readme" label="%ReadmeRelabelRetargetAction.label" tooltip="%ReadmeRelabelRetargetAction.tooltip" helpContextId="org.eclipse.ui.examples.readmetool.open_browser_action_context" icon="icons/ctool16/openbrwsr.gif" retarget="true" allowLabelUpdate="true"> </action> ...
Le azioni ridestinabili vengono specificate utilizzando l'attributo retarget="true". Questo farà sì che nell'insieme di azioni venga creata una RetargetAction. Si noti che le azioni ridestinabili non specificano una classe di implementazione, poiché è compito di ciascuna vista o editor del plug-in impostare un gestore che implementi ciascuna azione. Se allowLabelUpdate è true, allora verrà creata una LabelRetargetAction.
Le azioni ridestinabili saranno visibili nel menu della finestra quando l'insieme delle azioni readme è visibile. Tuttavia, non saranno abilitate se l'editor o la vista di struttura dello strumento readme non sono attivi.
Come devono operare l'editor e la vista? Anche in questo caso, il lato client esegue un'operazione simile alla registrazione di un gestore per il workbench o di un'azione ridestinabile dell'editor. Quando si registra un gestore di azione globale, è necessario utilizzare l'id dell'azione specificato nel tag.
Questa operazione viene gestita da ReadmeEditorActionBarContributor per conto dell'editor. Per prima cosa, vengono definiti i gestori per le azioni.
public ReadmeEditorActionBarContributor() { ... handler4 = new EditorAction(MessageUtil.getString("Editor_Action4")); handler5 = new EditorAction(MessageUtil.getString("Editor_Action5")); handler5.setToolTipText(MessageUtil.getString("Readme_Editor_Action5")); ... }
I gestori vengono registrati contemporaneamente ai gestori per le azioni ridestinabili dell'editor.
public void init(IActionBars bars, IWorkbenchPage page) { ... bars.setGlobalActionHandler(IReadmeConstants.ACTION_SET_RETARGET4, handler4); bars.setGlobalActionHandler(IReadmeConstants.ACTION_SET_LABELRETARGET5, handler5); ... }
È importante ricordare che i contributor della barra delle azioni sono condivisi da istanze differenti di uno stesso editor. Ciò significa che se l'editor attivo per il ReadmeEditorActionBarContributor cambia, i gestori devono ricevere l'informazione.
public void setActiveEditor(IEditorPart editor) { ... handler4.setActiveEditor(editor); handler5.setActiveEditor(editor); ... }
Tutto questo è valido per l'editor. Quando quest'ultimo è attivato, lo saranno anche queste azioni.
Si noti che l'etichetta della prima azione ridestinabile ("Azione 4 dell'editor") non è stata utilizzata dal momento che il tag XML dell'insieme di azioni non ha impostato allowLabelUpdate.
ReadmeContentOutlinePage definisce i propri gestori nello stessa posizione in cui ha definito i gestori per le azioni ridestinabili dell'editor:
public void createControl(Composite parent) { ... action = new OutlineAction(MessageUtil.getString("Outline_Action4")); getSite().getActionBars().setGlobalActionHandler( IReadmeConstants.ACTION_SET_RETARGET4, action); action = new OutlineAction(MessageUtil.getString("Outline_Action5")); action.setToolTipText(MessageUtil.getString("Readme_Outline_Action5")); getSite().getActionBars().setGlobalActionHandler( IReadmeConstants.ACTION_SET_LABELRETARGET5, action); }
Quando la struttura del contenuto è attiva sarà possibile vedere questa azione con la nuova etichetta.