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

你可能感兴趣的:(eclipse)