コンテンツ・アシストによって、ユーザー要求におけるコンテキスト依存コンテンツ完了を提供することができます。この機能は、org.eclipse.jface.text.contentassist のプラットフォーム・テキスト・フレームワークによってインプリメントされています。 ポップアップ・ウィンドウ (infopop) は、句を完成させるよう考えられるテキスト選択を要求するために使用されます。 ユーザーは、テキストに挿入するため、これらの選択を行うことができます。 コンテンツ・アシストは、文書の現在位置に関連する情報をユーザーに提供するため、コンテキスト infopop もサポートしています。
コンテンツ・アシストのインプリメントはオプションです。特定のエディターに使用される文書モデルを認識せず、コンテンツ・アシストのための汎用動作を行わないため、デフォルトで 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;
}
ユーザーがコンテンツ・アシストを呼び出せるようにするには、アクションを作成して構成する必要があります。これは通常、AbstractTextEditor.createActions() のサブクラス実装で行われます。
protected void createActions() {
...
IAction action= new ContentAssistAction(aResourceBundle, "ContentAssistProposal.", this); //$NON-NLS-1$
action.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS);
setAction(actionId, action); //$NON-NLS-1$
markAsStateDependentAction(actionId, true); //$NON-NLS-1$
PlatformUI.getWorkbench().getHelpSystem().setHelp(action, helpContextId);
...
}
エディターのアクション・バー・コントリビューターを拡張して、メインメニューにアクションを表示させる必要があります。
...
private RetargetTextEditorAction fContentAssist;
public MyEditorActionContributor() {
fContentAssist= new RetargetTextEditorAction();
String commandId= ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS;
fContentAssist.setActionDefinitionId(commandId);
}
public void contributeToMenu(IMenuManager menu) {
IMenuManager editMenu= menu.findMenuUsingPath(M_EDIT);
editMenu.appendToGroup(MB_ADDITIONS, fContentAssist);
}
public void setActiveEditor(IEditorPart part) { IAction editorAction= getAction(part, "ContentAssist");
fContentAssist.setAction(editorAction);
}
...