Eclipseのプラグイン開発のドキュメントクラスについて。
|
org.eclipse.jface.text.IDocumentは、TextEditorでテキストを保持するクラス(インターフェース)。
代表的な具象クラスはorg.eclipse.jface.text.Document。
ITextEditorからIDocumentを取得する方法。[2013-11-27]
import org.eclipse.jface.text.IDocument; import org.eclipse.ui.texteditor.IDocumentProvider; import org.eclipse.ui.texteditor.ITextEditor;
ITextEditor editor = 〜; IDocumentProvider provider = editor.getDocumentProvider(); IDocument document = provider.getDocument(editor.getEditorInput());
TextEditorに関連して色を付けたりフォールディングやアウトラインの表示範囲を決定したりするのにIDocumentを使う。
その際にパーサーを使ってIDocumentからテキストを読み込んで構文解析を行うが、解析結果は使い回せるので、共通の場所に保持しておきたい。
IDocumentは全ての場所に渡されるので、IDocumentに保持しておくのが都合がいい。
という訳で、独自のIDocumentクラスを作ってみる。
import org.eclipse.jface.text.Document;
public class MyDocument extends Document { private ParseResult ast;
public void setParseResult(ParseResult ast) { this.ast = ast; } public ParseResult getParseResult() { return ast; } }
ドキュメントクラスのインスタンス化はDocumentProviderで行う。
import org.eclipse.ui.editors.text.FileDocumentProvider;
public class MyDocumentProvider extends FileDocumentProvider {
@Override protected IDocument createEmptyDocument() { return new MyDocument(); } }
import org.eclipse.ui.editors.text.TextEditor;
public class MyEditor extends TextEditor {
/** * コンストラクター. */ public MyEditor() { setDocumentProvider(new MyDocumentProvider()); 〜 }
パース結果の保持を行う場所は、パース(構文解析)を行う場所が相応しい。
ドキュメントに変更があると登録したパーティションスキャナーが呼ばれるので、そのメソッドで構文解析してドキュメントに保持すれば良さそう。
import org.eclipse.jface.text.rules.IPartitionTokenScanner;
public class MyPartitionScanner implements IPartitionTokenScanner {
@Override public void setPartialRange(IDocument document, int offset, int length, String contentType, int partitionOffset) { MyDocument doc = (MyDocument) document; MyParser parser = new MyParser(); ParseResult ast = parser.parse(doc); doc.setParserResult(ast); 〜 } }