- 浏览: 2487508 次
- 性别:
- 来自: 杭州
-
文章分类
- 全部博客 (574)
- Book (62)
- Architecture (6)
- Java (39)
- Taobao (41)
- Distributed (4)
- Life (72)
- Database (7)
- Spring (16)
- Photography (15)
- Bicycle (41)
- Test (20)
- jBPM (8)
- Business (12)
- Movie (3)
- Ajax (15)
- Code (7)
- Eclipse (96)
- VIM (2)
- Music (6)
- Groovy (10)
- AutoHotKey (3)
- Dorado (10)
- Maven (7)
- Scrum (5)
- English (20)
- Financial (12)
- OSGi (3)
- Other (4)
- Tool (6)
- Browser (1)
- PPT (1)
- Project Management (4)
- Agile (6)
- Nosql (1)
- Search engine (6)
- Shell (2)
- Open Source (4)
- Storm (10)
- Guava (3)
- Baby (1)
- netty (1)
- Algorithm (1)
- Linux (1)
- Python (2)
最新评论
-
roy2011a:
https://github.com/ebottabi/sto ...
storm的序列化问题及与spring的结合方式 -
roy2011a:
能抗能打 写道哥们儿,你好!能共享下那个storm与sprin ...
storm的序列化问题及与spring的结合方式 -
Alick1:
兄弟,你之前是不是在深圳的正阳公司呆过啊?
storm的ack和fail -
liuleixwd:
先点个赞,写的非常好!有个问题请教下,如果我再bolt里不用e ...
storm的ack和fail -
yao-dd:
solr的facet查询
FROM:http://www.blog.edu.cn/user1/19180/archives/2005/1025573.shtml
4.4 请求说明
处于MVC核心地位的EditPart,负责控制模型和视图,以及接受用户的请求。请求(Request)构成了用户一种用户接口(UI),系统将各种操作(鼠标、键盘)封装成不同的Request传递给EditPart进行处理。
另一个和请求有关的概念是EditPolicy,这可以看成是一种代理,它可以分担EditPart处理请求的责任,增加软件的复用性。前面说过EditPolicy不是必需的,因为所有的请求都可以在EditPart中进行处理,然而使用EditPolicy还有一个好处就是——它可对请求进行进一步的分发(Dispatch),使得结构更清晰更容易理解(但如果你去看Policy的源代码,你会发现其实它也拥有一个getCommand操作,分发就是在那里进行的)。
下面我给出对块状元素的3个请求,并且给出应用哪些EditPolicy可以处理这个请求。
4.4.1 创建一个块状元素
创建一个块状元素的请求是CreateRequest,你可以通过比较RequestConstants.REQ_CREATE来确定这个请求(就是说你可以调用Request.getType来比较)。
LayoutEditPolicy的getCreateCommand函数可以用来处理这个请求。
通过调用CreateRequest.getNewObject方法,你可以创建一个新的元素,而通过调用CreateRequest.getNewObjectType函数可以获得新元素的类型,这是一个Class对象。通过调用CreateRequest.getLocation函数可以获得块状元素的左上点的坐标,调用CreateRequest.getSize函数则可以获得块状元素的大小,或者调用EditPolicy的getConstraintFor函数直接获得Rectangle。如果你用的是XYLayoutEditPolicy(对应XYLayout),那么获得大小和位置的操作是有意义的,如果你使用的是OrderedLayoutEditPolicy(对应ToolbarLayout和FlowLayout等),那么这两个属性将没有意义。这两个Policy分别对应不同的布局方法,不能混用。
4.4.2 重设一个块状元素的边界
重设一个块状元素的边界的请求是ChangeBoundsRequest,它对应两个请求类型:REQ_MOVE和REQ_RESIZE(同样在RequestConstants中定义,下同)。按照GEF的帮助所说,如果新的大小和原大小相同,GEF将产生一个REQ_MOVE请求,否则产生REQ_RESIZE请求,但显然REQ_RESIZE请求包含REQ_MOVE请求的情况。如果你只想处理移动请求,而不想(或者说不允许)处理REQ_RESIZE请求,那么你可以在EditPart中仅仅对REQ_MOVE进行相应,否则你需要对这两个进行处理。如果你使用父亲处理子女的移动请求(通常是这样做的),那么对应的请求类行是REQ_MOVE_CHILDREN和REQ_RESIZE_CHILDREN。
对于父EditPart处理的情况,如果你使用的是XYLayoutEditPolicy,那么XYLayoutEditPolicy.createChangeConstraintCommand函数将用来处理这两个请求,它对应的是XYLayout布局。如果你使用的是诸如流布局一类的布局(也就是使用OrderedLayoutEditPolicy及其子类),那么createMoveChildCommand函数将用来处理移动元素的请求(这类布局不支持子元素的变形),而它的移动策略也不过是改变子元素的顺序,具体的可以参考GEF的API。
通过调用ChangeBoundsRequest的getTransformedRectangle函数获得新的Rectangle(参数是原来的Rectangle,它会进行位置变换)。
4.4.3 删除一个块状元素
删除一个块状元素的请求是GroupRequest(它还能代表其它的请求),其中类型是REQ_DELETE。这个请求只能由被删除的元素进行相应。
ComponentEditPolicy的createDeleteCommand可以处理删除消息。
然而,你可能会发现,即使你完成了所有的代码,但是无论你怎么按下Delete键,元素就是不会被删除(实际上,请求根本就没有产生)。这就是删除请求的不同之处:删除请求的发起者实际上是之前我们忽略的actionBar(工具栏),Delete键是工具栏的一个快捷操作而已。因此为了能让删除操作有效,我们必须定义工具栏。首先要实现工具栏的类,下面的例子能够帮助你实现一个简单的工具栏:
Request简介之SELECTION_FEEDBACK_ROLE
这个角色专门用来处理和选择有关的请求,当一个对象被选中时(可能是由于各种原因被选中),GEF会使用到这个角色。因此,我们可以安装这个角色,来处理这些选择消息。
安装这个角色的方法是,继承并安装SelectionEditPolicy,不过单纯继承GraphicalEditPolicy却更为简便,SelectionEditPolicy是raphicalEditPolicy的子类。所以下面通过继承一个GraphicalEditPolicy,来介绍这个角色。GraphicalEditPolicy并不是抽象类,因此没有抽象函数以待实现。对于常见的应用,我们关心以下几个操作:
showTargetFeedback
eraseTargetFeedback
getTargetEditPart
前两个操作在默认情况下什么也不做,第三个操作默认情况下返回null。首先我们看showTargetFeedback和eraseTargetFeedback的作用,为了说明这个问题,我们假定一个场景,我们希望一个矩形的元素,当我们向其中加入其他模型时,这个元素可以具有“热敏”风格,这个时候,我们可以重载showTargetFeedback函数如下:
- public void showTargetFeedback(Request request){
- if(request.getType().equals(RequestConstants.REQ_ADD)||
- request.getType().equals(RequestConstants.REQ_CREATE)
- ) {
- /*
- * 保存元素的背景色
- * 将矩形元素高亮显示
- */
- }
- }
REQ_ADD是想该矩形元素添加已经存在的模型时的请求,REQ_CREATE是向该元素中创建新的子模型。当然,这里的请求类型还可以是REQ_MOVE、REQ_CLONE、REQ_CONNECTION_START、REQ_CONNECTION_END等等。需要说明的是,REQ_MOVE并非移动这个Policy所在的模型,而是指一些子模型在这个模型内部移动,换句话说就是移动内部模型。然后再看看eraseTargetFeedback函数,它用来还原showTargetFeedback造成的影响,因此比较简单:
- public void eraseTargetFeedback(Request request){
- /*
- * 如果模型被高亮显示,则恢复其原有的背景色
- * 反之什么也不用做
- */
- }
现在再来看看getTargetEditPart函数,这个函数的作用是返回选中的EditPart,在默认情况下,它返回null或者自己,则GEF选中这个EditPart。对于一些特殊需求,我们允许它返回不是自己的EditPart,比如下面的情况:我们希望当我第一次选中一个元素时,则选中这个元素,否则选中它的父亲(容器)。为了达到这个目的,我们可以这样写:
- public EditPart getTargetEditPart(Request request){
- if(request.getType().equals(RequestConstants.REQ_SELECTION)) {
- EditPart part = getHost();
- if(!(part.getParent() instanceof DiagramPart)&&
- part.getSelected()!=EditPart.SELECTED_NONE) {
- part = part.getParent();
- }
- return part;
- }
- return null;
- }
在这里我们假设DiagramPart是根EditPart,因为选中根EditPart没有意义。另一点需要说明的是,getSelected的返回值,包括SELECTED_NONE、SELECTED、SELECTED_PRIMARY,详细地的信息,可以参考GEF的帮助。
- package pku.oo.ui.actions;
- import org.eclipse.gef.ui.actions.ActionBarContributor;
- import org.eclipse.gef.ui.actions.DeleteRetargetAction;
- import org.eclipse.gef.ui.actions.RedoRetargetAction;
- import org.eclipse.gef.ui.actions.UndoRetargetAction;
- import org.eclipse.jface.action.IToolBarManager;
- import org.eclipse.ui.actions.ActionFactory;
- public class DiagramActionBarContributor extends ActionBarContributor {
- protected void buildActions() {
- addRetargetAction(new UndoRetargetAction());
- addRetargetAction(new RedoRetargetAction());
- addRetargetAction(new DeleteRetargetAction());
- }
- protected void declareGlobalActionKeys() {
- // TODO Auto-generated method stub
- }
- public void contributeToToolBar(IToolBarManager toolBarManager) {
- toolBarManager.add(getAction(ActionFactory.UNDO.getId()));
- toolBarManager.add(getAction(ActionFactory.REDO.getId()));
- toolBarManager.add(getAction(ActionFactory.DELETE.getId()));
- }
- }
同时,在plugin.xml中在Extensions里设置好contributorClass,详细请看第一部分。
4.4.4 处理连接(connection)
Connection是个复杂的话题,这里先不阐述处理连接相关的方法(虽然和处理块状元素类似)。在以后的章节中,会专门解决连接的问题(包括绘制、控制、常用操作等等)。
4.4.5 添加EditPolicy
之前说过,每个EditPolicy都扮演一个角色(role),只有正确设置角色,EditPolicy才能正常工作。你可以在EditPart的createEditPolicies中为这个EditPart添加EditPolicy。
下面给出一些角色和它们对应的EditPolicy,其中也包括上面提到的几个EditPolicy:
EditPolicy.LAYOUT_ROLE:对应所有的LayoutEditPolicy,对于具有子EditPart的Part是必须的。
EditPolicy.COMPONENT_ROLE:对应所有的ComponentEditPolicy,元素能够被删除的话,你应该添加这个角色。
EditPolicy.DIRECT_EDIT_ROLE:对应DirectEditManager,它用来处理在位编辑(In place edit),关于在位编辑的话题,也许将来会在一个小品文中叙述。
EditPolicy.GRAPHICAL_NODE_ROLE:对应GraphicalNodeEditPolicy,如果这个块状元素能够被连接附着,那么它应该使用这个policy,我会在讲连接的时候说明这个policy的用法。
EditPolicy.SELECTION_FEEDBACK_ROLE:对应GraphicalEditPolicy,这是一个处理鼠标选中的反馈角色,比如你想另元素具有热敏特性,可以使用这个角色。同样,关于这个角色的话题,也会出现在某个小品文中。
EditPolicy.CONNECTION_ENDPOINTS_ROLE:对应ConnectionEndpointEditPolicy,这是一个关于连接的角色,这个类是可以直接被实例化的。
发表评论
-
Java程序员25个必备的Eclipse插件
2012-01-12 22:36 21964原文:http://www.fromdev.com/2012/ ... -
关于插件更新安装的错误
2007-12-21 20:12 2242在更新插件的时候出现这样的错误: Unable to comp ... -
最近做eclipse branding, features的一些经验
2007-12-16 01:24 4585知道eclipse的splash怎么做 ... -
GEF学习笔记
2007-12-07 20:20 4185GEF以前学习过, 而且还 ... -
SWT布局深入学习
2007-11-30 23:00 7971以下内容是学习"The Definitive Gui ... -
Eclipse Action 深入学习笔记(3)
2007-11-25 17:59 4141filter元素是用来指定当 ... -
Eclipse Action 深入学习笔记(2)
2007-11-25 17:14 5247Object Action 这种Action是跟弹出的上下文菜 ... -
Eclipse Action 深入学习笔记(1)
2007-11-25 17:07 7711以前做插件用到的ActionSet都只是依葫芦画瓢,没有真正理 ... -
JFace Text Editor完全掌握之终极指南(4)
2007-11-24 17:08 5708错误标识(Error Marking) Error Marki ... -
JFace Text Editor完全掌握之终极指南(3)
2007-11-24 16:56 5551内容大纲 之所以要给编 ... -
JFace Text Editor完全掌握之终极指南(2)
2007-11-24 16:53 6764最后一步就是实现各种功能 语法高亮 首先我们要实现的是语法高亮 ... -
JFace Text Editor完全掌握之终极指南(1)
2007-11-24 16:17 10033JFace Text Editor是JFace里面一个功能强大 ... -
最近的Eclipse plugin开发总结
2007-11-24 11:30 4962List控件没有提供addDblClickListener方法 ... -
eclipse3.3关于JavaFileEditorInput兼容性问题的解决
2007-11-24 11:22 4694在eclipse3.3中,JavaFileEditor ... -
Eclipse WTP Projects Facets实战指南(2)
2007-11-21 21:13 5291修饰工作 给facet在选择列表中添加图标 格式如下: xml ... -
Eclipse WTP Projects Facets实战指南(1)
2007-11-21 20:21 9625这个文章基本是"Building Project F ... -
也说关于WizardPage的动态生成
2007-11-05 14:26 5179在Eclipse中一个Wizard=Wiza ... -
关于多页编辑器中不同Editor之间的Redo&Undo冲突的解决
2007-09-03 15:17 4100在我们的插件工具的开 ... -
TextEditor原理分析笔记
2007-08-23 15:48 3404Editor的语法着色原理:Eclipse使用damage , ... -
最近的Eclipse开发总结
2007-08-23 15:46 2145java.lang.IllegalAccessError: t ...
相关推荐
第四章 GEF框架详解 GEF(Graphical Editing Framework)是一个基于Draw2D的Eclipse插件,主要用于构建图形编辑工具。它不仅提供了图形界面的基本处理机制,还通过监听和响应用户交互事件(如鼠标、键盘和Workbench...
4. **流程设计基础**:在gef框架下进行流程设计,首先要明确流程的目标和步骤,这可能涉及到对程序逻辑的理解和拆解,将复杂的任务分解为一系列可执行的子任务。这通常需要扎实的编程基础和问题解决能力。 5. **gef...
这是我自己在学习GEF的时候做的一些总结。 1、GEF中的概念比如Command,Tool,Request等等。 2、GEF中使用到的几种设计模式。 3、GEF中对鼠标键盘事件处理的机制、流程。
3. **手势和命令**:Gef支持各种用户手势,如拖放、剪切、复制、粘贴等,这些手势通过命令系统来实现,确保了操作的可撤销/重做能力。 4. **连接器和线**:用于创建和管理图形元素之间的连接,支持自定义连接样式和...
《基于GEF框架的SVG制作工具设计与实现》 SVG(Scalable Vector Graphics)是一种基于XML的矢量图形描述语言,广泛应用于各种系统中,因为它支持图形、图像、文字、透明效果和动画的描述,并具有高度的交互性。然而...
通过简单易懂的方式,介绍了Eclipse GEF 框架原理。对GEF开发有极大的好处/
**Eclipse图形化编辑框架(GEF)** Eclipse图形化编辑框架(GEF)是Eclipse平台中的一个重要组件,主要用于构建可自定义的图形编辑工具。它为开发人员提供了一套全面的API和设计模式,使得创建复杂的图形用户界面...
#### 引言:GEF框架概览 GEF,全称为Graphical Editor Framework,是Eclipse平台下一款强大的图形编辑框架,专为开发图形用户界面而设计。它允许开发者创建复杂的图形编辑器,如流程图编辑器、UML类图编辑器等,极...
3. **注册Command到CommandStack**:将CopyCommand和PasteCommand添加到EditDomain的CommandStack,这样当用户执行拷贝和粘贴操作时,框架会自动调用这些命令。 4. **EditPolicy的实现**:在图形元素的EditPolicy中...
Eclipse插件开发框架GEF(Graphical Editing Framework)是一个强大的工具,用于构建基于Eclipse平台的图形化编辑器。这个API文档详细介绍了如何利用GEF进行插件开发,为开发者提供了丰富的参考资料。 1. **Eclipse...
point="org.eclipse.ui.editors"> class="com.example.ui.PracticeEditor" icon="logo.gif" default="true" contributorClass=... name="Practice Editor" ... extensions="gefpracticeal"/> </extension>
### Eclipse的GEF框架深入解析 #### 一、GEF框架概述 GEF,全称为Graphical Editor Framework,是Eclipse平台下的一款图形编辑框架,主要用于构建图形化编辑器,如流程设计器、UML类图编辑器等。GEF遵循经典的MVC...
在执行这些命令时,GEF框架会确保模型的同步更新,同时更新图形视图,以反映这些操作。 此外,`XYLayoutEditPolicy`还可能涉及其他的布局相关方法,如`layout()`,用于在需要时自动调整图形元素的布局,确保图形...
GEF(Graphical Editing Framework)是Eclipse平台上一个强大的图形编辑框架,主要用于构建可视化的建模和图形编辑工具。更新到3.7.1版本,它提供了许多改进和新功能,以满足开发者在创建图形用户界面时的需求。在这...
**GEF(Graphical Editing Framework)** 是一个用于构建图形编辑工具的开源框架,它为开发人员提供了一套全面的库和工具,用于创建基于Eclipse的富客户端平台(RCP)的应用程序,特别是那些涉及图形用户界面(GUI)...
《GEF-SDK-3.6.2 jar:Eclipse GEF框架详解及在Android ADT中的应用》 GEF(Graphical Editing Framework)是Eclipse项目中的一个重要组成部分,它为开发图形化编辑器提供了强大的支持。在标题“GEF-SDK-3.6.2 jar...
Java GEF(Graphical Editing Framework)开发实例是一个深入理解并应用GEF框架的优秀实践案例。GEF是Eclipse平台上用于构建图形编辑器的库,它提供了构建图形用户界面(GUI)所需的基础结构,尤其适合创建复杂的...
3. **图元(Figure)和图元工厂(FigureFactory)**:GEF中的图元是图形的基本构建块,可以是简单的形状,如矩形或椭圆,也可以是复杂的组合。图元工厂则用于创建和管理这些图元。 4. **命令(Command)模式**:GEF...
在图形编辑框架(GEF,Graphical Editing Framework)中,锚点(Anchor)是一个关键概念,它是连接模型元素之间的连接线在元素上的固定点。在GEF中,锚点的定位直接影响到连接线的形状和行为,特别是当用户通过鼠标...