改变GMF应用程序画布的布局

简介:

在GMF帮我们生成的应用程序里,画布(Canvas)的布局缺省是使用XYLayout的,这种布局适合UML类图、流程图等应用,但并不适合序列图或表格这类应用。而且目前GMF的.gmfgraph模型里没有提供为整个Canvas设置布局的地方,因此只能通过修改代码的方式实现。因为GMF Runtime是基于GEF的,即GMF生成的代码本质上也是一个GEF应用程序,所以根据以往编写GEF应用程序的经验,不难找到需要修改的地方。

首先要修改作为画布的那个EditPart(下称yourCanvasEditPart),这个类是从gmf的DiagramEditPart继承过来的,看一下后者的createDefaultEditPolicies()方法就会发现它的LAYOUT_ROLE的EditPolicy是gmf的XYLayoutEditPolicy:

installEditPolicy(EditPolicy.LAYOUT_ROLE, new XYLayoutEditPolicy());

GEF里同一个EditPart上要覆盖一个已有EditPolicy的方法是使用同样的Role安装新的EditPolicy,所以我们应该在yourCanvasEditPart的createDefaultEditPolicies()方法里使用LAYOUT_ROLE安装自己的EditPolicy,这里为方便使用了GEF提供的FlowLayoutEditPolicy,你若有特殊需要可实现自己的EditPolicy:

installEditPolicy(EditPolicy.LAYOUT_ROLE, new FlowLayoutEditPolicy() {

    @Override
    protected Command getCreateCommand(CreateRequest request) {
        return null;
    }

    @Override
    protected Command createMoveChildCommand(EditPart child,
            EditPart after) {
        return null;
    }

    @Override
    protected Command createAddCommand(EditPart child, EditPart after) {
        return null;
    }

    @Override
    protected boolean isHorizontal() {
        return true;
    }

});

我们知道,GEF里每个EditPart上作为LAYOUT_ROLE安装的EditPolicy应该和此EditPart对应的Figure使用的LayoutManager匹配,例如XYLayoutEditPolicy对应XYLayout,而FlowLayoutEditPolicy匹配的LayoutManager就是FlowLayout或ToolbarLayout,这两个LayoutManager最大的区别是前者允许子图形换行(列)排列,而后者只能有一行(列)。要注意一点,FlowLayoutEditPolicy与ToolbarLayout一起使用存在一点问题,原因是在FlowLayoutEditPolicy的isHorizontal()方法里认为传入的layoutmanager参数是FlowLayout,因此我们在上面代码里覆盖了isHorizontal()方法,至于返回true或false根据你的需求决定。

现在,为了匹配修改后使用的FlowLayoutEditPolicy,我们要覆盖yourCanvasEditPart的createFigure()方法,在父类DiagramEditPart里这个方法返回的Figure使用的是FreeFormLayout,我们现在需要的是ToolbarLayout,所以:

protected IFigure createFigure() {
    Figure f = new FreeformLayer();
    ToolbarLayout layout = new ToolbarLayout();
    layout.setVertical(false);
    layout.setSpacing(10);
    layout.setStretchMinorAxis(true);
    f.setLayoutManager(layout);
    f.setBorder(new MarginBorder(15));
    return f;
}

经过这样两处修改后,你的编辑器应该已经像下图所示这样了(可能还有些细节代码需要处理一下):

GMF在GEF基础上做了很多包装,例如添加了SemanticEditPolicy、CanonicalEditPolicy等等新的EditPolicy,以及相关的很多Command和EditPart,它们为GMF应用程序提供了新的功能,虽然掌握GMF Runtime的API需要花些时间,但这允许我们在不进行大规模编写代码的情况下获得符合需求的图形化编辑器,建议先提前了解一下。

Update(2007/07/17): 在GMF 2.0里,可以通过设置xxx.gmfgen文件里Figure Viewmap的"Layout Type"属性为"TOOLBAR_LAYOUT"达到同样目的。

本文转自博客园八进制的博客,原文链接:改变GMF应用程序画布的布局,如需转载请自行联系原博主。

相关文章
|
4月前
|
XML 搜索推荐 Java
Android App开发之自定义图形中位图与图形互转、剪裁图形内部区域、给图形添加部件的讲解及实战(附源码 简单易懂)
Android App开发之自定义图形中位图与图形互转、剪裁图形内部区域、给图形添加部件的讲解及实战(附源码 简单易懂)
33 0
|
API 图形学
Winform控件优化之自定义控件的本质【从圆角控件看自定义的本质,Region区域无法反锯齿的问题】
自定义控件的本质只有两点:重绘控件Region区域(圆角、多边形、图片等),这是整个控件的真实范围;重绘图形,在原有Region范围内,重绘不同的图形(圆角、多边形、图片等)作为背景......
432 0
Winform控件优化之自定义控件的本质【从圆角控件看自定义的本质,Region区域无法反锯齿的问题】
|
算法 Windows
Winform控件优化之实现无锯齿的圆角窗体(或任意图形的无锯齿丝滑的窗体或控件)【借助LayeredWindow】
在一般能搜到的所有实现圆角窗体的示例中,都有着惨不忍睹的锯齿...而借助于Layered Windows,是可以实现丝滑无锯齿效果的Form窗体的,其具体原理就是分层窗体....
963 0
Winform控件优化之实现无锯齿的圆角窗体(或任意图形的无锯齿丝滑的窗体或控件)【借助LayeredWindow】
|
11天前
简单讲述ondragstart、drag、ondragend、ondragenter、ondragover、ondrop、ondragleave七个与拖拽相关的监听事件,并运用实现拖拽过程放置样式变化
简单讲述ondragstart、drag、ondragend、ondragenter、ondragover、ondrop、ondragleave七个与拖拽相关的监听事件,并运用实现拖拽过程放置样式变化
|
1月前
QML (控件位置布局)之(Anchors)锚布局
QML (控件位置布局)之(Anchors)锚布局
36 2
|
4月前
[Qt5&布局] 控件自动填满所在布局框架
[Qt5&布局] 控件自动填满所在布局框架
35 0
[Qt5&布局] 控件自动填满所在布局框架
|
10月前
|
编译器 API 图形学
【unity细节】基于unity子对象(如相机)为什么无法进行z轴的拖拽移动和z轴自动归位的问题
【unity细节】基于unity子对象(如相机)为什么无法进行z轴的拖拽移动和z轴自动归位的问题
115 0
Winform控件优化之圆角Panel【绘制时需要注意的几点和扩展】
圆角的实现(原理和绘制方法)之前基本都已经介绍,本篇主要是实现圆角Panel时介绍几点注意点和一些扩展。一是BackColor应始终为Transparent;二是Draw完全显示绘制出的线条...
1139 0
Winform控件优化之圆角Panel【绘制时需要注意的几点和扩展】
关于 Qt图形视图框架自绘图元放到左边和上边之外,部分在内进行拉伸后,拉伸多余的区域无法碰撞 的解决方法
关于 Qt图形视图框架自绘图元放到左边和上边之外,部分在内进行拉伸后,拉伸多余的区域无法碰撞 的解决方法
关于 Qt图形视图框架自绘图元放到左边和上边之外,部分在内进行拉伸后,拉伸多余的区域无法碰撞 的解决方法