minimize

事業拡大のため、新しい仲間を募集しています。
→詳しくはこちら

エディタに表示する文字の見た目などをカスタマイズするクラスです。

基本的な使い方

public class MyEditor extends TextEditor {
    protected void initializeEditor() {
        super.initializeEditor();
        setSourceViewerConfiguration(new MySourceViewerConfiguration());
    }
}

このように使います。
SourceViewerConfiguration クラスの派生クラスを作成し、
MyEditorのinitializeEditor メソッド内で setSourceViewerConfiguration メソッドを呼び出します。

あとは、必要に応じて MySourceViewerConfiguration クラス内でメソッドを実装していきます。

getPresentationReconciler

エディタ内の文字装飾をカスタマイズするには、このメソッドを実装します。

public IPresentationReconciler getPresentationReconciler(
        ISourceViewer sourceViewer) {
    PresentationReconciler reconciler = new PresentationReconciler();
    ITokenScanner scanner = new MyCodeScanner();
    DefaultDamagerRepairer dr = new DefaultDamagerRepairer(scanner);
    reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
    reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);
    return reconciler;
}

ITokenScanner は、エディタ内の文字を解析して装飾方法を指定するためのインターフェイスです。
このインターフェイスを実装したクラスを別に作成する必要があります。

ITokenScanner

直接 ITokenScanner を implements しても良いですが、
既に RuleBasedScanner というクラスがあるのでこれを継承するのが便利です。
あとは、以下のようなコンストラクタを定義するだけです。

public class MyCodeScanner extents RuleBasedScanner {
    public MyCodeScanner() {
        List rules = new ArrayList();
        rules.add(new MyRule(...));
        rules.add(new MyRule(...));
        setRules((IRule[])rules.toArray(new IRule[rules.size()]));
    }
}

文字列を解析するルールを必要なだけ指定して、setRulesメソッドを呼び出します。
ルールは IRule を継承して自作するか、既存のクラスを使用します。

既存クラスについては、 IRule を Hierarchy に掛ければすぐに見つかるはずです。
自作クラスの作成については、以前書いた記事を参考にしてみて下さい。
参考コラム : 独自のルールを作る

getDoubleClickStrategy

エディタ内をダブルクリックしたときの動作をカスタマイズするには、このメソッドを実装します。

public ITextDoubleClickStrategy getDoubleClickStrategy(
        ISourceViewer sourceViewer, String contentType) {
    return new MyDoubleClickStrategy();
}

ITextDoubleClickStrategy インターフェイスを実装したクラスを別に作成する必要があります。

ITextDoubleClickStrategy

実装するメソッドは以下の一つです。

public void doubleClicked(ITextViewer viewer) {
    int pos = viewer.getSelectedRange().x; // 現在のカーソル位置
    IDocument doc = viewer.getDocument(); // エディタ内ドキュメント
    
    // 各種処理...
    
    viewer.setSelectedRange(offset, length); // エディタ内テキストを選択
}