S-JIS[2013-01-14] 変更履歴

EclipseプラグインDMDLエディター(対応括弧の強調)

Eclipseプラグイン開発自作DMDLエディターでキーワードに色を付けてみる。


概要

DMDLでは波括弧でブロックを作るので、Javaのエディターと同じ様に対応する括弧を強調表示してみたい。

item = {
    code : LONG;
    id   : TEXT;
    name : TEXT;
};

DMBraceMatcher

対応する括弧(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

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

Eclipseプラグインへ戻る / Eclipseへ戻る / 技術メモへ戻る
メールの送信先:ひしだま