﻿<?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>博客园-hya's Code</title><link>http://www.cnblogs.com/hya1109/</link><description>攀登者,一个又一个高度....(技术+思想=强者)

</description><language>zh-cn</language><lastBuildDate>Fri, 10 Oct 2008 18:45:50 GMT</lastBuildDate><pubDate>Fri, 10 Oct 2008 18:45:50 GMT</pubDate><ttl>60</ttl><item><title>java设计模式基础之设计原则</title><link>http://www.cnblogs.com/hya1109/archive/2008/09/30/1302585.html</link><dc:creator>殇</dc:creator><author>殇</author><pubDate>Tue, 30 Sep 2008 13:42:00 GMT</pubDate><guid>http://www.cnblogs.com/hya1109/archive/2008/09/30/1302585.html</guid><wfw:comment>http://www.cnblogs.com/hya1109/comments/1302585.html</wfw:comment><comments>http://www.cnblogs.com/hya1109/archive/2008/09/30/1302585.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/hya1109/comments/commentRss/1302585.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/hya1109/services/trackbacks/1302585.html</trackback:ping><description><![CDATA[<p>&#160;&#160; 设计模式是什么,在学习面向对象的过程中，我们总会不时的接触到模式！正如前人所说设计模式是人们的经验总结！在软件开发中我们总会遇到一些可重复的组件也好，代码段也好，这样就促使我们关注面向对象的可复用技术，而随着可复用技术的发展，一些固定的模式就随之出现！他们就是我们现在学习的所谓设计模式！不管学习什么技术，都要从基础出发，这是我的一贯原则！在看了n个设计模式后，我忽然发现对设计模式我还是不得要领！终于在Java与模式这本书中我看到了我想要的，及一些设计模式所要遵守的原则:</p>
<p>&#160;&#160; 首先是可复用设计的基石：开闭原则，即一个软件实体要对扩展开放，对修改关闭！这句话对于有一些面向对象编程经验的人应该不陌生！不管是什么软件系统，设计者总是希望在不用更改源代码的情况下可以扩展。</p>
<p>&#160;&#160; 第二个原则是：里氏代换原则，这个原则依然是我们众所周知的，其表述是如果一个软件实体使用一个基类的话，那么一定适用其子类，而且他根本察觉不出其基类对象和子类对象的区别。其实学习面向对象语言的人都知道，子类拥有基类的除其私有资源的一些特性！在java中，编译器通常会检查是否符合里氏代换原则！</p>
<p>&#160;&#160;第三个原则是:依赖倒转或者叫依赖倒置原则，这个原则也许大家听说过，但是由他演变的另一个名词我想大家应该不陌生---IOC（依赖注入），对有人说IOC其实就是DIP。不过我认为ioc应该是一种技术，他是为了实现dip的，dip的表述就是：抽象不应该依赖于细节，细节应该依赖于抽象！或者是&#8220;应当依赖于接口编程，不应依赖于实现&#8221;。基本上要想实现开闭原则，dip应该是必须途径！至于ioc的设计理念，最近正在学习，我将在另一篇帖子中谈一下我对他的理解！</p>
<p>&#160;&#160;第四个原则是：接口隔离原则，一个类对另外的一个类的依赖应当建立在最少的接口之上！这也许对于我们难以理解，那么我来换另一种表述：使用多个专门的接口比使用单一的接口要好！我们在编写程序中往往想将接口写的越少越好，于是乎，我们将多个功能的代码，放到同一个接口中！其实这是错误的，我们应当将不同功能分开设立专门的接口，这正是接口隔离原则</p>
<p>&#160;&#160;其实，以上几个原则，在我们学习面向对象编程的过程中，都有接触。以上几个原则也是设计模式所遵循的原则！理解这些基本理论对于设计模式，或者说编程思想的学习是大有益处的！！！</p><img src ="http://www.cnblogs.com/hya1109/aggbug/1302585.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42930/" target="_blank">[新闻]Silverlight 2.0正式版下周发布</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>java--callback</title><link>http://www.cnblogs.com/hya1109/archive/2008/09/04/1284726.html</link><dc:creator>殇</dc:creator><author>殇</author><pubDate>Thu, 04 Sep 2008 14:40:00 GMT</pubDate><guid>http://www.cnblogs.com/hya1109/archive/2008/09/04/1284726.html</guid><wfw:comment>http://www.cnblogs.com/hya1109/comments/1284726.html</wfw:comment><comments>http://www.cnblogs.com/hya1109/archive/2008/09/04/1284726.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/hya1109/comments/commentRss/1284726.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/hya1109/services/trackbacks/1284726.html</trackback:ping><description><![CDATA[<p>&#160;&#160;&#160; 早有写贴的打算，无奈，刚刚出来工作，也是初到北京！生活还不安定，根本没有办法来写，终于回学校了！</p>
<p>&#160;&#160;&#160; 废话少说，在北京时，一位刚毕业的师兄，有一天问我:什么是CALLBACK！，说是面试时，有好多个公司都问了这个问题!当时我一时无语，只记着，在<font style="font-size: 10pt" size="4">阅读thinking in java是看到过有关他的介绍，但具体也说不清楚了，于是赶紧翻书，上网查资料。发现虽然都说的比较全面，但是都不是好理解！后来我又阅读了c++中回调函数的概念，才对他有了一个模糊的认识！</font></p>
<p><font size="2">&#160; 其实我们从字面意思来判断，就已经知道他大概的意思了，我从网上摘抄的定义是：<font size="2"><strong>软件模块之间总是存在着一定的接口，从调用方式上，可以把他们分为三类：同步调用、回调和异步调用。同步调用是一种阻塞式调用，调用方要等待对方执行完毕才返回，它是一种单向调用；回调是一种双向调用模式，也就是说，被调用方在接口被调用时也会调用对方的接口(有待商榷)；异步调用是一种类似消息或事件的机制，不过它的调用方向刚好相反，接口的服务在收到某种讯息或发生某种事件时，会主动通知客户方（即调用客户方的接口）。回调和异步调用的关系非常紧密，通常我们使用回调来实现异步消息的注册，通过异步调用来实现消息的通知。</strong>是不是有点抽象，其实我们可以举个简单的例子：<span style="color: red">我写个程序（也可能是个类，或者是个组件）称<span style="color: red">为a，</span></span><font style="font-size: 10pt; color: red" color="#ff0000" size="4">其中预留有回调函数接口，并封装好了该程序。另外一个人B要让a调用自己的程序b中的一个方法，于是，他通过我提供的接口回调自己b中的方法，目的达到。</font></font></font></p>
<p style="color: #000000"><font color="#ff0000" size="2">&#160;&#160;<font style="color: #000000" size="2">然后我们就可以写程序了，</font></font></p>
<font color="#ff0000" size="2"><font style="color: #000000" size="2">
<div class="cnblogs_code"><img id="Code_Closed_Image_213036" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_213036').style.display='none'; document.getElementById('Code_Open_Image_213036').style.display='inline'; document.getElementById('Code_Open_Text_213036').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_213036" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_213036').style.display='none'; getElementById('Code_Closed_Image_213036').style.display='inline'; getElementById('Code_Closed_Text_213036').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_213036">Code</span><span id="Code_Open_Text_213036" style="display: none"><br />
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">class</span><span style="color: #000000">&#160;Caller&#160;{&#160;&#160;&#160;&#160;&#160;<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;MyCallInterface&#160;mc;&#160;&#160;&#160;&#160;&#160;<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">void</span><span style="color: #000000">&#160;setCallfuc(MyCallInterface&#160;mc)&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br />
&#160;</span><span style="color: #0000ff">this</span><span style="color: #000000">.mc</span><span style="color: #000000">=</span><span style="color: #000000">&#160;mc;&#160;&#160;&#160;&#160;<br />
&#160;}&#160;&#160;&#160;&#160;&#160;<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">void</span><span style="color: #000000">&#160;call(){</span><span style="color: #0000ff">this</span><span style="color: #000000">.mc.method();&#160;&#160;&#160;&#160;&#160;<br />
}&#160;<br />
}&#160;&#160;&#160;&#160;<br />
</span><span style="color: #008000">//</span><span style="color: #008000">&#160;我还需要定义一个接口，以便程序员B根据我的定义编写程序实现接口</span><span style="color: #008000"><br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&#160;MyCallInterface&#160;{&#160;<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">void</span><span style="color: #000000">&#160;method();<br />
<br />
}&#160;&#160;&#160;&#160;&#160;<br />
</span><span style="color: #008000">//</span><span style="color: #008000">于是，程序员B只需要实现这个接口就能达到回调的目的了</span><span style="color: #008000"><br />
</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">class</span><span style="color: #000000">&#160;B&#160;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&#160;MyCallInterface&#160;{&#160;<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">void</span><span style="color: #000000">&#160;method()&#160;{&#160;<br />
System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">回调实现</span><span style="color: #000000">"</span><span style="color: #000000">);&#160;&#160;&#160;&#160;&#160;<br />
}<br />
<br />
&#160;</span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">static</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">void</span><span style="color: #000000">&#160;main(String&#160;args[]){&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br />
&#160;Caller&#160;call&#160;</span><span style="color: #000000">=</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">new</span><span style="color: #000000">&#160;Caller();&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br />
call.setCallfuc(</span><span style="color: #0000ff">new</span><span style="color: #000000">&#160;B());&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br />
&#160;call.call();}&#160;<br />
}<br />
<br />
</span></span></div>
<p>&#160;</p>
<p>OK，可以看到b实现了a回调他的方法！我们再来看个具体的例子，可能要复杂一点！有这样的一个问题：</p>
<p><span style="color: #ff0000"><span style="color: #ff0000">老板（Boss）让工人（Worker）干完活告诉他干的情况如何。（来自网上的例子<a href="http://lavasoft.blog.51cto.com/62575/90453">http://lavasoft.blog.51cto.com/62575/90453</a>）</span></span></p>
<p><span style="color: #ff0000"><span style="color: #ff0000"><span style="color: #000000"><span style="color: #000000">这是一个典型的回调问题，即工人要调用老板提供的接口，并且要老板调用学生的方法或属性，来了解工人的完成情况</span></span></span></span></p>
<p><span style="color: #ff0000"><span style="color: #ff0000"><span style="color: #000000"><span style="color: #000000">代码如下：</span></span></span></span></p>
</font></font>
<p style="color: #000000"><font size="2"><span style="color: #000000"><font size="2"></font></span><span style="color: #000000"><font size="2"></font></span></font></p>
<font size="2">
<div class="cnblogs_code"><img id="Code_Closed_Image_215656" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_215656').style.display='none'; document.getElementById('Code_Open_Image_215656').style.display='inline'; document.getElementById('Code_Open_Text_215656').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_215656" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_215656').style.display='none'; getElementById('Code_Closed_Image_215656').style.display='inline'; getElementById('Code_Closed_Text_215656').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_215656">Code</span><span id="Code_Open_Text_215656" style="display: none"><br />
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&#160;Event&#160;{&#160;<br />
&#160;&#160;&#160;&#160;</span><span style="color: #008000">/**</span><span style="color: #008000">&#160;<br />
&#160;&#160;&#160;&#160;&#160;*&#160;返回发生事件信息&#160;<br />
&#160;&#160;&#160;&#160;&#160;*&#160;<br />
&#160;&#160;&#160;&#160;&#160;*&#160;</span><span style="color: #808080">@return</span><span style="color: #008000">&#160;事件信息&#160;<br />
&#160;&#160;&#160;&#160;&#160;</span><span style="color: #008000">*/</span><span style="color: #000000">&#160;<br />
&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;String&#160;happendEvent();&#160;<br />
}<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">class</span><span style="color: #000000">&#160;EventA&#160;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&#160;Event&#160;{&#160;<br />
&#160;&#160;&#160;&#160;</span><span style="color: #008000">/**</span><span style="color: #008000">&#160;<br />
&#160;&#160;&#160;&#160;&#160;*&#160;返回发生事件信息&#160;<br />
&#160;&#160;&#160;&#160;&#160;*&#160;<br />
&#160;&#160;&#160;&#160;&#160;*&#160;</span><span style="color: #808080">@return</span><span style="color: #008000">&#160;事件信息&#160;<br />
&#160;&#160;&#160;&#160;&#160;</span><span style="color: #008000">*/</span><span style="color: #000000">&#160;<br />
&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;String&#160;happendEvent()&#160;{&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">return</span><span style="color: #000000">&#160;</span><span style="color: #000000">"</span><span style="color: #000000">发生了事件&#160;EventA！</span><span style="color: #000000">"</span><span style="color: #000000">;&#160;<br />
&#160;&#160;&#160;&#160;}&#160;<br />
}<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">class</span><span style="color: #000000">&#160;EventB&#160;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&#160;Event{&#160;<br />
&#160;&#160;&#160;&#160;</span><span style="color: #008000">/**</span><span style="color: #008000">&#160;<br />
&#160;&#160;&#160;&#160;&#160;*&#160;返回发生事件信息&#160;<br />
&#160;&#160;&#160;&#160;&#160;*&#160;</span><span style="color: #808080">@return</span><span style="color: #008000">&#160;事件信息&#160;<br />
&#160;&#160;&#160;&#160;&#160;</span><span style="color: #008000">*/</span><span style="color: #000000">&#160;<br />
&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;String&#160;happendEvent()&#160;{&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">return</span><span style="color: #000000">&#160;</span><span style="color: #000000">"</span><span style="color: #000000">发生了事件&#160;EventB！</span><span style="color: #000000">"</span><span style="color: #000000">;&#160;<br />
&#160;&#160;&#160;&#160;}&#160;<br />
}<br />
<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">class</span><span style="color: #000000">&#160;Worker&#160;{&#160;<br />
&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">private</span><span style="color: #000000">&#160;Event&#160;event;&#160;&#160;&#160;&#160;</span><span style="color: #008000">//</span><span style="color: #008000">事件&#160;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">private</span><span style="color: #000000">&#160;String&#160;name;&#160;&#160;&#160;&#160;</span><span style="color: #008000">//</span><span style="color: #008000">工人姓名&#160;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">private</span><span style="color: #000000">&#160;Boss&#160;boss;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #008000">//</span><span style="color: #008000">工人所属的老板&#160;</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;Worker(String&#160;name,&#160;Boss&#160;boss)&#160;{&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">this</span><span style="color: #000000">.name&#160;</span><span style="color: #000000">=</span><span style="color: #000000">&#160;name;&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">this</span><span style="color: #000000">.boss&#160;</span><span style="color: #000000">=</span><span style="color: #000000">&#160;boss;&#160;<br />
&#160;&#160;&#160;&#160;}&#160;<br />
<br />
&#160;&#160;&#160;&#160;</span><span style="color: #008000">/**</span><span style="color: #008000">&#160;<br />
&#160;&#160;&#160;&#160;&#160;*&#160;干活&#160;<br />
&#160;&#160;&#160;&#160;&#160;</span><span style="color: #008000">*/</span><span style="color: #000000">&#160;<br />
&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">void</span><span style="color: #000000">&#160;doWork()&#160;{&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;System.out.println(name&#160;</span><span style="color: #000000">+</span><span style="color: #000000">&#160;</span><span style="color: #000000">"</span><span style="color: #000000">&#160;is&#160;doing&#160;working<img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span style="color: #000000">"</span><span style="color: #000000">);&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #008000">//</span><span style="color: #008000">工人挺辛苦，干着枯燥乏味的重复工作，哈哈&#160;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">for</span><span style="color: #000000">&#160;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&#160;i&#160;</span><span style="color: #000000">=</span><span style="color: #000000">&#160;</span><span style="color: #000000">0</span><span style="color: #000000">;&#160;i&#160;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&#160;</span><span style="color: #000000">2000000</span><span style="color: #000000">;&#160;i</span><span style="color: #000000">++</span><span style="color: #000000">)&#160;{&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">int</span><span style="color: #000000">&#160;x&#160;</span><span style="color: #000000">=</span><span style="color: #000000">&#160;i&#160;</span><span style="color: #000000">/</span><span style="color: #000000">&#160;</span><span style="color: #000000">234</span><span style="color: #000000">&#160;</span><span style="color: #000000">+</span><span style="color: #000000">&#160;</span><span style="color: #000000">234</span><span style="color: #000000">;&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;System.out.println(name&#160;</span><span style="color: #000000">+</span><span style="color: #000000">&#160;</span><span style="color: #000000">"</span><span style="color: #000000">&#160;was&#160;finished&#160;work.</span><span style="color: #000000">"</span><span style="color: #000000">);&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #008000">//</span><span style="color: #008000">向老板说明发生的情况&#160;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;boss.getWorkerEvent(</span><span style="color: #0000ff">this</span><span style="color: #000000">,&#160;event);&#160;<br />
&#160;&#160;&#160;&#160;}&#160;<br />
<br />
&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;Event&#160;getEvent()&#160;{&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">return</span><span style="color: #000000">&#160;event;&#160;<br />
&#160;&#160;&#160;&#160;}&#160;<br />
<br />
&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">void</span><span style="color: #000000">&#160;setEvent(Event&#160;event)&#160;{&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">this</span><span style="color: #000000">.event&#160;</span><span style="color: #000000">=</span><span style="color: #000000">&#160;event;&#160;<br />
&#160;&#160;&#160;&#160;}&#160;<br />
<br />
&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;String&#160;getName()&#160;{&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">return</span><span style="color: #000000">&#160;name;&#160;<br />
&#160;&#160;&#160;&#160;}&#160;<br />
<br />
&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">void</span><span style="color: #000000">&#160;setName(String&#160;name)&#160;{&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">this</span><span style="color: #000000">.name&#160;</span><span style="color: #000000">=</span><span style="color: #000000">&#160;name;&#160;<br />
&#160;&#160;&#160;&#160;}&#160;<br />
}<br />
&#160;<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">class</span><span style="color: #000000">&#160;Boss&#160;{&#160;<br />
&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">private</span><span style="color: #000000">&#160;String&#160;name;&#160;<br />
<br />
&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;Boss(String&#160;name)&#160;{&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">this</span><span style="color: #000000">.name&#160;</span><span style="color: #000000">=</span><span style="color: #000000">&#160;name;&#160;<br />
&#160;&#160;&#160;&#160;}&#160;<br />
<br />
&#160;&#160;&#160;&#160;</span><span style="color: #008000">/**</span><span style="color: #008000">&#160;<br />
&#160;&#160;&#160;&#160;&#160;*&#160;老板接收工人的事件&#160;<br />
&#160;&#160;&#160;&#160;&#160;*&#160;</span><span style="color: #808080">@param</span><span style="color: #008000">&#160;worker&#160;工人&#160;<br />
&#160;&#160;&#160;&#160;&#160;*&#160;</span><span style="color: #808080">@param</span><span style="color: #008000">&#160;event&#160;&#160;事件&#160;<br />
&#160;&#160;&#160;&#160;&#160;</span><span style="color: #008000">*/</span><span style="color: #000000">&#160;<br />
&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">void</span><span style="color: #000000">&#160;getWorkerEvent(Worker&#160;worker,&#160;Event&#160;event)&#160;{&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">老板接收到事件信息：&#160;</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">worker.getName()&#160;</span><span style="color: #000000">+</span><span style="color: #000000">&#160;</span><span style="color: #000000">"</span><span style="color: #000000">:&#160;</span><span style="color: #000000">"</span><span style="color: #000000">&#160;</span><span style="color: #000000">+</span><span style="color: #000000">&#160;event.happendEvent());&#160;<br />
&#160;&#160;&#160;&#160;}&#160;<br />
}<br />
&#160;<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">class</span><span style="color: #000000">&#160;Test&#160;{&#160;<br />
&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">static</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">void</span><span style="color: #000000">&#160;main(String&#160;args[]){&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #008000">//</span><span style="color: #008000">初始化老板和工人&#160;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Boss&#160;boss&#160;</span><span style="color: #000000">=</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">new</span><span style="color: #000000">&#160;Boss(</span><span style="color: #000000">"</span><span style="color: #000000">老板</span><span style="color: #000000">"</span><span style="color: #000000">);&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Worker&#160;worker1</span><span style="color: #000000">=</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">new</span><span style="color: #000000">&#160;Worker(</span><span style="color: #000000">"</span><span style="color: #000000">张三</span><span style="color: #000000">"</span><span style="color: #000000">,boss);&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Worker&#160;worker2</span><span style="color: #000000">=</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">new</span><span style="color: #000000">&#160;Worker(</span><span style="color: #000000">"</span><span style="color: #000000">李四</span><span style="color: #000000">"</span><span style="color: #000000">,boss);&#160;<br />
<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #008000">//</span><span style="color: #008000">捏造两个事件&#160;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Event&#160;event1&#160;</span><span style="color: #000000">=</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">new</span><span style="color: #000000">&#160;EventA();&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Event&#160;event2&#160;</span><span style="color: #000000">=</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">new</span><span style="color: #000000">&#160;EventB();&#160;<br />
<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #008000">//</span><span style="color: #008000">事件是工人发出的&#160;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;worker1.setEvent(event1);&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;worker2.setEvent(event2);&#160;<br />
<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #008000">//</span><span style="color: #008000">工人干活，干完了通知老板干的情况如何&#160;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;worker1.doWork();&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;worker2.doWork();&#160;<br />
<br />
&#160;&#160;&#160;&#160;}&#160;<br />
}</span></span></div>
</font>
<p style="color: #000000"><font size="2">&#160;&#160; 我们可以看到在boss中，我们回调了工人的happendEvent方法，一般我们都用接口来实现回调！</font></p><img src ="http://www.cnblogs.com/hya1109/aggbug/1284726.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42925/" target="_blank">[新闻]Wikipedia“变心”，力挺Ubuntu</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>GEF七天之第五天</title><link>http://www.cnblogs.com/hya1109/archive/2008/07/29/1256002.html</link><dc:creator>殇</dc:creator><author>殇</author><pubDate>Tue, 29 Jul 2008 15:15:00 GMT</pubDate><guid>http://www.cnblogs.com/hya1109/archive/2008/07/29/1256002.html</guid><wfw:comment>http://www.cnblogs.com/hya1109/comments/1256002.html</wfw:comment><comments>http://www.cnblogs.com/hya1109/archive/2008/07/29/1256002.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/hya1109/comments/commentRss/1256002.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/hya1109/services/trackbacks/1256002.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; 今天写两篇,后天去北京,所以近期可能很少来园子里了,呵呵!!!</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 之前我们以一个小DEMO的形式介绍了GEF的model,Controller的实现,今天我们就来介绍gef中MVC的最后一个----view,即视图.由于我们这个DEMO是一个eclipse&nbsp;plug-in程序.所以他视图部分用的知识大部分是eclipse&nbsp;plug-in的相关知识(涉及的eclipse&nbsp;plug-in的相关知识我们将不作说明).</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通常我们用eclipse&nbsp;的Editor作为主要视图,<span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">我们必须扩展org.eclipse.ui.editors这个扩展点，这个可以在plugin.xm&nbsp;</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">定义，定义后的文件如下：</font></span></p>
<p><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p>&nbsp;</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_224509" onclick="this.style.display='none'; Code_Closed_Text_224509.style.display='none'; Code_Open_Image_224509.style.display='inline'; Code_Open_Text_224509.style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_224509" style="display: none" onclick="this.style.display='none'; Code_Open_Text_224509.style.display='none'; Code_Closed_Image_224509.style.display='inline'; Code_Closed_Text_224509.style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span id="Code_Closed_Text_224509" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">Code</span><span id="Code_Open_Text_224509" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">&lt;</span><span style="color: #800000">point</span><span style="color: #0000ff">="org.eclipse.ui.editors"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">editor<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="hya.gef.demo.shapes.ui.ShapesEditor"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extensions</span><span style="color: #0000ff">="Demo"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;icon</span><span style="color: #0000ff">="shapes.gif"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contributorClass</span><span style="color: #0000ff">="hya.gef.demo.shapes.ui.ShapesEditorActionBarContributor"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id</span><span style="color: #0000ff">="hya.gef.demo.shapes"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name</span><span style="color: #0000ff">="GEF&nbsp;Demo"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">extension</span><span style="color: #0000ff">&gt;</span></span></div>
<p><font face="宋体"></font></o:p></span>&nbsp;</p>
<p>其中，class属性指定我们编辑器对应的类；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;Extensions属性指定编辑器打开文件的扩展名为workflow；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Default属性指出该编辑器是扩展名为workflow文件的默认打开方式；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Icon为扩展名为workflow的文件和编辑器的图标；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Id属性为编辑器的唯一标识<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; Name为编辑器显示的名称</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;然后我们定义编辑器的主界面类<span style="font-weight: bold; font-size: 10.5pt; color: rgb(0,128,0); font-family: 'Courier New'; mso-spacerun: 'yes'"><span style="color: #000000"><span style="color: #000000">ShapesEditor,</span></span></span>他继承<span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">GraphicalEditorWithFlyoutPalette<font face="宋体">，<span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">GraphicalEditorWithFlyoutPalette</span>是带有面板的图形化编辑器.我们先来看看<span style="font-weight: bold; font-size: 10.5pt; color: rgb(0,128,0); font-family: 'Courier New'; mso-spacerun: 'yes'"><span style="color: #000000"><span style="color: #000000">ShapesEditor</span></span></span>的代码</font></span></p>
<p><!--endfragment--></p>
<div class="cnblogs_code"><img id="Code_Closed_Image_225435" onclick="this.style.display='none'; Code_Closed_Text_225435.style.display='none'; Code_Open_Image_225435.style.display='inline'; Code_Open_Text_225435.style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_225435" style="display: none" onclick="this.style.display='none'; Code_Open_Text_225435.style.display='none'; Code_Closed_Image_225435.style.display='inline'; Code_Closed_Text_225435.style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span id="Code_Closed_Text_225435" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">Code</span><span id="Code_Open_Text_225435" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">ackage&nbsp;hya.gef.demo.shapes.ui;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;hya.gef.demo.shapes.Activator;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;hya.gef.demo.shapes.models.DiagramModel;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;hya.gef.demo.shapes.models.RadioModel;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;hya.gef.demo.shapes.models.RectangularModel;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;hya.gef.demo.shapes.models.TriangleModel;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;hya.gef.demo.shapes.parts.ShapesEditPartFactory;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;hya.gef.demo.shapes.parts.tree.ShapesTreeEditPartFactory;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.EventObject;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.core.runtime.IProgressMonitor;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.gef.ContextMenuProvider;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.gef.DefaultEditDomain;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.gef.EditPartViewer;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.gef.GraphicalViewer;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.gef.dnd.TemplateTransferDragSourceListener;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.gef.dnd.TemplateTransferDropTargetListener;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.gef.editparts.ScalableFreeformRootEditPart;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.gef.palette.CombinedTemplateCreationEntry;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.gef.palette.ConnectionCreationToolEntry;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.gef.palette.MarqueeToolEntry;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.gef.palette.PaletteContainer;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.gef.palette.PaletteDrawer;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.gef.palette.PaletteGroup;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.gef.palette.PaletteRoot;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.gef.palette.PaletteSeparator;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.gef.palette.PanningSelectionToolEntry;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.gef.palette.ToolEntry;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.gef.requests.CreationFactory;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.gef.requests.SimpleFactory;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.gef.ui.actions.ActionRegistry;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.gef.ui.palette.PaletteViewer;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.gef.ui.palette.PaletteViewerProvider;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.gef.ui.parts.ContentOutlinePage;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.gef.ui.parts.TreeViewer;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.jface.resource.ImageDescriptor;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.jface.util.TransferDropTargetListener;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.swt.widgets.Composite;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.swt.widgets.Control;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.ui.IActionBars;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.ui.IEditorInput;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.ui.IEditorPart;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.ui.actions.ActionFactory;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.ui.part.IPageSite;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.ui.views.contentoutline.IContentOutlinePage;<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ShapesEditor&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;GraphicalEditorWithFlyoutPalette&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;PaletteRoot&nbsp;PALETTE_MODEL;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;顶层模型类</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;DiagramModel&nbsp;diagram;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;ShapesEditor()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setEditDomain(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;DefaultEditDomain(</span><span style="color: #0000ff">this</span><span style="color: #000000">));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@Override&nbsp;创建创建调色板<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;PaletteRoot&nbsp;getPaletteRoot()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(PALETTE_MODEL&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PALETTE_MODEL&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;createPalette();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;PALETTE_MODEL;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;在编辑器的GraphicalViewer加监听</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;initializeGraphicalViewer()&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">.initializeGraphicalViewer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GraphicalViewer&nbsp;viewer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;getGraphicalViewer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;viewer.setContents(getModel());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;增加监听，用于监听用户动作</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;viewer.addDropTargetListener(createTransferDropTargetListener());<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;建立监听</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;TransferDropTargetListener&nbsp;createTransferDropTargetListener()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;TemplateTransferDropTargetListener(getGraphicalViewer())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;CreationFactory&nbsp;getFactory(Object&nbsp;template)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;SimpleFactory((Class)&nbsp;template);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;给面板增加监听</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;PaletteViewerProvider&nbsp;createPaletteViewerProvider()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;PaletteViewerProvider(getEditDomain())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;configurePaletteViewer(PaletteViewer&nbsp;viewer)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">.configurePaletteViewer(viewer);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;viewer.addDragSourceListener(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TemplateTransferDragSourceListener(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;viewer));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;commandStackChanged(EventObject&nbsp;event)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;firePropertyChange(IEditorPart.PROP_DIRTY);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">.commandStackChanged(event);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;doSave(IProgressMonitor&nbsp;arg0)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;DiagramModel&nbsp;getModel()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;diagram;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;configureGraphicalViewer()&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">.configureGraphicalViewer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GraphicalViewer&nbsp;viewer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;getGraphicalViewer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;viewer.setEditPartFactory(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ShapesEditPartFactory());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;viewer.setRootEditPart(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ScalableFreeformRootEditPart());<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;添加右键菜单</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ContextMenuProvider&nbsp;cmProvider&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;EditorContextMenuProvider(viewer,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getActionRegistry());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;viewer.setContextMenu(cmProvider);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getSite().registerContextMenu(cmProvider,&nbsp;viewer);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setInput(IEditorInput&nbsp;input)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">.setInput(input);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;diagram&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;DiagramModel();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;getAdapter(Class&nbsp;type)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TreeViewer());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000">*************************************************************************<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;提供建立调色板（及工具箱)的方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*************************************************************************</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;建立工具箱</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;PaletteRoot&nbsp;createPalette()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PaletteRoot&nbsp;palette&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;PaletteRoot();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;palette.add(createToolsGroup(palette));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;palette.add(createShapesDrawer());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;palette;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;建立图形工具</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;PaletteContainer&nbsp;createShapesDrawer()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PaletteDrawer&nbsp;componentsDrawer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;PaletteDrawer(</span><span style="color: #000000">"</span><span style="color: #000000">Shapes</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CombinedTemplateCreationEntry&nbsp;component&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;CombinedTemplateCreationEntry(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">圆形</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Create&nbsp;an&nbsp;elliptical&nbsp;shape</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;RadioModel.</span><span style="color: #0000ff">class</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SimpleFactory(RadioModel.</span><span style="color: #0000ff">class</span><span style="color: #000000">),&nbsp;ImageDescriptor<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.createFromFile(Activator.</span><span style="color: #0000ff">class</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">icons/redio.gif</span><span style="color: #000000">"</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ImageDescriptor.createFromFile(Activator.</span><span style="color: #0000ff">class</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">icons/redio2.gif</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;componentsDrawer.add(component);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;component&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;CombinedTemplateCreationEntry(</span><span style="color: #000000">"</span><span style="color: #000000">矩形</span><span style="color: #000000">"</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Create&nbsp;a&nbsp;rectangular&nbsp;shape</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;RectangularModel.</span><span style="color: #0000ff">class</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SimpleFactory(RectangularModel.</span><span style="color: #0000ff">class</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ImageDescriptor.createFromFile(Activator.</span><span style="color: #0000ff">class</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">icons/rectangle.gif</span><span style="color: #000000">"</span><span style="color: #000000">),&nbsp;ImageDescriptor.createFromFile(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Activator.</span><span style="color: #0000ff">class</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">icons/rectangle2.gif</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;componentsDrawer.add(component);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;component&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;CombinedTemplateCreationEntry(</span><span style="color: #000000">"</span><span style="color: #000000">三角形</span><span style="color: #000000">"</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Create&nbsp;a&nbsp;Triangle&nbsp;shape</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;TriangleModel.</span><span style="color: #0000ff">class</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SimpleFactory(TriangleModel.</span><span style="color: #0000ff">class</span><span style="color: #000000">),&nbsp;ImageDescriptor<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.createFromFile(Activator.</span><span style="color: #0000ff">class</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">icons/triangle.gif</span><span style="color: #000000">"</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ImageDescriptor.createFromFile(Activator.</span><span style="color: #0000ff">class</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">icons/triangle.gif</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;componentsDrawer.add(component);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;componentsDrawer;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;PaletteContainer&nbsp;createToolsGroup(PaletteRoot&nbsp;palette)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PaletteGroup&nbsp;toolGroup&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;PaletteGroup(</span><span style="color: #000000">"</span><span style="color: #000000">Tools</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ToolEntry&nbsp;tool&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;PanningSelectionToolEntry();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toolGroup.add(tool);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;palette.setDefaultEntry(tool);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toolGroup.add(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MarqueeToolEntry());<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toolGroup.add(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;PaletteSeparator());<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tool&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ConnectionCreationToolEntry(</span><span style="color: #000000">"</span><span style="color: #000000">连线</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">连接两个图形</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ImageDescriptor.createFromFile(Activator.</span><span style="color: #0000ff">class</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">icons/connection.gif</span><span style="color: #000000">"</span><span style="color: #000000">),&nbsp;ImageDescriptor<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.createFromFile(Activator.</span><span style="color: #0000ff">class</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">icons/connection2.gif</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toolGroup.add(tool);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;toolGroup;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000">*************************************************************************<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;建立大纲视图对应类，以内部类的形式<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*************************************************************************</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;OutlinePage&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ContentOutlinePage&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;为editor建立一个新的大纲&nbsp;使用树结构显示大纲<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;OutlinePage(EditPartViewer&nbsp;viewer)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">(viewer);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;create&nbsp;outline&nbsp;viewer&nbsp;page</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getViewer().createControl(parent);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;configure&nbsp;outline&nbsp;viewer</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getViewer().setEditDomain(getEditDomain());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getViewer().setEditPartFactory(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ShapesTreeEditPartFactory());<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;让大纲视图和编辑器的GraphicalViewer视图同步选择</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getSelectionSynchronizer().addViewer(getViewer());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;设置大纲视图的根内容为DiagramModel</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getViewer().setContents(getModel());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;dispose()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;unhook&nbsp;outline&nbsp;viewer</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getSelectionSynchronizer().removeViewer(getViewer());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;dispose</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">.dispose();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;返回我们的outline成员变量，也就是指定让这个控件出现在大纲视图中</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Control&nbsp;getControl()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;getViewer().getControl();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;绑定UNDO/REDO/DELETE等命令到Eclipse主窗口&nbsp;方法必须<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;否则将否则当大纲视图处于活动状态时，主工具条上的这些命令就会变为不可用状态<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init(IPageSite&nbsp;pageSite)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">.init(pageSite);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionRegistry&nbsp;registry&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;getActionRegistry();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IActionBars&nbsp;bars&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pageSite.getActionBars();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ActionFactory.UNDO.getId();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bars.setGlobalActionHandler(id,&nbsp;registry.getAction(id));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ActionFactory.REDO.getId();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bars.setGlobalActionHandler(id,&nbsp;registry.getAction(id));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ActionFactory.DELETE.getId();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bars.setGlobalActionHandler(id,&nbsp;registry.getAction(id));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}<br />
</span></span></div>
<p>&nbsp;</p>
<p><!--endfragment-->&nbsp;</p>
<p class="0" style="margin-top: 5pt; vertical-align: baseline; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">在这个类getPaletteRoot()方法中，创建了面板。</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="0" style="margin-top: 5pt; vertical-align: baseline; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">在setInput方法中，定义了一个</font></span><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: 'Courier New'; mso-spacerun: 'yes'">DiagramModel</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">对象；</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="0" style="margin-top: 5pt; vertical-align: baseline; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">在构造函数中setEditDomain(new&nbsp;DefaultEditDomain(this));就是给当前编辑器设置一个默认编辑域，这个域跟命令堆栈有关。</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="0" style="margin-top: 5pt; vertical-align: baseline; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">initializeGraphicalViewer()<font face="宋体">方法，把GraphicalViewer</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">的内容设计为</font></span><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: 'Courier New'; mso-spacerun: 'yes'">DiagramModel</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">，说明后编辑的是一个</font></span><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: 'Courier New'; mso-spacerun: 'yes'">DiagramModel</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">，并且添加了监听以监听用户的请求（用</font></span><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: 'Courier New'; mso-spacerun: 'yes'">createTransferDropTargetListener</span><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">方法建立监听</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">）</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="0" style="margin-top: 5pt; vertical-align: baseline; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">在configureGraphicalViewer()，注册控制器工厂，并通过</font></span><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: 'Courier New'; mso-spacerun: 'yes'">ContextMenuProvider</span><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">来创建右肩菜单。</font></span><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="0" style="margin-top: 5pt; vertical-align: baseline; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: '宋体'; mso-spacerun: 'yes'">getAdapter(Class&nbsp;type)<font face="宋体">在此方法中创建大纲视图,大纲视图的相关创建我们以后再说明.</font></span></p>
<p class="0" style="margin-top: 5pt; vertical-align: baseline; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: '宋体'; mso-spacerun: 'yes'">建立大纲和建立面板以后我们会做详细说明</span></p>
<p class="0" style="margin-top: 5pt; vertical-align: baseline; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: '宋体'; mso-spacerun: 'yes'">这是视图界面截图:</span></p>
<p class="0" style="margin-top: 5pt; vertical-align: baseline; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: '宋体'; mso-spacerun: 'yes'"><img height="593" alt="" src="http://www.cnblogs.com/images/cnblogs_com/hya1109/hhhhhh.JPG" width="816" border="0" /></span></p>
<p><!--endfragment--><!--endfragment--></p>
<img src ="http://www.cnblogs.com/hya1109/aggbug/1256002.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42924/" target="_blank">[新闻]“不可破解”的加密技术出</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>java基础--特殊的String</title><link>http://www.cnblogs.com/hya1109/archive/2008/07/29/1255884.html</link><dc:creator>殇</dc:creator><author>殇</author><pubDate>Tue, 29 Jul 2008 12:34:00 GMT</pubDate><guid>http://www.cnblogs.com/hya1109/archive/2008/07/29/1255884.html</guid><wfw:comment>http://www.cnblogs.com/hya1109/comments/1255884.html</wfw:comment><comments>http://www.cnblogs.com/hya1109/archive/2008/07/29/1255884.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/hya1109/comments/commentRss/1255884.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/hya1109/services/trackbacks/1255884.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;有个问题,在网上十分常见,就是这样一段代码</p>
<p>&nbsp;&nbsp; </p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">1</span>&nbsp;<span style="color: #000000">String&nbsp;str</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String(</span><span style="color: #000000">"</span><span style="color: #000000">a</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;</span></div>
<p>有人往往会问：他创建了几个对象？我想答案是众所周知的2个。这个问题也从一个侧面说出了String的一些不同。</p>
<p>&nbsp;&nbsp;&nbsp; 我们接着说创建String对象的另-中方式：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; </p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">String&nbsp;str</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">aaa</span><span style="color: #000000">"</span></div>
<p>显然，这种方式他创建了一个对象。这种方式是String特有的（确实我们在java中好像没有看到过也从来没有过其他对象这样的方式创建）。其实java中这样设置String，应该是让他和内置的基本类型定义时一致。</p>
<p>&nbsp; 然后我们再来看看这样一段代码：</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">String&nbsp;str1</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">hya</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />String&nbsp;str2</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">hya</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;&nbsp;</span></div>
<p>他创建的对象还是一个，以前初学时我就感到疑惑。为什么会是一个呢？</p>
<p>&nbsp;&nbsp; 其实java里有一个字符串池的概念。确切地应该说是jvm中存在着一个字符串池，其中保存着很多String对象，并且可以被共享使用，因此它提高了效率。由于String类是final的，它的值一经创建就不可改变，因此我们不用担心String对象共享而带来程序的混乱。字符串池由String类维护，我们可以调用intern()方法来访问字符串池。 （来自javaeye的定义）</p>
<p>&nbsp;&nbsp; 当我们遇到String str1=&#8220;hya&#8221;的语句时，<font face="Courier New">Java会先在字符串池中寻找是否已经存在"hya"这个字符串,如果没有，则建立字符串"hya"对象，然后变量 str1指向这个地址；然后遇到语句String str2=&#8220;hya&#8221;这时字符串池中已经有 "hya"了，所以直接让变量str2也指向这个地址。</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; 我们再来看看<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">String&nbsp;str</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String(</span><span style="color: #000000">"</span><span style="color: #000000">a</span><span style="color: #000000">"</span><span style="color: #000000">);</span><span style="color: #000000">这个语句如何处理的呢？"a"是字符串池中的一个对象，然后new String（）是建立一个对象，并将句柄赋值给str，这与其他的对象建立没有什么不同。</span></font></p>
<p><font face="Courier New"><span style="color: #000000">&nbsp; 以让的知识介绍完后，我们再来看看这个问题（考试哦！）</span></font></p>
<p><font face="Courier New"><span style="color: #000000">&nbsp;</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">String&nbsp;str</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String(</span><span style="color: #000000">"</span><span style="color: #000000">a</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />String&nbsp;s</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String(</span><span style="color: #000000">"</span><span style="color: #000000">a</span><span style="color: #000000">"</span><span style="color: #000000">);</span></div>
<p>他创建了几个对象？如果明白了上面的知识的话，这个答案是不容置疑的！！！</p>
<p>&nbsp;&nbsp;&nbsp; 然后我们再来看看，实际编程中遇到的==和equqls的区别，这里主要针对String而言的。</p>
<p>&nbsp;&nbsp;&nbsp; 看如下代码：</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">String&nbsp;a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Hello</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />String&nbsp;b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Hello</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />String&nbsp;c&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String(</span><span style="color: #000000">"</span><span style="color: #000000">Hello</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />String&nbsp;d&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String(</span><span style="color: #000000">"</span><span style="color: #000000">Hello</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />System.out.println(a&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;b);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />System.out.println(b&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;c);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />System.out.println(c&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;d);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />System.out.println(a.equals(b));<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />System.out.println(b.equals(c));<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />System.out.println(c.equals(d));&nbsp;&nbsp;</span></div>
<p>&nbsp;</p>
输出结果是
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">true</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">false</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">false</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">true</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">true</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">true</span></div>
<p>呵呵，看出什么了吗？首先我们来说明一下在java中==和equqls的区别：</p>
<p>&nbsp;&nbsp;&nbsp; ==：对于基本类型来说是则是判断它们的值是否相等；对于两个对象则是判断它们的引用是否指向同一个对象；</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;equqls：是一个方法，针对基本类型的外覆盖类和String而言它是判断值是否相等；而对于普通的对象，他们的缺省的实现和==并没有区别。</span></font></p>
<p><font face="Courier New"><span style="color: #000000">&nbsp; 所以对于上面的一段代码，不管他们是不是同一个对象，他们的值都是Hello，所以用equqls方法，返回的值都是true。</span></font></p>
<p><font face="Courier New"><span style="color: #000000">&nbsp;&nbsp;</span></font></p>
<p><font face="Courier New"><span style="color: #000000">&nbsp; 由于java中String的用处十分的广，所以初于使用和性能上的考虑，对他作了一些特殊处理。最后我们再来说说String对象在JVM中的存储，以及字符串池与heap和stacK的关系。java中的数据主要存储在heap和stacK这两个数据结构中其中：栈（stack）：主要保存基本类型（或者叫内置类型）（char、byte、short、int、long、float、double、boolean）和对象的引用，数据可以共享，速度仅次于寄存器（register），快于堆。 堆（heap）：用于存储对象。 </p>
<p>我们查看String类的源码就会发现，它有一个value属性，保存着String对象的值，类型是char[]，这也正说明了字符串就是字符的序列。 <br />
当执行String a="hya";时，JVM会在栈中创建三个char型的值'h'、'y'和'a'，然后在堆中创建一个String对象，它的值（value）是刚才在栈中创建的三个char型值组成的数组{'h','y','a'}，最后这个新创建的String对象会被添加到字符串池中。如果我们接着执行String b=new String("hya");代码，由于"hya"已经被创建并保存于字符串池中，因此JVM只会在堆中新创建一个String对象，但是它的值（value）是共享前一行代码执行时在栈中创建的三个char型值值'a'、'b'和'c'。&nbsp;<br />
</span></font><font face="Courier New"></font></p>
<p><font face="Courier New">&nbsp;<span style="color: red"><font face="Courier New">&nbsp;ps:以上属于个人理解，如有错误，还请指正！谢谢！</font><font face="Courier New">&nbsp;</font></span></font><font face="Courier New">&nbsp; </font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><br />
</p>
</font>
<img src ="http://www.cnblogs.com/hya1109/aggbug/1255884.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42924/" target="_blank">[新闻]“不可破解”的加密技术出</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>GEF七天之第四天</title><link>http://www.cnblogs.com/hya1109/archive/2008/07/27/1252282.html</link><dc:creator>殇</dc:creator><author>殇</author><pubDate>Sat, 26 Jul 2008 16:18:00 GMT</pubDate><guid>http://www.cnblogs.com/hya1109/archive/2008/07/27/1252282.html</guid><wfw:comment>http://www.cnblogs.com/hya1109/comments/1252282.html</wfw:comment><comments>http://www.cnblogs.com/hya1109/archive/2008/07/27/1252282.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/hya1109/comments/commentRss/1252282.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/hya1109/services/trackbacks/1252282.html</trackback:ping><description><![CDATA[摘要:  没办法,这几天一直在生病.也不是太严重.就是在家呆着,老爸把空调弄成20度(老妈解释,冰箱冷藏功能坏了,暂时用空调顶一下)结果呢太凉,到外面又太热.一凉一热俺就病了.看来咱还是不能享受啊!不多说了,咱继续,还有一点,最近在看Junit(暂时是理论).所以呢,gef系列也可能上的慢一些!! 咱们接着上回来说.EditPart我们已经介绍过了.是否还记得createEditPolicies（）这个方&nbsp;&nbsp;<a href='http://www.cnblogs.com/hya1109/archive/2008/07/27/1252282.html'>阅读全文</a><img src ="http://www.cnblogs.com/hya1109/aggbug/1252282.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42923/" target="_blank">[新闻]13款Firefox Gmail扩展</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>GEF七天之第三天</title><link>http://www.cnblogs.com/hya1109/archive/2008/07/17/1244770.html</link><dc:creator>殇</dc:creator><author>殇</author><pubDate>Wed, 16 Jul 2008 16:23:00 GMT</pubDate><guid>http://www.cnblogs.com/hya1109/archive/2008/07/17/1244770.html</guid><wfw:comment>http://www.cnblogs.com/hya1109/comments/1244770.html</wfw:comment><comments>http://www.cnblogs.com/hya1109/archive/2008/07/17/1244770.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/hya1109/comments/commentRss/1244770.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/hya1109/services/trackbacks/1244770.html</trackback:ping><description><![CDATA[摘要:  在这说一下,其实GEF七天,并不是把我每天知识的总结,而是学习了GEF七天,我想通过这样一种方式将我这七天的收获和对GEF框架的理解,写出来,也算是对这一周的总结吧 其实这一章我们介绍gef的核心控制器了,在写之前,我们先介绍一下GEF要用到的设计模式. 在学GEF中给我感受最深的是,设计模式无处不在,除了上章中说的观察者模式外.GEF框架还运用了COMMAND(命令)模式,Policy(策略)&nbsp;&nbsp;<a href='http://www.cnblogs.com/hya1109/archive/2008/07/17/1244770.html'>阅读全文</a><img src ="http://www.cnblogs.com/hya1109/aggbug/1244770.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42922/" target="_blank">[新闻]支持鼠标手势的Chrome中文修改版</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>GEF七天之第二天 </title><link>http://www.cnblogs.com/hya1109/archive/2008/07/14/1242979.html</link><dc:creator>殇</dc:creator><author>殇</author><pubDate>Mon, 14 Jul 2008 15:18:00 GMT</pubDate><guid>http://www.cnblogs.com/hya1109/archive/2008/07/14/1242979.html</guid><wfw:comment>http://www.cnblogs.com/hya1109/comments/1242979.html</wfw:comment><comments>http://www.cnblogs.com/hya1109/archive/2008/07/14/1242979.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/hya1109/comments/commentRss/1242979.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/hya1109/services/trackbacks/1242979.html</trackback:ping><description><![CDATA[摘要:  上回,我们说明了GEF的实现原理,这次我们就从实际出发来说明他具体的实现.当然还是结合那个DEMO,同时我还会具体说一下,我对这个架构各部分的理解.由于是初学者,也许有理解的偏差,如有什么写错的请指正，并且欢迎交流。 之前我还是要说,学习GEF,如果你没有学过Eclipse插件，那么最好先花时间熟悉一下Eclipse的插件体系结构，在这里我只介绍GEF的相关知识,swt以及eclipseplug&nbsp;&nbsp;<a href='http://www.cnblogs.com/hya1109/archive/2008/07/14/1242979.html'>阅读全文</a><img src ="http://www.cnblogs.com/hya1109/aggbug/1242979.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42921/" target="_blank">[新闻]调查显示：开源技术已进入企业主流</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>GEF七天之第一天</title><link>http://www.cnblogs.com/hya1109/archive/2008/07/13/1242033.html</link><dc:creator>殇</dc:creator><author>殇</author><pubDate>Sun, 13 Jul 2008 14:15:00 GMT</pubDate><guid>http://www.cnblogs.com/hya1109/archive/2008/07/13/1242033.html</guid><wfw:comment>http://www.cnblogs.com/hya1109/comments/1242033.html</wfw:comment><comments>http://www.cnblogs.com/hya1109/archive/2008/07/13/1242033.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/hya1109/comments/commentRss/1242033.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/hya1109/services/trackbacks/1242033.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 在家闷头苦学了七天,终于初步弄懂了GEF这个架构,之前没有SWT的实际开发经验,也没有Eclipse插件的基础,弄懂GEF还真不容易啊.学任何东西我们都得从实际动手开发,我们就通过这个一个小demo来攻克这个架构.<br />
&nbsp;&nbsp;&nbsp; 首先,demo要求:
<p class="0" style="margin-left: 21pt; text-indent: 21pt; line-height: 150%; text-align: left"><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">一个eclipse&nbsp;plug-in程序，要有一个编辑区（editor），一个大纲（outline）.编辑区有画板，画板里有三角，矩形，圆形，连接线。用户可以通过拖拽的方式把图形拽到编辑区。编辑区图形能够实现删除，同时拥有uodo/redo。<br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p><br />
看似简单的要求....<br />
&nbsp;好了那我们首先就开始吧,对了还是先介绍一下GEF这个架构吧<br />
&nbsp;</p>
<p class="0" style="margin-top: 5pt; text-align: justify"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">GEF<font face="宋体">（Graphical&nbsp;Editor&nbsp;Framework）是一个图形化编辑框架，它允许开发人员以图形化的方式展示和编辑模型，从而提升用户体验。这样的应用程序有很多，例如：UML类图编辑器、图形化XML编辑器、界面设计工具以及图形化数据库结构设计工具等等.这是引用八进制老兄的话.对了貌似struts那个编辑器,就是能拖能拽的那个,就是用的这个框架.<br />
<br />
&nbsp; 他</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">采用</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">MVC</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">框架模式实现，</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">模型</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">对应业务逻辑，实现相应的接口，并添加事件监听器，实现对模型改变事件的监听。</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">控制器</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">由GEF提供的EditPart实现，安装编辑策略，监听模型的变化，处理模型变化请求，执行相应的Command命令完成相应的操作，绘制图形。</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">视图</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">部分由Eclipse提供的Draw2d实现，绘制相应的图形。我们也从这三个方面来说明程序的设计实现.<br />
&nbsp;&nbsp;&nbsp; 什么是Draw2d,我们只说GEF,Draw2d的相关知识,还是去找google,百度吧.当然了同时我们还要有Eclipse插件开发的相关知识.就这两样我还是看了将近一天呢.<br />
&nbsp;&nbsp; 现在我们在具体说一下GEF的大致工作原理:一下内容引自(<a href="http://www.cnblogs.com/bjzhanghao/archive/2005/02/13/104045.html">八进制</a>老兄的博客)<br />
<br />
</p>
<p align="center"><img height="443" alt="" hspace="5" src="http://www.cnblogs.com/images/cnblogs_com/bjzhanghao/gef/gefoverview.gif" width="640" align="baseline" /> <br />
图2 GEF结构图 </p>
<p><strong>模型</strong>：GEF的模型只与控制器打交道，而不知道任何与视图有关的东西。为了能让控制器知道模型的变化，应该把控制器作为事件监听者注册在模型中，当模型发生变化时，就触发相应的事件给控制器，后者负责通知各个视图进行更新。 </p>
<p>典型的模型对象会包含PropertyChangeSupport类型的成员变量，用来维护监听器成员即控制器；对于与其他对象具有连接关系的模型，要维护连入/连出的连接列表；如果模型对应的节点具有大小和位置信息，还要维护它们。这些变量并不是模型本身必须的信息，维护它们使模型变得不够清晰，但你可以通过构造一些抽象模型类（例如让所有具有连接的模型对象继承Node类）来维持它们的可读性。</p>
<p>相对来讲GEF中模型是MVC中最简单的一部分。</p>
<p><strong>控制器</strong>：我们知道，在MVC结构里控制器是模型与视图之间的桥梁，也是整个GEF的核心。它不仅要监听模型的变化，当用户编辑视图时，还要把编辑结果反映到模型上。举个例子来说，用户在数据库结构图上删除一个表时，控制器应该从模型中删除这个表对象、表中的字段对象、以及与这些对象有关的所有连接。当然在GEF中这些操作不是由直接控制器完成的，这个稍后就会说到。 </p>
<p>GEF中的控制器是所谓的EditPart对象，更确切的说应该是一组EditPart对象共同组成了GEF的控制器这部分，每一个模型对象都对应一个EditPart对象。你的应用程序中需要有一个EditPartFactory对象负责根据给定模型对象创建对应的EditPart对象，这个工厂类将被视图利用。</p>
<p>RootEditPart是一种特殊的EditPart，它和你的模型没有任何关系，它的作用是把EditPartViewer和contents（应用程序的最上层EditPart，一般代表一块画布）联系起来，可以把它想成是contents的容器。EditPartViewer有一个方法setRootEditPart()专门用来指定视图对应的RooEditPart。</p>
<p align="center"><img height="231" alt="" hspace="5" src="http://www.cnblogs.com/images/cnblogs_com/bjzhanghao/gef/editpart.gif" width="347" align="baseline" /> <br />
图3 EditPart对象 </p>
<p>用户的编辑操作被转换为一系列请求（Request），有很多种类的请求，这些种类在GEF里被称为角色（Role），GEF里有图形化和非图形化这两大类角色，前者比如Layout Role对应和布局有关的的操作，后者比如Connection Role对应和连接有关的操作等等。角色这个概念是通过编辑策略（EditPolicy）来实现的，EditPolicy的主要功能是根据请求创建相应的命令（Command），而后者会直接操作模型对象。对每一个EditPart，你都可以"安装"一些EditPolicy，用户对这个EditPart的特定操作会被交给已安装的对应EditPolicy处理。这样做的直接好处是可以在不同EditPart之间共享一些重复操作。</p>
<p>在GEF SDK提供的帮助文档（GEF开发指南）里有一份详细的EditPolicy、Role和Request类型列表，这里就不赘述了。</p>
<p><strong>视图</strong>：前面说过，GEF的视图可以有很多种，GEF目前提供了图形（GraphicalViewer）和树状（TreeViewer）这两种，前者利用Draw2D图形（IFigure）作为表现方式，多用于编辑区域，后者则多用于实现大纲展示。视图的任务同样繁重，除了模型的显示功能以外，还要提供编辑功能、回显（Feedback）、工具提示（ToolTip）等等。 </p>
<p>GEF使用EditPartViewer作为视图，它的作用和JFace中的Viewer十分类似，而EditPart就相当于是它的ContentProvider和LabelProvider，通过setContents()方法来指定。我们经常使用的Editor是一个GraphicalEditorWithPalette（GEF提供的Editor，是EditorPart的子类，具有图形化编辑区域和一个工具条），这个Editor使用GraphicalEditViewer和PaletteViewer这两个视图类，PaletteViewer也是GraphicalEditViewer的子类。开发人员要在configureGraphicalViewer()和initializeGraphicalViewer()这两个方法里对EditPartViewer进行定制，包括指定它的contents和EditPartFactory等等。</p>
<p>EditPartViewer同时也是ISelectionProvider，这样当用户在编辑区域做选择操作时，注册的SelectionChangeListener就可以收到选择事件。EditPartViewer会维护各个EditPart的选中状态，如果没有被选中的EditPart，则缺省选中的是作为contents的EditPart。</p>
<p>初步了解了GEF的MVC实现方式，让我们看看典型的GEF应用程序是什么样子的。大部分GEF应用程序都实现为Eclipse的Editor，也就是说整个编辑区域是放置在一个Editor里的。所以典型的GEF应用程序具有一个图形编辑区域包含在一个Editor（例如GraphicalEditorWithPalette）里，可能有一个大纲视图和一个属性页，一个用于创建EditPart实例的EditPartFactory，一些表示业务的模型对象，与模型对象对应的一些EditPart，每个EditPart对应一个IFigure的子类对象显示给用户，一些EditPolicy对象，以及一些Command对象。</p>
<p>GEF应用程序的工作方式如下： EditPartViewer接受用户的操作，例如节点的选择、新增或删除等等，每个节点都对应一个EditPart对象，这个对象有一组按操作Role分开的EditPolicy，每个EditPolicy会对应一些Command对象，Command最终对模型进行直接修改。用户的操作转换为Request分配给适当的EditPolicy，由后者创建适当的Command来修改模型，这些Command会保留在EditDomain（专门用于维护EditPartViewer、Command等信息的对象，一般每个Editor对应唯一一个该对象）的命令堆栈里，用于实现撤消/重做功能。<br />
</p>
</span>
<p class="0" style="margin-left: 21pt; text-indent: 21pt; line-height: 150%; text-align: left">引用完毕.<br />
<br />
了解了其基本原理后我们就可以开始开发了(呵呵,省去n多小示例的开发)....<br />
<br />
<span style="color: red">ps:我会把这一周的收获一一写来.呵呵....</span><!--endfragment--><!--endfragment--></o:p></span></p>
<!--endfragment-->
 <img src ="http://www.cnblogs.com/hya1109/aggbug/1242033.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42911/" target="_blank">[新闻]《第一财经周刊》:捅破下载软件公司的盈利窗户纸</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>距离矢量路由算法（最短路Bellman-Ford实现）实现</title><link>http://www.cnblogs.com/hya1109/archive/2008/05/25/1207063.html</link><dc:creator>殇</dc:creator><author>殇</author><pubDate>Sun, 25 May 2008 12:44:00 GMT</pubDate><guid>http://www.cnblogs.com/hya1109/archive/2008/05/25/1207063.html</guid><wfw:comment>http://www.cnblogs.com/hya1109/comments/1207063.html</wfw:comment><comments>http://www.cnblogs.com/hya1109/archive/2008/05/25/1207063.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/hya1109/comments/commentRss/1207063.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/hya1109/services/trackbacks/1207063.html</trackback:ping><description><![CDATA[<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.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;&nbsp;std;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;MAXN&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #800080">100</span><span style="color: #000000">&nbsp;;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;MAXV&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;&nbsp;MAXN&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;&nbsp;MAXN;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;INF&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #800080">2000000000</span><span style="color: #000000">&nbsp;;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;&nbsp;EDGE<br />
