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多多交流