內容助手(Content Assist)綁定於 JFace SourceViewer,不僅用於 Eclipse 編輯器,也能用於任何基於 SWT/JFace JAR 的獨立應用。本文在 Eclipse 編輯器外掛環境示範實作,並給獨立應用移植提示。
com.bdaum.SampleHTMLEditorHTMLEditor,名稱「Sample HTML Editor」,副檔名 html, htm此時 Ctrl+Space 無反應——SourceViewer 預設無內容助手。
生成的 XMLConfiguration(繼承 SourceViewerConfiguration)是配置中樞。需覆寫:
getContentAssistant():返回裝配好處理器的 ContentAssistantgetInformationControlCreator():自訂附加資訊視窗渲染(如標籤粗體)getContextInformationValidator() + computeContextInformation():支援上下文資訊驗證模式一:結構建議(無選取文字時)
從文檔偏移位置向後掃描限定符(如 <TA),匹配預定義標籤陣列(STRUCTTAGS1/2 分前綴/後綴),生成 CompletionProposal,光標落在標籤內合適位置。
模式二:樣式包裹(有選取文字時)
針對選取文字,提供 <b>/<i>/<code>/<strong> 等包裹建議。因替換長度不定,彈出視窗顯示簡短標籤(bold 等),選中時以 ContextInformation 顯示預覽,附加資訊視窗展示完整替換結果。
// getContentAssistant() 核心裝配
ContentAssistant assistant = new ContentAssistant();
IContentAssistProcessor processor = new HtmlContentAssistProcessor();
assistant.setContentAssistProcessor(processor, XMLPartitionScanner.XML_TAG);
assistant.setContentAssistProcessor(processor, XMLPartitionScanner.XML_DEFAULT);
assistant.setContentAssistProcessor(processor, IDocument.DEFAULT_CONTENT_TYPE);
assistant.enableAutoActivation(true); // 自動觸發
assistant.setAutoActivationDelay(500); // 500ms 延遲
assistant.setProposalSelectorBackground(bgColor); // 綠底區分附加視窗
assistant.setInformationControlCreator(getInformationControlCreator(sourceViewer));
return assistant;
getCompletionProposalAutoActivationCharacters() 返回 '<',輸入標籤開頭自動彈出IInformationPresenter,在 updatePresentation 中掃描 <...> 加粗(StyleRange + SWT.BOLD)computeContextInformation 與 ContextInformationValidatorVerifyKeyListener 攔截 Ctrl+Space 調用 sourceViewer.doOperation(CONTENTASSIST_PROPOSALS);Workbench 編輯器則用 TextOperationAction + setActionActivationCodeJava 編輯器的「參數化建議」(如 for 範本中變數名同步修改)屬 JDT 專有(org.eclipse.jdt.internal.ui.text.java.ExperimentalProposal 等),無 JDT 環境無法直接用。幸好源碼開放,移植難度不大,有需求可自行遷移。
透過 SourceViewerConfiguration 靈活裝配 ContentAssistant、IContentAssistProcessor、IInformationPresenter、ContextInformation,即可為任何 SWT/JFace 文本編輯器賦予專業級內容助手體驗。本文 HTML 編輯器範例展示了結構建議、樣式包裹、自動觸發、預覽視窗、上下文提示完整鏈路,代碼結構清晰可直接擴展。