﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Dreava-文章分类-Eclipse插件开发</title><link>http://www.blogjava.net/benniaolk/category/44434.html</link><description>梦幻瓜哇国</description><language>zh-cn</language><lastBuildDate>Sun, 28 Mar 2010 08:47:38 GMT</lastBuildDate><pubDate>Sun, 28 Mar 2010 08:47:38 GMT</pubDate><ttl>60</ttl><item><title>GEF实现Eclipse的Outline视图</title><link>http://www.blogjava.net/benniaolk/articles/316754.html</link><dc:creator>Dreava</dc:creator><author>Dreava</author><pubDate>Sun, 28 Mar 2010 08:39:00 GMT</pubDate><guid>http://www.blogjava.net/benniaolk/articles/316754.html</guid><wfw:comment>http://www.blogjava.net/benniaolk/comments/316754.html</wfw:comment><comments>http://www.blogjava.net/benniaolk/articles/316754.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/benniaolk/comments/commentRss/316754.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/benniaolk/services/trackbacks/316754.html</trackback:ping><description><![CDATA[<p>1、&nbsp;首先要实现EditPartFactory接口——EditPartFactoryOutlineImp，该接口为Outline视图提供控制器EditPart对象，注意该EditPartFactoryImp要与编辑视图——即真正的编辑区的EditPartFactory接口实现类PartFactoryEditAreaImp保持一致，否则无法同步编辑区与Outline的同步。当然，并不是编辑区的所有元素都应反应到Outline视图中，这要根据自己的需要在EditPartFactoryOutlineImp创建EditPart对象。<br />
2、&nbsp;Outline视图中的树控制器的构建：需要实现EditPartFactory接口——TreePartFactory，实现public EditPart createEditPart(EditPart context, Object model)方法，在该方法里为每个结点——model创建其子模型的树模型。Outline的树结构的根结点应该在编辑区的——GraphicalEditorWithFlyoutPalette继承类的内部类ContentOutlinePage继承类的public void createControl(Composite parent)方法中进行创建，通过getViewer().setContents(model)方法将根模型注入Outline视图中。<br />
另外，为了维护Outline的树，需要继承AbstractTreeEditPart，及实现PropertyChangeListener接口，主要需要重载或实现的一些方法为：</p>
<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 src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #008000">//</span><span style="color: #008000">此方法负责处理由于鼠标选中或更改对树造成的变化，对树结构进行刷新&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;propertyChange(PropertyChangeEvent&nbsp;evt)&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">树结点的图标&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;Image&nbsp;getImage()&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">树结点的文本&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;String&nbsp;getText()&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">该方法负责处理由于鼠标选中或其他事件激活某树结点该做的事情，如果为该树结点添加PropertyChangeListener。&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;activate()&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">与上面的方法相反&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;deactivate()&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">得到当前树结点的模型&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;List&nbsp;getModelChildren()&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 补充资料：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Eclipse 里，当编辑器（Editor）被激活时，大纲视图自动通过这个编辑器的getAdapter()方法寻找它提供的大纲（大纲实现IcontentOutlinePage 接口）。GEF 提供了ContentOutlinePage 类用来实现大纲视图，我们要做的就是实现一个它的子类，并重点实现createControl()方法。ContentOutlinePage 是org.eclipse.ui.part.Page 的一个子类，大纲视图则是PageBookView 的子类，在大纲视图中有一个PageBook，包含了很多Page 并可以在它们之间切换，切换的依据就是当前活动的Editor。因此，我们在createControl()方法里要做的就是构造这个Page，简化后的代码如下所示：</p>
<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 src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Control&nbsp;outline;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_49_85_Open_Image" onclick="this.style.display='none'; Codehighlighter1_49_85_Open_Text.style.display='none'; Codehighlighter1_49_85_Closed_Image.style.display='inline'; Codehighlighter1_49_85_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_49_85_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_49_85_Closed_Text.style.display='none'; Codehighlighter1_49_85_Open_Image.style.display='inline'; Codehighlighter1_49_85_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;OutlinePage()&nbsp;</span><span id="Codehighlighter1_49_85_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.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_49_85_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TreeViewer());&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_134_408_Open_Image" onclick="this.style.display='none'; Codehighlighter1_134_408_Open_Text.style.display='none'; Codehighlighter1_134_408_Closed_Image.style.display='inline'; Codehighlighter1_134_408_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_134_408_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_134_408_Closed_Text.style.display='none'; Codehighlighter1_134_408_Open_Image.style.display='inline'; Codehighlighter1_134_408_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;createControl(Composite&nbsp;parent)&nbsp;</span><span id="Codehighlighter1_134_408_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.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_134_408_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;outline&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;getViewer().createControl(parent);&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;getSelectionSynchronizer().addViewer(getViewer());&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;getViewer().setEditDomain(getEditDomain());&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;getViewer().setEditPartFactory(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TreePartFactory());&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;getViewer().setContents(getDiagram());&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 由于我们在构造方法里指定了使用树结构显示大纲，所以createControl()里的第一句就会使outline 变量得到一个Tree（见org.eclipse.gef.ui.parts.TreeViewer 的代码），第二句把TreeViewer 加到选择同步器中，从而让用户不论在大纲或编辑区域里选择EditPart 时，另一方都能自动做出同样的选择；最后三行的作用在以前的帖子里都有介绍，总体目的是把大纲视图的模型与编辑区域的模型联系在一起，这样，对于同一个模型我们就有了两个视图，体会到MVC 的好处了吧。<br />
实现大纲视图最重要的工作基本就是这些，但还没有完，我们要在init()方法里绑定UNDO/REDO/DELETE 等命令到Eclipse 主窗口，否则当大纲视图处于活动状态时，主工具条上的这些命令就会变为不可用状态；在 getControl()方法里要返回我们的outline 成员变量，也就是指定让这个控件出现在大纲视图中；在dispose()方法里应该把这个TreeViewer 从选择同步器中移除；最后，必须在PracticeEditor 里覆盖getAdapter()方法，前面说过，这个方法是在Editor 激活时被大纲视图调用的，所以在这里必须把我们实现好的OutlinePage 返回给大纲视图使用，代码如下：</p>
<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_37_153_Open_Image" onclick="this.style.display='none'; Codehighlighter1_37_153_Open_Text.style.display='none'; Codehighlighter1_37_153_Closed_Image.style.display='inline'; Codehighlighter1_37_153_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_37_153_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_37_153_Closed_Text.style.display='none'; Codehighlighter1_37_153_Open_Image.style.display='inline'; Codehighlighter1_37_153_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;getAdapter(Class&nbsp;type)&nbsp;</span><span id="Codehighlighter1_37_153_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.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_37_153_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(type&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;IContentOutlinePage.</span><span style="color: #0000ff">class</span><span style="color: #000000">)&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;OutlinePage();&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">.getAdapter(type);&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">&nbsp;&nbsp;<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<img src ="http://www.blogjava.net/benniaolk/aggbug/316754.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/benniaolk/" target="_blank">Dreava</a> 2010-03-28 16:39 <a href="http://www.blogjava.net/benniaolk/articles/316754.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>