??xml version="1.0" encoding="utf-8" standalone="yes"?> GEF源码分析Q六Q?GEF 的EditPart的职能分?__ 跨国时尚媒体集团q告部门 的故??BR> 部门q将李L?x)议Q简短阐明会(x)议主题和要求后,Qؓ(f)?jin)提高?x)议效率会(x)议每人最?/SPAN>5分钟发言Q最?/SPAN>20分钟讨论旉Q?/SPAN>5分钟GraphicalEditPart先生做ȝQ?/SPAN> 王首先站v发言Q“目前我?/SPAN>EditPart部门Q虽?dng)主要d有明定义,但是内部的工作流E不明确Q没有可依章E?/SPAN>...”?/SPAN> “是呀Q公司目前还没有我们部门的标准操作手册,很多问题都有很大随机性,工作的好坏过于依赖h员本w的工作能力Q这十分不利于h员的内部动以及(qing)Ch员的补充”我们的GraphicalEditPart"教练"满意的点点头?/SPAN> 魏h补充一下:(x)“由于我们内部每个h的做事方法,都是各有一套绝z,程不一_(d)l常D在工作对上下层通知协作出现问题。在水^部门沟通时Q也常常不流畅”。这是个大学刚毕业十分活泼的姑娘?/P>
“ؓ(f)什么大家L觉得女的职员不好Q看多有灉|的一个小姑娘呀Q又是个好苗子。?/SPAN>GraphicalEditPart"教练"此时内心(j)中的自我形象直就是华佗再世,那感觉真有点飘飘然乎Q?/SPAN>GraphicalEditPart先生不由自主地晃?jin)晃脑袋?/SPAN> 接下来其它hUL(fng)发言Q?/P>
“工作经验很隄互交,U篏与提高。很隑֜部门U对工作程{进行优化,~Z专业化。?/P>
“我们经常要?/SPAN>Figure部门一起工作,跟踪操作执行。这很是费工作旉Q尤其是当某个工作需要很长时_(d)或者中间经帔R要和客户交流反馈一D|_(d)q样非常影响工作效率。?/SPAN> “对于客L(fng)问题很难快速根据现有的l验模式形成解决Ҏ(gu)Q虽然我们公司服务态度和广告质量高于其它公司,但是l常׃反应速度太慢Q活被其它公总中抢?jin)去Q销售部门常常抱怨我们部门速度太慢。?/P>
“公司在相应客户需要操作过E中Q很N对客h个需求重新调整。客户常常抱怨在制作q程中很隑ց些小的改动。?/P>
…?/P>
׃GraphicalEditPart先生理师的带领,EditPart部门的会(x)议L短有效?/SPAN>1个小时多几分钟大安把问题简明扼要的表达出来?/SPAN> 李环顾下四周“最后,?/SPAN>GraphicalEditPart部长ȝ一下今天的?x)议”?/SPAN> 一直沉默的GraphicalEditPart先生站了(jin)hQ十分精,也环了(jin)一下四周,清了(jin)清嗓子?/SPAN> “首先、我要自我检讨一下,q一q多L忙ؕ于紧急的事情当中,很久没有攉大家的徏议和反馈?jin),q十分不利于我们部门的发展。今天大家D出很多目前部门的问题Q这些充分反映了(jin)大家寚w门的业务熟?zhn)E度Q我怿Q这是因为大家十分关注公司的未来Q希望公司越办越好,而不是怨天h的牢?d),可能有些领导会(x)觉的这是找毛病寚wg满,在我q里Q我今天在一ơ明表明,我十斚w励大ӞƢ迎大家一些意见反馈给我,希望大家不仅仅是单反馈在工作中的直接困难Q而且l过自己的思考提炼写成简z的文书l我Q最好发挥自我主动和创造性提Z些变革徏议。这些东西将是我们部门及(qing)公司潜在的珍늚财富Q同时也是我们部门未来发展方向的一个重要部分。?/P>
“今天的?x)议大家主要是针?gu)们部门的问题Q希望会(x)后大家再从公司整体考虑q些问题Q以?qing)未来扩?/SPAN>EditPart部门?x)带来什么问题,比如大家可以参考我们当初成立时遇到那些问题Q这些问题将来如何避免或减少。?/SPAN> “按计划Q会(x)后,李Q小孙,丁Q小黄还有我Q将ȝ今天?x)议Q同时、制定出未来部门l织变革的策略。在此期_(d)希望大家t跃的将自己的想法创意于我们交流。?/P>
“还有一件事情,今天要批评一下小丁同事,现在开?x)不q到?jin),但是Q不仅没发言、我看你从开?x)就一直看前天发的材料Qؓ(f)什么不提前准备Q这是耽误大家每个人的旉Q下不ؓ(f)例。今后、小李你在部门规章里加一条,部门开?x)前必须提前阅读理解会(x)议材料Q凡q反者,包括我在内一律站C(x)议室角落站着阅读完资料后Q在回会(x)议位。我的话完了(jin)。?/P>
丁满脸通红Q不由地低着_(d)双手捂住?jin)腮帮,不敢喘气了(jin),恨不得有个地~钻q去?/P>
“今天会(x)议结束。”小李宣布?/P>
?x)后?gu)孙的会(x)议记录,很快的小李几个hȝZ下的一个鱼骨图?/P>
什么是因果图? 因果囄发明?Kaoru Ishikawa 是一名管理专Ӟ其最初的目的是改qR间的质量控制工作。正如以下示例所C,因果图还能表辑օ他环境中的因果关pR?BR> ׃因果囄形状很像鱼的骨架Q所以它又称作鱼骨图。鱼的脊骨上几根最大的鱼骨表示主要的原因类别?BR>例如Q在本例中,主要的原因类别有盎格鲁h/q人、丹麦h、萨克逊h和诺曼底人,q些U族体都想控制英格兎ͼ从而导致了(jin)该战争的爆发?/P>
主要cd中的较小鱼骨表示主要的原因。例如,在本例中Q在萨克逊hq个cd斚wQ黑斯h(hun)斯战争的主要原因在于公元 1051 q萨克逊王爱d华许诺将王位传给威廉一世?/P>
(zhn)还可以在主要原因上dơ要原因?/P> 接下来我们以一个故事的方式来解决第三篇遗留下来问题Q?/SPAN> 已存在一个三角图形EditPartQ我们想重用?但是我们q需要增加(或删去)(j)Ҏ(gu)可调整的Ҏ(gu),如何保证无需重新建立一个新的EditPartQ或者做Z陋的l承Q当功能不断l合后,出现无数子EditPartc? 如何由框架自动完成Undo?qing)Redo功能Q?/P>
话说在某个跨国时媒体集团中国区q告部门Q这是一家主营^面广告的q告公司Q听说董事长是个q仅办百的老头GraphicalEditor先生Q来自赫赫有名的eclipse基金财团Q,有目前主要有两个子部?/SPAN>EditPart(q告{划?/SPAN>)?/SPAN>Figuer(q面设计?/SPAN>)?/SPAN> EditPart部长是一位中q充满信?j)和zdGraphicalEditPart先生?/SPAN> Figuer部长是一位与部门名同名的q告主设计师丽青春?/SPAN>Figure姐?/SPAN> EditPart部长GraphicalEditPart目前主要肩负着三项MQ?/SPAN> ׃公司扩大?jin)业务,投入市(jng)场的品种cL以往增加?jin)三倍,EditPart部长工作变得异常J忙有些快压垮了(jin)Q感觉自己快成ؓ(f)整日驮着重物q迈的驴子,“是不是自己老了(jin)”GraphicalEditPart先生开始常常怀疑自׃(jin)?/SPAN> q天Q?/SPAN>EditPart部长收到总部一信Q?/SPAN> GraphicalEditPart先生Q?/P>
首先我代表公司感谢?zhn)q些q勤奋出色的工作。我们公司在中国短短三年的营业额增长?jin)四倍,同时EditPart中国部门在此期间获得?jin)公司最有活力部门奖Q这些成l都与?zhn)的努力是分不开的。据我们?jin)解Q?zhn)?/SPAN>EditPart部门q三q中Q实施了(jin)几项富有创意的制度改革,如成?/SPAN>Tool情报攉部门Q推q后大大提高?jin)整个公?/SPAN>EditPart部门业务处理能力。ؓ(f)?jin)进一步扩大业务,公司在未来的两年里将在世界各地尤其是中国增加40%的区域广告部门,正如(zhn)所知道目前公司对于EditPart部门的组l规划以?qing)责d度还有很多不完善之处Q这十分不利于区域部门扩展的计划。故我委托?zhn)做出《未来广告部l织的规划》计划书Q本月底邀(g)h来总部参加l织规划与变革方案的评审?x),届时?x)Ҏ(gu)的计划书q行评审。如通过评审Q公司所有广告部会(x)按照(zhn)的计划书进行变革?/SPAN> 愿世界明天的舞収ͼ因我们而变得更加美好、充满激情与惌 CEO GEF “噢Q太了(jin)Q这信来的真是?qing)时Q如果再l箋如此的话Q我要压垮了(jin)Q只好另谋它职了(jin)。嗯Q这回我要好好地写这个计划书。这Pw上担子ȝ有减ȝ希望。有上司的赏识,我要一展宏图一番。”GraphicalEditPart不由自主拍了(jin)下桌子自a自语后,张开双臂Q砰C下Ԓ靠在椅背上,深深地出?jin)口气,双目d工作的压力似乎片刻间消失Q顺手戴上了(jin)他那十分h的太阳镜Q小声打开旁边CDQ噢Q夏威夷之夜Q感觉自己此时就在夏威夷带着墨镜w在金黄、松软、温暖的沙WQ吹着口哨Q热情似火的太阳I过太阳镜,过眼皮Q将几缕模糊的光芒带入眼中(其实是他那高瓦的吊灯Q,风?fn)?fn)Q旁边的?sh)风扇?j)Q在享受着q片d?rn)天堂感觉,Ȁ情创意不断涌出,啊,久违?jin)的感觉?/SPAN> 开qԌq速的打开他喜q脑图软g -- Mindjet ManagerQ记录下脑中的构思,M如下计划要点
GraphicalEditPart先生当天安排?jin)部门?qing)?x)议计划。经q?/SPAN>EditPart部门紧张有奏的准备会(x)议讨论的资料Q第三天、按?/SPAN>8:30开?x)?BR>
GraphicalEditPart先生q如往常,准时提前5分钟坐在?x)议室前边角上。他喜欢部门的小伙子们,虽然q些伙子们做事情时常有些不周,但是他更ƣ赏他们的活力和富有创造激情。所以、每每开?x)时Q他更愿坐在旁边听这些小伙子们的意见Q“相比较当个威武的军队长官,我更意是一个严格又和蔼的优U教练?/SPAN>GraphicalEditPart先生常常如此提醒自己不要俎代庖?/SPAN>
文章来源:http://xdingding.cnblogs.com/archive/2005/12/07/292516.html
]]>
看来GraphicalEditPart先生要大q一场,Ʋ知详情Q请听下回分?IMG src="http://xdingding.cnblogs.com/Emoticons/emsmiled.gif" align=absMiddle border=0>
GEF源码分析Q四Q?/SPAN> GEF 消息转义 ___ Tool的作?/SPAN>
接着上一节:(x)
我们先解军_下问题:(x)
在界面操作过E中Q我们希望面对的是边框调整事Ӟ囑ŞUd事gQ或者是~辑文本事gQ而不是原始的鼠标和键盘事Ӟ
术语定义Q?/P>
pȝUI事gQ?/SPAN> 一般由某些计算ZhZ互硬件发ZPq且l操作系l理解后产生的事Ӟ例如Q原始的鼠标的移动、点d键盘的敲M件等?/SPAN>
UI业务语义事gQ?/SPAN> ql?/SPAN>UI事g和其?/SPAN>UI业务语义事g触发Q由UI业务代码理解后生的事gQ操作系l不可理解,同时无Q何领域的业务语义Q,?/SPAN>2D囑Ş的尺寸调_(d)2D囑Ş的点击,2D囑Ş的移动?/SPAN>
Q其实不仅限于事件的转义Q包?/SPAN>UI的改变,也需要由pȝUI语义转换?/SPAN>UI业务语义来用)(j)
UI业务语义事g?/SPAN>Controller控制中的优点是易于理解、维护和扩充Q具体的主要有以下方面:(x)
a.减少pȝUI事g判断逻辑部分代码的重复。比如在Controller部分代码无需分步着大量逻辑重复的代码,当鼠标移动时d断究竟是一?/SPAN>2D囑Ş的尺寸改变,q是一?/SPAN>2D囑Ş的移动,q是一l?/SPAN>2D囑Ş的移动,q是2D囑ŞDragAndDrop的动作?/SPAN>
b.Controller部分的代码语义明。在Controller内部处理代码和接口中直接面对的是UI业务语义Q如囑Ş的移动,囑Ş的尺寸改变,q样、代码易于理解、调试等?/SPAN>
b.Controller部分代码无需为系l?/SPAN>UI事g保存状态。如2D囑Ş的移动中Q如果这些事件直接在Controller中处理,从开?/SPAN>MouseDown,?/SPAN>MouseMoveQ到MouseUpq程中,?/SPAN>Controller中要集中保留q样众多状态,极易造成Controller代码具体多头职责的症Ӟ从而?zhn)上严重的_分裂:)?/SPAN>
于是?/SPAN>GEF?/SPAN>FrameWork有给Z下的解决Ҏ(gu)Q?/SPAN>
?/SPAN>A
如上?/SPAN>AQ?/SPAN>
GEF通过Tools(?/SPAN>interface?/SPAN>Tool)Q当然在视图上的Menu?/SPAN>Toolbar是通过Action发出Q这个是eclipse?/SPAN>Workbench机制Q在此就不讨Z(jin)。以下是Tool的类l承?wi)?x)
?/SPAN>B
从上?/SPAN>B可以看出
?/SPAN>Tooll承的这些类均处理一个或者一c?/SPAN>UI业务语义事gQ其中需要保留中间状态的子类均以XXXTracker形式出现?/SPAN>
首先q些Tool的实现类通过Tool的接口(上图双Q,接收界面来的事gQ然后调用内?/SPAN>handleXXXQ这样通过内部函数getTargetRequest()[createTargetRequest()]和getSourceRequest()[createSourceRequest()]Q把pȝUI事g转换?/SPAN>UI业务语义事g?/SPAN>RequestQ如?/SPAN>CQ。至?/SPAN>Tool?x)通过调用相关联的EditPart的接口将UI业务语义事g通知?/SPAN>EditPart中。于是在Controller(EditPart)中仅仅需要理解处?/SPAN>Request对象?/SPAN>
?/SPAN>C
下面?/SPAN>ResizeTracker代码ZQ?/SPAN>
class ResizeTracker
protected Request createSourceRequest() {
ChangeBoundsRequest request;
request = new ChangeBoundsRequest(REQ_RESIZE);
request.setResizeDirection(getResizeDirection());
return request;
}
protected Command getCommand() {
List editparts = getOperationSet();
EditPart part;
CompoundCommand command = new CompoundCommand();
command.setDebugLabel("Resize Handle Tracker");//$NON-NLS-1$
for (int i = 0; i < editparts.size(); i++) {
part = (EditPart)editparts.get(i);
command.add(part.getCommand(getSourceRequest()));
}
return command.unwrap();
}
protected void eraseTargetFeedback() {
if (!getFlag(FLAG_TARGET_FEEDBACK))
return;
if (getTargetEditPart() != null)
getTargetEditPart().eraseTargetFeedback(getSourceRequest());
setFlag(FLAG_TARGET_FEEDBACK, false);
}
protected boolean handleButtonUp(int button) {
if (stateTransition(STATE_DRAG_IN_PROGRESS, STATE_TERMINAL)) {
eraseSourceFeedback();
eraseTargetFeedback();
performDrag();
}
return true;
}
最后还有个问题?BR>
Toolq些事g接口Q如何从Viewer传递过来的呢?
我画?jin)一个简要的cd
?/SPAN>D
参照上图Q下面罗列重要代码:(x)
大家主要以下两方?/P>
一、创些关键事件处理链的过E(注意图上的粗体文字)(j)Q?/P>
二、消息从SWT?/SPAN>Canvas实例传递到Toolq程Q图D中注释标{序Q;
class GraphicalEditor
public void createPartControl(Composite parent) {
createGraphicalViewer(parent);
}
protected void createGraphicalViewer(Composite parent) {
GraphicalViewer viewer = new ScrollingGraphicalViewer();
viewer.createControl(parent);
setGraphicalViewer(viewer);
configureGraphicalViewer();
hookGraphicalViewer();
initializeGraphicalViewer();
}
protected void setGraphicalViewer(GraphicalViewer viewer) {
getEditDomain().addViewer(viewer);
this.graphicalViewer = viewer;
}
class EditDomain
public void addViewer(EditPartViewer viewer) {
viewer.setEditDomain(this);
if (!viewers.contains(viewer))
viewers.add(viewer);
}
class GraphicalViewerImpl
public void setEditDomain(EditDomain domain) {
super.setEditDomain(domain);
// Set the new event dispatcher, even if the new domain is null. This will dispose
// the old event dispatcher.
getLightweightSystem()
.setEventDispatcher(eventDispatcher = new DomainEventDispatcher(domain, this));
}
private final LightweightSystem lws = createLightweightSystem();
class ScrollingGraphicalViewer
public void setEditDomain(EditDomain domain) {
super.setEditDomain(domain);
// Set the new event dispatcher, even if the new domain is null. This will dispose
// the old event dispatcher.
getLightweightSystem()
.setEventDispatcher(eventDispatcher = new DomainEventDispatcher(domain, this));
}
class LightweightSystem
public void setEventDispatcher(EventDispatcher dispatcher) {
this.dispatcher = dispatcher; //在此Shapes例子中是DomainEventDispatcher
dispatcher.setRoot(root);
dispatcher.setControl(canvas);
}
protected void addListeners() {
EventHandler handler = createEventHandler();
canvas.getAccessible().addAccessibleListener(handler);
canvas.getAccessible().addAccessibleControlListener(handler);
canvas.addMouseListener(handler);
canvas.addMouseMoveListener(handler);
canvas.addMouseTrackListener(handler);
canvas.addKeyListener(handler);
canvas.addTraverseListener(handler);
canvas.addFocusListener(handler);
canvas.addListener(SWT.MouseWheel, handler);
…?/P>
setEventDispatcher(getEventDispatcher());
}
class EventHandler
implements MouseMoveListener, MouseListener, AccessibleControlListener, KeyListener,
TraverseListener, FocusListener, AccessibleListener, MouseTrackListener,
Listener
{
?/P>
public void keyPressed(KeyEvent e) {
//在此Shapes例子中是DomainEventDispatcher
getEventDispatcher().dispatchKeyPressed(e);
}
?/P>
public void mouseDoubleClick(MouseEvent e) {
getEventDispatcher().dispatchMouseDoubleClicked(e);
}
?/P>
public void mouseMove(MouseEvent e) {
getEventDispatcher().dispatchMouseMoved(e);
}
public void mouseUp(MouseEvent e) {
getEventDispatcher().dispatchMouseReleased(e);
}
?/P>
}
q样、在?/SPAN>A?/SPAN>Request发送到EditPart机制做了(jin)要的探讨?/SPAN>
学习(fn)?/SPAN>Tool产生Request的机Ӟ可以帮助我们调试GEFQ同时如果在大家自己的程序中需要有新的UI交互cdQ也可以试着建立自己?/SPAN>ToolcM生新?/SPAN>RequestQ这样在自己?/SPAN>EditPart产生对应?/SPAN>Command,q样可以处理实现新?/SPAN>UI交互cd?/SPAN>
在下一我们探讨一下有兛_A中的EditPart如何产生CommandQ以?qing)执?/SPAN>Command问题?/SPAN>
包含GEF的Editor创徏时序?/STRONG>
?/SPAN>eclipse|站上例?A >A Shape Diagram EditorZ
GEF如同其他的一?/SPAN>framework一P是一个复杂庞大(有点夸张Q的Q当我们想用驾驭它Ӟ必d面的理解其整体构架及(qing)其运作过E。这需要我们的毅力和敏锐。旅途开始了(jin)?
GEF主要的Q务是针对2D囑Ş~辑操作Q如下图?/SPAN>
Z(jin)?/SPAN>GEF能够q泛的用于种cȝ?/SPAN>2D囑Ş~辑领域Q?/SPAN>GEF必d立一个严格的易扩?/SPAN>/易组?/SPAN>/易重用的MVC框架Q当然这U分解细化功能对象的Ҏ(gu)思想Q我们可以用在其它的地方Q其它领域、其他语a?/SPAN>C#上)(j)?/SPAN>
那么如果设计 q个 严格?/SPAN>MVC框架(对于Model是严格的独立Q它不依赖与View?/SPAN>Controller) 以及(qing) 此框?/SPAN> 如何 辑ֈ 易扩?/SPAN>/易组?/SPAN>/易重?/SPAN> 的特性。下面我按照自己拙劣的思\Q以麻雀之眼?/SPAN>鸉K之志?IMG src="http://xdingding.cnblogs.com/Emoticons/emembarrassed.gif" align=absMiddle border=0>
对于MVC?/SPAN>
View部分Q?/SPAN>GEF理所当然要用自家的东东Draw2D。利?/SPAN>Draw2D?/SPAN>Figuer作ؓ(f)自己?/SPAN>View?/SPAN>
Model部分Q?/SPAN>往往内部包含?jin)千差万别、不可预知的商业信息。因此?/SPAN>GEF框架应该量减少U束Q在下面详l说明约束)(j)?/SPAN>
Controller部分Q?/SPAN>EditPart/Draw2D?/SPAN>Figure/Modelq三个树(wi)状对象模型,?/SPAN>EditPart中将建立?jin)与其对应?/SPAN>Draw2D?/SPAN>Figure/Modell点 建立一一兌的关pR?/SPAN>
q样产生的构架如下:(x)
思考:(x)
Z?/SPAN>Controller要同View一样采用树(wi)状结构呢Q?/SPAN>
?/SPAN>Controller以树(wi)状的形式存在Q这样便于功能分解(q个道理有点?/SPAN> 在类设计?/SPAN> 复合优于l承 一般)(j)
q样每一l点?/SPAN>Controller(?/SPAN>EditPart) 仅需要处?/SPAN>
其当用户需要在囑Ş界面~辑界面中,需要用多U不?/SPAN>UI行ؓ(f)规则?/SPAN>2D元素Q例如不同的形状块,不同行ؓ(f)的连U等Q组合来完成工作Ӟ例如cMVisioq样的界面)(j)Q这U构架的优势显露无疑?/SPAN>
未完待箋?(下面要探讨如何生上qC个树(wi)状模型等?/SPAN>)
GEF学习(fn)W记Q一Q?/SPAN> eclipse?/SPAN>GEF相关目说明
首先、感?A >八进?/A>的辛勤劳动和奉献。这几天开始对GEF发生兴趣Q?A >八进制的GEFpdҎ(gu)学这些的帮助很大入门很快。自׃顺手把周末学习(fn)的东西记录下来。帮助后来学人。我?x)把q几天所学陆l写出希望大家支持。目前、正在ؓ(f)八进制例子发愁,我对NodePart增加?/SPAN>ResizeEditPolicyQ但是不知ؓ(f)何鼠标拖动时有个灰色的区域在随着变化Q但鼠标释放ӞNodeFigure的尺怸发生变化Q是否是因ؓ(f)?/SPAN>refreshVisuals中固化了(jin)SizeQ代码学?fn)?/SPAN>?
eclipse?/SPAN>GEF相关目说明?/SPAN>
各项目的介:(x)
Draw2DQ?/SPAN>建立?/SPAN>2l的囑Ş?/SPAN>(?wi)状囑Ş部gFigure)Q负责显C?/SPAN>2l的囑Ş展示?BR>
GEFQ?/SPAN> Q?/SPAN>Graphical Editing FrameworkQ?/SPAN>建立标准?/SPAN>MVC构架Q代码利?/SPAN>Draw2D作ؓ(f)自己?/SPAN>View部分Q主要代码实现复杂的?wi)?/SPAN>(?/SPAN>Model分别对应) 的控制器。实现的框架h很高的可复用{特性,例如Q将囑Ş部g功能分解为多?/SPAN>EditPolicyQ这样用者可以通过installEditPolicy接口来定Ӟ以及(qing)扩充自己的某一功能特征?/SPAN>
EMF: Q?/SPAN>Eclipse Modeling FrameworkQ?/SPAN>首先在一个轻量目以及(qing)目初期开发,Model常常采用拥有Property?/SPAN>Java对象来简单明?jin)表C【即 Plain Old Java Objects (POJOs)】?/SPAN>EMF定义?jin)一套Ecore元模型,使得Modelh易于l护、易于扩充、易于数据交换等Ҏ(gu)的Model Framwork。因此、在实际中大型的目中往往?x)采?/SPAN>Draw2DQ?/SPAN>GEFQ?/SPAN>EMF的方式来实现整体?/SPAN>MVC模式。例如:(x)ROSE的最新版?/SPAN> IBM.Rational.Software.Architect是采用?jin)这U构架?/SPAN>
GMFQ?/SPAN> Q?/SPAN>Graphical Modeling Framework Q?/SPAN>使用?/SPAN>GEF?/SPAN>EMFQ徏立了(jin)两个之间的桥梁框Ӟ同时实现?jin)一些领域上的典范应用,?/SPAN>UML图,甘特图,脑图{。(目正在q行中这些功能还未完备。可以用来参考以实现自己的一个标准的GEFQ?/SPAN>EMF的应用)(j)?/SPAN>
各项目依赖关p:(x)
如上图:(x)使用者可以有以下几种用法Q?/P>
EMF: Model理?/SPAN>
Draw2D: 二维囑Ş展现
Draw2D Q?/SPAN> GEF: 二维囑Ş的简单编辑模?/SPAN>
Draw2D Q?/SPAN> GEF Q?/SPAN> EMFQ?/SPAN> 二维囑Ş的编辑模?/SPAN>
Draw2D Q?/SPAN> GEF Q?/SPAN> EMF Q?/SPAN> GMFQ基?/SPAN>GMF提供的图形编辑功能之上扩?BR>