Eclipseのプラグイン開発の自作DMDLエディターでキーワードに色を付けてみる。
|
DMDLでは波括弧でブロックを作るので、Javaのエディターと同じ様に対応する括弧を強調表示してみたい。
item = {
code : LONG;
id : TEXT;
name : TEXT;
};
対応する括弧(brace)を探すクラスとして、ICharacterPairMatcherインターフェースを実装したクラスを用意する。
package jp.hishidama.eclipse_plugin.dmdl_editor.editors; import jp.hishidama.eclipse_plugin.dmdl_editor.Activator; import org.eclipse.core.runtime.ILog; import org.eclipse.core.runtime.Status; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.Region; import org.eclipse.jface.text.source.ICharacterPairMatcher;
public class DMBraceMatcher implements ICharacterPairMatcher {
@Override
public void dispose() {
}
@Override
public void clear() {
}
@Override
public IRegion match(IDocument document, int offset) {
int len = document.getLength();
if (offset >= len) {
return null;
}
try {
if (offset > 0 && document.getChar(offset - 1) == '{') {
// 対応する'}'の位置を返す
int end = document.get().indexOf("}", offset);
if (end >= 0) {
return new Region(end, 1);
}
} else if (document.getChar(offset) == '}') {
// 対応する'{'の位置を返す
int start = document.get().lastIndexOf("{", offset);
if (start >= 0) {
return new Region(start, 1);
}
}
} catch (BadLocationException e) {
ILog log = Activator.getDefault().getLog();
log.log(new Status(Status.WARNING, Activator.PLUGIN_ID, 0, "DMBraceMatcher#match() location error.", e));
}
return null;
}
match()で、ドキュメントのカーソル位置に「{」や「}」が見つかったら、対応する位置(Region)を返す。
これは単純にString#indefOf()やlastIndexOf()で文字を探しているだけなので、ドキュメント上のコメント内に対応する括弧があった場合、そこにマッチしてしまう。
Javaエディターだとコメントは無視されるので、何かやってるんだろうなぁ。
@Override
public int getAnchor() {
return LEFT;
}
}
getAnchor()はRIGHTかLEFTを返すようにする。何に使うのかよく分からない!(爆)
DMDLEditorでcreatePartControl()をオーバーライドし、上記のDMBraceMatcherを扱えるようにする。
import org.eclipse.jface.text.ITextViewerExtension2; import org.eclipse.jface.text.source.MatchingCharacterPainter; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display;
@Override
public void createPartControl(Composite parent) {
super.createPartControl(parent);
MatchingCharacterPainter painter = new MatchingCharacterPainter(getSourceViewer(), new DMBraceMatcher());
painter.setColor(Display.getDefault().getSystemColor(SWT.COLOR_GRAY));
ITextViewerExtension2 extension = (ITextViewerExtension2) getSourceViewer();
extension.addPainter(painter);
}