minimize

Content Assist とは、テキストの補完機能のことです。
Ctrl+Space (Alt+/) を押すと出てくる例のアレです。

Editor内でこれを実装するのは結構簡単ですが、
ここではそれ以外の場所で Content Assist を実装する方法について説明します。

必要なクラス

Content Assist を実装するのに必要なクラスは、基本的に以下の3つです。

org.eclipse.jface.text.contentassist.ContentAssistant

その名の通り、これがメインとなるクラスです。
使い方をざっと説明します。

  1. ContentAssistant クラスのインスタンスを生成

    引数は特に必要ありません。

  2. install(textViewer) メソッド呼出

    TextViewer を引数に渡します。これは予め作成しておく必要があります。

  3. setContentAssistProcessor(processor, contentType) メソッド呼出

    processor は補完内容を定義したインスタンスです。
    これも予め作成しておく必要があります。
    contentType は IDocument と関連しているのですが、通常は IDocument.DEFAULT_CONTENT_TYPE を指定すればOKです。

  4. setShowEmptyList(true) メソッド呼出

    これは呼ばなくても構いませんが、呼んでおいた方が無難です(理由は後述)。
    ここまでが、事前準備です。

  5. showPossibleCompletions メソッド呼出

    あとは補完したいタイミングでこのメソッドを呼び出します。
    通常は、キー押下のイベント時です。

org.eclipse.jface.text.TextViewer

上の手順で出てきた TextViewer について説明します。
これはその名の通り Viewer の一種で、内部には StyledText を持っています。
使い方は簡単です。

  1. TextViewer クラスのインスタンスを生成

    通常のSWTコントロールと同じように、親CompositeとSWT Styleを引数で渡します。
    ここで自動的に StyledText コントロールが作成されます。

  2. setDocument(document) メソッド呼出

    ドキュメントを設定します。通常は new Document() とやっておけばOKです。

  3. getControl().addKeyListener(keyListner) メソッド呼出

    getControl() で StyledText が取得できるので、これにキー押下リスナーを追加します。
    あとはこのイベント内でキーの種類を判別して、Ctrl+Space が押されたら
    ContentAssistant の showPossibleCompletions メソッドを呼び出すようにします。

org.eclipse.jface.text.contentassist.IContentAssistProcessor

上の手順で出てきた processor について説明します。
これは補完候補を決定するロジックインターフェイスで、これを実装したクラスを
一つ新規作成する必要があります。
色々メソッドが定義されていますが、ほとんどは空実装でOKです。
必須なのは以下の1メソッドです。

computeCompletionProposals(ITextViewer viewer, int offset)

上の手順で説明した showPossibleCompletions メソッド呼出のタイミングで
このメソッドがCallされます。

引数には Viewer およびオフセット位置が渡ってきます。
例えば StyledText に入力された内容を取得するには viewer.getDocument().get() とします。
そのときのカーソル位置が offset に入っているので、これを元に
今の文脈で補完候補となるものを戻り値として返せばOKです。

戻り値は ICompletionProposal[] となっているので、ここに補完候補をセットします。

候補が無い場合にはサイズ0の配列を返します。
このとき、上の手順で書いた setShowEmptyList(true) をしていないと
ビープ音が鳴り耳障りなので書いておきましょう。

ICompletionProposal の実装クラスはいくつか既存のものがありますが
ここでは一番基本的な CompletionProposal を使います。

例えば、StyledText に "St" と入力した段階で
補完キーを押したとします。
このとき "String" を補完候補として出す場合は以下のようにします。

new CompletionProposal("String", 0, 2, 0);

第1引数が補完文字列、
第2・第3引数は補完実行時にreplace対象となる文字のオフセットと長さを指定します。
ここでは "St" を対象とするので、offset = 0, length = 2 となります。
第4引数は、補完実行後にカーソルを置く位置です。
例のように0とすれば、String の "S" の部分にカーソルが移動します。
6 とすれば、"g" の後ろにカーソルが移動することになります。

[コメント(0)]