GEF社区捐献的一个图形旋转(Rotation)的例子

GEF社区捐献的一个图形旋转(Rotation)的例子
GEF由于偏向的是以图形表达模型,所以图形表达能力一直都没有java2d强,rotation新闻组从2004年就有人陆续不断的提,但是3.5好像 也没有列入,不过社区的力量就是强大,有人了contribute一段支持旋转的代码。我拿到代码之后做了一个例子,由于它的transform不是 draw2d提供的平台相关性transform(如java2d所做的调用windows system api 驱动硬件),所以rotation的效果不是很好,线条有些模糊。



安装:

打开 https://bugs.eclipse.org/bugs/show_bug.cgi?id=117012,将附件下载下来,解压缩放到插件目录 (plugins或者dropins)。由于这是两个fragements,不能直接加到plugin的dependencies,参见 http://bongyee.blogspot.com/2009/02/plug-in-dependencies-depend-on.html提 供的解决办法。

更新代码支持旋转

在GEF中任何特征基本都会在MVC即model, editpart, figure三个层面做改动,rotation也不例外。

1 在model object上加一个属性int rotation_angle记录当前旋转角度,添加get/set方法,且在set方法中触发一个event给对应的editpart。

2 在editpart的createFigure方法中返回一个RotatableRectangleFigure。

3 稍微有点麻烦的就是修改Editpart了。在diagram editpart中安装继承了xylayouteditpolicy的editpolicy都会给child editpart默认安装一个resizableeditpolicy,这样选中一个editpart是就会在figure上出现八个handle,用来 move和resize。如果要支持rotation,覆盖默认的resiableeditpolicy为 RotatableResizableEditPolicy(捐献提供),覆盖方式为:

public   class  XXDiagramEditPart
{

protected   void  createEditPolicies() {
.
installEditPolicy(EditPolicy.LAYOUT_ROLE, 
new  QQQXYLayoutEditPolicy());

 }

}

public   class  QQQXYLayoutEditPolicy
{

protected  EditPolicy createChildEditPolicy(EditPart child) {
if  (child is RotatableChildEditPart)
{
return   new  RotatableResizableEditPolicy( true ){
 旋转命令
protected  Command getRotateCommand(
RotatableChangeBoundsRequest request) {
return   new  RotateCommand(getHost().getModel(), request.getAngleDelta());
}

}
}
}

}

RotateCommand非常简单,execute的时候设置模型的角度 += angleDelta,undo的时候 -= angleDelta。

4 响应模型触发的rotation事件,更新figure。

public   class  MyRotatableEditPart  // register as listener for model changing.
{

public   void  propertyChange(PropertyChangeEvent evt) {
if  (evt is Rotation Event)
{
// 更新figure
((RotatableRectangleFigure)getFigure()).setAngle(getModel().getRotationAngle());
}
}


欢迎大家来信msn多多交流

你可能感兴趣的:(GEF社区捐献的一个图形旋转(Rotation)的例子)