S-JIS[2013-03-31] 変更履歴

Eclipse GEF FrameBorder

Eclipseプラグイン開発GEFFigureに指定できるFrameBorderについて。


概要

FrameBorderは、ウィンドウの様に上部にタイトルバーを持った四角形(ちょっと浮き上がって見えるような影も付いている)。


FrameBorderを使ったFigureの例。

ExampleFigure.java:

import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.FrameBorder;
import org.eclipse.draw2d.FreeformLayout;
import org.eclipse.draw2d.TitleBarBorder;
public class ExampleFigure extends Figure {

	private FrameBorder border;
	public ExampleFigure() {
		border = new FrameBorder();
		{
			TitleBarBorder bar = (TitleBarBorder) border.getInnerBorder();
			bar.setTextColor(ColorConstants.black);
//			bar.setBackgroundColor(ColorConstants.blue);
		}
		setBorder(border);

		setLayoutManager(new FreeformLayout());
	}
	public void setName(String name) {	//タイトルラベルをセットする
		border.setLabel(name);
		repaint();	//repaintを呼び出さないと、即時反映されないっぽい
	}
}

FrameBorderでタイトルバー部分の色を変えたい場合は、inner(TitleBarBorder)を取得してそこにセットする。


選択箇所の限定

FrameBorderを単なる枠として使用する(FrameBorderの範囲内に別の図形群が入っていても特別な処理をしない)場合、
マウスをクリックした際にFrameBorderのFigure自体が選択されてしまって範囲内の別の図形を選択しづらい。
(特に、通常であれば何も無い部分をクリックしてドラッグすることで範囲選択が出来るのだが、FrameBorder内でそれをやるとFrameBorder自身が選択されてしまい、範囲選択が出来ない)

Figureの選択メソッドをいじると特定部分だけ選択させることが出来る。

ExampleFigure.java:

import org.eclipse.draw2d.IFigure;

import org.eclipse.draw2d.TreeSearch;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Rectangle;
public class ExampleFigure extends Figure {
〜
	@Override
	public IFigure findFigureAt(int x, int y, TreeSearch search) {
		// 四方の辺の部分だけ選択可能とする

		Rectangle rect = getBounds();
		Dimension barSize = border.getInnerBorder().getPreferredSize(this);
			if ((rect.x <= x && x < rect.x + 4)
			 || (rect.y <= y && y < rect.y + barSize.height)
			 || (rect.right() - 4 <= x && x < rect.right())
			 || (rect.bottom() - 4 <= y && y < rect.bottom())) {
				return super.findFigureAt(x, y, search); //通常の選択判定
			}

		return null; //選択拒否
	}
}

ちなみに、判定する必要なく常に選択できないようにするなら、EditPartを修正する方が簡単。

ExampleEditPart.java:

public class ExampleEditPart extends AbstractGraphicalEditPart {

	@Override
	protected IFigure createFigure() {
		ExampleFigure figure = new ExampleFigure();
		refreshName(figure);
		return figure;
	}

	private void refreshName(ExampleFigure figure) {
		ExampleModel model = (ExampleModel)getModel();
		figure.setName(model.getName());
	}
	@Override
	public boolean isSelectable() {
		return false;	//常に選択拒否
	}
}

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