`

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. }    
 

 

 

分享到:
评论

相关推荐

    NavigationPane

    NavigationPane是软件开发中常见的一种界面元素,尤其在Windows应用和移动应用设计中,它扮演着导航和组织内容的关键角色。NavigationPane控件通常用于创建一个侧滑菜单,用户可以通过滑动屏幕或点击按钮来展示或...

    前端开源库-source-pane

    "source-pane"是一个这样的库,专为前端开发者设计,它提供了源窗格的功能,允许用户查看和编辑代码实体,尤其适用于调试和增强开发体验。在这个“源窗格”中,我们可以看到它被设计成一个兼容各种实体的编辑器,...

    VC界面+停靠窗口+自动隐藏窗口

    本文将深入探讨如何使用VC6.0实现如VS2010中的弹出式工具栏功能,包括窗口停靠、自动隐藏和弹出机制。我们将主要关注以下几个方面: 1. **VC界面设计**:VC6.0中的MFC(Microsoft Foundation Classes)库为我们提供...

    前端开源库-meeting-pane

    【前端开源库-meeting-pane】是一款专为实现会议协作功能设计的前端库,它提供了实体兼容窗格,使得在各种设备上进行会议协同工作变得更加便捷和高效。在现代的在线会议场景中,用户需要能够在不同平台上顺畅地共享...

    前端开源库-contacts-pane

    【前端开源库-contacts-pane】是一个专为管理联系人而设计的开源项目,它提供了通讯簿、组和个人联系人的高效管理界面。这个库是前端开发中的一个重要工具,它旨在简化Web应用程序中的联系人数据处理,为用户提供...

    前端开源库-folder-pane

    5. **跨平台兼容性**:作为一个前端库,"folder-pane"应该能在不同的浏览器和设备上正常工作,提供一致的用户体验。 在实际应用中,"folder-pane-master"可能包含以下文件和目录: - `src/`:源代码目录,包含库的...

    VS2013 c++ 获取工具栏窗口标题及宽高

    在本文中,我们将深入探讨如何在Visual Studio 2013 (VS2013) 的C++环境中,利用Windows API来获取一个工具栏窗口的标题以及它的宽度和高度。这个过程涉及到对Windows操作系统底层机制的理解,特别是关于窗口消息...

    解决Vue对Element中的el-tab-pane添加@click事件无效

    解决Vue对Element中的el-tab-pane添加@click事件无效

    Windows-7-Navigation-Pane-Customizer

    总的来说,“Windows-7-Navigation-Pane-Customizer”是一款实用的第三方工具,它为Windows 7用户提供了一个调整和优化导航窗格的平台,从而提升操作效率和用户体验。通过合理利用这个工具,我们可以让Windows 7更加...

    pane-fixer-centos.rar

    "pane-fixer-centos"脚本就是针对这些问题进行优化和修复的工具,特别适用于CentOS 7.5版本。 该脚本的核心内容包括安装必要的中文字体、调整系统环境变量以及更新系统配置。具体来说,它可能会执行以下操作: 1. ...

    pane-management-源码.rar

    在软件开发中,pane通常指的是窗口中的一个可独立调整大小和位置的部分,比如Java Swing或JavaFX中的JPanel,或者是Windows Forms或WPF中的Panel控件。这些pane经常被用来组织和展示不同的用户界面元素。因此,这个...

    Revit二次开发 简单的可停靠窗口示例代码

    在Revit中,可停靠窗口(Dockable Pane)是一种用户界面元素,可以像其他Revit面板一样在屏幕边缘吸附或自由浮动,为用户提供个性化的工具集和视图。本示例代码主要介绍如何创建一个简单的可停靠窗口,帮助开发者...

    SSM框架JSP使用Layui实现layer弹出层效果

    在SSM(Spring、SpringMVC、MyBatis)框架中,使用JSP页面和Layui前端框架来实现layer弹出层效果是常见的做法,这样可以为用户提供更好的交互体验。Layui是一款轻量级的前端组件库,其中的layer模块提供了丰富的弹窗...

    mfc窗口的任意分割

    `CSplitterWnd`通常作为主窗口的一部分,它管理着一组子窗口,这些子窗口被称为“pane”或“view”。当创建`CSplitterWnd`时,需要定义初始的分割布局,这包括分割的方向(水平或垂直)以及每个pane的数量。在运行时...

    前端开源库-chat-pane

    5. **可定制化**:Chat-pane 提供丰富的配置选项和API接口,允许开发者调整聊天窗口的外观、行为以及功能。例如,可以自定义消息气泡样式、添加表情支持、设置消息滚动机制等。 6. **用户体验**:为了提升用户体验...

    Atom-hey-pane,用于放大活动窗格的Atom包。贡献给蒂莫米/嘿.zip

    3. 兼容性:由于Atom的开放性和插件友好的环境,Atom-嘿pane通常与其他插件兼容,不会引发冲突。 4. 配置选项:虽然默认设置已经相当实用,但用户可以根据个人喜好通过Atom的配置界面调整插件的行为,例如放大比例、...

    vue-split-pane:使用Vue.js的可调拆分窗格

    Vue分割窗格使用Vue.js的可调拆分窗格安装# yarn (recommend)$ yarn add vue-split-pane# npm$ npm install vue-split-pane --save用法CDN < script src =" https://unpkg.com/vue-split-pane " > </ ...

    emacs-tmux-pane:将emacs窗口与tmux窗格融合

    `emacs-tmux-pane`是一个创新的整合方案,它允许用户无缝地在Emacs编辑器窗口和tmux窗格之间切换,提升了开发者的效率和工作流程。本文将深入探讨这个集成解决方案以及相关的技术知识点。 首先,Emacs是一款高度可...

    Java弹出窗口代码

    本文将详细介绍 Java 弹出窗口的代码实现,包括基本的弹出窗口代码和经过设置后的弹出窗口。通过本文,您将学习如何使用 Java 创建弹出窗口,如何设置弹出窗口的外观、尺寸大小和弹出位置。 基本的弹出窗口代码 在...

    2304489791721561.创建窗口.zip

    开发者需要设置窗口的内容 pane,添加组件,并调用`setVisible(true)`来显示窗口。 5. **在Python的Tkinter中创建窗口** Tkinter是Python的默认GUI库,基于Tcl/Tk。创建窗口通过`Tk`类,如`root = Tk()`,然后添加...

Global site tag (gtag.js) - Google Analytics