内容辅助允许您在用户请求时提供上下文相关的内容补全。此功能通过 org.eclipse.jface.text.contentassist 中的平台文本框架来实现。弹出窗口(弹出信息)用来提出可能的文本选择以补全短语。用户可以选择这些选择以便在文本中插入。内容辅助还支持上下文弹出信息,以便为用户提供与文档中的当前位置相关的信息。
是否实现内容辅助是可选的。缺省情况下,SourceViewerConfiguration 不会安装内容辅助,原因是它不知道用于特定编辑器的文档模型,并且没有内容辅助的一般行为。
为了实现内容辅助,必须配置编辑器的源查看器配置才能定义内容辅助。此操作是在 JavaSourceViewerConfiguration 中的 Java 编辑器示例中完成的。
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; }
内容辅助行为是在 IContentAssistant 接口中定义的。设置内容辅助在某些方面与设置语法突出显示相似。对于不同的文档内容类型,应当采用不同的短语补全战略来配置辅助。补全战略是使用 IContentAssistProcessor 实现的。处理器为特定内容类型中的偏移量提出补全并计算上下文信息。
并不是所有内容类型都需要具有内容辅助。在 Java 示例编辑器中,为缺省上下文类型和 javadoc 提供了内容辅助处理器,但是不会处理多行注释。让我们看一下这些处理器中的每个处理器。
JavaCompletionProcessor 相当简单。它只能提供关键字作为补全候选值。关键字是在 fgProposals
字段中定义的,并且始终提供这些关键字作为候选值:
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; }
补全可以在用户请求时触发,也可以在输入“(”或“.”字符时自动触发:
public char[] getCompletionProposalAutoActivationCharacters() { return new char[] { '.', '(' }; }
除了提供补全之外,JavaCompletionProcessor 还定义用户可以请求的上下文信息。上下文信息包括对给定上下文中的可用信息的描述以及详细的信息消息。
在 Java 编辑器示例中,信息实际上并不是上下文相关的。当用户请求上下文信息时,会对包含五个相似的上下文信息对象的数组进行计算以获取当前偏移量。所有这些上下文信息对象都定义这样一个上下文:它包含偏移量前面的五个字符和偏移量后面的五个字符。如果选择了这五个建议中的任何一个建议,则详细信息就会显示在光标附近,并且只要光标处于偏移量周围的五个字符的上下文内,就会一直显示这些详细信息。
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; }
当输入“#”字符时,将自动显示此上下文信息:
public char[] getContextInformationAutoActivationCharacters() { return new char[] { '#' }; }
可以使用 IContentAssistant 来配置内容辅助的外观和行为。例如,可以配置自动激活超时以及弹出信息的方向和颜色。
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; }