Assistance au contenu

L'assistant de contenu permet d'offrir à l'utilisateur des propositions d'achèvement de contenu contextuelles.  Il est mis en oeuvre par la structure de texte de la plateforme dans org.eclipse.jface.text.contentassist.   Des fenêtres en incrustation (infopops) proposent des choix de texte possibles permettant d'achever une phrase.  L'utilisateur peut sélectionner ces choix pour une insertion automatique dans le texte.  L'assistant de contenu supporte également les infopops contextuelles pour fournir à l'utilisateur des informations liées à la position courante dans le document. 

L'implémentation de l'assistant de contenu est facultative.  Par défaut, SourceViewerConfiguration n'installe pas d'assistant de contenu puisqu'il ne connaît pas le modèle de document qu'utilise un éditeur particulier et n'a pas de comportement générique pour l'assistant de contenu. 

Pour implémenter l'assistant de contenu, l'afficheur de code source de votre éditeur doit être configuré de manière à définir un assistant de contenu.  Cette opération est illustrée dans l'exemple d'éditeur Java dans JavaSourceViewerConfiguration.

public IContentAssistant
getContentAssistant(ISourceViewer sourceViewer) {

	ContentAssistant assistant= new ContentAssistant();
	assistant.setContentAssistProcessor(new JavaCompletionProcessor(),
IDocument.DEFAULT_CONTENT_TYPE);
	assistant.setContentAssistProcessor(new JavaDocCompletionProcessor(),
JavaPartitionScanner.JAVA_DOC); 
	...
	return assistant;
}

Le comportement de l'assistant de contenu est défini dans l'interface IContentAssistant.   La définition de l'assistant de contenu est similaire à la définition de la mise en évidence de syntaxe.  L'assistant doit être configuré avec différentes stratégies d'achèvement de phrase pour différents types de contenu de document.  Les stratégies d'achèvement sont implémentées à l'aide de  IContentAssistProcessor.   Un processeur propose des textes d'achèvement et calcule les informations contextuelles pour une position au sein d'un type de contenu spécifique.

Processeurs de l'assistant de contenu

L'assistance au contenu n'est pas nécessaire pur tous les types de contenu.   Dans l'exemple d'éditeur Java, des processeurs d'assistant de contenu sont fournis pour le type de contenu par défaut et pour le code Java, mais pas pour les commentaires multilignes.  Observons chacun de ces processeurs.

JavaCompletionProcessor est relativement simple.  Il ne fournit que des mots clés comme propositions d'achèvement.  Ces mots clés sont définis dans une zone, fgProposals, et toujours fournis comme propositions :

public ICompletionProposal[]
computeCompletionProposals(ITextViewer viewer, int documentOffset) {
	ICompletionProposal[] result= new
ICompletionProposal[fgProposals.length];
	for (int i= 0; i < fgProposals.length; i++) {
		IContextInformation info= new ContextInformation(fgProposals[i],
MessageFormat.format(JavaEditorMessages.getString("CompletionProcessor.Proposal.ContextInfo.pattern"),
new Object[] { fgProposals[i] })); //$NON-NLS-1$
		result[i]= new CompletionProposal(fgProposals[i], documentOffset, 0,
fgProposals[i].length(), null, fgProposals[i], info,
MessageFormat.format(JavaEditorMessages.getString("CompletionProcessor.Proposal.hoverinfo.pattern"),
new Object[] { fgProposals[i]})); //$NON-NLS-1$
	}
	return result;
}

La proposition d'achèvement peut être déclenchée à la demande de l'utilisateur ou automatiquement à l'entrée du caractère "(" ou "." :

public char[]
getCompletionProposalAutoActivationCharacters() {
	return new char[] { '.', '(' };
}

Outre les propositions d'achèvement, JavaCompletionProcessor définit les informations contextuelles que l'utilisateur peut demander.   Les informations contextuelles incluent une description des éléments d'information disponibles dans un contexte donné et le message d'information détaillé.   

Dans l'exemple d'éditeur Java, les informations ne sont pas réellement contextuelles.  Un tableau contenant cinq objets d'informations contextuelles semblables est calculé pour la position en cours lorsque l'utilisateur demande des informations contextuelles. Tous ces objets d'informations contextuelles définissent un contexte contenant les cinq caractères qui précèdent la position et les cinq qui la suivent. Si l'une de ces cinq propositions est sélectionnée, les informations détaillées s'affichent en regard du curseur et y restent tant que le curseur se maintient dans la zone des cinq caractères autour de la position.

public IContextInformation[]
computeContextInformation(ITextViewer viewer, int documentOffset) {
	IContextInformation[] result= new IContextInformation[5];
	for (int i= 0; i < result.length; i++)
		result[i]= new ContextInformation(
			MessageFormat.format(JavaEditorMessages.getString("CompletionProcessor.ContextInfo.display.pattern"),
new Object[] { new Integer(i), new Integer(documentOffset) }),
			MessageFormat.format(JavaEditorMessages.getString("CompletionProcessor.ContextInfo.value.pattern"),
new Object[] { new Integer(i), new Integer(documentOffset - 5), new
Integer(documentOffset + 5)}));
	return result;
}

 

Ces informations contextuelles s'affichent automatiquement à l'entrée du caractère "#" :

public char[]
getContextInformationAutoActivationCharacters() {
	return new char[] { '#' };
}

Configuration de l'assistant de contenu

IContentAssistant permet de configurer l'apparence et le comportement de l'assistant de contenu.  Par exemple, vous pouvez configurer le délai d'expiration de l'auto activation ainsi que l'orientation et la couleur des informations en incrustation.

public IContentAssistant
getContentAssistant(ISourceViewer sourceViewer) {

	ContentAssistant assistant= new ContentAssistant();
	...
	assistant.enableAutoActivation(true);
	assistant.setAutoActivationDelay(500);
	assistant.setProposalPopupOrientation(IContentAssistant.PROPOSAL_OVERLAY);
	assistant.setContextInformationPopupOrientation(IContentAssistant.CONTEXT_INFO_ABOVE);
	assistant.setContextInformationPopupBackground(JavaEditorEnvironment.getJavaColorProvider().getColor(new
RGB(150, 150, 0)));

	return assistant;
}

 

Copyright IBM Corporation and others 2000, 2003.