Content Assist とは、テキストの補完機能のことです。
Ctrl+Space (Alt+/) を押すと出てくる例のアレです。
Editor内でこれを実装するのは結構簡単ですが、
ここではそれ以外の場所で Content Assist を実装する方法について説明します。
Content Assist を実装するのに必要なクラスは、基本的に以下の3つです。
その名の通り、これがメインとなるクラスです。
使い方をざっと説明します。
ContentAssistant クラスのインスタンスを生成
引数は特に必要ありません。
TextViewer を引数に渡します。これは予め作成しておく必要があります。
setContentAssistProcessor(processor, contentType) メソッド呼出
processor は補完内容を定義したインスタンスです。
これも予め作成しておく必要があります。
contentType は IDocument と関連しているのですが、通常は IDocument.DEFAULT_CONTENT_TYPE を指定すればOKです。
これは呼ばなくても構いませんが、呼んでおいた方が無難です(理由は後述)。
ここまでが、事前準備です。
showPossibleCompletions メソッド呼出
あとは補完したいタイミングでこのメソッドを呼び出します。
通常は、キー押下のイベント時です。
上の手順で出てきた TextViewer について説明します。
これはその名の通り Viewer の一種で、内部には StyledText を持っています。
使い方は簡単です。
通常のSWTコントロールと同じように、親CompositeとSWT Styleを引数で渡します。
ここで自動的に StyledText コントロールが作成されます。
ドキュメントを設定します。通常は new Document() とやっておけばOKです。
getControl().addKeyListener(keyListner) メソッド呼出
getControl() で StyledText が取得できるので、これにキー押下リスナーを追加します。
あとはこのイベント内でキーの種類を判別して、Ctrl+Space が押されたら
ContentAssistant の showPossibleCompletions メソッドを呼び出すようにします。
上の手順で出てきた processor について説明します。
これは補完候補を決定するロジックインターフェイスで、これを実装したクラスを
一つ新規作成する必要があります。
色々メソッドが定義されていますが、ほとんどは空実装でOKです。
必須なのは以下の1メソッドです。
上の手順で説明した 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" の後ろにカーソルが移動することになります。