Le support des informations en incrustation est fourni dans la structure de texte de la plate-forme, ce qui permet d'implémenter des incrustations d'informations (ou info-incrustations) sur le texte et les règles qui s'affichent dans votre éditeur.
Le support des info-incrustations est facultatif. Par défaut, SourceViewerConfiguration n'installe pas les info-incrustations car il n'existe pas d'informations générales utiles à afficher. Pour fournir des info-incrustations de texte et règle, l'afficheur de code source de votre éditeur doit être configuré de manière à définir un objet info-incrustation avec plug-in.
Revenons sur JavaSourceViewerConfiguration pour voir quelles méthodes définissent le comportement des info-incrustations :
public ITextHover getTextHover(ISourceViewer sourceViewer, String contentType) { return new JavaTextHover(); } public IAnnotationHover getAnnotationHover(ISourceViewer sourceViewer) { return new JavaAnnotationHover(); }
Les classes auxiliaires d'info-incrustations peuvent aussi être installées dynamiquement à l'aide du protocole SourceViewer (setTextHover et setAnnotationHover). Les deux méthodes offrent les mêmes bénéfices du point de vue de l'exécution, mais le regroupement des substitutions de comportement de plug-in dans une sous-classe de SourceViewerConfiguration offre l'avantage de consolider toutes les substitutions comportementales en un même emplacement.
Voyons maintenant les spécificités liées aux deux types d'info-incrustations.
Une info-incrustation de texte permet de fournir des informations concernant le texte affiché dans l'éditeur. Cette opération s'effectue à l'aide de l'interface ITextHover. Une info-incrustation de texte traite la région à utiliser comme source des informations en incrustation, pour une position donnée du document. Elle fournit également le texte d'information concernant une région spécifique. L'info-incrustation JavaTextHover est relativement simple. Elle vérifie si la position d'info-incrustation fournie se trouve dans la sélection de texte. Si tel est le cas, elle fournit la plage de sélection comme région d'info-incrustation.
public class JavaTextHover implements ITextHover { ... public IRegion getHoverRegion(ITextViewer textViewer, int offset) { Point selection= textViewer.getSelectedRange(); if (selection.x <= offset && offset < selection.x + selection.y) return new Region(selection.x, selection.y); return new Region(offset, 0); } }
Compte tenu de la région d'info-incrustation calculée, le texte sélectionné et extrait du document et renvoyé en tant qu'informations en incrustation.
public class JavaTextHover implements ITextHover { public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) { if (hoverRegion != null) { try { if (hoverRegion.getLength() > -1) return textViewer.getDocument().get(hoverRegion.getOffset(), hoverRegion.getLength()); } catch (BadLocationException x) { } } return JavaEditorMessages.getString("JavaTextHover.emptySelection"); } ... }
Si nous faisons passer le curseur sur une sélection dans l'éditeur, nous constatons que le texte d'informations en incrustation affiche la sélection.
Vous pouvez utiliser des informations contextuelles plus complexes pour obtenir des informations en incrustation très utiles. Des exemples sont fournis dans le JavaTextHover implémenté avec l'éditeur JDT.
Une info-incrustation sur la règle verticale permet d'afficher les informations relatives aux lignes. La classe d'info-incrustation est configurée comme indiqué ci-dessus. IAnnotationHover est l'interface des objets d'info-incrustation de la règle. Même si le nom implique que l'info-incrustation est réservée aux annotations de la règle, il revient à chaque éditeur de déterminer l'emploi le mieux approprié. Une info-incrustation de règle est chargée de renvoyer la chaîne d'informations associée à un numéro de ligne particulier, que cette ligne contienne ou non des marqueurs.
L'exemple d'éditeur Java JavaAnnotationHover implémente une info-incrustation pour chaque ligne. Il se sert du numéro de ligne pour obtenir la totalité du texte de l'info-incrustation et la renvoyer comme une chaîne d'informations.
public String getHoverInfo(ISourceViewer sourceViewer, int lineNumber) { IDocument document= sourceViewer.getDocument(); try { IRegion info= document.getLineInformation(lineNumber); return document.get(info.getOffset(), info.getLength()); } catch (BadLocationException x) { } return null; }
L'info-incrustation accédant au document et à l'afficheur de code source, elle dispose de tout le contexte requis pour prendre des décisions contextuelles plus complexes concernant les informations à afficher. Par exemple, le modèle d'annotation peut être extrait de l'afficheur de code source de façon à fournir des informations en incrustation (info-incrustations) pour toutes les annotations de la règle verticale. Le JavaAnnotationHover de l'éditeur JDT offre cette possibilité.