コンテンツ・アシストによって、ユーザー要求におけるコンテキスト依存コンテンツ完了を提供することができます。 この機能は、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; }