GEF七天之第一天

2023-11-22 11:40
文章标签 第一天 gef 七天

本文主要是介绍GEF七天之第一天,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在家闷头苦学了七天,终于初步弄懂了GEF这个架构,之前没有SWT的实际开发经验,也没有Eclipse插件的基础,弄懂GEF还真不容易啊.学任何东西我们都得从实际动手开发,我们就通过这个一个小demo来攻克这个架构.
    首先,demo要求:

一个eclipse plug-in程序,要有一个编辑区(editor),一个大纲(outline).编辑区有画板,画板里有三角,矩形,圆形,连接线。用户可以通过拖拽的方式把图形拽到编辑区。编辑区图形能够实现删除,同时拥有uodo/redo。


看似简单的要求....
 好了那我们首先就开始吧,对了还是先介绍一下GEF这个架构吧
 

GEF(Graphical Editor Framework)是一个图形化编辑框架,它允许开发人员以图形化的方式展示和编辑模型,从而提升用户体验。这样的应用程序有很多,例如:UML类图编辑器、图形化XML编辑器、界面设计工具以及图形化数据库结构设计工具等等.这是引用八进制老兄的话.对了貌似struts那个编辑器,就是能拖能拽的那个,就是用的这个框架.

  他
采用MVC框架模式实现,模型对应业务逻辑,实现相应的接口,并添加事件监听器,实现对模型改变事件的监听。控制器由GEF提供的EditPart实现,安装编辑策略,监听模型的变化,处理模型变化请求,执行相应的Command命令完成相应的操作,绘制图形。视图部分由Eclipse提供的Draw2d实现,绘制相应的图形。我们也从这三个方面来说明程序的设计实现.
    什么是Draw2d,我们只说GEF,Draw2d的相关知识,还是去找google,百度吧.当然了同时我们还要有Eclipse插件开发的相关知识.就这两样我还是看了将近一天呢.
   现在我们在具体说一下GEF的大致工作原理:一下内容引自(八进制老兄的博客)


图2 GEF结构图

模型:GEF的模型只与控制器打交道,而不知道任何与视图有关的东西。为了能让控制器知道模型的变化,应该把控制器作为事件监听者注册在模型中,当模型发生变化时,就触发相应的事件给控制器,后者负责通知各个视图进行更新。

典型的模型对象会包含PropertyChangeSupport类型的成员变量,用来维护监听器成员即控制器;对于与其他对象具有连接关系的模型,要维护连入/连出的连接列表;如果模型对应的节点具有大小和位置信息,还要维护它们。这些变量并不是模型本身必须的信息,维护它们使模型变得不够清晰,但你可以通过构造一些抽象模型类(例如让所有具有连接的模型对象继承Node类)来维持它们的可读性。

相对来讲GEF中模型是MVC中最简单的一部分。

控制器:我们知道,在MVC结构里控制器是模型与视图之间的桥梁,也是整个GEF的核心。它不仅要监听模型的变化,当用户编辑视图时,还要把编辑结果反映到模型上。举个例子来说,用户在数据库结构图上删除一个表时,控制器应该从模型中删除这个表对象、表中的字段对象、以及与这些对象有关的所有连接。当然在GEF中这些操作不是由直接控制器完成的,这个稍后就会说到。

GEF中的控制器是所谓的EditPart对象,更确切的说应该是一组EditPart对象共同组成了GEF的控制器这部分,每一个模型对象都对应一个EditPart对象。你的应用程序中需要有一个EditPartFactory对象负责根据给定模型对象创建对应的EditPart对象,这个工厂类将被视图利用。

RootEditPart是一种特殊的EditPart,它和你的模型没有任何关系,它的作用是把EditPartViewer和contents(应用程序的最上层EditPart,一般代表一块画布)联系起来,可以把它想成是contents的容器。EditPartViewer有一个方法setRootEditPart()专门用来指定视图对应的RooEditPart。


图3 EditPart对象

用户的编辑操作被转换为一系列请求(Request),有很多种类的请求,这些种类在GEF里被称为角色(Role),GEF里有图形化和非图形化这两大类角色,前者比如Layout Role对应和布局有关的的操作,后者比如Connection Role对应和连接有关的操作等等。角色这个概念是通过编辑策略(EditPolicy)来实现的,EditPolicy的主要功能是根据请求创建相应的命令(Command),而后者会直接操作模型对象。对每一个EditPart,你都可以"安装"一些EditPolicy,用户对这个EditPart的特定操作会被交给已安装的对应EditPolicy处理。这样做的直接好处是可以在不同EditPart之间共享一些重复操作。

在GEF SDK提供的帮助文档(GEF开发指南)里有一份详细的EditPolicy、Role和Request类型列表,这里就不赘述了。

视图:前面说过,GEF的视图可以有很多种,GEF目前提供了图形(GraphicalViewer)和树状(TreeViewer)这两种,前者利用Draw2D图形(IFigure)作为表现方式,多用于编辑区域,后者则多用于实现大纲展示。视图的任务同样繁重,除了模型的显示功能以外,还要提供编辑功能、回显(Feedback)、工具提示(ToolTip)等等。

GEF使用EditPartViewer作为视图,它的作用和JFace中的Viewer十分类似,而EditPart就相当于是它的ContentProvider和LabelProvider,通过setContents()方法来指定。我们经常使用的Editor是一个GraphicalEditorWithPalette(GEF提供的Editor,是EditorPart的子类,具有图形化编辑区域和一个工具条),这个Editor使用GraphicalEditViewer和PaletteViewer这两个视图类,PaletteViewer也是GraphicalEditViewer的子类。开发人员要在configureGraphicalViewer()和initializeGraphicalViewer()这两个方法里对EditPartViewer进行定制,包括指定它的contents和EditPartFactory等等。

