1.Layer层:
FreeformFigure所有实现此接口的figure都具备向四周延伸的能力,但是此种figure必须放在FreeformViewport类似容器里面。
FreeformLayer:里面有一个FreeformHelper对象用于管理它的子,这里不深究它里面的逻辑,只强调它的用法。一般一个编辑器都是以一个这样的自由延伸的容器作为跟,它最主要的作用是编辑器里面的Layer多半都是以它为父扩展出来的。
![](http://www.ibm.com/developerworks/cn/opensource/os-ecl-gef/part3/images/image001.gif)
编辑器一般以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 的时候才能使用。如果想自己实现:
- public void createControl(Composite parent) {
- parent.setLayout(new GridLayout(1,false));
- Canvas canvas = new Canvas(parent, SWT.NONE);
- canvas.setLayoutData(new GridData(GridData.FILL_BOTH));
-
- LightweightSystem lightweightSystem = new LightweightSystem(canvas);
-
- ScalableFreeformRootEditPart rootEditPart = (ScalableFreeformRootEditPart) getViewer()
- .getRootEditPart();
- ScrollableThumbnail thumbnail = new ScrollableThumbnail(
- (Viewport) rootEditPart.getFigure());
- thumbnail.setSource(rootEditPart.getFigure());
- lightweightSystem.setContents(thumbnail);
- }
分享到:
相关推荐
NavigationPane是软件开发中常见的一种界面元素,尤其在Windows应用和移动应用设计中,它扮演着导航和组织内容的关键角色。NavigationPane控件通常用于创建一个侧滑菜单,用户可以通过滑动屏幕或点击按钮来展示或...
"source-pane"是一个这样的库,专为前端开发者设计,它提供了源窗格的功能,允许用户查看和编辑代码实体,尤其适用于调试和增强开发体验。在这个“源窗格”中,我们可以看到它被设计成一个兼容各种实体的编辑器,...
本文将深入探讨如何使用VC6.0实现如VS2010中的弹出式工具栏功能,包括窗口停靠、自动隐藏和弹出机制。我们将主要关注以下几个方面: 1. **VC界面设计**:VC6.0中的MFC(Microsoft Foundation Classes)库为我们提供...
【前端开源库-meeting-pane】是一款专为实现会议协作功能设计的前端库,它提供了实体兼容窗格,使得在各种设备上进行会议协同工作变得更加便捷和高效。在现代的在线会议场景中,用户需要能够在不同平台上顺畅地共享...
【前端开源库-contacts-pane】是一个专为管理联系人而设计的开源项目,它提供了通讯簿、组和个人联系人的高效管理界面。这个库是前端开发中的一个重要工具,它旨在简化Web应用程序中的联系人数据处理,为用户提供...
5. **跨平台兼容性**:作为一个前端库,"folder-pane"应该能在不同的浏览器和设备上正常工作,提供一致的用户体验。 在实际应用中,"folder-pane-master"可能包含以下文件和目录: - `src/`:源代码目录,包含库的...
在本文中,我们将深入探讨如何在Visual Studio 2013 (VS2013) 的C++环境中,利用Windows API来获取一个工具栏窗口的标题以及它的宽度和高度。这个过程涉及到对Windows操作系统底层机制的理解,特别是关于窗口消息...
解决Vue对Element中的el-tab-pane添加@click事件无效
总的来说,“Windows-7-Navigation-Pane-Customizer”是一款实用的第三方工具,它为Windows 7用户提供了一个调整和优化导航窗格的平台,从而提升操作效率和用户体验。通过合理利用这个工具,我们可以让Windows 7更加...
"pane-fixer-centos"脚本就是针对这些问题进行优化和修复的工具,特别适用于CentOS 7.5版本。 该脚本的核心内容包括安装必要的中文字体、调整系统环境变量以及更新系统配置。具体来说,它可能会执行以下操作: 1. ...
在软件开发中,pane通常指的是窗口中的一个可独立调整大小和位置的部分,比如Java Swing或JavaFX中的JPanel,或者是Windows Forms或WPF中的Panel控件。这些pane经常被用来组织和展示不同的用户界面元素。因此,这个...
在Revit中,可停靠窗口(Dockable Pane)是一种用户界面元素,可以像其他Revit面板一样在屏幕边缘吸附或自由浮动,为用户提供个性化的工具集和视图。本示例代码主要介绍如何创建一个简单的可停靠窗口,帮助开发者...
在SSM(Spring、SpringMVC、MyBatis)框架中,使用JSP页面和Layui前端框架来实现layer弹出层效果是常见的做法,这样可以为用户提供更好的交互体验。Layui是一款轻量级的前端组件库,其中的layer模块提供了丰富的弹窗...
`CSplitterWnd`通常作为主窗口的一部分,它管理着一组子窗口,这些子窗口被称为“pane”或“view”。当创建`CSplitterWnd`时,需要定义初始的分割布局,这包括分割的方向(水平或垂直)以及每个pane的数量。在运行时...
5. **可定制化**:Chat-pane 提供丰富的配置选项和API接口,允许开发者调整聊天窗口的外观、行为以及功能。例如,可以自定义消息气泡样式、添加表情支持、设置消息滚动机制等。 6. **用户体验**:为了提升用户体验...
3. 兼容性:由于Atom的开放性和插件友好的环境,Atom-嘿pane通常与其他插件兼容,不会引发冲突。 4. 配置选项:虽然默认设置已经相当实用,但用户可以根据个人喜好通过Atom的配置界面调整插件的行为,例如放大比例、...
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是一款高度可...
本文将详细介绍 Java 弹出窗口的代码实现,包括基本的弹出窗口代码和经过设置后的弹出窗口。通过本文,您将学习如何使用 Java 创建弹出窗口,如何设置弹出窗口的外观、尺寸大小和弹出位置。 基本的弹出窗口代码 在...
开发者需要设置窗口的内容 pane,添加组件,并调用`setVisible(true)`来显示窗口。 5. **在Python的Tkinter中创建窗口** Tkinter是Python的默认GUI库,基于Tcl/Tk。创建窗口通过`Tk`类,如`root = Tk()`,然后添加...