Eclipseのプラグイン開発のGEFのFigureに指定できるFrameBorderについて。
|
FrameBorderは、ウィンドウの様に上部にタイトルバーを持った四角形(ちょっと浮き上がって見えるような影も付いている)。
FrameBorderを使ったFigureの例。
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の選択メソッドをいじると特定部分だけ選択させることが出来る。
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を修正する方が簡単。
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; //常に選択拒否
}
}