La structure de l'éditeur de texte fournit plusieurs classes utilitaire qui facilitent la présentation et la mise à jour du code source. Nous nous attacherons maintenant au plan de travail dont l'éditeur fait partie. Comment l'éditeur agit-il sur les autres fonctionnalités du plan de travail telles que les menus contextuels, les barres de menus et les barres d'outils ?
Pour comprendre comment les éditeurs s'enregistrent auprès du plan de travail et proposent des actions pour la barre de menus du plan de travail, reportez-vous à la section traitant de org.eclipse.ui.editors. Nous ne redonnerons pas ces informations ici. Nous nous contenterons d'observer rapidement la marque où l'exemple d'éditeur Java enregistre son éditeur.
<extension point="org.eclipse.ui.editors"> <editor name="%javaEditorName" icon="icons/obj16/java.gif" extensions="jav" contributorClass="org.eclipse.ui.examples.javaeditor.JavaActionContributor" class="org.eclipse.ui.examples.javaeditor.JavaEditor" id="org.eclipse.ui.JavaEditor"> </éditeur> </extension>
Les actions de la barre de menus du plan de travail sont fournies par le JavaActionContributor. Il implémente les actions placées dans le menu Edition et dans la barre d'outils du plan de travail.
public JavaActionContributor() { super(); fContentAssistProposal= new RetargetTextEditorAction(JavaEditorMessages.getResourceBundle(), "ContentAssistProposal."); //$NON-NLS-1$ ... fContentAssistTip= new RetargetTextEditorAction(JavaEditorMessages.getResourceBundle(), "ContentAssistTip."); //$NON-NLS-1$ ... fTogglePresentation= new PresentationAction(); }
Les deux premières actions sont définies comme des actions redirigeables de l'éditeur de texte. Leur principe est identique à celui des actions redirigeables fournies par le plan de travail. Les actions redirigeables de l'éditeur de texte correspondent à des entrées de menu que le programme de contribution d'actions associe dynamiquement aux actions correspondantes fournies par l'éditeur actif. Lorsque l'éditeur actif change, l'action à laquelle l'action redirigeable de l'éditeur de texte est associée change aussi. L'extrait de code suivant montre que le programme de contribution d'actions de l'éditeur trouve l'action correspondante en demandant à l'éditeur un action d'ID donné :
protected final IAction getAction(ITextEditor editor, String actionId) {
return (editor == null ? null : editor.getAction(actionId));
} public void setActiveEditor(IEditorPart part) {
super.setActiveEditor(part);
ITextEditor editor= null;
if (part instanceof ITextEditor)
editor= (ITextEditor) part;
fContentAssistProposal.setAction(getAction(editor, "ContentAssistProposal"));
fContentAssistTip.setAction(getAction(editor, "ContentAssistTip"));
fTogglePresentation.setEditor(editor);
fTogglePresentation.update();
}
L'ID doit être identique pour l'enregistrement de l'action auprès de
l'éditeur et pour JavaTextEditor. (Voir aussi la section suivante.):
protected void createActions() { super.createActions(); IAction a= new TextOperationAction(JavaEditorMessages.getResourceBundle(), "ContentAssistProposal.", this, ISourceViewer.CONTENTASSIST_PROPOSALS); //$NON-NLS-1$ a.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS); setAction("ContentAssistProposal", a); a= new TextOperationAction(JavaEditorMessages.getResourceBundle(), "ContentAssistTip.", this, ISourceViewer.CONTENTASSIST_CONTEXT_INFORMATION); //$NON-NLS-1$ a.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_CONTEXT_INFORMATION); setAction("ContentAssistTip", a); }
La troisième action du programme de contribution est une action concrète ajoutée à la barre d'outils du plan de travail. Elle fait passer l'éditeur de l'affichage de la plage sélectionnée (selon indication du décomposeur de contenu de l'exemple Java) et l'affichage de l'intégralité du fichier. Cette action n'apparaît que dans la barre d'outils.
La méthode createActions permet d'enregistrer des actions auprès de l'éditeur. Il s'agit notamment des actions appropriées aux menus contextuels de l'éditeur ou des actions fournies dans les définitions d'extension. Dans l'éditeur d'exemple Java, seules les actions associées aux actions redirigeables sont créées. Toutefois, l'éditeur d'exemple Java hérite également des actions créées par TextEditor et ses superclasses. Ces actions peuvent être utilisées dans les menus contextuels de l'éditeur.
La méthode editorContextMenuAboutToShow de TextEditor est utilisée dans la structure pour permettre aux éditeurs d'ajouter des actions au menu contextuel de la zone d'édition. Vous pouvez faire appel à un chemin de menu pour déterminer très exactement où votre action doit apparaître. Les chemins de menus acceptés dans le menu contextuel de l'éditeur sont définis dans l'implémentation de cette méthode dans AbstractTextEditor.
Vous pouvez ajouter une action à ce menu de plusieurs manières. La première consiste à ajouter une action en utilisant uniquement l'ID sous lequel elle est enregistrée auprès de l'éditeur. Par exemple, JavaTextEditor ajoute au menu ses actions d'assistance au contenu lorsque cette méthode est appelée. Les actions n'apparaissent pas dans le menu lorsqu'aucune action n'est enregistrée sous l'ID indiqué.
public void editorContextMenuAboutToShow(MenuManager menu) { super.editorContextMenuAboutToShow(menu); addAction(menu, "ContentAssistProposal"); addAction(menu, "ContentAssistTip"); }
La superclasse TextEditor ajoute des actions d'une autre manière ; en spécifiant un groupe de menus dans le menu contextuel dans lequel placer l'action. Dans ce cas, les actions (Décaler vers la gauche, Décaler vers la droite) apparaissent dans le menu contextuel dans le groupe de menus défini par AbstractTextEditor.
protected void editorContextMenuAboutToShow(IMenuManager menu) { super.editorContextMenuAboutToShow(menu); addAction(menu, ITextEditorActionConstants.GROUP_EDIT, ITextEditorActionConstants.SHIFT_RIGHT); addAction(menu, ITextEditorActionConstants.GROUP_EDIT, ITextEditorActionConstants.SHIFT_LEFT); }
La méthode rulerContextMenuAboutToShow s'utilise de la même manière avant affichage du menu contextuel de la règle. L'implémentation de cette méthode dans AbstractTextEditor définit les groupes dans lesquels des éléments peuvent être ajoutés au menu.
Des ID peuvent être attribués aux menus contextuels de l'éditeur et de la règle de sorte que d'autres plug-in puissent alimenter ces menus dans leurs extensions. Le schéma d'affectation des ID de menu s'est assoupli depuis la première version de la plateforme. La structure peut toutefois s'exécuter dans un mode compatible qui garantit l'adéquation avec les plug-in développés pour la version d'origine. AbstractTextEditor.setCompatibilityMode() permet de contrôler ce comportement. La valeur par défaut est true.
Lorsque le mode compatible est actif (valeur true), les ID des menus contextuels d'éditeur et de règle peuvent être définis à l'aide du protocole AbstractTextEditor. Les méthodes setEditorContextMenuId et setRulerContextMenuId permettent cette opération. La réinitialisation des ID peut se révéler utile pour éviter d'hériter de menus fournis aux menus des superclasses. Par exemple, le JavaTextEditor de l'exemple réinitialise les ID de son menu contextuel à des valeurs Java pour ne pas hériter de contributions de texte générique provenant d'autres plug-in.
protected void initializeEditor() { super.initializeEditor(); JavaEditorEnvironment.connect(this); setSourceViewerConfiguration(new JavaSourceViewerConfiguration()); setEditorContextMenuId("#JavaEditorContext"); setRulerContextMenuId("#JavaRulerContext"); }
Si aucun ID n'est défini nulle part dans la hiérarchie concrète, les ID par défaut définis par AbstractTextEditor sont utilisés.
L'ID du menu contextuel de l'éditeur est toujours <ID
éditeur>.EditorContext
, où <ID éditeur>
correspond à l'ID de l'éditeur. L'ID d'un éditeur est défini dans la
déclaration xml de l'éditeur. L'ID du menu contextuel de la règle est
toujours <ID éditeur>.RulerContext
.