前言
这三天来,一直在为一个问题所困扰。
我做的项目是将emf和gef结合的一个典型实例。其实我接触这些东西也才4,5个月,两个Eclipse工具都很熟悉,但是并不能说是精通。
在项目制作的过程中,编辑器的布局问题并没有拿到桌面上来讨论。毕竟,功能没有实现,编辑器作的再漂亮也不起作用。
现在,所有的功能点全部按要求实现了,可是再看看编辑器,就会觉得很外行,呵呵。
尽管老大不在公司,但是我想他肯定支持我的这个想法:将界面作的professional一点。
于是,我浪费了3天时间来重新做布局。
搜索icon
项目组没有给我配备美工,所有的图片都是临时的,我就采用了一些qq表情图,所以编辑器很“可爱”。现在需要根据每个模型的实际含义来配备icon,于是利用google & baidu搜了一些图片下来。好在我还会点ps,那二十多个图标就算定了。
研究布局
这次的代码大改造,需要严重的感谢一个人:reload_cn。非常感谢他能耐心的听我不停的发牢骚,并给于正确的指导。这对后来的改造成功起决定性作用。尽管他将社区里的帅照改成了黑猩猩......
好,转入正题。目前的编辑器功能已经实现了,但是为什么要改布局呢?因为现在编辑器采用的是xyLayout,创建一个对象之后,将它的xywh保存在模型对象中,然后再refreshVisual的时候设置Figure的Bound。这么做的问题是,首先,没有很好的计算坐标,所以坐标有点出入(有的时候坐标出入大的难以接受),其次,本工具定义的主要是流程,所以编辑器里的“内容”很多,每创建一个对象都需要手工拖拽到合适的位置上。
在reload_cn的提示下,我研究了一下GEF的Flow例子。由于时间关系(元旦之后就会发布最终版本,要不加班,要不加快脚步干活),我直接就将flow里的GraphLayoutManager拿过来用了...
结果是,经常报些莫名其妙的错误。
所谓心急吃不了热豆腐。
继续在reload_cn的提示下,研究了他的sequnce diagram的例子。在这个例子中,他做了个很简单的布局处理。
从这里例子中,我领悟出了真谛:
在EditPart中设置的Layout Policy其实主要处理的是创建对象等等request,并不处理真正的编辑器布局。又或者说它的布局是逻辑意义上的。真正处理布局,来让我们看到效果的,是Figure的布局。而这个正好是我常常忽略的。
Figure怎么布局??我一般用的就是xyLayout和ToolbarLayout。但是如果要作出漂亮的效果,这些还是不够的。八进制的blog中提到了draw2d的tree example。我看过了,然后研究了一下,觉得太简单了,不能符合本项目的需求。
回头再看看flow,觉得这个例子本身就是流程定义,并且跟我的项目在Figure上有很多共同点。。。
仍然心有余悸,毕竟用flow的代码作的所有尝试(用了1天的时间)全部失败了,而且还败的莫名其妙。
开始尝试
不能因为失败,所以放弃(但是可以有放弃的想法,呵呵)。我决定一点一点地来尝试。
首先,我替换了所有的icon,至少图标看起来已经舒服多了。
接着,根据flow中figure的做法,更新了项目中的所有Figure。运行一下看看,呵呵,至少图标很象了。
我很喜欢flow中自动计算Figure位置的功能和动态移动效果。怎么办?继续改装代码。
将GraphLayoutManager小心翼翼的搬了过来。没有效果。但是至少没有出错。
开始使用GraphLayoutManager来进行坐标计算。(这个过程漫长而痛苦,不停的报异常,不停的对比代码,不停的跟踪,不停的发牢骚....)
最后出的问题最有意思,假如编辑器根模型的Figure采用flow中的figure,那么编辑器中只显示连线。为什么呢?因为我的编辑器中使用的是viewer.setRootEditPart(new ScalableFreeformRootEditPart());而flow中用的是getGraphicalViewer().setRootEditPart(new ScalableRootEditPart());所以在我这边,figure采用FreeformLayer就no problem了。
最终得结果是改好了,一切都跟flow那么象
结果
结论
假如你和我一样,在项目制作后期修改编辑器的布局,这里有几个建议:
1 研究一下例子,从简单的开始,一直到难的,让理论知识根深蒂固。
2 作个小例子,或者将你已经作的小例子进行类似的改编,看看出什么问题,为什么出问题。
3 例子没做出来没关系,这些跟头栽在小例子上比栽在项目中让人欣慰的多。
4 先修改Figure。尽量接近你想要的效果。
5 引入布局,暂时不要使用它,只要他的流程走下来没有问题就成功了一半。
6 使用布局。会出现很多问题,但是很容易定位问题。调试吧。
暂时就这么多吧,刚刚的改动导致了编辑器中的删除功能抛异常,我得看看去