﻿<?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-玩转Java-随笔分类-Java插件开发</title><link>http://www.blogjava.net/jacky9881/category/28588.html</link><description>玩转Java</description><language>zh-cn</language><lastBuildDate>Sat, 10 Jul 2010 04:19:44 GMT</lastBuildDate><pubDate>Sat, 10 Jul 2010 04:19:44 GMT</pubDate><ttl>60</ttl><item><title>Eclipse中一些扩展点介绍四</title><link>http://www.blogjava.net/jacky9881/archive/2010/07/09/filter.html</link><dc:creator>玩转Java</dc:creator><author>玩转Java</author><pubDate>Fri, 09 Jul 2010 12:59:00 GMT</pubDate><guid>http://www.blogjava.net/jacky9881/archive/2010/07/09/filter.html</guid><wfw:comment>http://www.blogjava.net/jacky9881/comments/325683.html</wfw:comment><comments>http://www.blogjava.net/jacky9881/archive/2010/07/09/filter.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jacky9881/comments/commentRss/325683.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacky9881/services/trackbacks/325683.html</trackback:ping><description><![CDATA[扩展点：<br />
org.eclipse.ui.ide.resourceFilters<br />
org.eclipse.jdt.ui.javaElementFilters<br />
<br />
org.eclipse.ui.ide.resourceFilters扩展点可以给Naivgator视图的过滤器列表增加过滤项，要使用该扩展点需要在插件依赖项中追加<br />
对插件项目org.eclipse.ui.ide的依赖。<br />
<br />
扩展清单如下：<br />
<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">extension<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">point</span><span style="color: #0000ff">="org.eclipse.ui.ide.resourceFilters"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">pattern</span><span style="color: #0000ff">="*.classpath"</span><span style="color: #ff0000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selected</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">extension</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
上述代码的作用就是给Navigator视图，增加过滤器，过滤后缀名为classpath的文件，该过滤项默认为选中状态。<br />
<br />
org.eclipse.jdt.ui.javaElementFilters扩展点可以给Java透视图中相应视图的过滤器列表增加过滤项，要使用该扩展点需要在插件依赖项中追加<br />
对插件项目org.eclipse.jdt.ui的依赖。<br />
<br />
扩展清单如下：<br />
<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">extension<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">point</span><span style="color: #0000ff">="org.eclipse.jdt.ui.javaElementFilters"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">description</span><span style="color: #0000ff">="TestFilter&nbsp;Des"</span><span style="color: #ff0000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enabled</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id</span><span style="color: #0000ff">="aaaa"</span><span style="color: #ff0000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name</span><span style="color: #0000ff">="TestFilter"</span><span style="color: #ff0000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pattern</span><span style="color: #0000ff">="*.properties"</span><span style="color: #ff0000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;targetId</span><span style="color: #0000ff">="org.eclipse.jdt.ui.PackageExplorer"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">extension</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<br />
上述代码的作用就是给Package视图，增加过滤器，过滤点后缀名为properties的文件，该过滤项默认为选中状态。<br />
<img src ="http://www.blogjava.net/jacky9881/aggbug/325683.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacky9881/" target="_blank">玩转Java</a> 2010-07-09 20:59 <a href="http://www.blogjava.net/jacky9881/archive/2010/07/09/filter.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse中一些扩展点介绍三 </title><link>http://www.blogjava.net/jacky9881/archive/2010/07/09/keybind.html</link><dc:creator>玩转Java</dc:creator><author>玩转Java</author><pubDate>Fri, 09 Jul 2010 12:52:00 GMT</pubDate><guid>http://www.blogjava.net/jacky9881/archive/2010/07/09/keybind.html</guid><wfw:comment>http://www.blogjava.net/jacky9881/comments/325681.html</wfw:comment><comments>http://www.blogjava.net/jacky9881/archive/2010/07/09/keybind.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jacky9881/comments/commentRss/325681.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacky9881/services/trackbacks/325681.html</trackback:ping><description><![CDATA[扩展点：<br />
org.eclipse.ui.bindings<br />
<span style="font-family: Century; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 'MS Mincho'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA" lang="EN-US">org.eclipse.ui.contexts</span><br />
<br />
扩展点org.eclipse.ui.bindings是给command增加快捷键，结合（介绍二），给命令com.xxxx.test.command1增加快捷键，<br />
示例代码如下：<br />
<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">extension<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">point</span><span style="color: #0000ff">="org.eclipse.ui.bindings"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">key<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">commandId</span><span style="color: #0000ff">="com.xxxx.test.command1"</span><span style="color: #ff0000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contextId</span><span style="color: #0000ff">="org.eclipse.ui.contexts.window"</span><span style="color: #ff0000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;schemeId</span><span style="color: #0000ff">="org.eclipse.ui.defaultAcceleratorConfiguration"</span><span style="color: #ff0000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sequence</span><span style="color: #0000ff">="M2+F7"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">key</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">extension</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<br />
这样快捷键Shift+F7在Eclipse工作台上都会起作用，但是<span style="font-family: 宋体; color: black; font-size: 10pt; mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">如果想让命令的快捷键只对特定的视图或者编辑器起作用，那么可以通过<span style="font-family: Century; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 'MS Mincho'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA" lang="EN-US">org.eclipse.ui.contexts</span>扩展点来自定义上下文。<br />
<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">extension<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">point</span><span style="color: #0000ff">="org.eclipse.ui.contexts"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">context<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="viewmenu.testcontext"</span><span style="color: #ff0000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name</span><span style="color: #0000ff">="ViewContext"</span><span style="color: #ff0000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parentId</span><span style="color: #0000ff">="org.eclipse.ui.contexts.window"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">context</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">extension</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<br />
扩展之后，需要修改org.eclipse.ui.bindings扩展中的<span style="font-family: 'Courier New'; color: navy; font-size: 10pt; mso-fareast-font-family: 'MS Mincho'; mso-ansi-language: EN-US; mso-fareast-language: JA; mso-bidi-language: AR-SA" lang="EN-US">contextId</span>属性为<span style="font-family: 'Courier New'; color: green; font-size: 10pt; mso-fareast-font-family: 'MS Mincho'; mso-ansi-language: EN-US; mso-fareast-language: JA; mso-bidi-language: AR-SA" lang="EN-US">viewmenu.testcontext。</span><br />
<br />
另外还需要在需要增加该快捷键的编辑器或者视图对应类中增加如下代码（视图类在代码的createControl方法，编辑器类在代码的init方法）：<br />
<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">IContextService&nbsp;contextService&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />(IContextService)&nbsp;getSite().getService(IContextService.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />contextService.activateContext(</span><span style="color: #000000">"</span><span style="color: #000000">viewmenu.testcontext</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
</span>
<img src ="http://www.blogjava.net/jacky9881/aggbug/325681.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacky9881/" target="_blank">玩转Java</a> 2010-07-09 20:52 <a href="http://www.blogjava.net/jacky9881/archive/2010/07/09/keybind.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转载 Eclipse 插件开发 -- 深入理解菜单（Menu）功能及其扩展点</title><link>http://www.blogjava.net/jacky9881/archive/2010/07/03/menu.html</link><dc:creator>玩转Java</dc:creator><author>玩转Java</author><pubDate>Sat, 03 Jul 2010 08:00:00 GMT</pubDate><guid>http://www.blogjava.net/jacky9881/archive/2010/07/03/menu.html</guid><wfw:comment>http://www.blogjava.net/jacky9881/comments/325151.html</wfw:comment><comments>http://www.blogjava.net/jacky9881/archive/2010/07/03/menu.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jacky9881/comments/commentRss/325151.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacky9881/services/trackbacks/325151.html</trackback:ping><description><![CDATA[原文地址：http://www.fengfly.com/plus/view-179398-1.html<br />
<br />
<p>菜单是各种软件及开发平台会提供的必备功能，Eclipse 也不例外，提供了丰富的菜单，包括主菜单（Main Menu），视图 / 编辑器菜单（ViewPart/Editor Menu）和上下文菜单（Context Menu）。在 Eclipse 中，几乎所有的 Workbench Part 提供了人性化的菜单，大大方便了用户的操作。因此，如何扩展 Eclipse 的菜单功能，并实现特定于我们自己插件的菜单，是插件开发者必须掌握的重要技能，同时，Eclipse 提供了丰富的扩展点供开发人员使用。本文将首先介绍 Eclipse 中的菜单，然后详细说明如何进行扩展，最后以一个实例的形式引导读者深入理解 Eclipse 的菜单功能。</p>
<p>　　引言</p>
<p>　　Eclipse 具有丰富的菜单功能，给开发人员提供了很好的用户体验。总体而言，Eclipse 菜单种类包括视图 / 编辑器菜单，主菜单（Main Menu），视图 / 编辑器菜单（ViewPart/EditorPart Menu）和上下文菜单（Context Menu）。插件开发人员通过灵活应用这些菜单，可以给用户提供很好的体验。由于视图和编辑器菜单功能类似，因此本文重点讲述视图菜单（视图下拉菜单及其工具栏菜单），除此之外，还将讲述主菜单和上下文菜单。</p>
<p>　　如图 1 所示为 Project Explorer 视图的菜单，包括视图下拉菜单和工具栏菜单（折叠树节点）。通常而言，出现在视图工具栏的菜单都会出现在视图的下拉菜单，也就是说，比较常用的视图菜单放在视图的工具栏。</p>
<p>图 1. Project Explorer 视图的菜单</p>
<p>&nbsp;<a id="link" href="http://www.fengfly.com/uploads/allimg/20100606/201006062051271420.jpeg" target="_blank"><img id="image" src="http://www.fengfly.com/uploads/allimg/20100606/201006062051271420.jpeg"  alt="" /></a></p>
<p>&nbsp;</p>
<p>　　如图 2 所示为 Project Explorer 视图中的上下文菜单，只有当我们右键点击时才会出现。通常而言，出现频率较高的菜单项才会出现在菜单中。上下文菜单具有很强的灵活项，它可以随着我们点击的对象不同，弹出的菜单也会有相应的变化。</p>
<p>图 2. Project Explorer 视图中的上下文菜单</p>
<p><a id="link" href="http://www.fengfly.com/uploads/allimg/20100606/201006062051271421.jpeg" target="_blank"><img id="image" src="http://www.fengfly.com/uploads/allimg/20100606/201006062051271421.jpeg"  alt="" /></a><br />
　　如图 3 所示为 Eclipse 的主菜单，包括最上面的主菜单项（不可移动）及其下面的工具栏菜单（可以移动，并且 Eclipse 提供了显示 / 不显示这些菜单的功能），Eclipse 并不建议我们为每一个插件都添加新的主菜单，这样容易造成冗余，而且不方便用户操作。通常，我们可以把菜单项添加到 Eclipse 已有的菜单，如插件的查找功能可以添加一个查找菜单项到 Eclipse 的 Search 主菜单上。</p>
<p>图 3. Eclipse 的主菜单</p>
<p><a id="link" href="http://www.fengfly.com/uploads/allimg/20100606/201006062051271422.jpeg" target="_blank"><img id="image" src="http://www.fengfly.com/uploads/allimg/20100606/201006062051271422.jpeg"  alt="" /></a><br />
　　前面讲到 Eclipse 的各种菜单，那么，如何在开发插件或 RCP 应用程序的时候添加这些菜单？本文下面的篇幅将详细介绍如何扩展 Eclipse 的菜单功能，使读者深入了解 Eclipse 的菜单功能，并能够开发具有这些菜单的应用程序。因此，必须掌握三方面的内容：菜单种类，菜单的扩展点，菜单控制（显示 / 隐藏或启用 / 禁用菜单项）。下面从概念上介绍这三方面内容，下一小节将会进行详细介绍。</p>
<p>　　菜单种类</p>
<p>　　正如前面所讲到的，Eclipse 的菜单包括视图菜单，主菜单及上下文菜单三个种类。</p>
<p>　　菜单项的扩展点</p>
<p>　　Eclipse 提供了两种扩展点供用户添加菜单项到相应的位置。这两种扩展点为 org.eclipse.ui.commands（本文简称为 Commands 方式）和 org.eclipse.ui.actionSets（本文简称为 Actions 方式）。Actions 方式为界面上不同区域的表现方式提供了相应的扩展点，并且没有分离其界面表现和内在实现。恰恰相反，Commands 方式通过三步有效的达到界面表现和内部实现的分离：首先，通过 org.eclipse.ui.commands 扩展点创建命令和类别（Category），并且可以把某些命令放在一个类别（Category）中；然后，通过 org.eclipse.ui.menus 指定命令出现在界面的哪个区域（视图菜单 / 主菜单 / 上下文菜单）；最后通过 org.eclipse.ui.handlers 指定命令的实现。因此，Eclipse 推荐新开发的插件使用 Commands 来创建您的界面菜单。当然，由于 Actions 在现有的插件中用得比较多，如果我们需要扩展或基于之前的插件开发，也需要对其进行了解。除此之外，针对上下文菜单，虽然 Commands 和 Actions 方式均可以创建上下文菜单，但是 Eclipse 还提供了另外一种创建上下文菜单的扩展点 org.eclipse.ui.popupMenus（本文简称为 popupMenus 方式），本文将就这三种扩展点做详细的介绍。</p>
<p>　　菜单控制</p>
<p>　　菜单控制是一个非常常见的功能，例如，随着选定的内容或当前窗口的不同，菜单中的菜单项会有相应的变化（显示 / 隐藏或启用 / 禁用菜单项），因此，如何控制菜单是插件开发人员必须掌握的知识。Eclipse 为菜单控制提供了两种方法，一种是通过扩展点；另一种是通过 API 的方式编写程序控制。</p>
<p>　　Eclipse 菜单功能及其扩展点</p>
<p>　　至此，我们对 Eclipse 菜单有了感观的认识。由上一节我们可知，要深入理解 Eclipse 菜单功能，我们需要从三个方面去掌握：菜单种类，菜单的扩展点和菜单控制。下面将进行详细讲述。</p>
<p>　　菜单种类</p>
<p>　　针对各种菜单，Eclipse 提供了相应的扩展点，因此，开发人员可以通过这些扩展点把菜单放到界面的不同区域，详细内容请参考 2.2 小节。</p>
<p>　　菜单的扩展点</p>
<p>　　视图菜单的扩展点</p>
<p>　　采用 Commands 方式创建视图菜单，需要引入 org.eclipse.ui.menus 扩展点；而 Actions 方式需要引入 org.eclipse.ui.actionSets.</p>
<p>　　1、视图菜单（Commands 方式）：</p>
<p>　　MenuContribution locationURI = &#8220;[Scheme]:[id]?[argument-list]&#8221;</p>
<p>　　其中，Scheme 为该菜单项出现的区域，menu 为视图的下拉菜单，toolbar 为视图的工具栏菜单；id 为菜单区域 ID；argument-list 为该菜单项出现在指定菜单的位置。</p>
<p>　　例如：在 ProbelmView 的下拉菜单加一个菜单项，其 MenuContribution 的 locationURI 应为：menu:org.eclipse.ui.views.ProblemView?after=additions；在 ProblemView 的工具栏菜单中加入一个菜单项，其 locationURI 应为：toolbar:org.eclipse.ui.views.ProblemView?after=additions。</p>
<p>　　2、视图菜单（Actions 方式）：</p>
<p>　　采用 Actions 方式创建菜单，需要引入 org.eclipse.ui.actionSets 扩展点，并通过设定 action 的 menubarPath 指定下拉菜单 / 菜单项出现的位置；通过设定 action 的 toolbarPath 设定工具栏菜单 / 菜单项出现的位置。</p>
<p>　　例如，添加一个下拉菜单项到 Problems 视图中，其 menubarPath 应为：</p>
<p>　　org.eclipse.ui.views.ProblemView/additions</p>
<p>　　主菜单的扩展点</p>
<p>　　1、主菜单（Commands 方式）</p>
<p>　　通过 Commands 方式把菜单项添加到主菜单及其工具栏上，和视图菜单一样，也是通过扩展点 org.eclipse.ui.menus 实现，需要设定其 menuContribution 的 locationURI。</p>
<p>　　例如，添加一个菜单（菜单可以包含若干个菜单项）到主菜单一栏中，其 locationURI 为：</p>
<p>　　menu:org.eclipse.ui.main.menu?after=additions</p>
<p>　　添加一个菜单到工具栏之中，其 locationURI 为：</p>
<p>　　toolbar:org.eclipse.ui.main.toolbar?after=additions</p>
<p>　　当然，我们也可以把菜单项添加到已经存在的菜单当中，例如添加一个菜单项到 Eclipse 的 Search 主菜单当中，其 locationURI 为：</p>
<p>　　menu:org.eclipse.search.menu?dialogGroup</p>
<p>　　2、主菜单（Actions 方式）</p>
<p>　　通过 Actions 方式把菜单项添加到主菜单及其工具栏上，和视图菜单一样，也是通过扩展点 org.eclipse.ui.actionSets 实现，需要设定 action 的 menubarPath 和 toolbarPath 实现。</p>
<p>　　例如，添加一个菜单项到 Eclipse 的 Search 主菜单中，其 menubarPath 应为：</p>
<p>　　org.eclipse.search.menu/dialogGroup</p>
<p>　　注意：如果采用上述方式添加一个菜单项到 Search 主菜单，当我们运行时并没有出现添加的菜单项，这时候需要换一个 workspace，其原因是 Eclipse 缓存了与其相关的某些信息在 workspace 当中。</p>
<p>　　上下文菜单的扩展点</p>
<p>　　上下文菜单除了通过 Commands 和 Actions 方式添加，还可以使用扩展点 org.eclipse.ui.popupMenus 方式添加，下面分别进行介绍。</p>
<p>　　1、上下文菜单（Commands 方式）</p>
<p>　　Commands 方式与添加视图菜单和主菜单的方式一样，通过设定其 menuContribution 的 locationURI 来实现。</p>
<p>　　例如，添加一个上下文菜单到 Problems 视图中，其 locationURI 为：</p>
<p>　　popup:org.eclipse.ui.views.ProblemView?after=additions。</p>
<p>　　如果我们想让某个上下文菜单项出现在任何区域，则可以使用下面的 locationURI：</p>
<p>　　popup:org.eclipse.ui.popup.any?after=additions</p>
<p>　　2、上下文菜单（Actions 方式）</p>
<p>　　Actions 方式没有直接提供扩展点添加上下文菜单，但是我们可以通过编程的方式实现，如下代码清单 1 为 TreeViewer 添加上下文菜单，通过 IMenuManager 的 add 方法添加 actions。</p>
<p>清单 1. 通过 Actions 方式编程实现添加上下文菜单</p>
<p>　private　void　hookContextMenu()　{　<br />
　　IMenuManager　fMenuMgr　=　new　MenuManager(&#8220;#PopupMenu&#8221;);　<br />
　　fMenuMgr.setRemoveAllWhenShown(true);　<br />
　　//　添加　Actions　<br />
　　fMenuMgr.add(action　&#8230;　)　<br />
　　fMenuMgr.createContextMenu(treeViewer.getControl());　<br />
　　treeViewer.getControl().setMenu(fMenu);　<br />
　　getSite().registerContextMenu(fMenuMgr,　treeViewer);　<br />
　}　</p>
<p>　　3、上下文菜单（popupMenus 方式）</p>
<p>　　通过 popupMenus 扩展点实现上下文菜单，需要设定 objectContribution 的 objectClass 属性把上下文菜单添加到相应的区域。</p>
<p>　　例如，如果我们想当用户点击 Eclipse 中的资源时，弹出的上下文菜单包括某个菜单项，我们可以设定 objectClass 属性为：</p>
<p>　　org.eclipse.core.resources.IResource</p>
<p>　　通过 Commands 方式创建菜单项</p>
<p>　　通过 Commands 方式创建菜单项，首先需要创建 Command，通过扩展点 org.eclipse.ui.commands，然后我们可以把这个 Command 放到任何区域，上一小节已经讲到，通过 org.eclipse.ui.menus 扩展点确定菜单创建的区域，最后通过扩展点 org.eclipse.ui.handlers 定义这个 command 的具体行为。</p>
<p>　　在创建 Command 时，我们可以先创建一个 Category，并把相关的一些命令放到这个 Category 中，这样有利于管理。代码清单 2 创建一个 Command(&#8220;Show in Glossary Explorer&#8221;)，并放到一个 Category 中，然后把该 Command 放到 BGSearchResultView 视图的上下文菜单中，最后通过扩展 org.eclipse.ui.handlers 定义该 Command 的实现类。</p>
<p>清单 2. 通过 Commands 方式添加菜单项</p>
<p>　&lt;!--　添加　command　--&gt;　<br />
　&lt;extension　<br />
　　　point="org.eclipse.ui.commands"&gt;　<br />
　　&lt;category　<br />
　　　description="Business　Glossary"　<br />
　　　id="com.ibm.bg.ui.commands.category"　<br />
　　　name="%category.BusinessGlossary.name"&gt;　<br />
　　&lt;/category&gt;　<br />
　　&lt;command　<br />
　　　categoryId="com.ibm.bg.ui.commands.category"　<br />
　　　description="Show　in　Glossary　Explorer"　<br />
　　　id="com.ibm.bg.ui.commands.BGShowInBrowser"　<br />
　　　name="%command.ShowInGE.name"&gt;　<br />
　　&lt;/command&gt;　<br />
　&lt;/extension&gt;　<br />
　&lt;!--　把　Command　放到界面的对应区域　--&gt;　<br />
　&lt;extension　<br />
　　　　point="org.eclipse.ui.menus"&gt;　<br />
　　&lt;menuContribution　locationURI=　<br />
　　"popup:com.ibm.bg.internal.ui.search.BGSearchResultView?after=additions"&gt;　<br />
　　　&lt;command　<br />
　　　　　　commandId="com.ibm.bg.ui.commands.BGShowInBrowser"　<br />
　　　　　　style="push"　<br />
　　　　　　tooltip="%command.ShowInGE.tooltip"&gt;　<br />
　　　&lt;/command&gt;　<br />
　　&lt;/menuContribution&gt;　<br />
　&lt;/extension&gt;　<br />
　&lt;!--　定义　command　的实现类　--&gt;　<br />
　&lt;extension　<br />
　　　point="org.eclipse.ui.handlers"&gt;　<br />
　　&lt;handler　<br />
　　　　　class="com.ibm.bg.internal.ui.handlers.BGShowInBrowser"　<br />
　　　　　commandId="com.ibm.bg.ui.commands.BGShowInBrowser"&gt;　<br />
　　&lt;/handler&gt;　<br />
　&lt;/extension&gt;　</p>
<p>　　通过 Actions 方式创建菜单项</p>
<p>　　正如前面讲到，Actions 方式没有分离界面的表现和内部实现，因此，所有这些均通过 action 来完成。如下代码清单 3 为添加一个 Search 菜单项到 Eclipse 的 Search 主菜单（通过 action 的 menubarPath 指定）中，其中 class 对应的值为该 Action 的实现类，该类需要实现接口 IWorkbenchWindowActionDelegate。</p>
<p>清单 3. 通过 Actions 方式添加菜单项</p>
<p>　&lt;extension　<br />
　　　point="org.eclipse.ui.actionSets"&gt;　<br />
　　&lt;actionSet　<br />
　　　　　id="com.ibm.bg.ui.workbenchActionSet"　<br />
　　　　　label="%category.name.0"　<br />
　　　　　visible="true"&gt;　<br />
　　　&lt;action　<br />
　　　　　　class="com.ibm.bg.internal.ui.handlers.BGSearchHandler"　<br />
　　　　　　definitionId="com.ibm.bg.ui.commands.BGSearch"　<br />
　　　　　　icon="icons/search.png"　<br />
　　　　　　id="com.ibm.bg.ui.commands.BGSearch"　<br />
　　　　　　label="%action.searchGlossayInMainMenu.label"　<br />
　　　　　　menubarPath="org.eclipse.search.menu/dialogGroup"　<br />
　　　　　　style="push"&gt;　<br />
　　　&lt;/action&gt;　<br />
　　&lt;/actionSet&gt;　<br />
　&lt;/extension&gt;　</p>
<p>　　通过 popupMenus 方式创建菜单项</p>
<p>　　popupMenus 方式创建上下文菜单项也是通过 action 来实现，下面例子为添加一个菜单项到用户右击 IGraphicalEditPart 对象时弹出的上下文菜单，通过 menubarPath 指定该 Action 出现的区域，通过 class 指定该 action 的实现类，该类需要实现接口 IObjectActionDelegate。</p>
<p>清单 4. 通过 popupMenus 方式添加菜单项</p>
<p>　&lt;extension　<br />
　　　point="org.eclipse.ui.popupMenus"&gt;　<br />
　　&lt;objectContribution　<br />
　　　　　adaptable="false"　<br />
　　　　　id="com.ibm.bg.uml.objectContributions.BGAssignToGlossary"　<br />
　　　　　objectClass="org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart"&gt;　<br />
　　　&lt;action　<br />
　　　　　　class="com.ibm.bg.internal.uml.actions.BGAssignToGlossary"　<br />
　　　　　　enablesFor="+"　<br />
　　　　　　icon="icons/assign.png"　<br />
　　　　　　id="com.ibm.bg.internal.uml.actions.BGAssignToGlossary"　<br />
　　　　　　label="%BGAssignToGlossary.item"　<br />
　　　　　　menubarPath="com.ibm.bg.uml.popupMenuGroup"&gt;　<br />
　　　&lt;/action&gt;　<br />
　　&lt;/objectContribution&gt;　<br />
　&lt;/extension&gt;　</p>
<p>　　菜单控制</p>
<p>　　视图菜单的控制主要包括启用 / 禁用，显示 / 隐藏菜单。</p>
<p>　　通过 Command 方式创建的菜单，可以通过 org.eclipse.ui.commands 的 visibleWhen 属性控制菜单的隐藏和显示，通过 org.eclipse.ui.handlers 的 activewhen 或 enabledWhen 控制菜单的启用或禁用。</p>
<p>　　通过 Actions 方式创建的菜单，可以通过 action 的 enablement 属性控制菜单的启用 / 禁用。</p>
<p>　　通过 popupMenus 方式创建的菜单，可以通过 objectContribution 的 visibility 和 enablement 来设置该 objectContribution 下的 action 的显示 / 隐藏和启用 / 禁用，我们也可以设置 action 的 enablement 来控制该菜单的启用 / 禁用。</p>
<p>　　这里不详细讲述 enablement，visibleWhen 和 enabledWhen 的参数及如何设置，读者可以参考第三节的例子和本文的参考文献。</p>
<p>　　编程实践</p>
<p>　　本文将结合前两节讲到的知识，以例子的形式说明如何创建并且控制菜单。首先创建一个视图（Menu Example），然后分别通过 Commands，Actions 和 popupMenus 方式创建若干个菜单，并添加相应的菜单控制点。</p>
<p>　　创建 Menu Example 视图</p>
<p>　　扩展 org.eclipse.views 创建&#8220;Menu Example&#8221;视图，如下代码清单 5 为创建视图的 xml 代码。</p>
<p>清单 5. 扩展 org.eclipse.ui.views 创建视图</p>
<p>　&lt;extension　<br />
　　　point="org.eclipse.ui.views"&gt;　<br />
　　&lt;category　<br />
　　　　　id="com.free.menu.category"　<br />
　　　　　name="Menu　Example　View"&gt;　<br />
　　&lt;/category&gt;　<br />
　　&lt;view　<br />
　　　　　category="com.free.menu.category"　<br />
　　　　　class="com.free.menu.view.MenuExplorer"　<br />
　　　　　id="com.free.menu.view.MenuExplorer"　<br />
　　　　　name="Menu　Explorer"　<br />
　　　　　restorable="true"&gt;　<br />
　　&lt;/view&gt;　<br />
　&lt;/extension&gt;　</p>
<p>　　创建 Commands</p>
<p>　　采用 Command 方式创建&#8220;Menu Example&#8221;主菜单（包含 AngryCommand 和 JokeCommand 两个菜单项），并且基于这两个菜单项创建了 Menu Example 视图的下拉菜单和工具栏菜单，及其 TreeViewer 的上下文菜单。</p>
<p>　　如下代码清单 6 为扩展 org.eclipse.ui.commands 创建 Menu Example 命令和类别，并且包含两个命令：Joke Command 和 Angry Command。</p>
<p>清单 6. 扩展 org.eclipse.ui.commands 创建命令</p>
<p>　&lt;extension　<br />
　　　point="org.eclipse.ui.commands"&gt;　<br />
　　&lt;category　<br />
　　　　　id="com.free.menu.category"　<br />
　　　　　name="Menu　Example"&gt;　<br />
　　&lt;/category&gt;　<br />
　　&lt;command　<br />
　　　　　categoryId="com.free.menu.category"　<br />
　　　　　id="com.free.menu.commands.jokeCommand"　<br />
　　　　　name="Joke　Command"&gt;　<br />
　　&lt;/command&gt;　<br />
　　&lt;command　<br />
　　　　　categoryId="com.free.menu.category"　<br />
　　　　　id="com.free.menu.commands.angryCommand"　<br />
　　　　　name="Angry　Command"&gt;　<br />
　　&lt;/command&gt;　<br />
　&lt;/extension&gt;　</p>
<p>　　关联 Commands 到主菜单</p>
<p>　　如下代码清单 7 为扩展 org.eclipse.ui.menus，并基于前面创建的 Comands，添加一个主菜单 Menu Example，并且包含 Joke Command 和 Angry Command 菜单项。</p>
<p>清单 7. 创建 Menu Example 主菜单</p>
<p>　&lt;menuContribution　<br />
　　　locationURI="menu:org.eclipse.ui.main.menu?after=additions"&gt;　<br />
　　&lt;menu　<br />
　　　id="com.free.menu.MenuExample"　<br />
　　　　　label="Menu　Example"&gt;　<br />
　　　&lt;command　<br />
　　　　　　commandId="com.free.menu.commands.jokeCommand"　<br />
　　　　　　style="push"&gt;　<br />
　　　&lt;/command&gt;　<br />
　　　&lt;command　<br />
　　　　　　commandId="com.free.menu.commands.angryCommand"　<br />
　　　　　　style="push"&gt;　<br />
　　　&lt;/command&gt;　<br />
　　&lt;/menu&gt;　<br />
　&lt;/menuContribution&gt;　</p>
<p>　　Commands 的实现类</p>
<p>　　如下代码清单 9 所示扩展 org.eclipse.ui.handlers 为 Joke Command 和 Angry Command 创建事件处理类，其中 Joke Command 通过 enabledWhen 属性控制该菜单项是否启用，当我们同时选择了两个对象时 Joke Command 处于启用状态，否则为禁用。</p>
<p>清单 9. 扩展 org.eclipse.ui.handlers 为 Commands 创建实现类</p>
<p>　&lt;extension　<br />
　　　point="org.eclipse.ui.handlers"&gt;　<br />
　　&lt;handler　<br />
　　　　　class="com.free.menu.actions.JokeCommand"　<br />
　　　　　commandId="com.free.menu.commands.jokeCommand"&gt;　<br />
　　　&lt;enabledWhen&gt;　<br />
　　　　　&lt;count　<br />
　　　　　　　　value="2"&gt;　<br />
　　　　　&lt;/count&gt;　<br />
　　　&lt;/enabledWhen&gt;　<br />
　　&lt;/handler&gt;　<br />
　　&lt;handler　<br />
　　　　　class="com.free.menu.actions.AngryCommand"　<br />
　　　　　commandId="com.free.menu.commands.angryCommand"&gt;　<br />
　　&lt;/handler&gt;　<br />
　&lt;/extension&gt;　</p>
<p>　　创建 Action 并关联到 Eclipse 的 Search 主菜单</p>
<p>　　采用 Actions 方式在 Eclipse 的主菜单 Search 中添加创建菜单项 SmileAction。扩展 org.eclipse.ui.actionSets 在 Eclipse 的主菜单 Search 中添加一个菜单项 Smile Action。如下代码清单 10 所示创建该 action 并添加到 search 主菜单，只有当我们选择至少一个对象时（设置 enablesFor 属性为&#8220;+&#8221;），该菜单项才处于启用状态。</p>
<p>清单 10. 通过 Actions 方式创建菜单项</p>
<p>　&lt;extension　<br />
　　　point="org.eclipse.ui.actionSets"&gt;　<br />
　　&lt;actionSet　<br />
　　　　　id="com.free.menu.actionSet.MenuExample"　<br />
　　　　　label="Menu　Example"　<br />
　　　　　visible="true"&gt;　<br />
　　　&lt;action　<br />
　　　　　　class="com.free.menu.actions.SmileAction"　<br />
　　　　　　enablesFor="+"　<br />
　　　　　　icon="icons/searchres.gif"　<br />
　　　　　　id="com.free.menu.actions.smileAction"　<br />
　　　　　　label="Smile　Action"　<br />
　　　　　　menubarPath="org.eclipse.search.menu/dialogGroup"　<br />
　　　　　　style="push"&gt;　<br />
　　　&lt;/action&gt;　<br />
　　&lt;/actionSet&gt;　<br />
　&lt;/extension&gt;　</p>
<p>　　pupupMenus 方式创建 Action 并关联到 IResource 资源的上下文菜单</p>
<p>　　扩展 org.eclipse.ui.popupMenus 创建菜单&#8220;Menu Example&#8221;，该菜单包含一个菜单项 HelloAction。当我们在 Eclipse 任何区域右击 org.eclipse.core.resources.IResource 资源时弹出的上下文菜单中会出现&#8220;Menu Example&#8221;菜单。如下代码清单 11 为创建该上下文菜单的 xml 代码。</p>
<p>清单 11. popupMenus 方式创建上下文菜单</p>
<p>　&lt;extension　<br />
　　　point="org.eclipse.ui.popupMenus"&gt;　<br />
　　&lt;objectContribution　<br />
　　　　　adaptable="true"　<br />
　　　　　id="com.free.menu.popupMenu"　<br />
　　　　　objectClass="org.eclipse.core.resources.IResource"&gt;　<br />
　　　&lt;menu　<br />
　　　　　　label="Menu　Example"　<br />
　　　　　　path="additions"　<br />
　　　　　　id="com.free.menu.popupSubMenu"&gt;　<br />
　　　　　&lt;separator　<br />
　　　　　　　　name="additions"&gt;　<br />
　　　　　&lt;/separator&gt;　<br />
　　　&lt;/menu&gt;　<br />
　　　&lt;action　<br />
　　　　　　label="Hello　Action"　<br />
　　　　　　class="com.free.menu.popup.actions.HelloAction"　<br />
　　　　　　menubarPath="com.free.menu.popupSubMenu/additions"　<br />
　　　　　　enablesFor="1"　<br />
　　　　　　id="com.free.menu.newAction"&gt;　<br />
　　　&lt;/action&gt;　<br />
　　&lt;/objectContribution&gt;　<br />
　&lt;/extension&gt;　</p>
<p>　　pupupMenus 方式创建 Action 并关联到 IResource 资源的上下文菜单</p>
<p>　　扩展 org.eclipse.ui.popupMenus 创建菜单项 GreetAction 和 CryAction，当我们右击 Menu Example 视图中的 TreeViewer 节点时弹出。如下代码清单 12 所示扩展 org.eclipse.ui.popupMenus 为 Menu Example 视图创建 GreetAction 和 CryAction 上下文菜单项。使用 visiblity 的 objectState 属性控制菜单项的可见状态，使用该属性要求其选择的对象实现了 org.eclipse.ui.IActionFilter 接口，具体可参见 Person 类的实现。</p>
<p>清单 12. 扩展 org.eclipse.ui.popupMenus 创建菜单</p>
<p>　&lt;extension　<br />
　　　point="org.eclipse.ui.popupMenus"&gt;　<br />
　　&lt;objectContribution　<br />
　　　　　adaptable="false"　<br />
　　　　　id="com.free.menu.views.popupMenu"　<br />
　　　　　objectClass="com.free.menu.model.Person"&gt;　<br />
　　　&lt;action　<br />
　　　　　　class="com.free.menu.actions.GreetAction"　<br />
　　　　　　enablesFor="+"　<br />
　　　　　　id="com.free.menu.actions.greetAction"　<br />
　　　　　　label="Greet　Action"　<br />
　　　　　　menubarPath="additions"&gt;　<br />
　　　&lt;/action&gt;　<br />
　　　&lt;visibility&gt;　<br />
　　　　　&lt;objectState　<br />
　　　　　　　　name="firstName"　<br />
　　　　　　　　value="Dan"&gt;　<br />
　　　　　&lt;/objectState&gt;　<br />
　　　&lt;/visibility&gt;　<br />
　　&lt;/objectContribution&gt;　<br />
　&lt;/extension&gt;　<br />
　&lt;extension　<br />
　　　point="org.eclipse.ui.popupMenus"&gt;　<br />
　　&lt;objectContribution　<br />
　　　　　adaptable="false"　<br />
　　　　　id="com.free.menu.views.popupMenu2"　<br />
　　　　　objectClass="com.free.menu.model.Person"&gt;　<br />
　　　&lt;action　<br />
　　　　　　class="com.free.menu.actions.CryAction"　<br />
　　　　　　enablesFor="+"　<br />
　　　　　　id="com.free.menu.actions.cryAction"　<br />
　　　　　　label="Cry　Action"　<br />
　　　　　　menubarPath="additions"&gt;　<br />
　　　　　&lt;enablement&gt;　<br />
　　　　　　&lt;objectState　<br />
　　　　　　　　　name="firstName"　<br />
　　　　　　　　　value="David"&gt;　<br />
　　　　　　&lt;/objectState&gt;　<br />
　　　　　&lt;/enablement&gt;　<br />
　　　&lt;/action&gt;　<br />
　　　&lt;visibility&gt;　<br />
　　　　　&lt;objectState　<br />
　　　　　　　　name="lastName"　<br />
　　　　　　　　value="Rubel"&gt;　<br />
　　　　&lt;/objectState&gt;　<br />
　　　&lt;/visibility&gt;　<br />
　　&lt;/objectContribution&gt;　<br />
　&lt;/extension&gt;　</p>
<p>　　Menu Example 视图的代码实现类</p>
<p>　　如下代码清单 13 所示为 Menu Example 视图的代码，该视图中有一个 TreeViewer，并通过函数 hookContextMenu 把上下文菜单关联到 TreeViewer。其中函数 viewMenuAction 用于更新菜单的状态，它首先获取视图菜单，然后调用 IMenuManager 的 update 方法更新对应菜单项的状态，从而达到控制菜单的目的。</p>
<p>清单 13. Menu Example 视图代码</p>
<p>　public　class　MenuExplorer　extends　ViewPart　{　<br />
　　private　TreeViewer　treeViewer;　<br />
　　private　MenuManager　fMenuMgr;　<br />
　　private　Menu　fMenu;　<br />
　　private　static　MenuExplorer　fInstance　=　null;　<br />
　　public　MenuExplorer()　{　<br />
　　　　fInstance　=　this;　<br />
　　}　<br />
　　public　static　MenuExplorer　getInstance(){　<br />
　　　　return　fInstance;　<br />
　　}　<br />
　　public　void　createPartControl(Composite　parent)　{　<br />
　　　　treeViewer　=　new　TreeViewer　(parent,　SWT.MULTI);　<br />
　　　　treeViewer.setLabelProvider(new　PersonListLabelProvider());　<br />
　　　　treeViewer.setContentProvider(new　PersonTreeContentProvider());　<br />
　　　　treeViewer.setInput(Person.example());　<br />
　　　　this.getSite().setSelectionProvider(treeViewer);　<br />
　　　　hookContextMenu();　<br />
　　　　fInstance　=　this;　<br />
　　　　　<br />
　　}　<br />
　　public　void　setViewMenuActionState(boolean　state){　　　　　<br />
　　　　JokeCommand.setState(state);　<br />
　　　　viewMenuAction();　<br />
　　}　<br />
　　private　void　viewMenuAction()　{　<br />
　　　　IActionBars　bars=　getViewSite().getActionBars();　<br />
　　　　final　IMenuManager　menu=　bars.getMenuManager();　　　<br />
　　　　　<br />
　　　　UIOperation.asyncExecCommand(new　Runnable(){　<br />
　　　　　　public　void　run()　{　<br />
　　　　　　　　menu.update("com.free.menu.commands.jokeAction");　<br />
　　　　　　}　　　　　　　<br />
　　　　});　　　　　<br />
　　}　<br />
　　private　void　hookContextMenu()　{　<br />
　　　　fMenuMgr　=　new　MenuManager("#PopupMenu");　<br />
　　　　fMenuMgr.setRemoveAllWhenShown(true);　<br />
　　　　fMenuMgr.addMenuListener(new　IMenuListener()　{　<br />
　　　　　　public　void　menuAboutToShow(IMenuManager　manager)　{　　　　　　　　　<br />
　　　　　　}　<br />
　　　　});　<br />
　　　　fMenu　=　fMenuMgr.createContextMenu(treeViewer.getControl());　<br />
　<br />
　　　　treeViewer.getControl().setMenu(fMenu);　<br />
　　　　getSite().registerContextMenu(fMenuMgr,　treeViewer);　　　　　　　　<br />
　　}　　　<br />
　　public　void　setFocus()　{　<br />
　　　　treeViewer.getTree().setFocus();　<br />
　<br />
　　}　<br />
　}　</p>
<p>　　Person 类的实现</p>
<p>　　如下代码清单 14 为 Person 类的实现，用于表示 MenuExample 视图中 TreeViewer 的一个节点，它实现了 IActionFilter 接口，通过 testAttribute 来确定是否显示 / 隐藏菜单（其中 target 表示用户选择的对象，name/value 对应于 plugin.xml 文件中 objectState 的 name/value）.</p>
<p>清单 14. Person 类实现</p>
<p>　public　class　Person　implements　IActionFilter　{　<br />
　<br />
　　private　String　firstName　=　"John";　<br />
　　private　String　lastName　=　"Doe";　<br />
　　protected　int　age　=　37;　<br />
　　public　Person[]　children　=　new　Person[0];　<br />
　　public　Person　parent　=　null;　<br />
　　public　Person(String　firstName,　String　lastName,　int　age)　{　<br />
　　　　this.firstName　=　firstName;　<br />
　　　　this.lastName　=　lastName;　<br />
　　　　this.age　=　age;　<br />
　　}　<br />
　　public　Person(String　firstName,　String　lastName,　int　age,　Person[]　children)　{　<br />
　　　　this(firstName,　lastName,　age);　<br />
　　　　this.children　=　children;　<br />
　　　　for　(int　i　=　0;　i　&lt;　children.length;　i++)　{　<br />
　　　　　　children[i].parent　=　this;　<br />
　　　　}　<br />
　　}　<br />
　　public　String　getFirstName()　{　<br />
　　　　return　this.firstName;　<br />
　　}　<br />
　　public　String　getLastName()　{　<br />
　　　　return　this.lastName;　<br />
　　}　<br />
　　public　static　Person[]　example()　{　<br />
　　　　return　new　Person[]　{　<br />
　　　　　　　　new　Person("Dan",　"Rubel",　38,　new　Person[]　{　<br />
　　　　　　　　　　　　new　Person("Beth",　"Rubel",　8),　<br />
　　　　　　　　　　　　new　Person("David",　"Rubel",　3)　}),　<br />
　　　　　　　　new　Person("Eric",　"Clayberg",　39,　new　Person[]　{　<br />
　　　　　　　　　　　　new　Person("Lauren",　"Clayberg",　6),　<br />
　　　　　　　　　　　　new　Person("Lee",　"Clayberg",　4)　}),　<br />
　　　　　　　　new　Person("Mike",　"Taylor",　52)　};　<br />
　　}　<br />
　　public　String　toString()　{　<br />
　　　　return　firstName　+　"　"　+　lastName;　<br />
　　}　<br />
　　public　boolean　testAttribute(Object　target,　String　name,　String　value)　{　<br />
　<br />
　　　　if　(target　instanceof　Person)　{　<br />
　　　　　　Person　person　=　(Person)　target;　<br />
　　　　　　if　(name.equals("firstName")　&amp;&amp;　value.equals(person.getFirstName()))　{　<br />
　　　　　　　　return　true;　<br />
　　　　　　}　<br />
　<br />
　　　　　　if　(name.equals("lastName")　&amp;&amp;　value.equals(person.getLastName()))　{　<br />
　　　　　　　　return　true;　<br />
　　　　　　}　<br />
　　　　}　<br />
　　　　return　false;　<br />
　　}　<br />
　}　</p>
<p>　　总结</p>
<p>　　至此为止，已经把 Eclipse 菜单功能及其扩展点涉及到的类 / 接口 /API 进行了详细的说明，相信读者已经有清晰的认识了。对于前面提到 popupMenus 方式创建上下文菜单，要求选择的对象实现 IActionFilter 接口，但是，如果开发人员正在使用 gmf 进行开发，那么我们可以不必要求选择的对象实现 IActionFilter，我们可以通过扩展 org.eclipse.gmf.runtime.common.ui.services.action.actionFilterProviders 对菜单项进行控制，如下代码清单 15 为扩展该 extension point 的 xml 代码，我们可以定义多个属性（&lt;Attribute&gt; &#8230; &lt;/Attribute），其中 Attribute 的 name 和 value 对应于 visibility 的 objectState 中的 name 和 value。</p>
<p>清单 15. 通过 actionFilterProviders 扩展点实现对菜单的控制</p>
<p>　&lt;extension　<br />
　point="org.eclipse.gmf.runtime.common.ui.services.action.actionFilterProviders"&gt;　<br />
　　　&lt;ActionFilterProvider　<br />
　　　　　　class="com.free.menu.PopupActionFilterProvider"&gt;　<br />
　　　　&lt;Priority　<br />
　　　　　　　name="Medium"&gt;　<br />
　　　　&lt;/Priority&gt;　<br />
　　　　&lt;Attribute　<br />
　　　　　　　name="com.ibm.bg.uml.search.isSupportedType"　<br />
　　　　　　　value="supported"&gt;　<br />
　　　　&lt;/Attribute&gt;　<br />
　　　&lt;/ActionFilterProvider&gt;　<br />
　&lt;/extension&gt;　</p>
<p>　　如下代码清单 16 所示 PopupActionFilterProvider 的实现，它继承 AbstractActionFilterProvider，只需要实现其中的 testAttribute 和 provides 方法，当 testAttribute 返回 true 时，那么该菜单项被启用，否则禁用。其中 target 对应于我们选择的对象，name 和 value 参数对应于 visiblity 中 objectState 的 name 和 value 的指定值 ( 与前面提到的 Person 类中的 testAttribute 方法类似 )。</p>
<p><br />
清单 16. actionFilterProviders 扩展点实现类</p>
<p>　public　class　PopupActionFilterProvider　extends　AbstractActionFilterProvider　{　<br />
　<br />
　<br />
　　public　PopupActionFilterProvider()　{　<br />
　　}　<br />
　<br />
　　public　boolean　testAttribute(Object　target,　String　name,　String　value)　{　<br />
　　　　　　　<br />
　　}　<br />
　<br />
　　public　boolean　provides(IOperation　operation)　{　<br />
　　　　return　false;　<br />
　　}　<br />
　<br />
　}</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/jacky9881/aggbug/325151.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacky9881/" target="_blank">玩转Java</a> 2010-07-03 16:00 <a href="http://www.blogjava.net/jacky9881/archive/2010/07/03/menu.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse中一些扩展点介绍二</title><link>http://www.blogjava.net/jacky9881/archive/2010/07/03/menucommand.html</link><dc:creator>玩转Java</dc:creator><author>玩转Java</author><pubDate>Sat, 03 Jul 2010 07:55:00 GMT</pubDate><guid>http://www.blogjava.net/jacky9881/archive/2010/07/03/menucommand.html</guid><wfw:comment>http://www.blogjava.net/jacky9881/comments/325150.html</wfw:comment><comments>http://www.blogjava.net/jacky9881/archive/2010/07/03/menucommand.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jacky9881/comments/commentRss/325150.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacky9881/services/trackbacks/325150.html</trackback:ping><description><![CDATA[扩展点：<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">org.eclipse.ui.menus（确定菜单创建的区域）<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />org.eclipse.ui.commands<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />org.eclipse.ui.handlers（command的具体行为）<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />org.eclipse.ui.commandImages（comand的图片）<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<br />
扩展点org.eclipse.ui.menus用来对菜单进行扩展，可以对主菜单，工具栏，上下文菜单进行扩展。<br />
<br />
示例代码如下：<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">extension<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">point</span><span style="color: #0000ff">="org.eclipse.ui.menus"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">menuContribution<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">allPopups</span><span style="color: #0000ff">="false"</span><span style="color: #ff0000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;locationURI</span><span style="color: #0000ff">="menu:org.eclipse.ui.main.menu?after=additions"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">command<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">commandId</span><span style="color: #0000ff">="com.xxxx.test.command1"</span><span style="color: #ff0000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style</span><span style="color: #0000ff">="push"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">command</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">menuContribution</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">extension</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<br />
其中locationURI属性指定菜单扩展的位置，上述代码是对主菜单进行扩展，如果要对工具栏和上下文菜单进行扩展，书写格式如下：<br />
<br />
toolbar:org.eclipse.ui.main.toolbar?after=additions<br />
popup:org.eclipse.ui.popup.any?after=additions(上下文菜单在任何位置出现)<br />
popup:org.eclipse.ui.views.ProblemView?after=additions(上下文菜单在问题视图中出现)<br />
<br />
commandId属性指定该menu对应的command，一个menu可以对应多个command。<br />
<br />
command可以通过扩展点org.eclipse.ui.commands扩展，示例代码如下：<br />
<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">extension<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">point</span><span style="color: #0000ff">="org.eclipse.ui.commands"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">category<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="com.xxxx.test.category1"</span><span style="color: #ff0000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name</span><span style="color: #0000ff">="MenuTest"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">category</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">command<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #ff0000">categoryId</span><span style="color: #0000ff">="="</span><span style="color: #ff0000">com.xxxx.test.category1"<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id</span><span style="color: #0000ff">="com.xxxx.test.command1"</span><span style="color: #ff0000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name</span><span style="color: #0000ff">="CommandA"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">command</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">extension</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<br />
至于Command具体要做什么，需要通过扩展点org.eclipse.ui.handlers来指定，示例代码如下：<br />
<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">extension<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">point</span><span style="color: #0000ff">="org.eclipse.ui.handlers"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">handler<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="com.xxxx.test.SampleHandler"</span><span style="color: #ff0000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;commandId</span><span style="color: #0000ff">="com.xxxx.test.command1"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">handler</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">extension</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<br />
还有扩展点org.eclipse.ui.commandImages，可以指定Command对应的图标。<br />
<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">extension<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">point</span><span style="color: #0000ff">="org.eclipse.ui.commandImages"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">image<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">commandId</span><span style="color: #0000ff">="com.xxxx.test.command1"</span><span style="color: #ff0000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;icon</span><span style="color: #0000ff">="icons/sample.gif"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">image</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">extension</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<br />
<img src ="http://www.blogjava.net/jacky9881/aggbug/325150.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacky9881/" target="_blank">玩转Java</a> 2010-07-03 15:55 <a href="http://www.blogjava.net/jacky9881/archive/2010/07/03/menucommand.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse中一些扩展点介绍一</title><link>http://www.blogjava.net/jacky9881/archive/2010/07/03/orgeclipsecoreruntimepreferences.html</link><dc:creator>玩转Java</dc:creator><author>玩转Java</author><pubDate>Sat, 03 Jul 2010 07:22:00 GMT</pubDate><guid>http://www.blogjava.net/jacky9881/archive/2010/07/03/orgeclipsecoreruntimepreferences.html</guid><wfw:comment>http://www.blogjava.net/jacky9881/comments/325148.html</wfw:comment><comments>http://www.blogjava.net/jacky9881/archive/2010/07/03/orgeclipsecoreruntimepreferences.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jacky9881/comments/commentRss/325148.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacky9881/services/trackbacks/325148.html</trackback:ping><description><![CDATA[扩展点：<span style="font-family: Century; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 'MS Mincho'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA" lang="EN-US">org.eclipse.core.runtime.preferences</span><br />
功能：该扩展点主要用来设置首选项的初始值；<br />
<br />
扩展点示例：<br />
<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">extension<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">point</span><span style="color: #0000ff">="org.eclipse.core.runtime.preferences"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">initializer<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="com.xxxx.test.AbstractPreferenceInitializer1"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">initializer</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">extension</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<br />
initializer指定设置首选项初始值的类，示例代码如下：<br />
<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;AbstractPreferenceInitializer1&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000"><br />
<img id="Codehighlighter1_84_252_Open_Image" onclick="this.style.display='none'; Codehighlighter1_84_252_Open_Text.style.display='none'; Codehighlighter1_84_252_Closed_Image.style.display='inline'; Codehighlighter1_84_252_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_84_252_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_84_252_Closed_Text.style.display='none'; Codehighlighter1_84_252_Open_Image.style.display='inline'; Codehighlighter1_84_252_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AbstractPreferenceInitializer&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_84_252_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_84_252_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
<img id="Codehighlighter1_142_250_Open_Image" onclick="this.style.display='none'; Codehighlighter1_142_250_Open_Text.style.display='none'; Codehighlighter1_142_250_Closed_Image.style.display='inline'; Codehighlighter1_142_250_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_142_250_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_142_250_Closed_Text.style.display='none'; Codehighlighter1_142_250_Open_Image.style.display='inline'; Codehighlighter1_142_250_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&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;initializeDefaultPreferences()&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_142_250_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_142_250_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IPreferenceStore&nbsp;prefs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Activator.getDefault().getPreferenceStore();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prefs.setDefault(</span><span style="color: #000000">"</span><span style="color: #000000">MAX</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">1000</span><span style="color: #000000">);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<br />
上述代码设置属性MAX的初始值为1000，这个属性就可以被首选项使用了。<br />
<br />
使用扩展点<span style="font-family: 'Courier New'; color: black; font-size: 10pt; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA" lang="EN-US"><strong>org.eclipse.ui.preferencePages</strong>扩展首选项<br />
<br />
</span>扩展点示例：<br />
<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">extension<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">point</span><span style="color: #0000ff">="org.eclipse.ui.preferencePages"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">page<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="com.xxxx.test.WorkbenchPreferencePage1"</span><span style="color: #ff0000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id</span><span style="color: #0000ff">="com.xxxx.test.page1"</span><span style="color: #ff0000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name</span><span style="color: #0000ff">="testName"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">page</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">extension</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<br />
这样就可以在<span style="font-family: 'Courier New'; color: black; font-size: 10pt; mso-fareast-font-family: 'MS Mincho'; mso-ansi-language: EN-US; mso-fareast-language: JA; mso-bidi-language: AR-SA" lang="EN-US">WorkbenchPreferencePage1</span>类中使用刚才定义的属性MAX了，示例代码如下：<br />
<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;WorkbenchPreferencePage1&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;FieldEditorPreferencePage&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000"><br />
<img id="Codehighlighter1_110_370_Open_Image" onclick="this.style.display='none'; Codehighlighter1_110_370_Open_Text.style.display='none'; Codehighlighter1_110_370_Closed_Image.style.display='inline'; Codehighlighter1_110_370_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_110_370_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_110_370_Closed_Text.style.display='none'; Codehighlighter1_110_370_Open_Image.style.display='inline'; Codehighlighter1_110_370_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IWorkbenchPreferencePage&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_110_370_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_110_370_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img id="Codehighlighter1_153_225_Open_Image" onclick="this.style.display='none'; Codehighlighter1_153_225_Open_Text.style.display='none'; Codehighlighter1_153_225_Closed_Image.style.display='inline'; Codehighlighter1_153_225_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_153_225_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_153_225_Closed_Text.style.display='none'; Codehighlighter1_153_225_Open_Image.style.display='inline'; Codehighlighter1_153_225_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&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(IWorkbench&nbsp;workbench)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_153_225_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_153_225_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setPreferenceStore(Activator.getDefault().getPreferenceStore());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
<img id="Codehighlighter1_275_367_Open_Image" onclick="this.style.display='none'; Codehighlighter1_275_367_Open_Text.style.display='none'; Codehighlighter1_275_367_Closed_Image.style.display='inline'; Codehighlighter1_275_367_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_275_367_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_275_367_Closed_Text.style.display='none'; Codehighlighter1_275_367_Open_Image.style.display='inline'; Codehighlighter1_275_367_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&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;createFieldEditors()&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_275_367_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_275_367_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;max&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;getPreferenceStore().getDefaultInt(</span><span style="color: #000000">"</span><span style="color: #000000">MAX</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">max);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<br />
<img src ="http://www.blogjava.net/jacky9881/aggbug/325148.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacky9881/" target="_blank">玩转Java</a> 2010-07-03 15:22 <a href="http://www.blogjava.net/jacky9881/archive/2010/07/03/orgeclipsecoreruntimepreferences.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse的内存优化与内存不足问题(转贴)</title><link>http://www.blogjava.net/jacky9881/archive/2010/06/26/Java_OutOfMemoryError.html</link><dc:creator>玩转Java</dc:creator><author>玩转Java</author><pubDate>Sat, 26 Jun 2010 13:37:00 GMT</pubDate><guid>http://www.blogjava.net/jacky9881/archive/2010/06/26/Java_OutOfMemoryError.html</guid><wfw:comment>http://www.blogjava.net/jacky9881/comments/324572.html</wfw:comment><comments>http://www.blogjava.net/jacky9881/archive/2010/06/26/Java_OutOfMemoryError.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jacky9881/comments/commentRss/324572.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacky9881/services/trackbacks/324572.html</trackback:ping><description><![CDATA[<p>原址地址：http://hi.baidu.com/dangjun625/blog/item/a0732c0845181ddc63d98666.html<br />
<br />
</p>
<p>MyEclipse has detected that less than 5% of the 64MB of Perm <br />
Gen (Non-heap memory) space remains. It is strongly recommended<br />
that you exit and restart MyEclipse with new virtual machine memory<br />
paramters to increase this memory.&nbsp;&nbsp; Failure to do so can result in<br />
data loss. The recommended Eclipse memory parameters are: <br />
eclipse.exe -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M</p>
<p>eclipse根目录下面的 eclipse.ini 配置 从网上搜了些资料</p>
<p>-vmargs：说明后面是VM的参数<br />
-Xms128m：虚拟机占用系统的最小内存<br />
-Xmx512m：虚拟机占用系统的最大内存的5%为25.6M，理论上要求-Xmx的数值与-XX:MaxPermSize必须大于25.6M<br />
-XX:PermSize：最小堆大小。一般报内存不足时,都是说这个太小,&nbsp;堆空间剩余小于5%就会警告,建议把这个稍微设大一点,不过要视自己机器内存大小来设置<br />
-XX:MaxPermSize：最大堆大小。这个也适当大些</p>
<p>把里面的参数改为<br />
-vmargs&nbsp;&nbsp;<br />
-Xms128M&nbsp;&nbsp;<br />
-Xmx512M&nbsp;&nbsp;<br />
-XX:PermSize=128M&nbsp;&nbsp;<br />
-XX:MaxPermSize=256M<br />
问题解决！</p>
<p>从网上的资料看PermSize大一点肯定更好，而且最好是设置PermSize和MaxPermSize一样大。理由如下： <br />
PermSize 和MaxPermSize如果设置为相同还可以在一定程度上提高性能，因为，PermSize在不断的变化中会需要转移其中的数据。如果固定了以后，则可以减少每次扩大PermSize带来的性能损失。</p>
<p>1、PermGen space简介 <br />
　　 <br />
　　PermGen space的全称是Permanent Generation space，是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存益出，解决方法也一定是加大内存。 <br />
　　 <br />
　　说说为什么会内存益出： <br />
　　（1）这一部分用于存放Class和Meta的信息，Class在被 Load的时候被放入PermGen space区域，它和和存放Instance的Heap区域不同。 <br />
　　（2） GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理，所以如果你的APP会LOAD很多CLASS 的话,就很可能出现PermGen space错误。这种错误常见在web服务器对JSP进行pre compile的时候。 <br />
　　 <br />
　　如果你的WEB APP下都用了大量的第三方jar，其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。</p>
<p><strong>解决方法： 手动设置MaxPermSize大小 <br />
</strong>　　 <br />
　　修改TOMCAT_HOME/bin/catalina.bat，在echo "Using CATALINA_BASE: $CATALINA_BASE"上面加入以下行： <br />
　　 JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m <br />
　　<strong>建议：将相同的第三方jar文件移置到tomcat/shared/lib目录下，这样可以减少jar 文档重复占用内存</strong></p>
<p><strong>1。参数的含义</strong></p>
<p>-vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M</p>
<p>参数中-vmargs的意思是设置JVM参数，所以后面的其实都是JVM的参数了，我们首先了解一下JVM内存管理的机制，然后再解释每个参数代表的含义。<br />
堆(Heap)和非堆(Non-heap)内存<br />
按照官方的说法：&#8220;Java 虚拟机具有一个堆，堆是运行时数据区域，所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。&#8221;&#8220;在JVM中堆之外的内存称为非堆内存(Non-heap memory)&#8221;。可以看出JVM主要管理两种类型的内存：堆和非堆。简单来说堆就是Java代码可及的内存，是留给开发人员使用的；非堆就是JVM留给自己用的，所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。 <br />
堆内存分配<br />
<strong>JVM初始分配的内存由-Xms指定</strong>，默认是物理内存的1/64；<strong>JVM最大分配的内存由-Xmx指定</strong>，默认是物理内存的1/4。默认空余堆内存小于40%时，JVM就会增大堆直到-Xmx的最大限制；空余堆内存大于70%时，JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。 <br />
非堆内存分配<br />
<strong>JVM使用-XX:PermSize设置非堆内存初始值</strong>，默认是物理内存的1/64；<strong>由XX:MaxPermSize设置最大非堆内存的大小</strong>，默认是物理内存的1/4。 <br />
JVM内存限制(最大值)<br />
首先JVM内存限制于实际的最大物理内存，假设物理内存无限大的话，JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制，这个限制一般是2GB-3GB（一般来说Windows系统下为1.5G-2G，Linux系统下为2G-3G），而64bit以上的处理器就不会有限制了。</p>
<p><strong>2. 为什么有的机器我将-Xmx和-XX:MaxPermSize都设置为512M之后Eclipse可以启动，而有些机器无法启动？</strong></p>
<p>通过上面对JVM内存管理的介绍我们已经了解到JVM内存包含两种：堆内存和非堆内存，另外JVM最大内存首先取决于实际的物理内存和操作系统。所以说设置VM参数导致程序无法启动主要有以下几种原因：<br />
1) 参数中-Xms的值大于-Xmx，或者-XX:PermSize的值大于-XX:MaxPermSize；<br />
2) -Xmx的值和-XX:MaxPermSize的总和超过了JVM内存的最大限制，比如当前操作系统最大内存限制，或者实际的物理内存等等。说到实际物理内存这里需要说明一点的是，如果你的内存是1024MB，但实际系统中用到的并不可能是1024MB，因为有一部分被硬件占用了。</p>
<p><strong>3. 为何将上面的参数写入到eclipse.ini文件Eclipse没有执行对应的设置？</strong><br />
那为什么同样的参数在快捷方式或者命令行中有效而在eclipse.ini文件中是无效的呢？这是因为我们没有遵守eclipse.ini文件的设置规则：<br />
参数形如&#8220;项 值&#8221;这种形式，中间有空格的需要换行书写，如果值中有空格的需要用双引号包括起来。比如我们使用-vm C:\Java\jre1.6.0\bin\javaw.exe参数设置虚拟机，在eclipse.ini文件中要写成这样：<br />
-vm <br />
C:\Java\jre1.6.0\bin\javaw.exe <br />
按照上面所说的，最后参数在eclipse.ini中可以写成这个样子：<br />
-vmargs <br />
-Xms128M <br />
-Xmx512M <br />
-XX:PermSize=64M <br />
-XX:MaxPermSize=128M <br />
实际运行的结果可以通过Eclipse中&#8220;Help&#8221;-&#8220;About Eclipse SDK&#8221;窗口里面的&#8220;Configuration Details&#8221;按钮进行查看。<br />
另外需要说明的是，Eclipse压缩包中自带的eclipse.ini文件内容是这样的：<br />
-showsplash <br />
org.eclipse.platform <br />
--launcher.XXMaxPermSize <br />
256m <br />
-vmargs <br />
-Xms40m <br />
-Xmx256m <br />
其中<strong>&#8211;launcher.XXMaxPermSize</strong>（注意最前面是两个连接线）跟<strong>-XX:MaxPermSize</strong>参数的含义基本是一样的，我觉得唯一的区别就是前者是eclipse.exe启动的时候设置的参数，而后者是eclipse所使用的JVM中的参数。其实二者设置一个就可以了，所以这里可以把&#8211;launcher.XXMaxPermSize和下一行使用#注释掉。</p>
<p>3. 其他的启动参数。 如果你有一个双核的CPU，也许可以尝试这个参数:</p>
<p><code><font face="新宋体">-XX:+UseParallelGC</font></code></p>
<p>让GC可以更快的执行。（只是JDK 5里对GC新增加的参数）</p>
<p>&nbsp;</p>
<p><strong>补充：</strong></p>
<p>可以在myelipse里选中相应的服务器比如<strong>tomcat5</strong>，展开里面的JDK子项页面，来增加服务器启动的JVM参数设置：</p>
<p>-Xms128m <br />
-Xmx256m <br />
-XX:PermSize=128M <br />
-XX:MaxNewSize=256m <br />
-XX:MaxPermSize=256m</p>
<img src ="http://www.blogjava.net/jacky9881/aggbug/324572.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacky9881/" target="_blank">玩转Java</a> 2010-06-26 21:37 <a href="http://www.blogjava.net/jacky9881/archive/2010/06/26/Java_OutOfMemoryError.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JVM terminated.Exit code=1.</title><link>http://www.blogjava.net/jacky9881/archive/2008/07/27/217880.html</link><dc:creator>玩转Java</dc:creator><author>玩转Java</author><pubDate>Sun, 27 Jul 2008 13:22:00 GMT</pubDate><guid>http://www.blogjava.net/jacky9881/archive/2008/07/27/217880.html</guid><wfw:comment>http://www.blogjava.net/jacky9881/comments/217880.html</wfw:comment><comments>http://www.blogjava.net/jacky9881/archive/2008/07/27/217880.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/jacky9881/comments/commentRss/217880.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacky9881/services/trackbacks/217880.html</trackback:ping><description><![CDATA[最近在升级JDK版本后，启动Eclipse时候，遇到这样的问题：<br />
JVM terminated.Exit code=1.<br />
在网上找了些资料，找到了解决方法。<br />
只要修改eclipse.ini文件即可。修改内容如下：<br />
-startup<br />
plugins\org.eclipse.equinox.launcher_1.0.100.v20080509-1800.jar<br />
--launcher.library<br />
plugins\org.eclipse.equinox.launcher.win32.win32.x86_1.0.100.v20080509-1800<br />
-showsplash<br />
<strong><em style="color: #ff0000">vm<br />
D:\Java\jdk15011\bin\javaw.exe<br />
</em></strong>org.eclipse.platform<br />
--launcher.XXMaxPermSize<br />
256m<br />
-vmargs<br />
-Xms40m<br />
-Xmx256m<br />
其中粗体部分为新增内容。 
<img src ="http://www.blogjava.net/jacky9881/aggbug/217880.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacky9881/" target="_blank">玩转Java</a> 2008-07-27 21:22 <a href="http://www.blogjava.net/jacky9881/archive/2008/07/27/217880.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse插件开发问题二</title><link>http://www.blogjava.net/jacky9881/archive/2008/04/23/195233.html</link><dc:creator>玩转Java</dc:creator><author>玩转Java</author><pubDate>Wed, 23 Apr 2008 11:44:00 GMT</pubDate><guid>http://www.blogjava.net/jacky9881/archive/2008/04/23/195233.html</guid><wfw:comment>http://www.blogjava.net/jacky9881/comments/195233.html</wfw:comment><comments>http://www.blogjava.net/jacky9881/archive/2008/04/23/195233.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jacky9881/comments/commentRss/195233.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacky9881/services/trackbacks/195233.html</trackback:ping><description><![CDATA[&nbsp;
<p><span style="font-family: 宋体">问题描述：</span></p>
<p><span style="font-family: 宋体">最近在做</span>Eclipse<span style="font-family: 宋体">插件开发的时候，在国际化的问题上遇到这样问题，比如我的</span>plugin.xml<span style="font-family: 宋体">文件中，通过</span>%xxx<span style="font-family: 宋体">来引用</span>plugin_zh.properties<span style="font-family: 宋体">中对应键</span>xxx<span style="font-family: 宋体">的信息时，在插件运行时，相应的信息显示不了，后来进过研究，发现是由于在</span>MANIFEST.MF<span style="font-family: 宋体">少配置了一项造成的</span></p>
<p>Bundle-Localization: plugin<span style="font-family: 宋体">，</span></p>
<p><span style="font-family: 宋体">而这一项配置我在</span>Overview<span style="font-family: 宋体">标签页上没有找到相应设置的地方，把这个在</span>MANIFEST.MF<span style="font-family: 宋体">加上，插件在运行时，就可以显示</span>plugin_zh.properties<span style="font-family: 宋体">中定义的消息了。</span></p>
<img src ="http://www.blogjava.net/jacky9881/aggbug/195233.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacky9881/" target="_blank">玩转Java</a> 2008-04-23 19:44 <a href="http://www.blogjava.net/jacky9881/archive/2008/04/23/195233.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse插件开发中的问题一</title><link>http://www.blogjava.net/jacky9881/archive/2008/04/23/195232.html</link><dc:creator>玩转Java</dc:creator><author>玩转Java</author><pubDate>Wed, 23 Apr 2008 11:41:00 GMT</pubDate><guid>http://www.blogjava.net/jacky9881/archive/2008/04/23/195232.html</guid><wfw:comment>http://www.blogjava.net/jacky9881/comments/195232.html</wfw:comment><comments>http://www.blogjava.net/jacky9881/archive/2008/04/23/195232.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jacky9881/comments/commentRss/195232.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacky9881/services/trackbacks/195232.html</trackback:ping><description><![CDATA[&nbsp; <span style="font-family: 宋体">问题描述：</span>
<p><span style="font-family: 宋体">最近在</span>Eclipse<span style="font-family: 宋体">插件开发中遇到这样的问题，我使用如入扩展点<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">extension<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">point</span><span style="color: #0000ff">="org.eclipse.debug.ui.launchConfigurationTabs"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">tab<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="com.example.launch.SqlDebugTab"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;group</span><span style="color: #0000ff">="org.eclipse.jdt.debug.ui.launchConfigurationTabGroup.localJavaApplication"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id</span><span style="color: #0000ff">="&nbsp;com.example.launchs.SqlDebugTab"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name</span><span style="color: #0000ff">="SqlDebugTab"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">associatedDelegate<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">delegate</span><span style="color: #0000ff">="&nbsp;com.example.launch.SqlDebugLaunchDelegate"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">associatedDelegate</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">tab</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">extension</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">extension<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">point</span><span style="color: #0000ff">="org.eclipse.debug.core.launchDelegates"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">launchDelegate<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">delegate</span><span style="color: #0000ff">="&nbsp;com.example.launch.SqlDebugLaunchDelegate"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id</span><span style="color: #0000ff">="&nbsp;com.example.launch.SqlDebugLaunchDelegate"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;modes</span><span style="color: #0000ff">="debug"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type</span><span style="color: #0000ff">="org.eclipse.jdt.launching.localJavaApplication"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">launchDelegate</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">extension</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
&nbsp;
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也就是在调式</span><span lang="EN-US">Java Application</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的对话框中，增加一个</span><span lang="EN-US">Tab</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">页，</span><span lang="EN-US">Tab</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">页的名字为</span><span lang="EN-US">SqlDebugTab</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，在这个</span><span lang="EN-US">Tab</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">页上增加几个复选框，复选框要显示视图的名称，如果用户选择某个复选框，点&#8220;</span><span lang="EN-US">Debug</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&#8221;后，将显示指定的视图，可是在</span><span lang="EN-US">com.example.launch.SqlDebugLaunchDelegate</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类中的</span><span lang="EN-US">launch</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法中调用</span><span lang="EN-US">PlatformUI.getWorkbench().getActiveWorkbenchWindow()</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，得到的对象却为</span><span lang="EN-US">null</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，调试程序才发现，运行</span><span lang="EN-US">com.example.launch.SqlDebugLaunchDelegate</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类是，走的是新线程，也就是说点&#8220;</span><span lang="EN-US">Debug</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&#8221;按钮时，</span><span lang="EN-US">Eclipse</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">平台启动的是新的线程（非</span><span lang="EN-US">UI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">线程），而在新线程中是取不到</span><span lang="EN-US">ActiveWorkbenchWindow</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象，为了解决这个问题</span><span lang="EN-US">,</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">花费了很多时间，最后终于找到解决方法</span><span lang="EN-US">,</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</span><span lang="EN-US">launch</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法通过如下程序来显示视图，就可以解决上面遇到的问题：</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"><img id="Codehighlighter1_64_253_Open_Image" onclick="this.style.display='none'; Codehighlighter1_64_253_Open_Text.style.display='none'; Codehighlighter1_64_253_Closed_Image.style.display='inline'; Codehighlighter1_64_253_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_64_253_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_64_253_Closed_Text.style.display='none'; Codehighlighter1_64_253_Open_Image.style.display='inline'; Codehighlighter1_64_253_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #000000">PlatformUI.getWorkbench().getDisplay().asyncExec(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Runnable()&nbsp;</span><span id="Codehighlighter1_64_253_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_64_253_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_87_251_Open_Image" onclick="this.style.display='none'; Codehighlighter1_87_251_Open_Text.style.display='none'; Codehighlighter1_87_251_Closed_Image.style.display='inline'; Codehighlighter1_87_251_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_87_251_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_87_251_Closed_Text.style.display='none'; Codehighlighter1_87_251_Open_Image.style.display='inline'; Codehighlighter1_87_251_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&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;run()&nbsp;</span><span id="Codehighlighter1_87_251_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_87_251_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IWorkbenchWindow&nbsp;window&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;PlatformUI.getWorkbench()<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getActiveWorkbenchWindow();<br />
<img id="Codehighlighter1_203_249_Open_Image" onclick="this.style.display='none'; Codehighlighter1_203_249_Open_Text.style.display='none'; Codehighlighter1_203_249_Closed_Image.style.display='inline'; Codehighlighter1_203_249_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_203_249_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_203_249_Closed_Text.style.display='none'; Codehighlighter1_203_249_Open_Image.style.display='inline'; Codehighlighter1_203_249_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&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;(window&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)</span><span id="Codehighlighter1_203_249_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_203_249_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.getActivePage().showView（</span><span style="color: #000000">"</span><span style="color: #000000">&#8230;&#8230;</span><span style="color: #000000">"</span><span style="color: #000000">）；<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
</span>
<img src ="http://www.blogjava.net/jacky9881/aggbug/195232.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacky9881/" target="_blank">玩转Java</a> 2008-04-23 19:41 <a href="http://www.blogjava.net/jacky9881/archive/2008/04/23/195232.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>流程设计器开发十二（复制粘贴部分）</title><link>http://www.blogjava.net/jacky9881/archive/2008/01/17/175815.html</link><dc:creator>玩转Java</dc:creator><author>玩转Java</author><pubDate>Thu, 17 Jan 2008 00:27:00 GMT</pubDate><guid>http://www.blogjava.net/jacky9881/archive/2008/01/17/175815.html</guid><wfw:comment>http://www.blogjava.net/jacky9881/comments/175815.html</wfw:comment><comments>http://www.blogjava.net/jacky9881/archive/2008/01/17/175815.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jacky9881/comments/commentRss/175815.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacky9881/services/trackbacks/175815.html</trackback:ping><description><![CDATA[要在编辑器中支持复制，粘贴功能，首先，要在编辑器中选择活动节点，Eclipse工作台的菜单中复制，粘贴按钮处于激活状态，要实现这功能，我们还必须做些配置，因为编辑器没有单独的菜单栏，所有编辑器共享一个菜单栏，前面我们在定义编辑器扩展点时，有一个属性contributorClass没有指定值，它的值应该是一个实现IEditorActionBarContributor接口的类的全名，只有指定这个属性，菜单栏中的菜单项才能够对我们在编辑器中所做的操作进行相应；<br />
首先，我们增加属性contributorClass对应的类：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.example.workflow.actions;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.gef.ui.actions.ActionBarContributor;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.ui.actions.ActionFactory;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_209_377_Open_Image" onclick="this.style.display='none'; Codehighlighter1_209_377_Open_Text.style.display='none'; Codehighlighter1_209_377_Closed_Image.style.display='inline'; Codehighlighter1_209_377_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_209_377_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_209_377_Closed_Text.style.display='none'; Codehighlighter1_209_377_Open_Image.style.display='inline'; Codehighlighter1_209_377_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;WorkflowActionContributor&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ActionBarContributor&nbsp;</span><span id="Codehighlighter1_209_377_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_209_377_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
<img id="Codehighlighter1_254_260_Open_Image" onclick="this.style.display='none'; Codehighlighter1_254_260_Open_Text.style.display='none'; Codehighlighter1_254_260_Closed_Image.style.display='inline'; Codehighlighter1_254_260_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_254_260_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_254_260_Closed_Text.style.display='none'; Codehighlighter1_254_260_Open_Image.style.display='inline'; Codehighlighter1_254_260_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&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;buildActions()&nbsp;</span><span id="Codehighlighter1_254_260_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_254_260_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
<img id="Codehighlighter1_317_373_Open_Image" onclick="this.style.display='none'; Codehighlighter1_317_373_Open_Text.style.display='none'; Codehighlighter1_317_373_Closed_Image.style.display='inline'; Codehighlighter1_317_373_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_317_373_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_317_373_Closed_Text.style.display='none'; Codehighlighter1_317_373_Open_Image.style.display='inline'; Codehighlighter1_317_373_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&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;declareGlobalActionKeys()&nbsp;</span><span id="Codehighlighter1_317_373_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_317_373_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addGlobalActionKey(ActionFactory.COPY.getId());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<p>在declareGlobalActionKeys增加对复制命令的申明，同时把属性contributorClass指定为这个类，包含全路径。再定义复制动作CopyAction，代码如下：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.example.workflow.actions;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.gef.ui.actions.SelectionAction;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.ui.IWorkbenchPart;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.ui.actions.ActionFactory;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_221_394_Open_Image" onclick="this.style.display='none'; Codehighlighter1_221_394_Open_Text.style.display='none'; Codehighlighter1_221_394_Closed_Image.style.display='inline'; Codehighlighter1_221_394_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_221_394_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_221_394_Closed_Text.style.display='none'; Codehighlighter1_221_394_Open_Image.style.display='inline'; Codehighlighter1_221_394_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;CopyAction&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;SelectionAction</span><span id="Codehighlighter1_221_394_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_221_394_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_264_319_Open_Image" onclick="this.style.display='none'; Codehighlighter1_264_319_Open_Text.style.display='none'; Codehighlighter1_264_319_Closed_Image.style.display='inline'; Codehighlighter1_264_319_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_264_319_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_264_319_Closed_Text.style.display='none'; Codehighlighter1_264_319_Open_Image.style.display='inline'; Codehighlighter1_264_319_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;CopyAction(IWorkbenchPart&nbsp;part)&nbsp;</span><span id="Codehighlighter1_264_319_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_264_319_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">(part);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setId(ActionFactory.COPY.getId());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
<img id="Codehighlighter1_371_391_Open_Image" onclick="this.style.display='none'; Codehighlighter1_371_391_Open_Text.style.display='none'; Codehighlighter1_371_391_Closed_Image.style.display='inline'; Codehighlighter1_371_391_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_371_391_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_371_391_Closed_Text.style.display='none'; Codehighlighter1_371_391_Open_Image.style.display='inline'; Codehighlighter1_371_391_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;calculateEnabled()&nbsp;</span><span id="Codehighlighter1_371_391_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_371_391_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<p>&nbsp;</p>
<p><br />
注意构造函数中一定要把这个action的id设置为ActionFactory.COPY.getId()，和前面统一起来；</p>
<p>到这儿还没有结束，还必须在编辑器类中注册这个action，覆盖编辑器父类中的createActions()方法：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_31_219_Open_Image" onclick="this.style.display='none'; Codehighlighter1_31_219_Open_Text.style.display='none'; Codehighlighter1_31_219_Closed_Image.style.display='inline'; Codehighlighter1_31_219_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_31_219_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_31_219_Closed_Text.style.display='none'; Codehighlighter1_31_219_Open_Image.style.display='inline'; Codehighlighter1_31_219_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;createActions()&nbsp;</span><span id="Codehighlighter1_31_219_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_31_219_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">.createActions();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;CopyAction&nbsp;copyAction&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;CopyAction((IWorkbenchPart)&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;getActionRegistry().registerAction(copyAction);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;getSelectionActions().add(copyAction.getId());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
但是当我们在复制按钮可用情况，点击之后，我们希望把我们选择的对象，拷贝到剪切板上，这个在其他软件中已经成功实现，但要是在我们开发的流程设计器中，要实现这个功能，我们还必须自己写代码来实现，必须重写CopyAction父类中的run方法，把我们选择的对象放到剪切板上，代码如下：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_18_85_Open_Image" onclick="this.style.display='none'; Codehighlighter1_18_85_Open_Text.style.display='none'; Codehighlighter1_18_85_Closed_Image.style.display='inline'; Codehighlighter1_18_85_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_18_85_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_18_85_Closed_Text.style.display='none'; Codehighlighter1_18_85_Open_Image.style.display='inline'; Codehighlighter1_18_85_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;run()&nbsp;</span><span id="Codehighlighter1_18_85_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_18_85_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Clipboard.getDefault().setContents(</span><span style="color: #0000ff">super</span><span style="color: #000000">.getSelectedObjects());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<p>这样当我们点复制按钮之后，流程设计器就把我们选择的内容放到剪切板上，下一步要做的就是粘贴了。</p>
<p>要使粘贴按钮可用，所做的修改和复制类似，在类WorkflowActionContributor 的方法declareGlobalActionKeys中增加addGlobalActionKey(ActionFactory.PASTE.getId())</p>
<p>增加PasteAction类，代码如下：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.example.workflow.actions;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.gef.ui.actions.Clipboard;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.gef.ui.actions.SelectionAction;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.ui.IWorkbenchPart;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.ui.actions.ActionFactory;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_267_523_Open_Image" onclick="this.style.display='none'; Codehighlighter1_267_523_Open_Text.style.display='none'; Codehighlighter1_267_523_Closed_Image.style.display='inline'; Codehighlighter1_267_523_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_267_523_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_267_523_Closed_Text.style.display='none'; Codehighlighter1_267_523_Open_Image.style.display='inline'; Codehighlighter1_267_523_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;PasteAction&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;SelectionAction</span><span id="Codehighlighter1_267_523_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_267_523_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_311_367_Open_Image" onclick="this.style.display='none'; Codehighlighter1_311_367_Open_Text.style.display='none'; Codehighlighter1_311_367_Closed_Image.style.display='inline'; Codehighlighter1_311_367_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_311_367_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_311_367_Closed_Text.style.display='none'; Codehighlighter1_311_367_Open_Image.style.display='inline'; Codehighlighter1_311_367_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;PasteAction(IWorkbenchPart&nbsp;part)&nbsp;</span><span id="Codehighlighter1_311_367_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_311_367_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">(part);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setId(ActionFactory.PASTE.getId());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
<img id="Codehighlighter1_419_520_Open_Image" onclick="this.style.display='none'; Codehighlighter1_419_520_Open_Text.style.display='none'; Codehighlighter1_419_520_Closed_Image.style.display='inline'; Codehighlighter1_419_520_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_419_520_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_419_520_Closed_Text.style.display='none'; Codehighlighter1_419_520_Open_Image.style.display='inline'; Codehighlighter1_419_520_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;calculateEnabled()&nbsp;</span><span id="Codehighlighter1_419_520_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_419_520_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_471_491_Open_Image" onclick="this.style.display='none'; Codehighlighter1_471_491_Open_Text.style.display='none'; Codehighlighter1_471_491_Closed_Image.style.display='inline'; Codehighlighter1_471_491_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_471_491_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_471_491_Closed_Text.style.display='none'; Codehighlighter1_471_491_Open_Image.style.display='inline'; Codehighlighter1_471_491_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(Clipboard.getDefault().getContents()</span><span style="color: #000000">!=</span><span style="color: #0000ff">null</span><span style="color: #000000">)</span><span id="Codehighlighter1_471_491_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_471_491_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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><span style="color: #000000">;<br />
<img id="Codehighlighter1_496_517_Open_Image" onclick="this.style.display='none'; Codehighlighter1_496_517_Open_Text.style.display='none'; Codehighlighter1_496_517_Closed_Image.style.display='inline'; Codehighlighter1_496_517_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_496_517_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_496_517_Closed_Text.style.display='none'; Codehighlighter1_496_517_Open_Image.style.display='inline'; Codehighlighter1_496_517_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #0000ff">else</span><span id="Codehighlighter1_496_517_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_496_517_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
这里对Paste菜单的可用性作了判断，只有当剪切板中内容不为空时，粘贴按钮才可用，否则为不可用状<br />
态。<br />
另外还要在编辑器中对这个action进行申明，<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">PasteAction&nbsp;pasteAction&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;PasteAction((IWorkbenchPart)&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />getActionRegistry().registerAction(pasteAction);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />getSelectionActions().add(pasteAction.getId());</span></div>
到这里，当我们在编辑器中选择活动，选择复制之后，粘贴按钮可用，但点粘贴按钮具体做什么，我们还没有定义，要实现这个做什么功能，还必须覆盖PasteAction父类中的run方法：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_18_559_Open_Image" onclick="this.style.display='none'; Codehighlighter1_18_559_Open_Text.style.display='none'; Codehighlighter1_18_559_Closed_Image.style.display='inline'; Codehighlighter1_18_559_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_18_559_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_18_559_Closed_Text.style.display='none'; Codehighlighter1_18_559_Open_Image.style.display='inline'; Codehighlighter1_18_559_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;run()&nbsp;</span><span id="Codehighlighter1_18_559_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_18_559_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;list&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(List)Clipboard.getDefault().getContents();<br />
<img id="Codehighlighter1_110_556_Open_Image" onclick="this.style.display='none'; Codehighlighter1_110_556_Open_Text.style.display='none'; Codehighlighter1_110_556_Closed_Image.style.display='inline'; Codehighlighter1_110_556_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_110_556_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_110_556_Closed_Text.style.display='none'; Codehighlighter1_110_556_Open_Image.style.display='inline'; Codehighlighter1_110_556_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">list.size();i</span><span style="color: #000000">++</span><span style="color: #000000">)</span><span id="Codehighlighter1_110_556_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_110_556_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AbstractActivityEditPart&nbsp;part&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(AbstractActivityEditPart)list.get(i);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AbstractActivity&nbsp;model&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(AbstractActivity)part.getModel();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WorkflowProcess&nbsp;parent&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(WorkflowProcess)part.getParent().getModel();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AbstractActivity&nbsp;clone&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;AbstractActivity();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clone.setName(</span><span style="color: #000000">"</span><span style="color: #000000">CloneActivity</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clone.setLocation(model.getLocation());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clone.setSize(model.getSize());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clone.setFigure(model.getFigure());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent.addChild(clone);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br />
这里只是做了一下简单处理，更复杂的逻辑用户可以根据自己应用的需要，这里的run可以通过执行一个命令，以支持撤销，重做功能，原理就是这样的，另外剪切功能和这类似，只是在复制基础上多了个删除操作。
<img src ="http://www.blogjava.net/jacky9881/aggbug/175815.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacky9881/" target="_blank">玩转Java</a> 2008-01-17 08:27 <a href="http://www.blogjava.net/jacky9881/archive/2008/01/17/175815.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>流程设计器开发十一（扩展点部分）</title><link>http://www.blogjava.net/jacky9881/archive/2008/01/16/175576.html</link><dc:creator>玩转Java</dc:creator><author>玩转Java</author><pubDate>Wed, 16 Jan 2008 00:42:00 GMT</pubDate><guid>http://www.blogjava.net/jacky9881/archive/2008/01/16/175576.html</guid><wfw:comment>http://www.blogjava.net/jacky9881/comments/175576.html</wfw:comment><comments>http://www.blogjava.net/jacky9881/archive/2008/01/16/175576.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/jacky9881/comments/commentRss/175576.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacky9881/services/trackbacks/175576.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;到目前为止，一个完整的流程设计器已基本完成，为了增加系统的可扩展性，比如目前活动的类型有三种，假如以后我们要增加活动的类型，怎么办？按照目前的做法，我们只能修改代码，为了使系统的扩展性更好，即我们如果要增加活动类型，只需要修改配置文件，而无须修改现有系统的代码，为此，我们把活动类型定义一个扩展点，用户以后要增加活动类型，只需扩展这个扩展点就可以了。（代码）在plugin.xml...&nbsp;&nbsp;<a href='http://www.blogjava.net/jacky9881/archive/2008/01/16/175576.html'>阅读全文</a><img src ="http://www.blogjava.net/jacky9881/aggbug/175576.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacky9881/" target="_blank">玩转Java</a> 2008-01-16 08:42 <a href="http://www.blogjava.net/jacky9881/archive/2008/01/16/175576.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>流程设计器开发十（新建向导部分）</title><link>http://www.blogjava.net/jacky9881/archive/2008/01/15/175352.html</link><dc:creator>玩转Java</dc:creator><author>玩转Java</author><pubDate>Tue, 15 Jan 2008 00:45:00 GMT</pubDate><guid>http://www.blogjava.net/jacky9881/archive/2008/01/15/175352.html</guid><wfw:comment>http://www.blogjava.net/jacky9881/comments/175352.html</wfw:comment><comments>http://www.blogjava.net/jacky9881/archive/2008/01/15/175352.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jacky9881/comments/commentRss/175352.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacky9881/services/trackbacks/175352.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;这一节主要介绍如何通过新建向导，来新建我们扩展的文件(.workflow),要在新建增加内容，必须扩展org.eclipse.ui.newWizards，因此我们要修改plugin.xml文件，增加内容如下：(代码下载)&lt;extension&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point="org.ec...&nbsp;&nbsp;<a href='http://www.blogjava.net/jacky9881/archive/2008/01/15/175352.html'>阅读全文</a><img src ="http://www.blogjava.net/jacky9881/aggbug/175352.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacky9881/" target="_blank">玩转Java</a> 2008-01-15 08:45 <a href="http://www.blogjava.net/jacky9881/archive/2008/01/15/175352.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>流程设计器开发九（属性页部分）</title><link>http://www.blogjava.net/jacky9881/archive/2008/01/14/175062.html</link><dc:creator>玩转Java</dc:creator><author>玩转Java</author><pubDate>Mon, 14 Jan 2008 00:59:00 GMT</pubDate><guid>http://www.blogjava.net/jacky9881/archive/2008/01/14/175062.html</guid><wfw:comment>http://www.blogjava.net/jacky9881/comments/175062.html</wfw:comment><comments>http://www.blogjava.net/jacky9881/archive/2008/01/14/175062.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/jacky9881/comments/commentRss/175062.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacky9881/services/trackbacks/175062.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这一节主要介绍如何给编辑器增加属性页，属性页主要用来显示编辑器中选中对象的属性的，比如在编辑器选中活动，可以在属性页上显示活动的大小和位置等信息，要实现这一功能，首先要让模型实现IPropertySource接口，我们让模型的基类ModelElement实现这个接口，基类要实现这接口中六个方法，这六个方法如下：/**&nbsp;*//**&nbsp;An&nbsp;empty&nbsp;p...&nbsp;&nbsp;<a href='http://www.blogjava.net/jacky9881/archive/2008/01/14/175062.html'>阅读全文</a><img src ="http://www.blogjava.net/jacky9881/aggbug/175062.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacky9881/" target="_blank">玩转Java</a> 2008-01-14 08:59 <a href="http://www.blogjava.net/jacky9881/archive/2008/01/14/175062.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>流程设计器开发八（大纲视图部分）</title><link>http://www.blogjava.net/jacky9881/archive/2008/01/11/174481.html</link><dc:creator>玩转Java</dc:creator><author>玩转Java</author><pubDate>Fri, 11 Jan 2008 00:44:00 GMT</pubDate><guid>http://www.blogjava.net/jacky9881/archive/2008/01/11/174481.html</guid><wfw:comment>http://www.blogjava.net/jacky9881/comments/174481.html</wfw:comment><comments>http://www.blogjava.net/jacky9881/archive/2008/01/11/174481.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jacky9881/comments/commentRss/174481.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacky9881/services/trackbacks/174481.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;要实现大纲视图，我们先回顾一下以前在编辑器中实现GraphicalViewer视图，是如何实现的，找到以前的代码，在WorkflowProcessEditor的configureGraphicalViewer方法中，GraphicalViewer&nbsp;viewer&nbsp;=&nbsp;getGraphicalViewer();viewer.setEditPartFac...&nbsp;&nbsp;<a href='http://www.blogjava.net/jacky9881/archive/2008/01/11/174481.html'>阅读全文</a><img src ="http://www.blogjava.net/jacky9881/aggbug/174481.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacky9881/" target="_blank">玩转Java</a> 2008-01-11 08:44 <a href="http://www.blogjava.net/jacky9881/archive/2008/01/11/174481.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>流程设计器开发七（转移拐点部分）</title><link>http://www.blogjava.net/jacky9881/archive/2008/01/10/174184.html</link><dc:creator>玩转Java</dc:creator><author>玩转Java</author><pubDate>Thu, 10 Jan 2008 01:46:00 GMT</pubDate><guid>http://www.blogjava.net/jacky9881/archive/2008/01/10/174184.html</guid><wfw:comment>http://www.blogjava.net/jacky9881/comments/174184.html</wfw:comment><comments>http://www.blogjava.net/jacky9881/archive/2008/01/10/174184.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/jacky9881/comments/commentRss/174184.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacky9881/services/trackbacks/174184.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这一节主要介绍如何在转移上增加拐点，要实现这功能，首先要修改转移的模型，增加一个列表属性，维护转移上所有的拐点，转移模型为实现拐点功能而增加的代码如下：&nbsp;public&nbsp;static&nbsp;final&nbsp;String&nbsp;BENDPOINT_PROP&nbsp;=&nbsp;"Transition.BendPoint";private&nbsp;Li...&nbsp;&nbsp;<a href='http://www.blogjava.net/jacky9881/archive/2008/01/10/174184.html'>阅读全文</a><img src ="http://www.blogjava.net/jacky9881/aggbug/174184.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacky9881/" target="_blank">玩转Java</a> 2008-01-10 09:46 <a href="http://www.blogjava.net/jacky9881/archive/2008/01/10/174184.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>流程设计器开发六（转移建立和删除）</title><link>http://www.blogjava.net/jacky9881/archive/2008/01/09/173935.html</link><dc:creator>玩转Java</dc:creator><author>玩转Java</author><pubDate>Wed, 09 Jan 2008 03:10:00 GMT</pubDate><guid>http://www.blogjava.net/jacky9881/archive/2008/01/09/173935.html</guid><wfw:comment>http://www.blogjava.net/jacky9881/comments/173935.html</wfw:comment><comments>http://www.blogjava.net/jacky9881/archive/2008/01/09/173935.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/jacky9881/comments/commentRss/173935.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacky9881/services/trackbacks/173935.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 哪个模型的控制器能接受在活动之间建立转移的请求呢，只有活动模型的控制器了，因为活动模型中维护着活动的输入和输出转移的列表，在活动控制器增加策略，使该控制器能接受建立转移的请求，代码如下：protectedvoid&nbsp;createEditPolicies()&nbsp;{&nbsp;&nbsp;&nbsp;&nbs...&nbsp;&nbsp;<a href='http://www.blogjava.net/jacky9881/archive/2008/01/09/173935.html'>阅读全文</a><img src ="http://www.blogjava.net/jacky9881/aggbug/173935.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacky9881/" target="_blank">玩转Java</a> 2008-01-09 11:10 <a href="http://www.blogjava.net/jacky9881/archive/2008/01/09/173935.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>流程设计器开发五（移动和删除活动部分）</title><link>http://www.blogjava.net/jacky9881/archive/2008/01/07/173390.html</link><dc:creator>玩转Java</dc:creator><author>玩转Java</author><pubDate>Mon, 07 Jan 2008 09:16:00 GMT</pubDate><guid>http://www.blogjava.net/jacky9881/archive/2008/01/07/173390.html</guid><wfw:comment>http://www.blogjava.net/jacky9881/comments/173390.html</wfw:comment><comments>http://www.blogjava.net/jacky9881/archive/2008/01/07/173390.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jacky9881/comments/commentRss/173390.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacky9881/services/trackbacks/173390.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这一节我们来介绍如何在编辑器中移动活动，改变活动的大小和删除活动，在流程控制器中已经安装的策略WorkflowProcessXYLayoutEditPolicy，可以接受移动活动和改变活动大小的请求，但不能接受删除活动的请求，要处理删除活动的请求，必须在活动控制器中安装策略。&nbsp;&nbsp;&nbsp;&nbsp;&nb...&nbsp;&nbsp;<a href='http://www.blogjava.net/jacky9881/archive/2008/01/07/173390.html'>阅读全文</a><img src ="http://www.blogjava.net/jacky9881/aggbug/173390.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacky9881/" target="_blank">玩转Java</a> 2008-01-07 17:16 <a href="http://www.blogjava.net/jacky9881/archive/2008/01/07/173390.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>流程设计器开发四(策略和命令部分)</title><link>http://www.blogjava.net/jacky9881/archive/2008/01/04/172635.html</link><dc:creator>玩转Java</dc:creator><author>玩转Java</author><pubDate>Fri, 04 Jan 2008 00:49:00 GMT</pubDate><guid>http://www.blogjava.net/jacky9881/archive/2008/01/04/172635.html</guid><wfw:comment>http://www.blogjava.net/jacky9881/comments/172635.html</wfw:comment><comments>http://www.blogjava.net/jacky9881/archive/2008/01/04/172635.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jacky9881/comments/commentRss/172635.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacky9881/services/trackbacks/172635.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 要实现向编辑器增加活动，我们应该在面板上选一种活动（开始活动，普通活动，结束活动），拖到编辑器中。为此我们必须在面板和编辑器中分别加监听。修改WorkflowProcessEditor类在编辑器的GraphicalViewer加监听protectedvoid&nbsp;initializeGraphicalViewer()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp...&nbsp;&nbsp;<a href='http://www.blogjava.net/jacky9881/archive/2008/01/04/172635.html'>阅读全文</a><img src ="http://www.blogjava.net/jacky9881/aggbug/172635.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacky9881/" target="_blank">玩转Java</a> 2008-01-04 08:49 <a href="http://www.blogjava.net/jacky9881/archive/2008/01/04/172635.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>流程设计器开发三(编辑器部分)</title><link>http://www.blogjava.net/jacky9881/archive/2008/01/03/172356.html</link><dc:creator>玩转Java</dc:creator><author>玩转Java</author><pubDate>Thu, 03 Jan 2008 00:54:00 GMT</pubDate><guid>http://www.blogjava.net/jacky9881/archive/2008/01/03/172356.html</guid><wfw:comment>http://www.blogjava.net/jacky9881/comments/172356.html</wfw:comment><comments>http://www.blogjava.net/jacky9881/archive/2008/01/03/172356.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/jacky9881/comments/commentRss/172356.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacky9881/services/trackbacks/172356.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp;为了实现流程编辑器，光有我们建立的模型，控制器和视图还不够，我们还必须新建一个编辑器类，为此，我们要新建一个插件项目，我们新建的插件项目com.example.workflow结构如下：&nbsp;&nbsp;&nbsp;&nbsp;为了实现一个编辑器，我们必须扩展org.eclipse.ui.editors这个扩展点，这个可...&nbsp;&nbsp;<a href='http://www.blogjava.net/jacky9881/archive/2008/01/03/172356.html'>阅读全文</a><img src ="http://www.blogjava.net/jacky9881/aggbug/172356.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacky9881/" target="_blank">玩转Java</a> 2008-01-03 08:54 <a href="http://www.blogjava.net/jacky9881/archive/2008/01/03/172356.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>流程设计器开发二(控制器和视图部分)</title><link>http://www.blogjava.net/jacky9881/archive/2008/01/02/172254.html</link><dc:creator>玩转Java</dc:creator><author>玩转Java</author><pubDate>Wed, 02 Jan 2008 08:51:00 GMT</pubDate><guid>http://www.blogjava.net/jacky9881/archive/2008/01/02/172254.html</guid><wfw:comment>http://www.blogjava.net/jacky9881/comments/172254.html</wfw:comment><comments>http://www.blogjava.net/jacky9881/archive/2008/01/02/172254.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jacky9881/comments/commentRss/172254.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacky9881/services/trackbacks/172254.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp;这一节，我们讲控制器的设计，在gef框架中，控制器作为连接模型和视图的桥梁，它主要根据用户的操作来修改模型，并且刷新视图。在前面我们定义了流程模型（WorkflowProcess），活动模型（AbstractActivity），转移模型（Transition），在这里我们分别定义相应的控制器（EditPart），首先我们定义流程模型对应的控制器(Wo...&nbsp;&nbsp;<a href='http://www.blogjava.net/jacky9881/archive/2008/01/02/172254.html'>阅读全文</a><img src ="http://www.blogjava.net/jacky9881/aggbug/172254.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacky9881/" target="_blank">玩转Java</a> 2008-01-02 16:51 <a href="http://www.blogjava.net/jacky9881/archive/2008/01/02/172254.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>流程设计器开发一(模型部分)</title><link>http://www.blogjava.net/jacky9881/archive/2008/01/02/172223.html</link><dc:creator>玩转Java</dc:creator><author>玩转Java</author><pubDate>Wed, 02 Jan 2008 07:32:00 GMT</pubDate><guid>http://www.blogjava.net/jacky9881/archive/2008/01/02/172223.html</guid><wfw:comment>http://www.blogjava.net/jacky9881/comments/172223.html</wfw:comment><comments>http://www.blogjava.net/jacky9881/archive/2008/01/02/172223.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/jacky9881/comments/commentRss/172223.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacky9881/services/trackbacks/172223.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp;我自从进入公司后，一直从事有关gef方面的开发工作，在这期间，走过不少弯路，仅仅是把GEF框架弄明白，就费了很大力气，所以，现在想写一点东西出来，供初学者阅读。&nbsp;&nbsp;&nbsp;&nbsp;GEF(Graphical Editing Framework)是图形化编辑器开发的工具，比较典型的应用就是IBM 的Rose，它是一个...&nbsp;&nbsp;<a href='http://www.blogjava.net/jacky9881/archive/2008/01/02/172223.html'>阅读全文</a><img src ="http://www.blogjava.net/jacky9881/aggbug/172223.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacky9881/" target="_blank">玩转Java</a> 2008-01-02 15:32 <a href="http://www.blogjava.net/jacky9881/archive/2008/01/02/172223.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>