Informations en incrustation de texte et règle

Le support des informations en incrustation est fourni dans la structure de texte de la plateforme, ce qui permet d'implémenter des incrustations d'informations (ou infopops) sur le texte et les règles qui s'affichent dans votre éditeur.

Le support des infopops est facultatif.  Par défaut, SourceViewerConfiguration n'installe pas les infopops car il n'existe pas d'informations générales utiles à afficher.  Pour fournir des infopops de texte et règle, l'afficheur de code source de votre éditeur doit être configuré de manière à définir un objet infopop avec plug-in.

Revenons sur JavaSourceViewerConfiguration pour voir quelles méthodes définissent le comportement des infopops :

public ITextHover getTextHover(ISourceViewer
sourceViewer, String contentType) {
	return new JavaTextHover();
}
public IAnnotationHover getAnnotationHover(ISourceViewer sourceViewer) {
	return new JavaAnnotationHover();
}

Les classes auxiliaires d'infopops 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'infopops.

Infopop de texte

Une infopop 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 infopop 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'infopop JavaTextHover est relativement simple.   Elle vérifie si la position d'infopop 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'infopop. 

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'infopop 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 au-dessus d'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.

Infopop de règle

Une infopop sur la règle verticale permet d'afficher les informations relatives aux lignes.  La classe d'infopop est configurée comme indiqué ci-dessus.  IAnnotationHover est l'interface des objets infopop de règle.  Même si le nom implique que l'infopop est réservée aux annotations de la règle, il revient à chaque éditeur de déterminer l'emploi le mieux approprié.  Une infopop 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 infopop pour chaque ligne.  Il se sert du numéro de ligne pour obtenir la totalité du texte de l'infopop 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'infopop 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 (infopops) pour toutes les annotations de la règle verticale.  Le JavaAnnotationHover de l'éditeur JDT offre cette possibilité.

Copyright IBM Corporation and others 2000, 2003.