`
gdwrx_winson
  • 浏览: 131467 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

GEF源码分析

阅读更多
GEFPlugin
单例控制,通过getDefault()获取
代理到InternalGEFPlugin

EditPart extends IAdaptable
作为Controller,将Application的model绑定到图形界面上。
EditPart can be composed of or have references to other EditParts.
EditPart的creator应该只使用setModel(Object),其他APIs主要被Tools、EditPolicies、and other EditParts使用。
和EditPart交互(interaction)使用Requests,Request指定了交互的类型。
Request主要使用在getTargetEditPart(Request),showSourceFeedback(Request),过滤selection  understandsRequest(Request), 获取commands。
Non-primary selection
Primary selection ( is defined as the last object selected) or “Anchor” selection
……….(方法介绍)

EditPartViewer extends org.eclipse.jface.viewers.ISelectionProvider
An adapter on an SWT org.eclipse.swt.widgets.Control that manages the EditParts.
负责editpart的生命周期(lifecycle)
EditPart有像TreeItems或Figures等的visuals,而这些都是建立在viewer及其control之上,故viewer可以通过visuals来提供targeting of editpart的功能。
继承自ISelectionProvider使得viewer可以管理selected editparts的列表,最后的元素称为primary member。这个列表不能为空,如果没有选中任何editpart,那么viewer的contents editpart就会使用。
A viewer is populated by setting its contents. This can be done by passing the model corresponding to the contents.
Viewer可以获取到EditPartFactory,从而去创建contents editpart,并将其增加到root editpart中。同样,可以使用EditPart.refresh()方法对EditPart进行update.
Root Editpart不代表model中的任何东西,它主要用在viewer的bootstrap, 并且作为contents的parent.
Viewer管理editpart的生命周期:viewer被realized(即拥有一个SWT Control)触发viewer的rootroot触发所有的EditPart; EditPart被从viewer中移除就会执行deactived。当viewer中的Control被disposed之后,那么所有的editparts都会被root EditPart进行deactive
A viewer has an arbitrary(随意) collection of keyed properties that can be set and queried. A value of NULL is used to remove a key from the property map. A viewer will fire property change notification whenever these values are updated.

SelectionManager
管理着Viewer的selection模型,维护着EditPart的列表,并指出获得Focus的EditPart。
负责ISelection和SelectionManager本身模型的转换
负责焦点Focus的获得和丢失
成员域:
EditPart focusPart
Runnable notifier (触发Selection发生变化事件,最终所有监听Viewer的Selection事件的都会被fire)
List selection (元素为EditPart)
EditPartViewer viewer

EditPartFactory
EditPart createEditPart(EditPart context, Object model);以context作为parent,model作为模型,创建新的EditPart.

LayerConstants
定义典型的Layer,主要有以下Layer:Primary Layer、Connection Layer、Grid Layer、Guide Layer、Handle Layer、Feedback Layer、Scaled Feedback Layer、Printable Layers、Scalable Layers

SharedCursors
SharedImages
SharedMessages
提供GEF中共享的光标、图片、消息。

Tool
解析从EditDomain和EditPartViewers中获取的鼠标和键盘输入,将这些low-level events转换成higher-level Requests.

DragTracker extends Tool
特定的Tool,被SelectionTool在拖动鼠标时候使用到,SelectionTool在鼠标down时候获取到DragTracker,在鼠标released之前,所有数据都是由DragTracker进行处理(and forwards all input to that tracker until after the mouse is released.)。同样,在keyboard方面也一样。
void commitDrag();  (类似一种事务的处理方式)

EditDomain
成员域有:CommandStack、PaletteViewer、Tool(active和default)、PaletteRoot(继承自PaletteEntry)、List< EditPartViewer>
EditDomain通常和Eclipse的IEditorPart进行绑定。
Viewers被增加到EditDomain中,类似于很多Control放在一个IEditorPart
ActiveTool主要是事件转发的接收体,其初始值来源于Palette中的默认ActiveToolEntry。(EditDomain监听Palette的变化,在ToolEntry的Selection发生变化的时候,通过Active的ToolEntry,从而设置EditDomain的Active Tool)
将SWT的事件,如KeyEvent、MouseEvent等转发到Tool中处理。

DefaultEditDomain extends EditDomain
增加IEditorPart的域

EditPolicy
覆盖EditPart的全部editing behavior,主要分成以下三类:
Command Creation
Feedback Management:showing/erasing source/target feedback
Delegation/Forwarding:对于某一Request,创建新的Request并交给其他EditPart进行处理,如Composite的EditPart接收到Delete Request。
EditPolicy决定着EditPart的editing capabilities(能力)
定义的一些EditPolicy Role:
ComponentEditPolicy
Connection Endpoint Policy
Connection Bendpoint Policy
ConnectionEditPolicy
ContainerEditPolicy
DirectEditPolicy
GraphicalNodeEditPolicy
LayoutEditPolicy
NodeEditPolicy
PrimaryDrag Policy
Selection Feedback
TreeContainerEditPolicy

Handle
被SelectionTool用于获取DragTracker。
对于GraphicalViewer,在某一个Location的时候,首先返回的是Handler。
方法:
DragTracker getDragTracker()
Point getAccessibleLocation();

KeyStroke
封装Keyboard的动作(press or release),将KeyEvent中的stateMask、keyCode、character进行抽取和处理。
通过KeyEvent.stateMask、KeyEvent.keyCode、KeyEvent.character构造出KeyStroke,区分成两种Press和Release

KeyHandler
接收KeyEvent,然后将其构造成KeyStroke,再对其进行处理。能够处理EditPartViewer上的所有normal keystrokes(不包含Menu上的Accelerator)
自身接收到可以不进行处理,交给Parent进行处理。
一般被某个Tool进行调用。
成员域:
Map<KeyStroke, IAction>
KeyHandler parent

MouseWheelHandler
可以在EditPartViewer中进行注册。Key由MouseWheelHandler.KeyGenerator所生成,需要根据stateMask。
处理鼠标滚轮事件。

MouseWheelZoomHandler implements MouseWheelHandler
对某个特定的viewer进行缩放处理。
注册方式:
graphicalViewer.setProperty(MouseWheelHandler.KeyGenerator.getKey(SWT.MOD1), MouseWheelZoomHandler.SINGLETON);
可通过以下方式获取到ZoomManager:
(ZoomManager)viewer.getProperty(ZoomManager.class.toString());

MouseWheelHelper
为每个EditPart提供以自己方式处理鼠标滚轮事件的能力。
鼠标滚轮事件由Tool分配到MouseWheelHandler进行处理,而MouseWheelHandler将其代理到MouseWheelHelper来处理。
MouseWheelHandler获取MouseWheelHelper的方式:通过EditPart的
getAdapter(MouseWheelHelper.class)

SnapToHelper (Abstract)
被Tools临时性的用作snapping certain mouse interactions
不应该被Tools或EditPart 重用(reuse)
Tool获取SnapToHelper的方式:通过EditPart的getAdapter(SnapToHelper.class)方式适配而来。
抽象方法:主要被CreationTool、ResizeTracker使用。
public abstract int snapRectangle(Request request, int snapOrientation,
PrecisionRectangle baseRect, PrecisionRectangle result);

SnapToGeometry extends SnapToHelper
SnapToGrid extends SnapToHelper
SnapToGuides extends SnapToHelper
CompoundSnapToHelper extends SnapToHelper
SnapTo应该是对齐的含义?

ExposeHelper
暴露EditPart及其包含的children。
EditPartViewer使用该接口去显示non-visuable的EditPart。
获取接口方式:是EditPart的一个Adapter,getAdapter(ExposeHelper.class)
接口方法:void exposeDescendant(EditPart editpart);

AutoexposeHelper
略。。。。。

AccessibleAnchorProvider
跟瞄点相关,略
在EditPart中注册的一个Adapter,获取方式getAdapter(AccessibleAnchorProvider.class)
在ConnectionCreationTool和ConnectionEndpointTracker中使用
接口方法:
List getSourceAnchorLocations();
List getTargetAnchorLocations();

AccessibleHandleProvider
跟Handle相关,略
在EditPart中注册的Adapter,获取方式getAdapter(AccessibleHandleProvider.class)
在SelectionTool中的handleTraverseHandle使用。
接口方法:List getAccessibleHandleLocations();

ContextMenuProvider extends MenuManager implements IMenuListener (Abstract)
在使用上和MenuManager没有太大区别
成员域:EditPartViewer viewer; 将Menu和viewer进行了绑定。
具体继承类通过public abstract void buildContextMenu(IMenuManager menu);来完成不同情况下Menu的创建。

Request
用于和EditPart交互
主要功能面:获取请求、showing feedback、performing generic operations
成员域:
Object type 描述请求的类型,一般是String,并多数使用RequestConstants定义的常量
Map extendedData:扩展数据存储的地方。

RequestConstants
成员域,主要用作Request的Type
connection start
connection end
Reconnection source
Reconnection target
move bendpoint
create bendpoint
resize
resize children
move
move children
open
orphan
orphan children
create child
add children
clone
delete
delete dependant
align
align children
direct edit
selection
selection hover

AccessibleEditPart (Abstract)
为EditPart提供Accessibility 支持。
EditPart是GEF中Selection的基本元素,当Selection变化的时候,Accessibility clients就会被notified,然后这些Accessibility clients就会去query相应的EditPartViewer,从而获取各样的accessibility information
org.eclipse.gef.editparts.AbstractEditPart.getAccessibleEditPart方法为EditPart提供相应的AccessibleEditPart

EditPart的子接口及实现类:
RootEditPart extends EditPart
EditPartViewer的root
将EditPartViewer和其contents之间建立桥接关系。
RootEditPart只有唯一的child EditPart,称为Contents
在model中不代表任何东西,不能和User进行交互。
接口方法:
EditPart getContents();
EditPartViewer getViewer();

TreeEditPart extends EditPart
EditPart用在TreeViewer中的特定类
Visual Part是TreeItem
接口方法:
Widget getWidget(); Widget要么是Tree或TreeItem
void setWidget(Widget widget);

GraphicalEditPart extends EditPart
EditPart用在GraphicalViewers中的特定类
Visual Part是IFigure
接口方法:
IFigure getFigure(); 代表该GraphicalEditPart的primary Figure
IFigure getContentPane(); children的Figuer放置的地方。
List getSourceConnections();ConnectionEditPart的集合
List getTargetConnections();
void addNodeListener(NodeListener listener); NodeListener用于connection事件监听
void removeNodeListener(NodeListener listener);
void setLayoutConstraint(EditPart child, IFigure figure, Object constraint); 设置
content Pane的Layout布局限制(LayoutManager的Constraint)。

NodeEditPart extends GraphicalEditPart
支持target和source ConnectionEditParts,提供了target和source的ConnectionAnchor
以下类依赖该类:
AbstractConnectionEditPart:在refresh()
GraphicalNodeEditPolicy:在新的connection创建的过程中,在还没有connection的过程中,source Node EditPart负责着display feedback.
ConnectionEndpointEditPolicy:connection的end断开或重新连接到新的node上,用于计算新的anchors用于display feedback
接口方法:
以ConnectionEditPart或Request为参数,获得Source和Target的ConnectionAnchor

ConnectionEditPart extends GraphicalEditPart
代表连接Source Node EditPart和Target Node EditPart的Connection
模型没有connection的要求,此时可以通过EditPart来获取Connection的信息。AbstractGraphicalEditPart的getModelXXXConnections().  XXX代表Source或Target
ConnectionEditPart是Node EditPart的features,所以Node EditPart负责着connection的创建和管理。创建的时候都会先通过EditPartViewer.getEditPartRegistry()获得的EditPartRegistry判断一下connection是否已经存在。
ConnectionEditPart也可以用作”node”,也可以有children,一般为一些Label或可选择的decorations.
接口方法:XXX代表着Source或Target
EditPart getXXX();
void setXXX(EditPart source); 


EditPartViewer的子接口及实现类
GraphicalViewer extends EditPartViewer
增加hit-test Handles的能力。
接口方法:
Handle findHandleAt(Point p); 通过Viewer的Control上的Point返回Handle
1
0
分享到:
评论

相关推荐

    eclipse gef原理的详细介绍PPT,很有参考价值

    **GEF(Graphical Editing Framework)深度解析** GEF,全称为Graphical Editing Framework,是Eclipse平台下用于构建图形编辑器的一种框架。它遵循MVC(Model-View-Controller)设计模式,使得开发者能够专注于...

    GEF原理的详细介绍+程序实例和程序源码

    **GEF(Graphical Editing Framework)** 是一个用于构建图形化编辑...PPT文件则可能包含更详尽的理论讲解和案例分析,帮助深入理解GEF的工作机制。程序源码则提供实践指导,让开发者能亲手实践,更好地掌握GEF的用法。

    gef all 3.5.2 源码

    学习和分析Gef All 3.5.2 的源码不仅可以提高你的调试技巧,还能让你深入了解调试器的内部工作原理,以及如何通过Python扩展GDB的能力。这是一项有益于任何软件开发者的技术,尤其是那些专注于系统级编程、逆向工程...

    GEF教程及demo源码

    DEMO源码分析** `GEF_RCP_DEMO`通常包含了一个完整的GEF应用实例,可能包括以下关键部分: - **EditorPart**: 实现编辑器的入口,加载和保存模型,创建图表视图。 - **Model类**: 定义图形元素的数据结构。 - **...

    gef源码文件

    源码分析是软件开发和逆向工程中的重要环节,尤其是在没有官方文档的情况下,直接阅读源码是理解其工作原理的最直接途径。这个压缩包包含了gef、ui和darw2d三个部分的源码,我们将逐一探讨它们在Gef框架中的作用和...

    GEF 进阶+源码.rar

    **GEF(Graphical Editing Framework)** 是一个用于构建图形编辑框架的开源项目,由Eclipse组织维护。...IBM中文文档提供了一个很好的学习资源,结合源码分析,能更直观地理解这两个库的工作原理和用法。

    GEF教程及demo源码GEF_RCP_DEMO.zip

    8. **DEMO源码分析** GEF_RCP_DEMO的源码包含了各种GEF特性的实例,如图元创建、连接线绘制、拖放操作等。通过分析这些示例代码,开发者可以更深入地理解GEF的工作原理,学习如何在实际项目中应用。 9. **调试与...

    gef学习文档+学习源码

    Gef,全称“GNU Reverse Engineering Framework”,是一款强大的GDB(GNU Debugger)扩展,旨在简化调试过程,提供更直观、高效的方式来交互式地分析程序。在本文中,我们将深入探讨Gef的学习过程,涵盖其基本概念、...

    GEF入门实例代码2《Eclipse插件开发》中实例

    2. **实例代码结构分析** 在" GefExample "这个压缩包中,通常会包含以下几个关键部分: - **模型层(Model)**:定义了数据结构和业务逻辑,如`MyModel.java`。 - **视图层(View)**:定义了图形的展示方式,通常由...

    GEF-ALL-3.2.zip_GEF-ALL-3.6.2 pudn_gef_gef 3.2 download_gef java

    通过阅读和分析源码,开发者可以深入理解GEF的内部运作,这对于解决开发过程中遇到的问题和进行二次开发至关重要。 **gef-java** 标签表明了这是与Java语言相关的资源,意味着所有提供的GEF实现都是基于Java的。...

    一个GEF绘图的简单例子

    **示例分析** "GEFApp"这个例子可能是通过创建一个简单的图形编辑场景来展示GEF的基本用法。比如,它可能包含一个画布,用户可以在上面绘制和编辑一些基本形状,如圆形、矩形,并能进行拖拽、缩放、旋转等操作。...

    GEF的动态变化二

    标签“源码”表明我们将深入到代码级别来理解这个主题,这意味着博主可能分享了实现动态效果的代码示例或者分析。而“工具”标签则暗示了GEF作为开发工具的角色,它可以帮助开发者更轻松地构建图形界面应用程序。 ...

    基于GEF框架的SVG制作工具设计与实现

    综上所述,基于GEF框架的SVG制作工具设计与实现为解决SVG源码编辑的低效问题提供了一种有效途径。通过集成多个关键组件,这款工具能够显著提升SVG文件的创作效率,并为设计师提供更加友好和高效的工作环境。此外,...

    [翻译]Eclipse图形化编辑框架(GEF)/更新第7章:层和视图

    学习GEF的过程中,源码分析是非常有价值的。博主可能分享了关键类和方法的代码片段,帮助读者理解层和视图的实现细节。这有助于开发者在实际开发中更好地利用GEF框架。 **总结** Eclipse图形化编辑框架(GEF)通过层...

    GEF教程,注重实践。

    **四、源码分析** 对于想要深入了解GEF的人来说,阅读源码是非常有帮助的。GEF是开放源码的,可以从Eclipse的Git仓库中获取。通过阅读源码,可以了解其内部机制,如事件处理、模型与视图的同步机制等。 **五、工具...

    gef的源代码,能可运行

    1. 下载gef的最新版本源码。 2. 在GDB的初始化文件(通常是`.gdbinit`)中添加gef的加载命令,如`source &lt;gef-source-path&gt;/gef.py`。 3. 重启GDB,gef即被加载。 ### gef的实践应用 在提供的`GefPractice.request...

    gef 学习网站

    Gef,全称GNU Extensible Firmware Interface,是一种在固件接口层面上进行扩展的工具,主要用于调试和分析现代处理器系统,特别是在Linux内核中。它提供了一种交互式的、基于GDB(GNU Debugger)的环境,使得开发者...

    用gef写的一个tree例子(无移动)

    7. **源码分析**:通过阅读和理解提供的源代码,可以加深对GEF工作原理的理解,学习如何将理论知识应用到实际开发中。 通过这个例子,你将能够掌握使用GEF框架创建图形化界面的基本技能,这对于开发基于Eclipse平台...

Global site tag (gtag.js) - Google Analytics