原文来自:http://lengbingteng-163-com.iteye.com/blog/1294058
1.Layer层:
FreeformFigure所有实现此接口的figure都具备向四周延伸的能力,但是此种figure必须放在FreeformViewport类似容器里面。
FreeformLayer:里面有一个FreeformHelper对象用于管理它的子,这里不深究它里面的逻辑,只强调它的用法。一般一个编辑器都是以一个这样的自由延伸的容器作为跟,它最主要的作用是编辑器里面的Layer多半都是以它为父扩展出来的。
编辑器一般以ScalableFreeformRootEditPart为root。它拥有一个createLayers()方法,上图就是已经默认创建的layer。
我们看到缺省包含了很多层,而且层中还有子层,每个层都有一个关键字来标识,我们从下到上做一个简要的描述:
Grid Layer: 网格层,用来显示一个网格,帮助你定位图形
Primary Layer: 主层,大部分的图形都放置在这个层
Connection Layer: 连接层,连线都放置在这一层 。setConnectionRouter:可以为当前layer中的所有线添加通用的路由。setAntialias:设定抗锯齿的值。
Printable Layer: 可打印层,这个层并没有实际作用,只是用来包含主层和连接层
Scaled Feedback Layer: 扩展反馈层,所谓反馈是指操作时显示的一些提示信息,比如你拖动一个图形时,会显示一个虚影,这就是反馈
Scalable Layer: 和Printable Layer一样,只是一个容器层
Handle Layer: Handle是指一些可以拖动的小方块,比如选择一个图形时,会显示八个用于Resize的Handle
Feedback Layer: 也是一个反馈层
Guide Layer: 帮助层
所有的层我们都可以通过getLayer()方法得到,因此我们有很大的自由去控制这些层的属性,但是如果我们要添加一个层或者修改一个层的行为,我们必须实现自己的RootEditPart。
2.Pane窗口:
相对于Layer来说Pane是有边界的。还有就是Pane是作为一个容器存在的,它可以盛放layer。
LayeredPane:继承自Layer,作为一个容器,它里面只能放入Layer。它作为一个Layer的专有容器而存在。它用到了StackLayout布局管理器,这下平衡了,Layer之间就是上下层关系了。
LayeredPane的子类:FreeformLayeredPane(自由伸展)ScalableFreeformLayeredPane(自由伸展且可以缩放)ScalableLayeredPane(可以缩放)
ScrollPane:一个拥有滚动条的Pane,其实就是他里面用到了ScrollBar这个figure,这里要讲讲ScrollPane的实现思路。首先,ScrollPane本身是一个Figure,所以它会盛放所有的子元素在里面。然后就是,如果超出就会出现ScrollBar。
最后,我们之所以看到的只是这个Figure的部分,是因为它用到了Viewport(视口)这个组件。Viewport只会提供
ScrollPane设定的大小给我们看到,其他的组件会被隐藏掉。
ScrollPane的子类:PuristicScrollPane简单的提供了几个方法,使用上方便了点,无其他亮点。AnimatableScrollPane是GMF实现的一个ScrollPane,这个只能看它的实现思路,不会拿来用。
3.Viewport视口:
编辑器中当前可以见到的部分。一般在outline视图实现鹰眼功能的时候会用到这个东西。
Viewport有三个子类:FocusableViewport、RulerViewport和FreeformViewport。这三个Viewport跟gef中默认提供的RootEditPart是一一对应的:
RulerRootEditPart对应于RulerViewport
FreeFormGraphicalRootEditPart和它的子类ScalableFreeformRootEditPart对应于FreeformViewport
FocusableViewport是一个内部类
在outline中使用Viewport:
由于Viewport是一个真实的视口它的大小跟当前编辑器打开的大小一样,而outline视图上现实的肯定会跟它实际大小不一样。所有在Viewport用到outline中的时候,有一个转换过程,这个转换能力是由Thumbnail提供。
Thumbnail:缩略图的意思,其功能主要也是干这个的。它还有一个子类ScrollableThumbnail:扩展了一个滚动的功能。通常我们使用的就是这个子类ScrollableThumbnail。
我在实现outline视图的鹰眼功能的时候,没有自己实现这些细节,我是直接使用emf提供的一个类OverviewComposite:
- public void createControl(Composite parent)
- {
- RootEditPart rootEditPart = viewer.getRootEditPart();
- if (rootEditPart instanceof ScalableFreeformRootEditPart)
- {
- overview = new OverviewComposite(parent,
- (ScalableFreeformRootEditPart) rootEditPart);
- overview.setLayoutData(new GridData(GridData.FILL_BOTH));
- }
- }
这个方法是我的DiagramsOutlinePage类里面的方法,我只需要传入一个ScalableFreeformRootEditPart进去就行了。但是OverviewComposite类只能在使用ScalableFreeformRootEditPart作为rootEditPart 的时候才能使用。如果想自己实现: