﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-eroself-随笔分类-Eclipse</title><link>http://www.blogjava.net/eroself/category/27855.html</link><description>关于人生的程式，在这里谱写......</description><language>zh-cn</language><lastBuildDate>Mon, 25 Feb 2008 11:28:33 GMT</lastBuildDate><pubDate>Mon, 25 Feb 2008 11:28:33 GMT</pubDate><ttl>60</ttl><item><title>RCP系统开发</title><link>http://www.blogjava.net/eroself/archive/2008/02/25/181955.html</link><dc:creator>鬼谷子</dc:creator><author>鬼谷子</author><pubDate>Mon, 25 Feb 2008 04:04:00 GMT</pubDate><guid>http://www.blogjava.net/eroself/archive/2008/02/25/181955.html</guid><wfw:comment>http://www.blogjava.net/eroself/comments/181955.html</wfw:comment><comments>http://www.blogjava.net/eroself/archive/2008/02/25/181955.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/eroself/comments/commentRss/181955.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/eroself/services/trackbacks/181955.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 摘自：http://book.csdn.net/bookfiles/493/10049317083.shtml从本章开始，将带领大家进入激动人心的Eclipse RCP开发之旅。本章先将经费测算系统的架子搭建起来，例如菜单、工具栏、主控界面等等，至于系统各功能的实现细节，在随后的章节中将层层剥开。为了节省篇幅，从本章开始，对于大量需要导入的类，在程序代码中将予以省略。本章将主要学习到以...&nbsp;&nbsp;<a href='http://www.blogjava.net/eroself/archive/2008/02/25/181955.html'>阅读全文</a><img src ="http://www.blogjava.net/eroself/aggbug/181955.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/eroself/" target="_blank">鬼谷子</a> 2008-02-25 12:04 <a href="http://www.blogjava.net/eroself/archive/2008/02/25/181955.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>扩展Eclipse视图弹出菜单</title><link>http://www.blogjava.net/eroself/archive/2008/02/23/181559.html</link><dc:creator>鬼谷子</dc:creator><author>鬼谷子</author><pubDate>Sat, 23 Feb 2008 02:37:00 GMT</pubDate><guid>http://www.blogjava.net/eroself/archive/2008/02/23/181559.html</guid><wfw:comment>http://www.blogjava.net/eroself/comments/181559.html</wfw:comment><comments>http://www.blogjava.net/eroself/archive/2008/02/23/181559.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/eroself/comments/commentRss/181559.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/eroself/services/trackbacks/181559.html</trackback:ping><description><![CDATA[<p>转自：http://cnfree2000.spaces.live.com/blog/cns!6201144F025F9D77!426.entry<br />
<br />
Eclipse里每种编辑器都有它自己的视图，有时候我们需要在上面添加自己的功能，扩充视图弹出菜单则是必不可少的工作之一。 <br />
<br />
在一个视图的Popup&nbsp;Menu里增加一个菜单项，含有2种方式： <br />
<br />
1、viewerContribution，也就是通过视图的id。这样只有视图id和给定的id一致的时候，它的弹出菜单才会增加我们定义的菜单项。 <br />
<br />
2、objectContribution，通过对象类型。当在视图里选定的对象类型和给定的一致时，在视图的弹出菜单增加我们定义的菜单项。 <br />
<br />
菜单项的Action需要继承org.eclipse.ui.actions.ActionDelegate，然后实现特殊的View的ActionDelegate接口。比如要扩展Java编辑器： <br />
<br />
public&nbsp;class&nbsp;FinderActionDelegate&nbsp;extends&nbsp;ActionDelegate&nbsp;implements <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IEditorActionDelegate&nbsp;{ <br />
<br />
来看看插件的Plugin.xml的组成部分： <br />
<br />
viewerContribution形式： <br />
&nbsp;&nbsp;&nbsp;&lt;extension <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point="org.eclipse.ui.popupMenus"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;viewerContribution <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;targetID="#TextEditorContext" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id="com.cnfree.finder.editor"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;action <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label="查找最大ID" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;icon="icon/search.gif" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;helpContextId="com.cnfree.finder.finderaction" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class="com.cnfree.finder.FinderActionDelegate" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menubarPath="additions" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enablesFor="+" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id="com.cnfree.finder"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/action&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/viewerContribution&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;viewerContribution <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;targetID="#CompilationUnitEditorContext" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id="com.cnfree.finder.editor"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;action <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label="查找最大ID" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;icon="icon/search.gif" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;helpContextId="com.cnfree.finder.finderaction" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class="com.cnfree.finder.FinderActionDelegate" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menubarPath="additions" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enablesFor="*" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id="com.cnfree.finder"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/action&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/viewerContribution&gt; <br />
&nbsp;&nbsp;&nbsp;&lt;/extension&gt; &lt; br /&gt;&nbsp;&nbsp;&nbsp;&lt;extension <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point="org.eclipse.ui.editorActions"&gt; <br />
&nbsp;&nbsp;&nbsp;&lt;/extension&gt; <br />
<br />
这里我们需要知道扩展的视图它的菜单项在Eclipse插件注册表里定义的id（稍后我会附上Eclipse插件菜单项ID注册表）。比如Java编辑器对应的ID为： <br />
#TextEditorContext&nbsp;和&nbsp;#CompilationUnitEditorContext，我们定义好&nbsp;targetID，就把我们的插件id指向视图菜单的id了。这样Java编辑器就会添加我们的菜单项了。 <br />
<br />
&lt;!ATTLIST&nbsp;action <br />
&nbsp;&nbsp;&nbsp;id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CDATA&nbsp;#REQUIRED <br />
&nbsp;&nbsp;&nbsp;label&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CDATA&nbsp;#REQUIRED <br />
&nbsp;&nbsp;&nbsp;menubarPath&nbsp;&nbsp;&nbsp;CDATA&nbsp;#IMPLIED <br />
&nbsp;&nbsp;&nbsp;toolbarPath&nbsp;&nbsp;&nbsp;CDATA&nbsp;#IMPLIED <br />
&nbsp;&nbsp;&nbsp;icon&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CDATA&nbsp;#IMPLIED <br />
&nbsp;&nbsp;&nbsp;disabledIcon&nbsp;&nbsp;CDATA&nbsp;#IMPLIED <br />
&nbsp;&nbsp;&nbsp;hoverIcon&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CDATA&nbsp;#IMPLIED <br />
&nbsp;&nbsp;&nbsp;tooltip&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CDATA&nbsp;#IMPLIED <br />
&nbsp;&nbsp;&nbsp;helpContextId&nbsp;CDATA&nbsp;#IMPLIED <br />
&nbsp;&nbsp;&nbsp;style&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(push|radio|toggle)&nbsp;"push" <br />
&nbsp;&nbsp;&nbsp;state&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(true&nbsp;|&nbsp;false)&nbsp; <br />
&nbsp;&nbsp;&nbsp;class&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CDATA&nbsp;#REQUIRED <br />
&nbsp;&nbsp;&nbsp;enablesFor&nbsp;&nbsp;&nbsp;&nbsp;CDATA&nbsp;#IMPLIED&gt; <br />
&lt; br /&gt;此元素定义用户可在用户界面中调用的操作。 </p>
<ul><br />
    <li>id&nbsp;－&nbsp;用作此操作的引用的唯一标识。&nbsp; <br />
    <li>label&nbsp;－&nbsp;用作菜单项文本或工具栏按钮标签的可翻译名称。此名称可包括助记符信息。 <br />
    <li>menubarPath&nbsp;－&nbsp;用来指定下拉菜单中此操作位置的以斜杠（&#8220;/&#8221;）定界的路径。路径中的每个标记（最后一个标记除外）都必须表示层次结构中现有菜单的有效标识。最后一个标记表示要将操作添加到其中的命名组。如果省略了路径，则此操作将不会出现在下拉菜单中。&nbsp; <br />
    <li>toolbarPath&nbsp;－&nbsp;目标视图的本地工具栏内的命名组。如果该组不存在，则将创建它。如果省略该项，则操作将不会出现在本地工具栏中。&nbsp; <br />
    <li>icon&nbsp;－&nbsp;用来在操作的上下文中可视地表示操作的图标的相对路径。如果省略该项且操作出现在工具栏中，则&#8220;工作台&#8221;将使用占位符图标。该路径是相对于添加插件的&nbsp;plugin.xml&nbsp;文件的位置的。图标将出现在工具栏中，但是不会出现在下拉菜单中。 <br />
    <li>disabledIcon&nbsp;－&nbsp;当禁用操作时，用于在操作的上下文中可视地表示操作的图标的相对路径。如果省略该项，则正常图标将变灰。该路径是相对于添加插件的&nbsp;plugin.xml&nbsp;文件的位置的。禁用的图标将出现在工具栏中，但是不会出现在下拉菜单中。 <br />
    <li>hoverIcon&nbsp;－&nbsp;当鼠标指针位于操作上时，用来在操作的上下文中可视地表示操作的图标的相对路径。如果省略此项，则将使用正常图标。该路径是相对于添加插件的&nbsp;plugin.xml&nbsp;文件的位置的。 <br />
    <li>tooltip&nbsp;－&nbsp;表示操作的工具提示的可翻译文本。仅当操作出现在工具栏中时才使用。 <br />
    <li>helpContextId&nbsp;－&nbsp;一个指示此操作的帮助上下文的唯一标识。如果操作作为菜单项出现，则在突出显示该菜单项时按&nbsp;F1&nbsp;键将显示帮助。 <br />
    <li>style&nbsp;－&nbsp;用来定义操作的用户界面样式类型的可选属性。如果定义了此项，则属性值将是下列其中一项：&nbsp; <br />
    &nbsp;&nbsp;&nbsp;push&nbsp;－&nbsp;作为普通菜单项或工具项。&nbsp; <br />
    &nbsp;&nbsp;&nbsp;radio&nbsp;－&nbsp;作为单选样式菜单项或工具项。同一菜单或工具栏组内具有单选样式的操作相当于单选按钮集。初始值由&nbsp;state&nbsp;属性指定。 <br />
    &nbsp;&nbsp;&nbsp;toggle&nbsp;－&nbsp;作为复选样式菜单项或切换工具项。初始值由&nbsp;state&nbsp;属性指定。&nbsp; <br />
    <li>state&nbsp;－&nbsp;指示初始状态（true&nbsp;或&nbsp;false）的可选属性，当&nbsp;style&nbsp;属性具有值&nbsp;radio&nbsp;或&nbsp;toggle&nbsp;时使用。 <br />
    <li>class&nbsp;－&nbsp;实现&nbsp;org.eclipse.ui.IViewActionDelegate&nbsp;的标准类的名称。 <br />
    <li>enablesFor&nbsp;－&nbsp;指示必须满足才能启用操作的选择计数的值。如果指定了此属性并且满足条件，则启用操作。如果条件不满足，则禁用操作。如果没有指定任何属性，则对选择了任意数目的项启用操作。下列属性格式受支持：&nbsp;!&nbsp;－&nbsp;选择了零项&nbsp;&nbsp; <br />
    &nbsp;&nbsp;&nbsp;?&nbsp;－&nbsp;选择了零项或一项&nbsp;&nbsp; <br />
    &nbsp;&nbsp;&nbsp;+&nbsp;－&nbsp;选择了一项或多项&nbsp; <br />
    &nbsp;&nbsp;&nbsp;multiple,&nbsp;2+&nbsp;－&nbsp;选择了两项或多项&nbsp; <br />
    &nbsp;&nbsp;&nbsp;n&nbsp;－&nbsp;选择了精确数目的项。例如：nablesFor="&nbsp;4"&nbsp;仅当选择了&nbsp;4&nbsp;个项时才启用操作。&nbsp; <br />
    &nbsp;&nbsp;&nbsp;*&nbsp;－&nbsp;选择了任意数目的项 <br />
    </li>
</ul>
<p>objectContribution形式： <br />
<br />
&nbsp;&nbsp;&nbsp;&lt;objectContribution&nbsp;objectClass="com.cnfree.action.IOpenable"&nbsp;&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;action <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id="com.cnfree.open" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menubarPath="new.ext" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;definitionID="com.cnfree.open.selection" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label="&amp;Open@Ctrl+O" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tooltip="Open&nbsp;the&nbsp;selected&nbsp;item(s)" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;helpContextId="com.cnfree.open.selection" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;icon="icon/open.gif" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class="com.cnfree.action.Op enSelectedActionDelegate" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enablesFor="+"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/action&gt; <br />
&nbsp;&nbsp;&nbsp;&lt;/objectContribution&gt; <br />
<br />
action&nbsp;Open实现了IOpenable，这样就意味着，所有包含了IOpenable对象的视图，当我们选中其中的IOpenable对象时，它的弹出菜单都会增加我们自定义的菜单项。 <br />
<br />
附带的例子： <br />
<a href="http://blog.csdwiki.org/upload/com.cnfree.finder_1.0.0-1120022748.rar" target="_blank">cnfree&nbsp;editor&nbsp;plugin</a> <br />
<br />
使用说明：建立一个Java文件，在它的注释里添加&nbsp;xxx.yyy&nbsp;，xxx为一个类名，yyy为一个三位数ID，比如cnfee.100,cnfree.101,cnfree.102，在Java透视图里打开这个Java文件，右键菜单会有一个选项：查找最大ID，打开后输入cnfree，它就会自动找到cnfree.102，并将该字符串高亮显示。 <br />
<br />
Eclipse<a href="http://www.jdg2e.com/ch21.actions.table/doc/" target="_blank">插件菜单ID注册表参考：http://www.jdg2e.com/ch21.actions.table/doc/</a> <br />
<br />
参考资料： <br />
<a href="http://www.eclipsesource.com/EN_ARCHIVE/etips_07072004.html&nbsp;" target="_blank">http://www.eclipsesource.com/EN_ARCHIVE/etips_07072004.html&nbsp;</a> <br />
Eclipse帮助：<a href="http://help.eclipse.org/help30/index.jsp?topic=/org.eclipse.platform.doc.isv/guide/workbench_basicext_popupMenus.htm" target="_blank">org.eclipse.platform.doc.isv/guide/workbench_basicext_popupMenus.htm</a> <br />
</p>
<img src ="http://www.blogjava.net/eroself/aggbug/181559.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/eroself/" target="_blank">鬼谷子</a> 2008-02-23 10:37 <a href="http://www.blogjava.net/eroself/archive/2008/02/23/181559.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>扩展Eclipse视图弹出菜单（二）</title><link>http://www.blogjava.net/eroself/archive/2008/02/23/181558.html</link><dc:creator>鬼谷子</dc:creator><author>鬼谷子</author><pubDate>Sat, 23 Feb 2008 02:29:00 GMT</pubDate><guid>http://www.blogjava.net/eroself/archive/2008/02/23/181558.html</guid><wfw:comment>http://www.blogjava.net/eroself/comments/181558.html</wfw:comment><comments>http://www.blogjava.net/eroself/archive/2008/02/23/181558.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/eroself/comments/commentRss/181558.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/eroself/services/trackbacks/181558.html</trackback:ping><description><![CDATA[<p align="left">转自：<a href="http://www.blogjava.net/cnfree/archive/2006/06/16/53326.html">http://www.blogjava.net/cnfree/archive/2006/06/16/53326.html</a><br />
<br />
</p>
<div class="postText">
<p><font face="Courier New" size="2"><a class="" title="" href="http://cnfree2000.spaces.msn.com/blog/cns!6201144F025F9D77!426.entry" target="_blank"><font color="#000080">上一篇文章</font></a>我们知道了Eclipse弹出菜单的基本用法。其实Eclipse的弹出菜单可以用来做很多文章，简单一点的根据文件类别，我们可以进行不同的文件操作，比如Ant的build.xml我们可以用来build，Java文件我们可以用Java Editor打开，这些基于文件类型的操作我们都可以很容易的实现。但是还有一种情况，如果文件类型一样，我们想进行不同的操作，该怎么实现呢？实际上这样的应用很多，比如同样是Java文件，含有main方法的Java文件有Run和Debug的选项，其它的都没有。还有现在的框架都是基于XML文件进行配置的，如果一个项目使用了多个框架，我们怎么根据不同的XML文件进行框架的区分呢？答案就是enablement的test。</font> </p>
<p class="code" id="dtd"><font face="Courier New" size="2">&lt;!ELEMENT </font><a name="e.test"><font face="Courier New" size="2">test</font> </a><font face="Courier New" size="2">EMPTY&gt;<br />
&lt;!ATTLIST test<br />
property&nbsp;CDATA #REQUIRED <br />
args&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CDATA #IMPLIED <br />
value&nbsp;&nbsp;&nbsp;&nbsp;CDATA #IMPLIED&gt;</font> </p>
<p><font face="Courier New" size="2"></font></p>
<p class="ConfigMarkup" id="elementDesc"><font face="Courier New" size="2">This element is used to evaluate the property state of the object in focus. The set of testable properties can be extended using the propery tester extension point. The test expression returns EvaluationResult.NOT_LOADED if teh property tester doing the actual testing isn't loaded yet.</font> </p>
<ul class="ConfigMarkup" id="attlistDesc">
    <li><font face="Courier New"><font size="2"><strong>property</strong> - the name of an object's property to test. </font></font>
    <li><font face="Courier New"><font size="2"><strong>args</strong> - additional arguments passed to the property tester. Multiple arguments are seperated by commas. Each individual argument is converted into a Java base type using the same rules as defined for the value attribute of the test expression. </font></font>
    <li><font face="Courier New"><font size="2"><strong>value</strong> - the expected value of the property. Can be omitted if the property is a boolean property. The test expression is supposed to return EvaluationResult.TRUE if the property matches the value and EvaluationResult.FALSE otherwise. The value attribute is converted into a Java base type using the following rules: </font></font>
    <ul>
        <li><font face="Courier New" size="2">the string "true" is converted into Boolean.TRUE </font>
        <li><font face="Courier New" size="2">the string "false" is converted into Boolean.FALSE </font>
        <li><font face="Courier New" size="2">if the string contains a dot then the interpreter tries to convert the value into a Float object. If this fails the string is treated as a java.lang.String </font>
        <li><font face="Courier New" size="2">if the string only consists of numbers then the interpreter converts the value in an Integer object. </font>
        <li><font face="Courier New" size="2">in all other cases the string is treated as a java.lang.String </font>
        <li><font face="Courier New" size="2">the conversion of the string into a Boolean, Float, or Integer can be suppressed by surrounding the string with single quotes. For example, the attribute value="'true'" is converted into the string "true" </font></li>
    </ul>
    </li>
</ul>
<p><br />
<font face="Courier New" size="2">比如我们要让含有main方法的Java文件它的右键弹出菜单包含一个额外的选项&#8220;This is main class&#8221;，需要编写如下的Plugin.xml：</font> </p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><font face="Courier New"><font size="2"><span style="color: #0000ff">&lt;</span> <span style="color: #800000">plugin</span> <span style="color: #0000ff">&gt;</span> </font></font><span style="color: #000000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;</font> </span><span style="color: #0000ff"><font face="Courier New" size="2">&lt;</font> </span><font face="Courier New"><font size="2"><span style="color: #800000">extension<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #ff0000">point</span> <span style="color: #0000ff">="org.eclipse.ui.popupMenus"</span> <span style="color: #0000ff">&gt;</span> </font></font><span style="color: #000000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font> </span><span style="color: #0000ff"><font face="Courier New" size="2">&lt;</font> </span><font face="Courier New"><font size="2"><span style="color: #800000">objectContribution<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #ff0000">id</span> <span style="color: #0000ff">="Advanced.PopupMenus"</span> </font></font><span style="color: #ff0000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objectClass</font> </span><font face="Courier New"><font size="2"><span style="color: #0000ff">="java.lang.Object"</span> <span style="color: #0000ff">&gt;</span> </font></font><span style="color: #000000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font> </span><font face="Courier New"><font size="2"><span style="color: #0000ff">&lt;</span> <span style="color: #800000">action&nbsp;</span> <span style="color: #ff0000">id</span> <span style="color: #0000ff">="Advanced.PopupMenus.Action"</span> </font></font><span style="color: #ff0000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label</font> </span><span style="color: #0000ff"><font face="Courier New" size="2">="AdvancedPopupMenus"</font> </span><span style="color: #ff0000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style</font> </span><span style="color: #0000ff"><font face="Courier New" size="2">="pulldown"</font> </span><span style="color: #ff0000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menubarPath</font> </span><span style="color: #0000ff"><font face="Courier New" size="2">="additions"</font> </span><span style="color: #ff0000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</font> </span><span style="color: #0000ff"><font face="Courier New" size="2">="advancedpopupmenus.popup.actions.AdvancedPopupMenusAction"</font> </span><font face="Courier New"><font size="2"><span style="color: #ff0000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enablesFor</span> <span style="color: #0000ff">="+"</span> <span style="color: #0000ff">&gt;</span> </font></font><span style="color: #000000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font> </span><font face="Courier New"><font size="2"><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">action</span> <span style="color: #0000ff">&gt;</span> </font></font><span style="color: #000000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font> </span><font face="Courier New"><font size="2"><span style="color: #0000ff">&lt;</span> <span style="color: #800000">enablement</span> <span style="color: #0000ff">&gt;</span> </font></font><span style="color: #000000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font> </span><font face="Courier New"><font size="2"><span style="color: #0000ff">&lt;</span> <span style="color: #800000">test&nbsp;</span> <span style="color: #ff0000">property</span> <span style="color: #0000ff">="advancedpopupmenus.popup.visable"</span> <span style="color: #0000ff">/&gt;</span> </font></font><span style="color: #000000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font> </span><font face="Courier New"><font size="2"><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">enablement</span> <span style="color: #0000ff">&gt;</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">objectContribution</span> <span style="color: #0000ff">&gt;</span> </font></font><span style="color: #000000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;</font> </span><font face="Courier New"><font size="2"><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">extension</span> <span style="color: #0000ff">&gt;</span> </font></font><span style="color: #000000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;</font> </span><font face="Courier New"><font size="2"><span style="color: #0000ff">&lt;</span> <span style="color: #800000">extension&nbsp;</span> <span style="color: #ff0000">point</span> <span style="color: #0000ff">="org.eclipse.core.expressions.propertyTesters"</span> <span style="color: #0000ff">&gt;</span> </font></font><span style="color: #000000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;</font> </span><span style="color: #0000ff"><font face="Courier New" size="2">&lt;</font> </span><font face="Courier New"><font size="2"><span style="color: #800000">propertyTester<br />
&nbsp;&nbsp;&nbsp;</span> <span style="color: #ff0000">namespace</span> <span style="color: #0000ff">="advancedpopupmenus.popup"</span> </font></font><span style="color: #ff0000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;properties</font> </span><span style="color: #0000ff"><font face="Courier New" size="2">="visable"</font> </span><span style="color: #ff0000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;type</font> </span><span style="color: #0000ff"><font face="Courier New" size="2">="java.lang.Object"</font> </span><span style="color: #ff0000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;class</font> </span><span style="color: #0000ff"><font face="Courier New" size="2">="advancedpopupmenus.popup.actions.VisablePropertyTester"</font> </span><span style="color: #ff0000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;id</font> </span><font face="Courier New"><font size="2"><span style="color: #0000ff">="advancedpopupmenus.popup.propertyTesters.visable"</span> <span style="color: #0000ff">&gt;</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">propertyTester</span> <span style="color: #0000ff">&gt;</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">extension</span> <span style="color: #0000ff">&gt;</span> </font></font><span style="color: #000000"><br />
</span><font face="Courier New"><font size="2"><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">plugin</span> <span style="color: #0000ff">&gt;</span> </font></font></div>
<p><font face="Courier New" size="2">我们需要检测在当前情况下是否需要显示这个菜单项，使用扩展点</font> <font color="#0000ff"><font face="Courier New" size="2">org.eclipse.core.expressions.propertyTesters</font> <font face="Courier New" color="#000000" size="2">：<br />
</font></font><font face="Courier New" color="#000000" size="2">&lt;!ELEMENT propertyTester EMPTY&gt;<br />
</font><font face="Courier New" color="#000000" size="2">&lt;!ATTLIST propertyTester<br />
</font><font face="Courier New" color="#000000" size="2">id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CDATA #REQUIRED<br />
</font><font face="Courier New" color="#000000" size="2">type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CDATA #REQUIRED<br />
</font><font face="Courier New" color="#000000" size="2">namespace&nbsp; CDATA #REQUIRED<br />
</font><font face="Courier New"><font size="2"><font color="#000000">properties CDATA #REQUIRED<br />
</font><font color="#000000">class&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CDATA #REQUIRED&gt;</font> </font></font></p>
<p><font color="#000000"><font face="Courier New"><font size="2"><strong>id</strong> - unique identifier for the property tester <br />
<strong>type</strong> - the type to be extended by this property tester <br />
<strong>namespace</strong> - a unique id determining the name space the properties are added to <br />
<strong>properties</strong> - a comma separated list of properties provided by this property tester <br />
<strong>class</strong> - the name of the class that implements the testing methods. The class must be public and extend <font color="#ff0000">org.eclipse.core.expressions.PropertyTester</font> with a public 0-argument constructor.&nbsp;<br />
<br />
这里只须注意</font> </font></font><span style="color: #800000"><font face="Courier New" color="#000000" size="2">propertyTester的namespace和properties正好对应test的property。<br />
</font></span><span style="color: #800000"><font color="#000000"><br />
<font face="Courier New" size="2">至于检测的逻辑我们在advancedpopupmenus.popup.actions.VisablePropertyTester中实现，这个类必须继承自<font color="#ff0000">org.eclipse.core.expressions.PropertyTester</font>。</font> </font></span></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff"><font face="Courier New" size="2">package</font> </span><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;advancedpopupmenus.popup.actions;<br />
<br />
</span><span style="color: #0000ff">import</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;org.eclipse.core.expressions.PropertyTester;<br />
</span><span style="color: #0000ff">import</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;org.eclipse.jdt.core.IMethod;<br />
</span><span style="color: #0000ff">import</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;org.eclipse.jdt.core.IType;<br />
</span><span style="color: #0000ff">import</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;org.eclipse.jdt.core.JavaModelException;<br />
</span><span style="color: #0000ff">import</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;org.eclipse.jdt.internal.core.CompilationUnit;<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;VisablePropertyTester&nbsp;</span> <span style="color: #0000ff">extends</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;PropertyTester<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">public</span> <span style="color: #000000">&nbsp;</span> <span style="color: #0000ff">boolean</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;test(&nbsp;Object&nbsp;receiver,&nbsp;String&nbsp;property,&nbsp;Object[]&nbsp;args,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;expectedValue&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">if</span> <span style="color: #000000">&nbsp;(&nbsp;</span> <span style="color: #000000">!</span> <span style="color: #000000">(&nbsp;receiver&nbsp;</span> <span style="color: #0000ff">instanceof</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;CompilationUnit&nbsp;)&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;</span> <span style="color: #0000ff">false</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CompilationUnit&nbsp;unit&nbsp;</span> <span style="color: #000000">=</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;(CompilationUnit)&nbsp;receiver;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">try</span> </font></font><span style="color: #000000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IType[]&nbsp;types&nbsp;</font> </span><span style="color: #000000"><font face="Courier New" size="2">=</font> </span><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;unit.getTypes(&nbsp;);<br />
&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;types&nbsp;</span> <span style="color: #000000">==</span> <span style="color: #000000">&nbsp;</span> <span style="color: #0000ff">null</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&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">false</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">for</span> <span style="color: #000000">&nbsp;(&nbsp;</span> <span style="color: #0000ff">int</span> <span style="color: #000000">&nbsp;i&nbsp;</span> <span style="color: #000000">=</span> <span style="color: #000000">&nbsp;</span> <span style="color: #000000">0</span> <span style="color: #000000">;&nbsp;i&nbsp;</span> <span style="color: #000000">&lt;</span> <span style="color: #000000">&nbsp;types.length;&nbsp;i</span> <span style="color: #000000">++</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IMethod[]&nbsp;methods&nbsp;</span> <span style="color: #000000">=</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;types[i].getMethods(&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&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;methods&nbsp;</span> <span style="color: #000000">==</span> <span style="color: #000000">&nbsp;</span> <span style="color: #0000ff">null</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&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">false</span> </font></font><font face="Courier New"><font size="2"><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">for</span> <span style="color: #000000">&nbsp;(&nbsp;</span> <span style="color: #0000ff">int</span> <span style="color: #000000">&nbsp;j&nbsp;</span> <span style="color: #000000">=</span> <span style="color: #000000">&nbsp;</span> <span style="color: #000000">0</span> <span style="color: #000000">;&nbsp;j&nbsp;</span> <span style="color: #000000">&lt;</span> <span style="color: #000000">&nbsp;methods.length;&nbsp;j</span> <span style="color: #000000">++</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">if</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;(&nbsp;methods[j].isMainMethod(&nbsp;)&nbsp;)<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: #0000ff">return</span> <span style="color: #000000">&nbsp;</span> <span style="color: #0000ff">true</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<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;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">catch</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;(&nbsp;JavaModelException&nbsp;e&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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">false</span> </font></font><span style="color: #000000"><font face="Courier New" size="2">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</font></span></div>
<p><font face="Courier New" size="2">我们只要判断接受的Java文件中是否含有main方法，如果有，则返回True，没有则返回False。<br />
<br />
如果我们是要接受一个Web开发的配置文件，我们可以这样写：</font> </p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><font face="Courier New"><font size="2"><span style="color: #0000ff">&lt;</span> <span style="color: #800000">plugin</span> <span style="color: #0000ff">&gt;</span> </font></font><span style="color: #000000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;</font> </span><span style="color: #0000ff"><font face="Courier New" size="2">&lt;</font> </span><font face="Courier New"><font size="2"><span style="color: #800000">extension<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #ff0000">point</span> <span style="color: #0000ff">="org.eclipse.ui.popupMenus"</span> <span style="color: #0000ff">&gt;</span> </font></font><span style="color: #000000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font> </span><span style="color: #0000ff"><font face="Courier New" size="2">&lt;</font> </span><font face="Courier New"><font size="2"><span style="color: #800000">objectContribution<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #ff0000">id</span> <span style="color: #0000ff">="Advanced.PopupMenus"</span> </font></font><span style="color: #ff0000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objectClass</font> </span><span style="color: #0000ff"><font face="Courier New" size="2">="org.eclipse.core.resources.IFile"</font> </span><span style="color: #ff0000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nameFilter</font> </span><font face="Courier New"><font size="2"><span style="color: #0000ff">="*.xml"</span> <span style="color: #0000ff">&gt;</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">&lt;</span> <span style="color: #800000">action&nbsp;</span> <span style="color: #ff0000">id</span> <span style="color: #0000ff">="Advanced.PopupMenus.Action"</span> </font></font><span style="color: #ff0000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label</font> </span><span style="color: #0000ff"><font face="Courier New" size="2">="This&nbsp;is&nbsp;web&nbsp;xml"</font> </span><span style="color: #ff0000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style</font> </span><span style="color: #0000ff"><font face="Courier New" size="2">="pulldown"</font> </span><span style="color: #ff0000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menubarPath</font> </span><span style="color: #0000ff"><font face="Courier New" size="2">="additions"</font> </span><span style="color: #ff0000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</font> </span><span style="color: #0000ff"><font face="Courier New" size="2">="advancedpopupmenus.popup.actions.AdvancedPopupMenusAction"</font> </span><font face="Courier New"><font size="2"><span style="color: #ff0000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enablesFor</span> <span style="color: #0000ff">="+"</span> <span style="color: #0000ff">&gt;</span> </font></font><span style="color: #000000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font> </span><font face="Courier New"><font size="2"><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">action</span> <span style="color: #0000ff">&gt;</span> </font></font><span style="color: #000000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font> </span><font face="Courier New"><font size="2"><span style="color: #0000ff">&lt;</span> <span style="color: #800000">enablement</span> <span style="color: #0000ff">&gt;</span> </font></font><span style="color: #000000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font> </span><font face="Courier New"><font size="2"><span style="color: #0000ff">&lt;</span> <span style="color: #800000">test&nbsp;</span> <span style="color: #ff0000">property</span> <span style="color: #0000ff">="advancedpopupmenus.popup.visable"</span> <span style="color: #0000ff">/&gt;</span> </font></font><span style="color: #000000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font> </span><font face="Courier New"><font size="2"><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">enablement</span> <span style="color: #0000ff">&gt;</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">objectContribution</span> <span style="color: #0000ff">&gt;</span> </font></font><span style="color: #000000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;</font> </span><font face="Courier New"><font size="2"><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">extension</span> <span style="color: #0000ff">&gt;</span> </font></font><span style="color: #000000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;</font> </span><font face="Courier New"><font size="2"><span style="color: #0000ff">&lt;</span> <span style="color: #800000">extension&nbsp;</span> <span style="color: #ff0000">point</span> <span style="color: #0000ff">="org.eclipse.core.expressions.propertyTesters"</span> <span style="color: #0000ff">&gt;</span> </font></font><span style="color: #000000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font> </span><span style="color: #0000ff"><font face="Courier New" size="2">&lt;</font> </span><font face="Courier New"><font size="2"><span style="color: #800000">propertyTester<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #ff0000">namespace</span> <span style="color: #0000ff">="advancedpopupmenus.popup"</span> </font></font><span style="color: #ff0000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;properties</font> </span><span style="color: #0000ff"><font face="Courier New" size="2">="visable"</font> </span><span style="color: #ff0000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type</font> </span><span style="color: #0000ff"><font face="Courier New" size="2">="org.eclipse.core.resources.IFile"</font> </span><span style="color: #ff0000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</font> </span><span style="color: #0000ff"><font face="Courier New" size="2">="advancedpopupmenus.popup.actions.VisablePropertyTester"</font> </span><span style="color: #ff0000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id</font> </span><font face="Courier New"><font size="2"><span style="color: #0000ff">="advancedpopupmenus.popup.propertyTesters.visable"</span> <span style="color: #0000ff">&gt;</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">propertyTester</span> <span style="color: #0000ff">&gt;</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">extension</span> <span style="color: #0000ff">&gt;</span> </font></font><span style="color: #000000"><br />
</span><font face="Courier New"><font size="2"><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">plugin</span> <span style="color: #0000ff">&gt;</span> </font></font></div>
<p><font face="Courier New"><font size="2">注意和上一个例子不同的地方，objectClass，nameFileter和type(在上一个例子中，我们也可以使用<font color="#ff0000">objectClass</font><span style="color: #0000ff">="org.eclipse.core.resources.IFile" </span><span style="color: #ff0000">nameFilter</span></font> </font><span style="color: #0000ff"><font face="Courier New" size="2">="*.java"</font> <font color="#000000"><font face="Courier New" size="2">)，相应的我们的VisablePropertyTester类也要做一些改动：</font> </font></span></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff"><font face="Courier New" size="2">package</font> </span><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;advancedpopupmenus.popup.actions;<br />
<br />
</span><span style="color: #0000ff">import</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;javax.xml.parsers.DocumentBuilder;<br />
</span><span style="color: #0000ff">import</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;javax.xml.parsers.DocumentBuilderFactory;<br />
</span><span style="color: #0000ff">import</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;org.eclipse.core.expressions.PropertyTester;<br />
</span><span style="color: #0000ff">import</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;org.eclipse.core.resources.IFile;<br />
</span><span style="color: #0000ff">import</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;org.w3c.dom.Document;<br />
</span><span style="color: #0000ff">import</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;org.w3c.dom.DocumentType;<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;VisablePropertyTester&nbsp;</span> <span style="color: #0000ff">extends</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;PropertyTester<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">public</span> <span style="color: #000000">&nbsp;</span> <span style="color: #0000ff">boolean</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;test(&nbsp;Object&nbsp;receiver,&nbsp;String&nbsp;property,&nbsp;Object[]&nbsp;args,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;expectedValue&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">if</span> <span style="color: #000000">&nbsp;(&nbsp;</span> <span style="color: #000000">!</span> <span style="color: #000000">(&nbsp;receiver&nbsp;</span> <span style="color: #0000ff">instanceof</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;IFile&nbsp;)&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;</span> <span style="color: #0000ff">false</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IFile&nbsp;xml&nbsp;</span> <span style="color: #000000">=</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;(IFile)&nbsp;receiver;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">try</span> </font></font><span style="color: #000000"><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DocumentBuilderFactory&nbsp;dbf&nbsp;</font> </span><span style="color: #000000"><font face="Courier New" size="2">=</font> </span><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;DocumentBuilderFactory.newInstance(&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DocumentBuilder&nbsp;db&nbsp;</span> <span style="color: #000000">=</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;dbf.newDocumentBuilder(&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;doc&nbsp;</span> <span style="color: #000000">=</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;db.parse(&nbsp;xml.getContents(&nbsp;)&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DocumentType&nbsp;type&nbsp;</span> <span style="color: #000000">=</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;doc.getDoctype(&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">if</span> <span style="color: #000000">(type.getSystemId(&nbsp;).equalsIgnoreCase(&nbsp;</span> <span style="color: #000000">"</span> <span style="color: #000000">http://java.sun.com/j2ee/dtds/web-app_2_2.dtd</span> <span style="color: #000000">"</span> <span style="color: #000000">&nbsp;))</span> <span style="color: #0000ff">return</span> <span style="color: #000000">&nbsp;</span> <span style="color: #0000ff">true</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">catch</span> </font></font><font face="Courier New"><font size="2"><span style="color: #000000">&nbsp;(&nbsp;Exception&nbsp;e&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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">false</span> </font></font><span style="color: #000000"><font face="Courier New" size="2">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</font> </span></div>
<p><font face="Courier New" size="2">这样根据不同的xml SystemID，我们就能够知道到底这是哪一种框架的配置文件了。</font> </p>
</div>
<img src ="http://www.blogjava.net/eroself/aggbug/181558.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/eroself/" target="_blank">鬼谷子</a> 2008-02-23 10:29 <a href="http://www.blogjava.net/eroself/archive/2008/02/23/181558.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>方便管理plugin或rcp的icons</title><link>http://www.blogjava.net/eroself/archive/2008/01/30/178564.html</link><dc:creator>鬼谷子</dc:creator><author>鬼谷子</author><pubDate>Wed, 30 Jan 2008 09:24:00 GMT</pubDate><guid>http://www.blogjava.net/eroself/archive/2008/01/30/178564.html</guid><wfw:comment>http://www.blogjava.net/eroself/comments/178564.html</wfw:comment><comments>http://www.blogjava.net/eroself/archive/2008/01/30/178564.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/eroself/comments/commentRss/178564.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/eroself/services/trackbacks/178564.html</trackback:ping><description><![CDATA[<p>转自：http://blog.csdn.net/moneyice/archive/2006/04/25/677423.aspx<br />
<br />
</p>
<div style="text-indent: 21pt">每个UI程序都离不开图片，一般的Eclipse插件，在一个类中定义了若干静态常量，每一个常量指定一个icon的名字，在程序中用到图片的时候，通过这个常量计算得到图片。Eclipse的插件一般规模较大，图片很多，而且分不同的像素，彩色，灰白等。这样有利于统一的管理和开发人员的沟通。</div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>但并不是每个plugin或者rcp都要用到这么多图片，如果只有很少的图片的话，可以用图片的名字作为key,来存取图片。程序例子如下：</div>
<div>public class ImageShop {</div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private static ImageRegistry register = new ImageRegistry();</span></div>
<div>&nbsp;</div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private static Set keys = new HashSet();</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static {</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; initial();</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static ImageDescriptor getDescriptor(String key) {</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ImageDescriptor image = register.getDescriptor(key);</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (image == null) {</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; image = ImageDescriptor.getMissingImageDescriptor();</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return image;</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static Image get(String key) {</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Image image = register.get(key);</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (image == null) {</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; image = ImageDescriptor.getMissingImageDescriptor().createImage();</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return image;</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static String[] getImageKey() {</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (String[]) keys.toArray(new String[keys.size()]);</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private static void initial() {</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Bundle bundle = Platform.getBundle(PwdgatePlugin.ID);</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; URL url = bundle.getEntry("icons");</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url = Platform.asLocalURL(url);</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PwdgatePlugin.log("get root path", e);</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File file = new File(url.getPath());</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File[] images = file.listFiles();</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; images.length; i++) {</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File f = images[i];</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!f.isFile()) {</span></div>
<div><span>&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; continue;</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String name = f.getName();</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!name.endsWith(".gif")) {</span></div>
<div><span>&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; continue;</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String key = name.substring(0, name.indexOf('.'));</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; URL fullPathString = bundle.getEntry("icons/" + name);</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ImageDescriptor des = ImageDescriptor.createFromURL(fullPathString);</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; register.put(key, des);</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keys.add(key);</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></div>
<div>}</div>
<div>&nbsp;</div>
<div>所有的图片都放在根目录/icons目录下，在系统中如果用到名字为default.gif的图片，只要调用ImageShop.get(&#8220;default&#8221;)即可；有时在Action中需要用到ImageDescriptor，调用ImageShop. getDescriptor(&#8220;default&#8221;)就可以取到。</div>
<img src ="http://www.blogjava.net/eroself/aggbug/178564.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/eroself/" target="_blank">鬼谷子</a> 2008-01-30 17:24 <a href="http://www.blogjava.net/eroself/archive/2008/01/30/178564.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>