L'assistant de contenu offre à l'utilisateur des propositions d'achèvement de contenu contextuelles. Il est mis en oeuvre par la structure de texte de la plate-forme dans org.eclipse.jface.text.contentassist. Des fenêtres en incrustation (info-incrustations) 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 info-incrustations 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.
L'assistant de contenu n'est pas nécessaire pour 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[] { '#' }; }
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; }