??xml version="1.0" encoding="utf-8" standalone="yes"?>а√在线天堂官网,久久精品亚洲一区二区,精品国产一区二区三区久久久蜜月
http://www.aygfsteel.com/pandawang/category/6830.htmlzh-cn Thu, 01 Mar 2007 14:15:25 GMT Thu, 01 Mar 2007 14:15:25 GMT 60 ZRCP的GEF~辑器中RetargetAction的注册问?/title> http://www.aygfsteel.com/pandawang/archive/2006/08/19/64532.htmlLong Long Ago Long Long Ago Sat, 19 Aug 2006 09:35:00 GMT http://www.aygfsteel.com/pandawang/archive/2006/08/19/64532.html http://www.aygfsteel.com/pandawang/comments/64532.html http://www.aygfsteel.com/pandawang/archive/2006/08/19/64532.html#Feedback 0 http://www.aygfsteel.com/pandawang/comments/commentRss/64532.html http://www.aygfsteel.com/pandawang/services/trackbacks/64532.html 首先需要在相应rcp工程中的ActionBarAdvisercM注册相应的Action,比如对应于deleteAction,我在Ҏorg.eclipse.ui.application.ActionBarAdvisor#makeAction(IWorkbenchWindow)中注册deleteAction,如下:protected void makeAction( final IWorkbenchWindow window) { IAction delAction = ActionFactory.DELETE.create(window); register(delAction); } 只是q么讄q是不能删除相应的图形元?需要在相应的编辑器中重载initҎ,d如下的代?br />public void init(IEditorSite site, IEditorInput input) throws PartInitException { // TODO Auto-generated method stub super .init(site, input); ActionRegistry registry = getActionRegistry(); IActionBars bar = site.getActionBars(); String id = ActionFactory.DELETE.getId(); bar.setGlobalActionHandler(id,registry.getAction(id)); bar.updateActionBars(); } 在这里仔l研I会发现,在第一D代码中实际上时创徏了一个action,q是一个RetargetAction,而在super.init()Ҏ会调用一个createActionҎ,q里创徏的是gef默认的redoAction undoAction selectionAction deleteAction saveAction.需要注意的是RetargetAction是一U可以跟t当前活动的部分,׃retargetAction含有一个id,如果q个zd部分提供的handler的id和retargetAction的id相同,那么相应的对retargetAction的调用就转嫁成对当前q个zd部分的handle的调?(当然如果Ҏ没有handle,那么q个action会disable).所?我们可以看出?q个retargetAction会在gef~辑器激zd调用gef的deleteAction. ]]> GEF中鼠标双M件的截获 http://www.aygfsteel.com/pandawang/archive/2006/06/08/51513.htmlLong Long Ago Long Long Ago Thu, 08 Jun 2006 14:21:00 GMT http://www.aygfsteel.com/pandawang/archive/2006/06/08/51513.html http://www.aygfsteel.com/pandawang/comments/51513.html http://www.aygfsteel.com/pandawang/archive/2006/06/08/51513.html#Feedback 0 http://www.aygfsteel.com/pandawang/comments/commentRss/51513.html http://www.aygfsteel.com/pandawang/services/trackbacks/51513.html
http://dev.eclipse.org/mhonarc/lists/gef-dev/msg00183.html
Ask: How to add a double click event or Request on a figure?when double click on a figure, a dialog pop up and do some actions.for example when double click on a UML class figure, a dialog pop up, user can Add a method to the class. Answer: This is already done in GEF. Your editpart will receive a performRequest(req) with the type RequestConstants.REQ_OPEN. See SelectEditPartTRacker#performOpen() -randy 是在figure对应的editpart中重载方法performRequest(Request req),q判断req的type是否为RequestConstants.REQ_OPEN,如果?则处理这个双M? q个Ҏ是个回调Ҏ,在SelectEditPartTRacker#performOpen() 中调用的.
]]> GEF中容器图形的坐标问题 http://www.aygfsteel.com/pandawang/archive/2006/05/15/46203.htmlLong Long Ago Long Long Ago Mon, 15 May 2006 06:04:00 GMT http://www.aygfsteel.com/pandawang/archive/2006/05/15/46203.html http://www.aygfsteel.com/pandawang/comments/46203.html http://www.aygfsteel.com/pandawang/archive/2006/05/15/46203.html#Feedback 0 http://www.aygfsteel.com/pandawang/comments/commentRss/46203.html http://www.aygfsteel.com/pandawang/services/trackbacks/46203.html ]]>GEF学习记?/title> http://www.aygfsteel.com/pandawang/archive/2006/04/09/40091.htmlLong Long Ago Long Long Ago Sun, 09 Apr 2006 06:38:00 GMT http://www.aygfsteel.com/pandawang/archive/2006/04/09/40091.html http://www.aygfsteel.com/pandawang/comments/40091.html http://www.aygfsteel.com/pandawang/archive/2006/04/09/40091.html#Feedback 0 http://www.aygfsteel.com/pandawang/comments/commentRss/40091.html http://www.aygfsteel.com/pandawang/services/trackbacks/40091.html 再GEF中UI的操作交互都是通过构徏RequestQƈ调用EditPart中的API来完成相应的操作Q这些API可以分ؓ四类Q?br />1。 ?strong>EditPart getTargetEditPart(Request) boolean understandsRequest(Request) 再我们进行交互操作时Q首先要定Ȁzȝ是那个EditPartQ经常是一个当前被选中的viewer和通过单击选择的EditPart的复合体。这个被选择的部仉过询问每个被选择的EditPart是否处理q个requestQ通过understandsRequestҎQ。那个在鼠标单击定的EditPart是通过viewer的帮助和getTargetEditPartҎ来找到的。ƈ不是所有的交互都有target?br />2?br />void showSourceFeedback(Request) void eraseSourceFeedback(Request) void showTargetFeedback(Request) void eraseTargetFeedback(Request) 在我们的交互操作特别是托拽图形时Q就需要EditPart来回显(FeedbackQ,托拽源被认ؓ是v作用的那个editpartQ目的部件被认ؓ是鼠标的目的地。showXXXFeedback可能是在鼠标Ud目的圎ͼ但未作用于目的part时调用,eraseXXXFeedback则可能是在鼠标作用于目的part后调用的?br />3?strong>Command getCommand(Request) q个Ҏ用于获得可执行的命o列表Q命令可以对模型q行操作QEditpart通过request询问Editpolicy来获得相应的command列表。同时command也可以判断这个交互操作是否时可能的。如果没有command或者command不能执行Q则ui会指个操作是不能执行的(鼠标变成止操作的样子)。如果一个editpartq回null作ؓcommand则它不会Lq个交互操作Q除非没有一个command被提供。ؓ了指C某个操作是不能执行的则EditPart需要返回一个不能执行的command?br />4?strong>void performRequest(Request) q有一UAPIQ它让EditPart去do somethingQ可能是一些ƈ不会立即改变model的改变,比如打开对话框或者激zȝ接编辑模式?br /> EditPartq不直接q行~辑Q它操作委托给EditPolicyQ每个EditPolicy专著于一U编辑Q务或者一l相关的操作。当上面的API被调用后Q除了performRequestҎQ,EditPart便委托给它的EditPolicy来处理这个request。对于不同的ҎQEditPart可能是在W一个能处理request的policy处就停止调用了或者每个policy都有Z执行q个request。GEF提供了几个默认的policyQ不q还是需要实现其中的一些特定方法?br /> q里再废话一点,在注册相应的EditPolicyӞ需要指定RoleQ这是一个字W串Q用来标C个EditPolicyQ相同的Role对应的EditPolicy会被替换Q例如子cd以通过Roleq个Key来覆盖其父类所安装的EditPolicy。EditPolicyQRoleQ分成两U类型,一U是囑Ş的,一U是非图形的Q上文中有提刎ͼq里详细的描qC下:Non-Graphical Roles: 1) COMPONENT_ROLE : 一个Component存在于一个parent中,q且可以从parent中删除。更Z般的Q它可以使Q何只涉及到这个EditPartQ而与View无关的东ѝ?More generally, it is anything that involves only this EditPart.) 2) CONNECTION_ROLE q是ConnectionEditParts应该有的一个基本角艌ӀConnections同Components有一点不同,删除Connections旉常q需要其从其source和target节点中删除,而不是从其parent中删除? 3) CONTAINER_ROLE 大部分拥有children的EditParts都应该具有这个角艌Ӏ一个Container会涉及到adds/orphans以及creates/deletes{操作? 4) NODE_ROLE 如果一个EditParts用户ConnectionQ则其应该具有这个角Ԍ它可以用来创建,删除Q重新连接一个Connection?Graphical Roles: 1) PRIMARY_DRAG_ROLE: 用来允许用户拖动q个EditPart。用户可以通过点击q个EditPart然后拖动Q或者点击这个EditPart所创徏的一个Handle来进行拖动? 2) LAYOUT_ROLE : Layout角色用来攑֜一个Container的EditPart上,q个EditPart拥有一个graphical layout。如果这个layout有constraintsQ则它需要通过计算来得到这个constraints? 3) GRAPHICAL_NODE_ROLE : A node supports connections to terminals. When creating and manipulating connections, EditPolicies with this role might analyze a Request's data to perform "hit testing" on the graphical view and determine the semantics of the connection. 用于支持q接到重点的nodeQ当创徏、操作连接时Q包含这个Role的Editpolicy会分析request的数据,来在囑Şview上做“hit testing”,q且判断q个connection的语义?br />4) CONNECTION_ENDPOINTS_ROLE: q个Role允许用户拖动一个ConnectionEditPart的端炏V? 5) CONNECTION_BENDPOINTS_ROLE : q个Role允许用户能够在一个Connection中间拖动和创建bendpoints? 6) SELECTION_FEEDBACK_ROLE : q个角色只是用来昄feedback。当鼠标q入或者在一个EditPart上暂停时QSelection Tool会发送两个类型的requestlEditPart。安装了q个角色的EditPart能够在此时接受这些请求来改变view的样子,或者弹出tipQlabel{? 7) TREE_CONTAINER_ROLE : SWT Tree的Layout Role?本地SWT Tree的Layout Role的等L。这个EditPolicy应该在树上显C反馈ƈ计算索引Q就像在file explorer里拖拽一栗?br />over?br /> ]]> GEF学习记?/title> http://www.aygfsteel.com/pandawang/archive/2006/04/09/40078.htmlLong Long Ago Long Long Ago Sun, 09 Apr 2006 04:33:00 GMT http://www.aygfsteel.com/pandawang/archive/2006/04/09/40078.html http://www.aygfsteel.com/pandawang/comments/40078.html http://www.aygfsteel.com/pandawang/archive/2006/04/09/40078.html#Feedback 0 http://www.aygfsteel.com/pandawang/comments/commentRss/40078.html http://www.aygfsteel.com/pandawang/services/trackbacks/40078.html 首先通过单击调色板,会调用一个实现org.eclipse.gef.requests.CreationFactory接口的工厂类Q这个是我们在注册相应的ToolEntry时声明的Q通过传入的参数这个工厂类q道应该创Z个什么类型的model元素。(注意Q这时候因为我们只是纯创徏了一个模型元素,对于它的父元素,位置信息{等都还不清楚,所以一般我们在讄模型元素的构造函数时需要有个无参数的构造方法(或者有默认参数的构造函敎ͼ。) 当单ȝ布上的某个位|后Q相应的信息比如 模型的父元素Q位|信息等{都已经可以定Q将q些信息以及新创建的模型元素本n包装成request传给相应的EditPartQ就是鼠标单d所在的囑Ş元素对应的EditPartQ?br /> q个EditPart会将q个request传给相应的EditPolicyQ至于怎么传递,q不清楚Q估计是q样的,EditPart会传l注册在其上的所有EditPolicyQ而每个EditPolicy都有个getCommandҎQ通过request的type交给相应的getXXXCommandҎ。查看了一下源代码Q发现在AbastractEditPart中有个getCommandҎ正是每个EditPolicy中的getCommandҎ都调用了一遍)?br /> 然后EditPolicy处理相应的requestQ具体的是调用getXXXCommadҎ得到处理相应request的CommandQCommand是可以改变模型。上面提到的q种EditPolicy属于NonGraphicalcdQGEF中还包括了一U称为Graphicalcd的EditPolicyQ这UEditPolicy不对模型q行处理Q只是用来修改图形显C(gq种说法不正,它可以更改视囑օ素的位置Q在业务模型和视图模型统一的情况下Q这U图形EditPolicy也会更改模型Q;而NonGraphical的EditPolicy则是不清楚图形元素的Q但它可以对模型q行更改Q因此这UEditPolicy在不同view之间是可以通用的?br /> 当模型发生改变后Q注册再其上的EditPart会得到相应的通知Q此Ӟ通过通知中的property信息QEditPart会refreshVisual或者refreshChildrenQ从而视图发生改变?img src ="http://www.aygfsteel.com/pandawang/aggbug/40078.html" width = "1" height = "1" /> ]]> gef学习记一 http://www.aygfsteel.com/pandawang/archive/2006/02/23/32212.htmlLong Long Ago Long Long Ago Thu, 23 Feb 2006 14:40:00 GMT http://www.aygfsteel.com/pandawang/archive/2006/02/23/32212.html http://www.aygfsteel.com/pandawang/comments/32212.html http://www.aygfsteel.com/pandawang/archive/2006/02/23/32212.html#Feedback 0 http://www.aygfsteel.com/pandawang/comments/commentRss/32212.html http://www.aygfsteel.com/pandawang/services/trackbacks/32212.html Draw2D is a lightweight system.轻量U系l,指这个绘囄l全部徏立在一个重量的控件上。对于Draw2D他是建立在SWT的Canvas上的?BR>Draw2D的几个部?BR>1.figures 主要功能Q?BR> 1。给一个figure注册和去注册监听器。这个figure会通知在这个figure中的鼠标旉l监听器?BR> 2。结构化的事件。比如figure层次的结构化变化Qfigure的移动和大小调整?BR> 3。当光标从figure上移q时Q光标的改变和显C?BR> 4。在figure的层ơ中操作figure的位|,包括dU除讉K子节点,或者访问他们的父节炏V?BR> 5。存取:figure的layout managerQfigure的size和locationQ还有tooltips?BR> 6。设|获得焦炏V?BR> 7。设|figure的透明度和可视性?BR> 8。进行坐标变换,figure的交叠和撞?BR> 9。绘制?BR> 10。确认?BR>figure有很多subclassQ提供了很多附加的功能。比?BR> 1。shapeQ它包含了非矩Ş的figureQ可以知道如何填充,q提供了对边界的宽和cd的配|,q提供了异或的绘制方法。比如有椭圆Q几何线Q多边ŞQ矩形,圆角矩Ş和三角Ş?BR> 2。widgetQdraw2d包含的figure允许你创量QlightweightQ的部gQwidgetQ,从而在你的draw2d应用E序中需要输入控制时提供支持。这包含大量的按钮,选择框和文本囑ŞQ标{?BR> 3。layer and paneQ这些用来作ؓ子类的容器,他们提供了羃放,滚动和讲figure攄在不同layer上的能力?BR>囑Ş上下?the graphics context) 当一个figuer需要被l制的时候轻量系l会调用fiuger的一个paintҎ。每一个figure都会得到一个graphical contextQ他是Graphics的一个实例。作为参ClpaintҎ。这个绘图上下文支持囑Ş操作包括l制Q填充图形绘制它的文字。它也提供了囑Ş的状态,q些可以影响囑Ş操作。这些状态包括当前字体,背景前景颜色{等?BR>2.LightweightSystem LightweightSystem时draw2d的核心。它提供了SWT Canvas控g和在其上建立的draw2dpȝ之间的映。包含三个方面: 1。the root figure.q个是LightweightSystem$RootFigurecȝ一个实例。这个是用户的root figure的父cR它l承了一些基于SWT Canvas的图形环境,比如字体Q前景背景颜艌Ӏ?BR> 2。the event dispatcher:SWTEventDispatchercdSWT事g传给Draw2D的root figure中相应的部g?BR> 3。the update manager.它负责绘制ƈ更新Draw2dfigure。当一个绘制请求从下层的SWTcanvas传来ӞLightWeightSystem会调用updatemanager中的performUpdateҎ。update manager会l护一个非法的或者需要重ȝfigure的worklist。upate manager会设法尽量连l的它的work listQ这样可以尽量的提高效率。默认的update managerQDaferredUpdateManager允许通过再Display上的用户U程来工作队列异步的更新?BR>对于一个figure的生存周期中Q绘?painting)和确?validating)是主要的处理q程。draw2d会要求一个figureQ调用绘制方法来递归的绘制自己。paint()Ҏ会调用多个绘制方法: 1。paintFigure()Qfigure递归的绘制自?BR> 2。paintclientarea(): figure递归的绘制子?BR> 3。paintborder():figurel制边界?BR> 当一个figure的size或者location需要重新计时Q将会调用确认?BR> 1。validate()Q要求figure的layout manager去重新布局它的子图 2。revalidate():调用invalidateQ添加一个图形和它的先L新update manager的invalid list?BR> ]]> 一个用RCP实现的简单的GEFE序 http://www.aygfsteel.com/pandawang/archive/2006/01/12/27754.htmlLong Long Ago Long Long Ago Thu, 12 Jan 2006 06:35:00 GMT http://www.aygfsteel.com/pandawang/archive/2006/01/12/27754.html http://www.aygfsteel.com/pandawang/comments/27754.html http://www.aygfsteel.com/pandawang/archive/2006/01/12/27754.html#Feedback 0 http://www.aygfsteel.com/pandawang/comments/commentRss/27754.html http://www.aygfsteel.com/pandawang/services/trackbacks/27754.html 八进?/A>的例子。在q里做一下ȝ。先来介l一下gefQ网上关于GEF的介l越来越多,从另一斚w也说明这个技术确实在热v来,不过GEFZ实现可扩放性和可重用性,做的很是复杂Q闲话一下,最q看了一本书《Better.Faster.Lighter.Java》,没看多少QJustin Gehtland, Bruce A. Tate写的Q一开始就说了Qؓ了满来越多的需要,各种frameworkQlibraryQlanguage都是来复杂了Q学习曲U也变得陡峭了,q个g是无法避免的Qjava语言也是Q不信去看看jdkQ?.1时才3.7MBQ?.4时已l?8MB了。我也一直坚信,Simply the bestQ呵呵)? GEF的一些资源: 1?A >www.eclipse.org q个是源头啊Qfaq也可以看?nbsp; 2。ibm的dW 除了相关文章Q这里还有本关于gef和emf的红宝书Q可?A href="http://http://publib-b.boulder.ibm.com/Redbooks.nsf/RedbookAbstracts/sg246302.html">免费下蝲? 3。eclipseworld.org q个是一个关于eclipse中文C 4。八q制的blog http://bjzhanghao.cnblogs.com/ ? 5。这里还有些中文教程 http://www.benisoft.com/cn/index.htm 6。还有一些blog http://www.aygfsteel.com/hopeshared/ http://www.aygfsteel.com/eclipshine/ http://www.aygfsteel.com/reloadcn/ http://www.aygfsteel.com/USTCEric 好了Q现在来介绍一下GEF的实现机Ӟ主要是我的一些理解可能还有一不对的地方,Ƣ迎大家帮我Ҏ?BR> GEF是具有标准MVCQModel-View-ControlQ结构的囑Ş~辑框架Q其中Model由我们自己根据业务来设计Q它要能够提供某U模型改变通知的机Ӟ用来把Model的变化告诉Control层;Control层由一些EditPart实现QEditPart是整个GEF的核心部Ӟ?View层,大多数情况下Q用Draw2D实现了,其作用是把Model以图形化的方式表现给使用者,当然你也可以使用其他囑Ş包,不过gef?Draw2D的结合还是非常紧密的Q一般ؓ了用方便,View都是使用Draw2D实现的?BR> 关于Draw2DQ八q制有一相应的文章 Q还有eclipse上的一?A >文章Q可以参考,q里有几炚w要强调一下: 1。Draw2D提供了很多缺省图形,最常见的有三类Q?、ŞӞShapeQ,如矩形、三角Ş、椭圆Ş{等Q?、控ӞWidgetQ,如标{、按钮、滚动条{等Q?、层QLayerQ,它们用来为放|于其中的图形提供羃放、滚动等功能?BR> 2。每个图形都可以拥有一个边框(BorderQ,Draw2D所提供的边框类型有GroupBoxBorder、TitleBarBorder、ImageBorder?ButtonBorderQ以及可以组合两U边框的CompoundBorder{等Q在Draw2D里还专门有一个Insetscȝ来表C框在囑Ş中所占的位置Q它包含上下左右四个整型数倹{?BR> 3。一个图形可以包含很多个子图形,q些被包含的囑Ş在显C的时候必M某种方式被排列v来,负责q个d的就是父囑Ş的LayoutManagerQ相应的U束QConstraintQ对象就在这里,比如在子囑ŞhQrefreshVisualsQ时可以通过其布局U束传递给其父元素来定位?BR> 4。利用Draw2D中的Router、Anchor和LocatorQ可以实现多U连接样式。Router负责q接U的外观和操作方式;Anchor控制q接U端点在囑Ş上的位置Q即"锚点"的位|;Locator的作用是定位囑Ş?BR> 前面说过了GEF是通过MVC架构实现的,下面分别介绍q三个方面: 一、模型(ModelQ:q个是相Ҏ较容易理解,模型保存着业务逻辑Q他是GEFq中唯一可以持久化的Qƈ且需要提供相应的监听机制Q来通知 EditPartL新ViewQ监听机制又可以分ؓ分布式和集中式两U,我们可以针对域监听器q行转有通知Q也可以全局q播Q在q里我们认ؓ CommandQEditPart用来更新模型的对象)也是模型的一个部分,因ؓ它了解模型。此外,在有时候可能需要多U模型。我们对于业务模型,提供一个“视䏀模型,q样便于实现和满相应的要求Q不内部模型是怎么LQ都要实现通知机制?BR> 二、视图。GEF提供了在EclipseWorkbench中用ViewerQ称为EditPartViewer。它的作用和jface中的 Viewer很相Q不q这时候它的ContentProvider和LabelProvider是EditPartQ通过setContents讄Q注意在八进制代码中setContents参数为模型对象,通过分析发现Q在AbstractEditPartViewer中此Ҏ被重载,可以除了接受 org.eclipse.gef.editpart对象外可以接受Object对象Q不q此时回调用EditPartFactoryQ通过l定的模型对象来创徏相应的EditPartQ个样做q不与“View与Model无直接联pZ的要求相矛盾)。这个接口承了 org.eclipse.jface.viewers.ISelectionProvider接口Q这个也和jface中的viewer一PQ因此 viewer提供了监听器Q这样可以将对view的操作传递到editpart。EditPartViewer会维护各个EditPart的选中状态,如果没有被选中的EditPartQ则~省选中的是作ؓcontents的EditPart?BR> EditPartViewer可以适配CQ何一个SWT控gQ因为它要求有createControlҎQ接受一个父SWT控g作ؓ适配对象Q从而将 GEF生成的Figure对象昄在这个SWT控g上,因此GEF可以使用M囑Ş包,不过GEF提供了对Draw2D的默认实玎ͼ比如 AbstractGraphicalEditPartcM的回调方法createFigurep求返回一个IFigure对象。将一个GEF囑Ş昄出来可以使用org.eclipse.ui.part.EditorPart也可以是org.eclipse.ui.part.ViewPartQ如果?EditorPartQ则需要实现承自WorkbenchPart的createPartControl,如果是ViewPart则需要自己实C GEF的交互,不过Eclipse Workbench对viewpart和editorpart的支持是一LQ都是在plugin文g扩展相应的扩展点。一般来_使用GEF?Editorpart的模式实现是非常方便的?BR> GEF目前提供两种视图分别是GraphicalViewer和TreeViewerQ都间接l承了EditPartViewer接口Q前者利?Draw2D囑ŞQIFigureQ作现方式,多用于编辑区域,后者则多用于实现大U展C,q且他们有两个具体的实现Q分别是 ScrollingGraphicalViewer和TreeViewer。其中ScrollingGraphicalViewerQ通过分析GEF源代码可知,是GraphicalEditor中Viewer的默认实玎ͼ我们可以通过GraphicalEditorcL供的 setGraphicalViewer(GraphicalViewer)Ҏ重新讄其他viewer。我们在使用的时候通过 configureGraphicalViewer和initializeGraphicalViewerҎ来配|GraphicalViewer。所不同的是Q在configureGraphicalViewer之后initializeGraphicalViewer之前插入了一?hookGraphicalViewerҎQ其作用是同步选择和把 EditPartViewer作ؓSelectionProvider注册到所在的siteQ其成为SelectionProvider?BR> 此外QGEF中还提供一U成色板QPaletteViewerQ的视图Q它也是间接实现了EditPartViewer接口。因此,我也像配|GraphicalViewer一h配置PaletteViewerQ类似的使用 configurePaletteViewer和initializePaletteViewerҎQ其间类似的插入了一?hookPaletteViewerҎQ用于设|相应EditDomain的PaletteViewer?BR> 最后,ȝ一下如何配|GraphicalViewQ主要是四个斚wQ?BR> 1。设|一个RootEditPartQRootEditPart的是使整个GEF框架q行h的关键之一。RootEditPartq不对应于Q何的模型对象Q它从setContents()Ҏ中接收到的模型对象进行{换,q添加到整个的EditPart体系中去?BR> 2。设|其EditPartFactoryQ负责从模型到EditPart的{换。一般来说一个模型对象对应于一个EditPart?BR> 3。设|EditDomainQ用来接收事件ƈ选择恰当的事件处理函数进行处理,q个主要是ؓ了相应view所接收到的用户的操作?BR> 4。调用setContents()ҎQؓ其设|要昄的内宏V?BR> 三、控制器QEditPartQ。这是GEF最核心的地方了Q它model和view联系h。程序员可以l承三种EditPartQ分别是 org.eclipse.gef.editparts.AbstractGraphicalEditPart Qorg.eclipse.gef.editparts.AbstractConnectionEditPart QAbstractGraphicalEditPart的子c)和org.eclipse.gef.editparts.AbstractTreeEditPart?/B>EditPart 的生命周期当setContentsӞ模型对象输入,此对象ؓ层对象Q通过它可以遍历所有的模型对象。:EditPartViewer配备?EditPartFactoryQEditPartViewer通过EditPartFactory构造相应的Contents EditPart。然后EditPartViewer中的每个EditPart通过EditPartFactory构造相应的子EditPart。当用户d新的模型的时候,包含q些模型对象的所对应的EditPart构造相应的EditPart作出相应。视囄构造和EditPart的构造是同时q行的,每当EditPart构造ƈd到它的父EditPart后相应的view也做同样的事情,比如GraphicalEditor中就?GraphicalViewer成员变量Q在此edipart创徏时回调用createPartControlQ在q个Ҏ中将会创建相应的viewQƈ其加入到父view中?BR> 一旦用户丢弃了某些模型对象Q相应的EditPart׃被丢弃。比如用h行了删除操作Q则相应的模型对象和相应的EditPart都被删除了,但用h销了删除操作而重新创建的EditPart与原来的EditPart是不同的Q所以EditPart是不能保存长期信息的Q应该交l模型去保存Qƈ?EditPart也是不能被Command所引用?BR> 在具体用时Q应该先定一个Contents EditPart,它的父元素ؓEditPartViewer的RootEditPart。RootEditPart是EditPartView?rootQ它EditPartView和它的contentsQ一般认为是层模型对象所对应的EditPartQ联pv来,RootEditPart 为用LEditPart提供一致性的上下文(contextQ。ƈ且,当没有被选中的模型EditPartӞ层对象的EditPart是默认被选中的,而RootEditPart是不能被选中的或者定位的Q甚至不能与用户怺互,他也没有对应的模型对象。GEF提供了几个默认的 RootEditPart的实玎ͼFreeformGraphicalRootEditPart,RootTreeEditPart, ScalableRootEditPartQScalableFreeformRootEditPartQ此cȝ承于 FreeformGraphicalRootEditPartQ增加了~放Zoom支持Q提供了ZoomManagerQ增加了一个LayerPaneQ?ScalableFreeformLayeredPane。)Q(原来q有个GraphicalRootEditPartQ已ldeprecatedQ用 ScalableRootEditPart代替Q。这里要注意的是Q?BR> 1)对于FreeformRootEditPartQ以及它的子c?ScalableFreeformRootEditPartQ,它的Contents EditPart应该有一?FONT size=-1>org.eclipse.draw2d.FreeformFigure 对象Q比如FreeformLayer或FreeformLayeredPaneQ作为它的Figure。例如在我们的代码里Q对应的是?DiagramPart中的createFigureҎQ它q回了一个FreeformLayer对象?BR> 2) FreeformGraphicalRootEditPart的Primery Layer没有使用draw2d的LayoutManagerQƈ且,除非contents的figure是个freeform figureQ否则不能正的调整大小?BR> 3)FreefromGraphicalRootEditPart使用FreeformViewportcM为它的primary figureQ这个类必须和ScrollingGraphicalViewer使用?BR> 4)ScalableRootEditPart使用 Viewport作ؓprimery figureQ这个类必须和ScrollingGraphicalViewer使用?BR> 5)RootTreeEditPart是TreeViewer的RootEditPart?BR> Contents EditPart的图形一般是一个空面板Q该面板包含diagram的子图?BR> 我们q要定义其他“视䏀模型的EditPartQ比如节点(nodeQ,q接QconnectionQ。对于节点,是GraphicalQ可以?AbstractGraphicalEditPart。ƈ且可以实现NodeEditPart接口Q则可以支持源和目标?ConnectionEditPartQ用AnchorQ具体在下面有讲q。在q里Q我们的代码的NodePartcMQ重载了 refreshVisualҎQ其中设|figure的布局U束是通过它的父元素来定位的,我不知道q是不是标准的方法,XYLayout使用的是 rectangleU束Q如果长宽设为-1Q表CZؓ该图形提供理惛_。不要用setBoundsQXYLayout布局理器可以保证对滚动条进行更斎ͼq能相对约束{化ؓl对U束Q如果长宽设|ؓQ?Q则能够图形设|ؓ理想的大。此外,Z改进性能Q我们可以将refreshVisual中有若干模型的分别刷斎ͼ或者设|是否需要刷新的开兟?BR> 对于q接Q可以承AbstractConnectionEditPartQ这个抽象类已经实现?ConnectionEditPart。和Node实现一P通过refreshVisualҎ属性从模型映射到图形。连接也可以有约束,不过与前面的U束不尽相同。在q里Q连接\由器Qconnection routerQ用约束来是连接{向(bendQ。需要注意的是,一个Connection EditPart的图形必L一个draw2d的ConnectionQ这样就引入了连接锚QConnection AnchorQ。连接必ȝq接锚(ConnectionAnchorQ“锚定”在两端。因此,需要在q接EditPart或者节点EditPart中实C用什么样的锚。缺省情况下QGEF使用节点EditPart通过实现NodeEditPart接口来提供锚。这是因为,锚的选择取决与各个节点上正在使用的图形,而连接EditPart不应了解节点上的囑ŞQƈ且,当用户创接的时候,q接EditPartq没有创建,q时候就p点自己显C反馈。这里需要注意的是:何时使用以及何时不用ConnectionEditPartQ当用户可以选择某些东西q可与之交互Ӟ需?ConnectionEditPart。它可能与某行中的某个对象相对应Qƈ且回自己删除Q如果这是需要一个绘制直U的节点或者容器,那么只需要用囑Ş?paintҎl制直线Q或者组合一个图形,q个囑Ş包含Polyline囑Ş。连接必要拥有源和目标。如果要创徏一个连接,q且在没有源和目标存在的情况下,可以l承AbstractGraphicalEditPartQƈ使用q接囑ŞQ比如PolylineConnection?BR> 正如前面说的Q模型需要实现某U通知机制Q各个EditPart要将自己做ؓ监听者,注册在模型上Q以便在模型发生改变的时候收到相应的通知? 当EditPart收到相应的通知Ӟ调用相应的处理方法,来进行一ơ强制的hQ对于模型对象的增减可以调用refreshChildrenҎQ对于简单属性的更改可以调用refreshVisualsҎQ这Ӟ像前面提到的Q可以只h改变的部分,以提高性能。一般,我们在ActivateҎ中注册监听器Q在DeactivateҎ中注销监听器?BR> 以上完成的是从模型到视图的映,你还需要实现的是编辑策略Edit PoliciesQ因为EditPartq不直接Ҏ型进行编辑,每一个EditPolicy都针对一个特定的~辑d或者一l相关的工作。这L实现便于在不同的EditPart间重用(reuseQ编辑行为,q且q样的实玎ͼ可以动态的改变行ؓQ比如改变layout或者routing时。在 createEditPoliciesҎ中,我们要insall我们的的PoliciesQ这时候就需要rolesQroles的作用就是作为关键字来标CZ同的policies。policy中提供CommandQ每个应用程序都有个Command栈,Command的运行要通过Command栈,而不是直接调用executeҎ?BR> 说到q里Q要注意EditPartView是视囄Q一般放在一个UI插g上比如EditorPartQviewPartQ甚至swt控g。EditPart是控制器Q联p视囑֒模型?BR> 在本文的最后介l一下GEF的运行机ӞEditPartView接受用户的操作,如节点的UdQ增删,每个节点对应一个EditPart对象Q每?EditPart都有一l由Role区分的EditPoliciesQ每个EditPolicy会对应一些Command对象QCommand最l会Ҏ型进行操作。用L操作会{化ؓRequest分配l特定的EditPolicyQ由EditPolicy创徏相应的CommandҎ型进行操作,q些 Command会保留在EditDomain的命令堆栈中Q用于实现undoQredo功能QEditDomain是专门用于维?EditPartViewQCommand信息的对象,一般每个EditPart有一个EditDomain?BR> 以上是Ҏ作的GEF部分的大概描qͼ可能有些地方写的比较|嗦Q有的地方写的也可能不对Q希望大家指出,谢谢。下面还要对RCP部分q行一些描q?BR> ]]>
վ֩ģ壺
˷ |
|
|
۶ |
˿ |
ٲ |
ƽ |
|
Թ |
|
ⶫ |
|
̨ |
|
Ȫ |
Ϫ |
Ϻ |
|
|
|
ֶ |
ǿ |
|
潭 |
|
|
|
ƽ |
|
ˮ |
|
|
ī |
|
ũ |
ɽ |
|
ͨ |
|
|
|