??xml version="1.0" encoding="utf-8" standalone="yes"?>精品美女视频,亚洲欧美日韩精品,国产精品综合av一区二区国产馆http://www.aygfsteel.com/pandawang/category/6829.htmlzh-cnWed, 28 Feb 2007 04:17:35 GMTWed, 28 Feb 2007 04:17:35 GMT60ZRCP的GEF~辑器中RetargetAction的注册问?/title><link>http://www.aygfsteel.com/pandawang/archive/2006/08/19/64532.html</link><dc:creator>Long Long Ago</dc:creator><author>Long Long Ago</author><pubDate>Sat, 19 Aug 2006 09:35:00 GMT</pubDate><guid>http://www.aygfsteel.com/pandawang/archive/2006/08/19/64532.html</guid><wfw:comment>http://www.aygfsteel.com/pandawang/comments/64532.html</wfw:comment><comments>http://www.aygfsteel.com/pandawang/archive/2006/08/19/64532.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/pandawang/comments/commentRss/64532.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/pandawang/services/trackbacks/64532.html</trackback:ping><description><![CDATA[最q做的gef~辑器在删除旉C一些问?是不能通过delete键删?到处搜集资料,解决?<br />首先需要在相应rcp工程中的ActionBarAdvisercM注册相应的Action,比如对应于deleteAction,我在Ҏorg.eclipse.ui.application.ActionBarAdvisor#makeAction(IWorkbenchWindow)中注册deleteAction,如下:<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Codehighlighter1_56_144_Open_Image" onclick="this.style.display='none'; Codehighlighter1_56_144_Open_Text.style.display='none'; Codehighlighter1_56_144_Closed_Image.style.display='inline'; Codehighlighter1_56_144_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_56_144_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_56_144_Closed_Text.style.display='none'; Codehighlighter1_56_144_Open_Image.style.display='inline'; Codehighlighter1_56_144_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> makeAction(</span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000"> IWorkbenchWindow window)</span><span id="Codehighlighter1_56_144_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.aygfsteel.com/images/dot.gif" /></span><span id="Codehighlighter1_56_144_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />    IAction delAction </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> ActionFactory.DELETE.create(window);<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />    register(delAction);<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /></span></div><br />只是q么讄q是不能删除相应的图形元?需要在相应的编辑器中重载initҎ,d如下的代?br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Codehighlighter1_80_378_Open_Image" onclick="this.style.display='none'; Codehighlighter1_80_378_Open_Text.style.display='none'; Codehighlighter1_80_378_Closed_Image.style.display='inline'; Codehighlighter1_80_378_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_80_378_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_80_378_Closed_Text.style.display='none'; Codehighlighter1_80_378_Open_Image.style.display='inline'; Codehighlighter1_80_378_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> init(IEditorSite site, IEditorInput input) </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> PartInitException </span><span id="Codehighlighter1_80_378_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.aygfsteel.com/images/dot.gif" /></span><span id="Codehighlighter1_80_378_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> TODO Auto-generated method stub</span><span style="COLOR: #008000"><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">super</span><span style="COLOR: #000000">.init(site, input);<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />    ActionRegistry registry </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> getActionRegistry();<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />    IActionBars bar </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> site.getActionBars();<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />    String id </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> ActionFactory.DELETE.getId();<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />    bar.setGlobalActionHandler(id,registry.getAction(id));<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />    bar.updateActionBars();<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><br />在这里仔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.<img src ="http://www.aygfsteel.com/pandawang/aggbug/64532.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/pandawang/" target="_blank">Long Long Ago</a> 2006-08-19 17:35 <a href="http://www.aygfsteel.com/pandawang/archive/2006/08/19/64532.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个用RCP实现的简单的GEFE序http://www.aygfsteel.com/pandawang/archive/2006/01/12/27754.htmlLong Long AgoLong Long AgoThu, 12 Jan 2006 06:35:00 GMThttp://www.aygfsteel.com/pandawang/archive/2006/01/12/27754.htmlhttp://www.aygfsteel.com/pandawang/comments/27754.htmlhttp://www.aygfsteel.com/pandawang/archive/2006/01/12/27754.html#Feedback0http://www.aygfsteel.com/pandawang/comments/commentRss/27754.htmlhttp://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.AbstractGraphicalEditPartQorg.eclipse.gef.editparts.AbstractConnectionEditPartQAbstractGraphicalEditPart的子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>

Long Long Ago 2006-01-12 14:35 发表评论
]]>
վ֩ģ壺 | Ͽ| | | Ƹ| DZ| | | | | | ϽϽ| | ɽ| Ͽ| | | Ͻ| ɽ| â| | Է| ɽ| ʩ| | | | ޼| | | ɽ| | | | | | | | | | |