Layer层和Pane窗口,Viewport视口

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:

 

 

Java代码 
  1. public void createControl(Composite parent)  
  2.     {  
  3.         RootEditPart rootEditPart = viewer.getRootEditPart();  
  4.         if (rootEditPart instanceof ScalableFreeformRootEditPart)  
  5.         {  
  6.             overview = new OverviewComposite(parent,  
  7.                     (ScalableFreeformRootEditPart) rootEditPart);  
  8.             overview.setLayoutData(new GridData(GridData.FILL_BOTH));  
  9.         }  
  10.     }  

 这个方法是我的DiagramsOutlinePage类里面的方法,我只需要传入一个ScalableFreeformRootEditPart进去就行了。但是OverviewComposite类只能在使用ScalableFreeformRootEditPart作为rootEditPart 的时候才能使用。如果想自己实现:

 

 

Java代码 
  1. public void createControl(Composite parent) {    
  2.     parent.setLayout(new GridLayout(1,false));    
  3.     Canvas canvas = new Canvas(parent, SWT.NONE);    
  4.     canvas.setLayoutData(new GridData(GridData.FILL_BOTH));    
  5.     
  6.     LightweightSystem lightweightSystem = new LightweightSystem(canvas);    
  7.     
  8.     ScalableFreeformRootEditPart rootEditPart = (ScalableFreeformRootEditPart) getViewer()    
  9.             .getRootEditPart();    
  10.     ScrollableThumbnail thumbnail = new ScrollableThumbnail(    
  11.             (Viewport) rootEditPart.getFigure());    
  12.     thumbnail.setSource(rootEditPart.getFigure());    
  13.     lightweightSystem.setContents(thumbnail);    
  14. }    
 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值