內容輔助可讓您根據使用者要求,來提供上下文相關的內容完成。 這個功能是由 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 編輯器範例中,資訊不是真正的環境定義。 當使用者要求環境定義資訊時, 便會計算含有 5 個類似環境定義資訊物件的陣列,以取得現行偏移。這些環境定義資訊物件全都會定義一個環境定義, 在偏移之前含有 5 個字元,在偏移之後含有 5 個字元。 如果選取了這 5 個提議的任一個,詳細資訊將出現在游標旁邊, 而且只要游標在偏移周圍的 5 個字元環境定義內,此資訊就會留下來。
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; }