Pour rappel, l'outil readme définit son propre éditeur ajoutant des actions à la barre de menus du plan de travail à l'aide de 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>
Observons de plus près ce qu'il se passe dans la classe du contributeur.
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")); ...
Lorsque le contributeur est créé, il génère deux actions redirigeables (l'une permettant la mise à jour du libellé, l'autre non). La création d'actions suit la même technique que le plan de travail. Il crée également deux gestionnaires qui seront utilisés pour les actions lorsque l'éditeur correspond à la partie active.
Où les gestionnaires d'actions sont-ils enregistrés ? La définition de gestionnaires globaux diffère légèrement lorsque votre éditeur détermine les actions redirigées. Pourquoi cela ? Parce que votre contributeur est charger d'assurer le suivi de la vue active et de relier différents gestionnaires à diverses vues. Sinon, l'éditeur devient actif. Le plan de travail l'effectue pour vous quand vous définissez un gestionnaire pour l'une de ses actions globales. Voici comment ReadmeEditorActionBarContributor organise les choses :
public void init(IActionBars bars, IWorkbenchPage page) { super.init(bars, page); bars.setGlobalActionHandler(IReadmeConstants.RETARGET2, handler2); bars.setGlobalActionHandler(IReadmeConstants.LABELRETARGET3, handler3); ...
Tout d'abord, le contributeur enregistre ses gestionnaires pour les actions redirigées. De cette façon, les actions seront exécutées quand l'éditeur sera actif. L'étape suivante consiste à enregistrer chaque RetargetAction comme un écouteur dans la page.
... // relier des actions redirigeables comme écouteurs de page page.addPartListener(action2); page.addPartListener(action3); IWorkbenchPart activePart = page.getActivePart(); if (activePart != null) { action2.partActivated(activePart); action3.partActivated(activePart); } }
L'ajout de chaque RetargetAction comme écouteur de partie signifie qu'une notification sera envoyée si la partie active change. L'action peut obtenir le gestionnaire global adapté à partir de la nouvelle partie activée. Reportez-vous à l'implémentation de RetargetAction pour avoir tous les détails. Notez qu'au départ l'action dépend de la partie active.
Lorsque le contributeur d'éditeur est supprimé, il doit détacher les actions redirigeables comme écouteurs de page.
public void dispose() { // supprimer les actions redirigeables comme écouteurs de page getPage().removePartListener(action2); getPage().removePartListener(action3); }
Enfin, les contributeurs de la barre d'actions sont partagés entre les instances de la même classe d'éditeur. C'est pourquoi les gestionnaires doivent être informés lorsque l'éditeur actif change afin qu'ils se connectent à l'instance appropriée.
public void setActiveEditor(IEditorPart editor) { ... handler2.setActiveEditor(editor); handler3.setActiveEditor(editor); ... }
La configuration côté éditeur est terminée. Lorsque l'éditeur est ouvert et actif, les gestionnaires (et leurs libellés) comme définis par ReadmeEditorActionBarContributor apparaîtront dans la barre de menus du plan de travail.
A présent que les contributions de l'éditeur sont intégrées, comment une vue enregistre-t-elle un gestionnaire ? Le code côté client revient à enregistrer un gestionnaire pour une action du plan de travail, sauf que l'ID d'action est celui déterminé par l'éditeur du plug-in. ReadmeContentOutlinePage enregistre un gestionnaire pour ces actions.
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); ...
Le décomposeur définit le texte des conseils et un libellé pour la deuxième action, sachant qu'il est possible d'attribuer un nouveau nom. Lorsque l'aperçu du readme est active, ses gestionnaires (et leurs libellés) n'apparaissent pas dans la barre de menus du plan de travail.
Notez que l'action renommée affiche le nouveau libellé.