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);
〜
}
}