<img id="Codehighlighter1_146_165_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_146_165_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_146_165_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_146_165_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_146_165_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_146_165_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_146_165_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_146_165_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span id="Codehighlighter1_146_165_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.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_146_165_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;u,&nbsp;v;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">&nbsp;;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;g[MAXN][MAXN];<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />EDGE&nbsp;e[MAXV];<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;BellmanFord(&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;beg,&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;end,&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;nNum,&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;eNum)<br />
<img id="Codehighlighter1_271_811_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_271_811_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_271_811_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_271_811_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_271_811_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_271_811_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_271_811_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_271_811_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span id="Codehighlighter1_271_811_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.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_271_811_Open_Text"><span style="color: #000000">{&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;nNum为顶点数,&nbsp;eNum为边数,&nbsp;复杂度O(VE)&nbsp;</span><span style="color: #008000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;d[MAXN];<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;i,&nbsp;k;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;&nbsp;(i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">&nbsp;;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;nNum;&nbsp;i&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">&nbsp;)<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d[i]&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;&nbsp;INF;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;d[beg]&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">&nbsp;;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;&nbsp;ex&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">&nbsp;;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;&nbsp;(k&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">&nbsp;;&nbsp;k&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;nNum&nbsp;&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;&nbsp;ex;&nbsp;k&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">&nbsp;)<br />
<img id="Codehighlighter1_501_785_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_501_785_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_501_785_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_501_785_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_501_785_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_501_785_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_501_785_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_501_785_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_501_785_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.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_501_785_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">&nbsp;;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;&nbsp;(i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">&nbsp;;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;eNum;&nbsp;i&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">&nbsp;)<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;&nbsp;(d[e[i].u]&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;&nbsp;INF&nbsp;&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;&nbsp;d[e[i].v]&nbsp;&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;&nbsp;d[e[i].u]&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;&nbsp;g[e[i].u][e[i].v])<br />
<img id="Codehighlighter1_669_778_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_669_778_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_669_778_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_669_778_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_669_778_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_669_778_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_669_778_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_669_778_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_669_778_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.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_669_778_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d[e[i].v]&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #0000