EditPartViewer同时也是ISelectionProvider,这样当用户在编辑区域做选择操作时,注册的SelectionChangeListener就可以收到选择事件。EditPartViewer会维护各个EditPart的选中状态,如果没有被选中的EditPart,则缺省选中的是作为contents的EditPart。

初步了解了GEF的MVC实现方式,让我们看看典型的GEF应用程序是什么样子的。大部分GEF应用程序都实现为Eclipse的Editor,也就是说整个编辑区域是放置在一个Editor里的。所以典型的GEF应用程序具有一个图形编辑区域包含在一个Editor(例如GraphicalEditorWithPalette)里,可能有一个大纲视图和一个属性页,一个用于创建EditPart实例的EditPartFactory,一些表示业务的模型对象,与模型对象对应的一些EditPart,每个EditPart对应一个IFigure的子类对象显示给用户,一些EditPolicy对象,以及一些Command对象。

GEF应用程序的工作方式如下: EditPartViewer接受用户的操作,例如节点的选择、新增或删除等等,每个节点都对应一个EditPart对象,这个对象有一组按操作Role分开的EditPolicy,每个EditPolicy会对应一些Command对象,Command最终对模型进行直接修改。用户的操作转换为Request分配给适当的EditPolicy,由后者创建适当的Command来修改模型,这些Command会保留在EditDomain(专门用于维护EditPartViewer、Command等信息的对象,一般每个Editor对应唯一一个该对象)的命令堆栈里,用于实现撤消/重做功能。

引用完毕.

了解了其基本原理后我们就可以开始开发了(呵呵,省去n多小示例的开发)....

ps:我会把这一周的收获一一写来.呵呵....

转载于:https://www.cnblogs.com/hya1109/archive/2008/07/13/1242033.html

这篇关于GEF七天之第一天的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/409880

相关文章

Java基础回顾系列-第一天-基本语法

基本语法 Java基础回顾系列-第一天-基本语法基础常识人机交互方式常用的DOS命令什么是计算机语言(编程语言) Java语言简介Java程序运行机制Java虚拟机(Java Virtual Machine)垃圾收集机制(Garbage Collection) Java语言的特点面向对象健壮性跨平台性 编写第一个Java程序什么是JDK, JRE下载及安装 JDK配置环境变量 pathHe

《C++标准库》读书笔记/第一天(C++新特性(1))

C++11新特性(1) 以auto完成类型自动推导 auto i=42; //以auto声明的变量,其类型会根据其初值被自动推倒出来,因此一定需要一个初始化操作; static auto a=0.19;//可以用额外限定符修饰 vector<string> v;  auto pos=v.begin();//如果类型很长或类型表达式复杂 auto很有用; auto l=[] (int

Android--第一天

创建AVD: 启动AVD: 点击按钮:Launch如下: 更换来电铃声: Window-->Show View-->Other... 点击进入:展开Android文件夹-->选择File Explorer:操作如下图 要想在音乐播放器上有该音乐,必须先“卸载SD卡,在安装SD卡”这样就可以了,声音--

Oracle第一天之sql

SQL 支持下列类别的命令:  数据定义语言(DDL)  数据操纵语言(DML)  事务控制语言(TCL)  数据控制语言(DCL) 数据类型 字符数据类型    :long   char  varchar2 CHAR: 当需要固定长度的字符串时,使用 CHAR 数据类型。          CHAR 数据类型存储字母

Oracle第一天之Oracle介绍

Oracle数据库由操作系统文件组成,这些文件提供数据库信息提供实际物理存储区 物理组件  : 数据文件+控制文件+日志文件 逻辑组件  :         数据库 | 表空间     至少一个:  名为 SYSTEM的系统表空间,由数据文件组成,一一对应;表空间的大小=所有构成该表空间的

mysql 获取本月/上月/下月第一天/最后一天

select curdate(); -- 获取当前日期select last_day(curdate()); -- 获取当月最后一天。select DATE_ADD(curdate(),interval -day(curdate())+1 day); -- 获取本月第一天select date_add

寒假集训第一天——结构体

期待已久的寒假集训终于开始了,第一天讲的内容比较简单——结构体,之前就学了点。。。 表示普通的结构体会用,涉及到指针都不大会,今天算是学了点指针的用法。。。 作业描述如下: 结构体 今天作业  1.定义一个acmer结构体,包括以下信息:姓名,学号,手机号,做题数,出生日期,其中出生日期date也是一个结构体,包括年、月、日  2.建立结构体数组,实现对多个同学

java 获取周、月、年的第一天以及最后一天的详细代码

public class MyCalendar { public static Date getDate(Calendar c) {      return new Date(c.getTimeInMillis());   }   /** * 得到本周第一天 * @return */ public static Calendar getFir

迎接开学第一天!请查收这份2024开学必备好物清单!

新的学期正悄然来临,开学第一天校园里即将迎来一张张充满朝气的面孔。无论是重返课堂的老生还是满怀期待的新生,开学季总是充满了新的希望与挑战。为了帮助学生们更好地适应即将到来的学习生活,我们精心准备了这份2024开学必备好物清单。从提高学习效率的智能设备到保护视力的健康科技产品,再到提升日常便利性的实用小物,请查收这份2024开学必备好物清单!接下来,让我们一起探索那些能够让学习变得更加轻松愉快的好物

idea插件开发的第一天-写一个小Demo

介绍 Demo说明 本文基于maven项目开发,idea版本为2022.3以上,jdk为1.8本文在Tools插件之上进行开发 Tools插件说明 Tools插件是一个Idea插件,此插件提供统一Spi规范,极大的降低了idea插件的开发难度,并提供开发者模块,可以极大的为开发者开发此插件提供便利Tools插件安装需要idea2022.3以上版本插件下载连接: https://downlo