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