吹き出しサポートはプラットフォーム・テキスト・フレームワークで提供され、エディターに表示されているテキストおよび ルーラーの上の情報吹き出し (infopop) をインプリメントできるようにします。
吹き出しサポートはオプションです。 役立つ一般情報がないため、デフォルトで SourceViewerConfiguration は 吹き出し動作をインストールしません。 テキストまたはルーラー吹き出しを提供するためには、エディターのソース・ビューアーを構成し、 プラグ可能吹き出しオブジェクトを定義しなければなりません。
もう一度 JavaSourceViewerConfiguration を調べて、どのメソッドが吹き出し動作を定義するか見てみましょう。
public ITextHover getTextHover(ISourceViewer sourceViewer, String contentType) { return new JavaTextHover(); } public IAnnotationHover getAnnotationHover(ISourceViewer sourceViewer) { return new JavaAnnotationHover(); }
吹き出しヘルパー・クラスは、SourceViewer プロトコル (setTextHover および setAnnotationHover) を使用して動的にインストールすることもできます。 いずれの方法を行っても、ランタイムにおける特定の効果はありません。 ただし、SourceViewerConfiguration の サブクラスにプラグ可能動作のオーバーライドすべてを行うことによって、定義すべてを 1 つに統合できるという効果が生まれます。
両方の種類の吹き出しを使用する上での特性を調べてみましょう。
テキスト吹き出しによって、エディターに表示されるテキストに関する情報テキストを指定できます。 これは、ITextHover インターフェースによって行われます。 テキスト吹き出しには、文書へのオフセットを与えられた、吹き出し情報のソースとして使用される領域を 計算する役割があります。 また、特定の領域に関する情報テキストを提供する役割もあります。 JavaTextHover は非常に単純です。 これは、吹き出しに与えられたオフセットがテキスト選択に含まれているかどうかを検査します。 含まれていれば、選択範囲を吹き出し領域として提供します。
public class JavaTextHover implements ITextHover { ... public IRegion getHoverRegion(ITextViewer textViewer, int offset) { Point selection= textViewer.getSelectedRange(); if (selection.x <= offset && offset < selection.x + selection.y) return new Region(selection.x, selection.y); return new Region(offset, 0); } }
独自に計算された吹き出し領域によって、その入力から選択されたテキストを取得し、それを吹き出し情報として返します。
public class JavaTextHover implements ITextHover { public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) { if (hoverRegion != null) { try { if (hoverRegion.getLength() > -1) return textViewer.getDocument().get(hoverRegion.getOffset(), hoverRegion.getLength()); } catch (BadLocationException x) { } } return JavaEditorMessages.getString("JavaTextHover.emptySelection"); } ... }
もちろん、エディターで選択を吹き出し表示すると、その吹き出しテキストは選択を示します。
役立つ吹き出し情報を計算するため、さらに複雑なコンテキスト情報を使用できます。 その例は、JDT エディターでインプリメントされた JavaTextHover にあります。
垂直表示域の吹き出しは、行指向の情報を表示するために役立ちます。 この吹き出しクラスは、上で述べられているように構成されています。 IAnnotationHover は、 ルーラー吹き出しオブジェクトのためのインターフェースです。 この名前は、吹き出しがルーラー上の注釈のためのものであることを示していますが、 実際、何が該当するかは個別のエディターによって異なります。 ルーラー吹き出しには、特定の行番号に関連する情報ストリングを返す (その行にマーカーが存在するかどうかには関係なく) 役割があります。
Java サンプル・エディターの JavaAnnotationHover は、すべての行の吹き出しをインプリメントします。 これは、行番号を使用して吹き出し行のテキストすべてを取得し、それを情報ストリングとして返します。
public String getHoverInfo(ISourceViewer sourceViewer, int lineNumber) { IDocument document= sourceViewer.getDocument(); try { IRegion info= document.getLineInformation(lineNumber); return document.get(info.getOffset(), info.getLength()); } catch (BadLocationException x) { } return null; }
吹き出しは文書およびソース・ビューアーにアクセスしているため、 表示される情報に関する、さらに複雑なコンテキスト決定を行うために必要なコンテキストを持っています。 たとえば、垂直表示域に表示されている注釈の吹き出し情報を提供するため、注釈モデルをソース・ビューアーから 取り出すことができます。 JDT エディターで提供されている JavaAnnotationHover に、この機能が用意されています。