﻿<?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-BaNg@taobao-随笔分类-Eclipse</title><link>http://www.blogjava.net/lifesting/category/29581.html</link><description>Just Do It!</description><language>zh-cn</language><lastBuildDate>Thu, 02 Feb 2012 15:01:41 GMT</lastBuildDate><pubDate>Thu, 02 Feb 2012 15:01:41 GMT</pubDate><ttl>60</ttl><item><title>Eclipse中正则表达式删除所有注释</title><link>http://www.blogjava.net/lifesting/archive/2012/02/02/369251.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Thu, 02 Feb 2012 09:25:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2012/02/02/369251.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/369251.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2012/02/02/369251.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/369251.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/369251.html</trackback:ping><description><![CDATA[<span style="font-size: 12px;"><strong>表达式： /\*{1,2}[\s\S]*?\*/<br /><br />对应语言注释 /* a lot of words */ 或文档注释 /** more words */<br />其中 *因为是regular expression的meta word，需要转义。<br />Eclipse中的查找是不能设置单行或者多行的，即DOT . 不包含 \r \n，所以\s代替，？表示非贪婪，即碰到注释结束 */ 要停止<br /><br /></strong></span><img src ="http://www.blogjava.net/lifesting/aggbug/369251.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2012-02-02 17:25 <a href="http://www.blogjava.net/lifesting/archive/2012/02/02/369251.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GEF社区捐献的一个图形旋转(Rotation)的例子</title><link>http://www.blogjava.net/lifesting/archive/2009/02/20/255789.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Fri, 20 Feb 2009 03:04:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2009/02/20/255789.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/255789.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2009/02/20/255789.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/255789.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/255789.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 实现GEF开发中的图形旋转的一个解决方案&nbsp;&nbsp;<a href='http://www.blogjava.net/lifesting/archive/2009/02/20/255789.html'>阅读全文</a><img src ="http://www.blogjava.net/lifesting/aggbug/255789.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2009-02-20 11:04 <a href="http://www.blogjava.net/lifesting/archive/2009/02/20/255789.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>搞Eclipse开发的Fellow都来露一个脸吧，谢谢！</title><link>http://www.blogjava.net/lifesting/archive/2009/02/04/253227.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Wed, 04 Feb 2009 05:10:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2009/02/04/253227.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/253227.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2009/02/04/253227.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/253227.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/253227.html</trackback:ping><description><![CDATA[先说下我自己，David BY Chan，28岁，在北京，2002年正式接触计算机程序，2003年底开始自学Eclipse开发，目前在一家研究所做仿真。基础杂实，为人低调，乐于助人，Eclipse Newsgroup上的David BY Chan就是我，呵呵，在上面少见到中国人。我擅长的方面有主要有Workbench UI, EMF, GEF/GMF, Debugger(Not Debugging)，对JDT/CDT/DTP/WTP也略有了解，感觉Eclipse太庞大了，经常碰到一些问题要调试很久。很想认识一些做Eclipse开发的，大家在交流的同时，累积的知识互为补充，共同进步。<br />
<br />
我的邮箱是： lifesting%gmail.com (replace % with @), msn id is step.in%hotmail.com<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/lifesting/aggbug/253227.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2009-02-04 13:10 <a href="http://www.blogjava.net/lifesting/archive/2009/02/04/253227.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>还真有一个Java AST View</title><link>http://www.blogjava.net/lifesting/archive/2008/12/19/247415.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Fri, 19 Dec 2008 15:36:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2008/12/19/247415.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/247415.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2008/12/19/247415.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/247415.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/247415.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: java ast view和java element view&nbsp;&nbsp;<a href='http://www.blogjava.net/lifesting/archive/2008/12/19/247415.html'>阅读全文</a><img src ="http://www.blogjava.net/lifesting/aggbug/247415.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2008-12-19 23:36 <a href="http://www.blogjava.net/lifesting/archive/2008/12/19/247415.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>着手开始准备我的第一个项目</title><link>http://www.blogjava.net/lifesting/archive/2008/12/12/246041.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Fri, 12 Dec 2008 14:16:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2008/12/12/246041.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/246041.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2008/12/12/246041.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/246041.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/246041.html</trackback:ping><description><![CDATA[软件开发的一个态势是迅捷，MDA(模型驱动架构)渐露头脚，火爆的RoR也只是MDA的初级模式，典型的比如代码合并和工具支持不够，模型的概念不够清晰。国内应用比较广的普元也包含类似想法，只不过有些忽略掉了&#8220;程序员&#8221;这个核心角色。<br />
<br />
我想要做的一个东西就是以模型为中心的开发方式，它被&#8220;隐藏&#8221;在Eclipse里面。比如日常我们做的企业开发大部分是以业务层BO为核心，然后向下延伸至存储，向上有service/service control/page control/page之类，那么通过一套可编程模板（即Template DSL)+代码生成器就可以生成想要的各个层的代码了，其本质上是一个UML图形建模工具，上面绑定模板，模板的编写提供类似JDT(提供在Eclipse编写/调试Java代码的插件集)的高亮/纠错，重构等，代码生成过程可以被运行或者单步调试。<br />
<br />
MDA在Eclipse社区的推动下，日渐成熟，以EMF metamodel描述的UML2足够强大，在技术完全可行，德国的oaw，法国的acceleo都有成熟的应用。<br />
<br />
我做这个的想法就是帮程序员摆脱繁重琐碎的比如javabean, html, configuration等。<br />
<br />
商业模式就是使用免费+收费专业培训支持。<br />
<br />
有同仁在搞MDA类似的开发么？欢迎提出宝贵意见。<br />
<br />
<strong>如果你是一个多层JavaEE的开发者，每天被spring, hibernate, jdbc, structs/jsf/xxx, html折磨，最希望共帮你解决那些问题呢？谢谢。</strong><br />
<br />
Update: Just do it，先去尝试一把，做一个版本出来，谢谢关注。<br />
<img src ="http://www.blogjava.net/lifesting/aggbug/246041.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2008-12-12 22:16 <a href="http://www.blogjava.net/lifesting/archive/2008/12/12/246041.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EMF的几种编辑方式</title><link>http://www.blogjava.net/lifesting/archive/2008/12/10/245449.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Wed, 10 Dec 2008 03:36:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2008/12/10/245449.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/245449.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2008/12/10/245449.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/245449.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/245449.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Eclipse Modeling  Framework  (EMF)的三种编缉方式。&nbsp;&nbsp;<a href='http://www.blogjava.net/lifesting/archive/2008/12/10/245449.html'>阅读全文</a><img src ="http://www.blogjava.net/lifesting/aggbug/245449.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2008-12-10 11:36 <a href="http://www.blogjava.net/lifesting/archive/2008/12/10/245449.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GMF中使用动态模板(dynamic templates)</title><link>http://www.blogjava.net/lifesting/archive/2008/12/08/245016.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Mon, 08 Dec 2008 05:54:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2008/12/08/245016.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/245016.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2008/12/08/245016.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/245016.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/245016.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 使用动态模板定制GMF代码生成。&nbsp;&nbsp;<a href='http://www.blogjava.net/lifesting/archive/2008/12/08/245016.html'>阅读全文</a><img src ="http://www.blogjava.net/lifesting/aggbug/245016.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2008-12-08 13:54 <a href="http://www.blogjava.net/lifesting/archive/2008/12/08/245016.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>插件开发之：Common Navigator View (CNV) 通用导航试图</title><link>http://www.blogjava.net/lifesting/archive/2008/11/30/242634.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Sat, 29 Nov 2008 17:28:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2008/11/30/242634.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/242634.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2008/11/30/242634.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/242634.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/242634.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一个实例完整的演示了Common Navigator View的开发过程。&nbsp;&nbsp;<a href='http://www.blogjava.net/lifesting/archive/2008/11/30/242634.html'>阅读全文</a><img src ="http://www.blogjava.net/lifesting/aggbug/242634.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2008-11-30 01:28 <a href="http://www.blogjava.net/lifesting/archive/2008/11/30/242634.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>plugin.properties不管用，插件中总是出现%xxx字符</title><link>http://www.blogjava.net/lifesting/archive/2008/11/26/242890.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Wed, 26 Nov 2008 14:20:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2008/11/26/242890.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/242890.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2008/11/26/242890.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/242890.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/242890.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: plugin.properties配置的key=value不管用，插件运行的时候总是显示%xx而不显示对应值。&nbsp;&nbsp;<a href='http://www.blogjava.net/lifesting/archive/2008/11/26/242890.html'>阅读全文</a><img src ="http://www.blogjava.net/lifesting/aggbug/242890.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2008-11-26 22:20 <a href="http://www.blogjava.net/lifesting/archive/2008/11/26/242890.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>插件开发: 将View里面的对象托拽到Editor步骤</title><link>http://www.blogjava.net/lifesting/archive/2008/11/22/241723.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Fri, 21 Nov 2008 17:27:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2008/11/22/241723.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/241723.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2008/11/22/241723.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/241723.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/241723.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 通过一个完整例子，系统的讲述了在Eclipse开发中怎么讲table/tree view里面的东西拖拽到text/graphical editor上。&nbsp;&nbsp;<a href='http://www.blogjava.net/lifesting/archive/2008/11/22/241723.html'>阅读全文</a><img src ="http://www.blogjava.net/lifesting/aggbug/241723.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2008-11-22 01:27 <a href="http://www.blogjava.net/lifesting/archive/2008/11/22/241723.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ubuntu下GTK+开发环境设置</title><link>http://www.blogjava.net/lifesting/archive/2008/11/17/240884.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Sun, 16 Nov 2008 16:28:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2008/11/17/240884.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/240884.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2008/11/17/240884.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/240884.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/240884.html</trackback:ping><description><![CDATA[为了搞清linux下SWT与GTK+的映射机制，翻出老笔记本装了个Ubuntu，配置GTK+开发环境还是比较简单的。<br />
<br />
<ol>
    <li>安装必须要的东西</li>
    <ol>
        <li>安装JDK，使用命令：<span style="color: red;">sudo apt-get install sun-java6-sdk</span></li>
        <li>安装eclipse+CDT 5.0，我觉得CDT从5开始渐成气候了，作为一个eclipse开发者，我觉得他比kdevelop好用:)，遗憾的是在win下不支持msvc，只能通过mingw或cygwin</li>
        <li>安装gnome和gtk+开发库，使用命令：<span style="color: red;">sudo apt-get install libgtk2.0-dev libgnome2-dev</span> ,安装之后，所有相关的头文件和静态／动态库文件已经准备好了，不得不说apt-get真NB。</li>
    </ol>
    <li>测试一下</li>
    <ol>
        <li>头文件使用命令 <span style="color: red;">pkg-config --cflags gtk+-2.0</span>，正常情况下会出现一下结果：<br />
        -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/pixman-1</li>
        <li>库文件使用命令 <span style="color: red;">pkg-config --libs gtk+-2.0</span>，正常情况下会出现一下结果：<br />
        -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 -ldl -lglib-2.0 <br />
        </li>
    </ol>
    <li>启动Eclipse，新建一个c project，然后右键单击 properties-&gt;c/c++ build-&gt;Settings，在Tool Setting中将给GCC设置头文件目录以及链接库(还有一种做法是自定义make file，里面调用pkg-config，因为没有显式设置，cdt无法做静态分析，不能利用它的强大功能，比如索引，重构等）。</li>
    <ol>
        <li>设置头文件，点击GCC C Compiler－&gt;Directories，然后使用命令 <span style="color: red;">pkg-config --cflags gtk+-2.0 | sed 's/ /\n/g' &gt; include.txt</span>，然后使用命令 <span style="color: red;">sed 's/-I//g' include.txt</span>，依次将出现的每一行add到inclue path里面去。</li>
        <li>设置库，点击GCC C Linker-&gt;Libraries，然后如头文件操作一样使用命令<span style="color: red;">pkg-config --libs gtk+-2.0 | sed 's/ /\n/g' &gt; lib.txt</span>，然后使用命令 <span style="color: red;">sed 's/-l//g' lib.txt</span>，依次将出现的每一行添加到libraries里。<br />
        </li>
    </ol>
    <li>编写一个包含GTK+测试代码的C文件，添加到项目里面，内容如下：<!--<br />
    <br />
    Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
    http://www.CodeHighlighter.com/<br />
    <br />
    --><!--<br />
    <br />
    Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
    http://www.CodeHighlighter.com/<br />
    <br />
    --><br />
    <div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
    <br />
    Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
    http://www.CodeHighlighter.com/<br />
    <br />
    --><span style="color: rgb(0, 0, 0);">#include&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">gtk</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">gtk.h</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
    </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;destroy(GtkWidget</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">,&nbsp;gpointer);<br />
    </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;gboolean&nbsp;delete_event(GtkWidget</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">,&nbsp;GdkEvent</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">,&nbsp;gpointer);<br />
    </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;main(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;argc,&nbsp;</span><span style="color: rgb(0, 0, 255);">char</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">argv[])&nbsp;{<br />
    &nbsp;&nbsp;&nbsp;&nbsp;GtkWidget&nbsp;</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">window,&nbsp;</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">label;<br />
    &nbsp;&nbsp;&nbsp;&nbsp;gtk_init(</span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">argc,&nbsp;</span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">argv);<br />
    &nbsp;&nbsp;&nbsp;&nbsp;window&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;gtk_window_new(GTK_WINDOW_TOPLEVEL);<br />
    &nbsp;&nbsp;&nbsp;&nbsp;gtk_window_set_title(GTK_WINDOW&nbsp;(window),&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Hello&nbsp;World!</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
    &nbsp;&nbsp;&nbsp;&nbsp;gtk_container_set_border_width(GTK_CONTAINER&nbsp;(window),&nbsp;</span><span style="color: rgb(0, 0, 0);">10</span><span style="color: rgb(0, 0, 0);">);<br />
    &nbsp;&nbsp;&nbsp;&nbsp;gtk_widget_set_size_request(window,&nbsp;</span><span style="color: rgb(0, 0, 0);">200</span><span style="color: rgb(0, 0, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 0);">100</span><span style="color: rgb(0, 0, 0);">);<br />
    &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">/*</span><span style="color: rgb(0, 128, 0);">&nbsp;Connect&nbsp;the&nbsp;main&nbsp;window&nbsp;to&nbsp;the&nbsp;destroy&nbsp;and&nbsp;delete-event&nbsp;signals.&nbsp;</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;g_signal_connect(G_OBJECT(window),&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">destroy</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,&nbsp;G_CALLBACK(destroy),&nbsp;NULL);<br />
    &nbsp;&nbsp;&nbsp;&nbsp;g_signal_connect(G_OBJECT(window),&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">delete_event</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;G_CALLBACK(delete_event),&nbsp;NULL);<br />
    &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">/*</span><span style="color: rgb(0, 128, 0);">&nbsp;Create&nbsp;a&nbsp;new&nbsp;GtkLabel&nbsp;widget&nbsp;that&nbsp;is&nbsp;selectable.&nbsp;</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;label&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;gtk_label_new(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Hello&nbsp;World</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
    &nbsp;&nbsp;&nbsp;&nbsp;gtk_label_set_selectable(GTK_LABEL&nbsp;(label),&nbsp;TRUE);<br />
    &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">/*</span><span style="color: rgb(0, 128, 0);">&nbsp;Add&nbsp;the&nbsp;label&nbsp;as&nbsp;a&nbsp;child&nbsp;widget&nbsp;of&nbsp;the&nbsp;window.&nbsp;</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;gtk_container_add(GTK_CONTAINER&nbsp;(window),&nbsp;label);<br />
    &nbsp;&nbsp;&nbsp;&nbsp;gtk_widget_show_all(window);<br />
    &nbsp;&nbsp;&nbsp;&nbsp;gtk_main();<br />
    &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br />
    }<br />
    </span><span style="color: rgb(0, 128, 0);">/*</span><span style="color: rgb(0, 128, 0);">&nbsp;Stop&nbsp;the&nbsp;GTK+&nbsp;main&nbsp;loop&nbsp;function&nbsp;when&nbsp;the&nbsp;window&nbsp;is&nbsp;destroyed.&nbsp;</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />
    </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;destroy(GtkWidget&nbsp;</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">window,&nbsp;gpointer&nbsp;data)&nbsp;{<br />
    &nbsp;&nbsp;&nbsp;&nbsp;gtk_main_quit();<br />
    }<br />
    </span><span style="color: rgb(0, 128, 0);">/*</span><span style="color: rgb(0, 128, 0);">&nbsp;Return&nbsp;FALSE&nbsp;to&nbsp;destroy&nbsp;the&nbsp;widget.&nbsp;By&nbsp;returning&nbsp;TRUE,&nbsp;you&nbsp;can&nbsp;cancel<br />
    &nbsp;*&nbsp;a&nbsp;delete-event.&nbsp;This&nbsp;can&nbsp;be&nbsp;used&nbsp;to&nbsp;confirm&nbsp;quitting&nbsp;the&nbsp;application.&nbsp;</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />
    </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;gboolean&nbsp;delete_event(GtkWidget&nbsp;</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">window,&nbsp;GdkEvent&nbsp;</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 255);">event</span><span style="color: rgb(0, 0, 0);">,&nbsp;gpointer&nbsp;data)&nbsp;{<br />
    &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;FALSE;<br />
    }<br />
    </span></div>
    <br />
    (以上代码来自图书 Foundation of GTK+ development)<br />
    然后运行，正常会显式如下：<br />
    <img alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/gtk-code.png" width="872" height="538" /></li>
</ol>
Ubuntu真是个好东西，耗的资源少，图形系统稳定，对开发人员及其友好，真的很强大。<br />
<br />
<img src ="http://www.blogjava.net/lifesting/aggbug/240884.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2008-11-17 00:28 <a href="http://www.blogjava.net/lifesting/archive/2008/11/17/240884.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse Job的属性</title><link>http://www.blogjava.net/lifesting/archive/2008/09/01/226072.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Mon, 01 Sep 2008 09:45:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2008/09/01/226072.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/226072.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2008/09/01/226072.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/226072.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/226072.html</trackback:ping><description><![CDATA[文章来源：<a href="http://blog.eclipse-tips.com/2008/08/adding-iaction-to-job.html">http://blog.eclipse-tips.com/2008/08/adding-iaction-to-job.html</a><br />
<br />
关于Job不说了，无所不在，我要讲的是job的一些属性。<br />
<br />
1 给Job加上Action，当用户在Job运行的时候点击时，可显示更具体的job描述或者对job本身进行操作。<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">Job&nbsp;job&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Job(</span><span style="color: #000000;">"</span><span style="color: #000000;">My&nbsp;Job</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;IStatus&nbsp;run(IProgressMonitor&nbsp;monitor)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;monitor.beginTask(</span><span style="color: #000000;">"</span><span style="color: #000000;">My&nbsp;job&nbsp;is&nbsp;working<img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">100</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">100</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span style="color: #000000;">200</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(InterruptedException&nbsp;e)&nbsp;{}&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;ignore</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;monitor.worked(</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;monitor.done();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Status(IStatus.OK,&nbsp;Activator.PLUGIN_ID,&nbsp;</span><span style="color: #000000;">"ok, </span><span style="color: #000000;">job&nbsp;finished!</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
};<br />
job.setProperty(IProgressConstants.ACTION_PROPERTY,&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Action()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;run()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageDialog.openInformation(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Shell(),&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Job&nbsp;Status</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Some&nbsp;partial&nbsp;results&nbsp;processed&nbsp;can&nbsp;be&nbsp;displayed&nbsp;here</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;});<br />
job.schedule();<br />
</span></div>
<br />
效果图：<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/jobaction1.JPG" width="754" height="541" /><br />
<br />
2 在Progress View里面保留记录<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">job.setProperty(IProgressConstants.KEEP_PROPERTY,&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">); <br />
</span></div>
<br />
效果图：<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/jobhistory.JPG" width="760" height="207" /><br />
<br />
3 防止error dialog打断你的操作。process view里面运行的job如果返回的status是error，那么默认它会弹出一个error dialog警告job有错误，如果job运行的同时你在干别的，这可能会打断你的某个操作(Eclispe的dialog都是modal的)。<br />
<br />
把job的返回状态改为error。<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Status(IStatus.ERROR,&nbsp;Activator.PLUGIN_ID,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Job&nbsp;finished&nbsp;with&nbsp;ERRORS</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span></div>
<br />
error dialog:<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/error_dialog.JPG" width="761" height="548" /><br />
<br />
加上属性屏蔽error dialog:<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">job.setProperty(IProgressConstants.NO_IMMEDIATE_ERROR_PROMPT_PROPERTY,&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);</span></div>
<br />
4 给Job加一个图标：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">job.setProperty(IProgressConstants.ICON_PROPERTY,&nbsp;Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">icons/sample.gif</span><span style="color: #000000;">"</span><span style="color: #000000;">));</span></div>
<br />
效果如下：<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/job_icon.JPG" width="760" height="207" /><br />
<br />
<img src ="http://www.blogjava.net/lifesting/aggbug/226072.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2008-09-01 17:45 <a href="http://www.blogjava.net/lifesting/archive/2008/09/01/226072.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>或许有用的特性 Eclipse 3.4 Templates View</title><link>http://www.blogjava.net/lifesting/archive/2008/08/29/225665.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Fri, 29 Aug 2008 15:20:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2008/08/29/225665.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/225665.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2008/08/29/225665.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/225665.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/225665.html</trackback:ping><description><![CDATA[Eclipse3.4用了一段时间了，发现了很多新特性，API变化也很大，昨天凑巧发现了JDT Template View，Window-&gt;Show View-&gt;Templates View效果如下：<br />
<br />
<img height="571" alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/tpl-view.JPG" width="1172" border="0" /><br />
<br />
看得出来它是在JDT UI里面定义的，综合了jdt text editor template 如 Java开头的category 和custom editor template如SWT开头的category。对于我来说，SWT/Draw2d/Plugin的大量重复性代码就可以通过这个来完成了。将模板的代码插入到编辑器有两种方法，一种是直接拖拽到编辑器中，另一种是输入简写入如"execute"，按Contxt Assist快捷键(一般为Ctrl+Space)。<br />
<br />
除此之外，Templates View还可以维护template比如add/remove。Template的值以XML字串存放在.metadata\.plugins\org.eclipse.core.runtime\.settings\org.eclipse.jdt.ui.prefs文件的org.eclipse.jdt.ui.text.custom_templates项<br />
起初我以为Template View好像还没有提供什么NB功能，在Window-&gt;Preferences-&gt;Java-&gt;-Editor-&gt;Templates可以做同样的事情，但稍微看了一下代码，发现我错了：<br />
<br />
Templates View是PageBookView，意味着它跟Properties View/Outline View一样，可以根据不同的Editor来显示不同的Page，比如上图JDT就是JavaTemplatesPage，如果编写一个DSL Editor需要用到Templates View，继承AbstractTemplatesPage，然后在Editor的getAapter()返回page，看Java Editor示例：<br />
<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_90_625_Open_Image" onclick="this.style.display='none'; Codehighlighter1_90_625_Open_Text.style.display='none'; Codehighlighter1_90_625_Closed_Image.style.display='inline'; Codehighlighter1_90_625_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_90_625_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_90_625_Closed_Text.style.display='none'; Codehighlighter1_90_625_Open_Image.style.display='inline'; Codehighlighter1_90_625_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;CompilationUnitEditor&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;JavaEditor&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;IJavaReconcilingListener&nbsp;</span><span id="Codehighlighter1_90_625_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_90_625_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
<img id="Codehighlighter1_138_624_Open_Image" onclick="this.style.display='none'; Codehighlighter1_138_624_Open_Text.style.display='none'; Codehighlighter1_138_624_Closed_Image.style.display='inline'; Codehighlighter1_138_624_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_138_624_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_138_624_Closed_Text.style.display='none'; Codehighlighter1_138_624_Open_Image.style.display='inline'; Codehighlighter1_138_624_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;getAdapter(Class&nbsp;required)&nbsp;</span><span id="Codehighlighter1_138_624_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_138_624_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_192_330_Open_Image" onclick="this.style.display='none'; Codehighlighter1_192_330_Open_Text.style.display='none'; Codehighlighter1_192_330_Closed_Image.style.display='inline'; Codehighlighter1_192_330_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_192_330_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_192_330_Closed_Text.style.display='none'; Codehighlighter1_192_330_Open_Image.style.display='inline'; Codehighlighter1_192_330_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(SmartBackspaceManager.</span><span style="color: #0000ff">class</span><span style="color: #000000">.equals(required))&nbsp;</span><span id="Codehighlighter1_192_330_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_192_330_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_248_326_Open_Image" onclick="this.style.display='none'; Codehighlighter1_248_326_Open_Text.style.display='none'; Codehighlighter1_248_326_Closed_Image.style.display='inline'; Codehighlighter1_248_326_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_248_326_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_248_326_Closed_Text.style.display='none'; Codehighlighter1_248_326_Open_Image.style.display='inline'; Codehighlighter1_248_326_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(getSourceViewer()&nbsp;</span><span style="color: #0000ff">instanceof</span><span style="color: #000000">&nbsp;JavaSourceViewer)&nbsp;</span><span id="Codehighlighter1_248_326_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_248_326_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;((JavaSourceViewer)&nbsp;getSourceViewer()).getBackspaceManager();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_378_482_Open_Image" onclick="this.style.display='none'; Codehighlighter1_378_482_Open_Text.style.display='none'; Codehighlighter1_378_482_Closed_Image.style.display='inline'; Codehighlighter1_378_482_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_378_482_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_378_482_Closed_Text.style.display='none'; Codehighlighter1_378_482_Open_Image.style.display='inline'; Codehighlighter1_378_482_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(ITemplatesPage.</span><span style="color: #0000ff">class</span><span style="color: #000000">.equals(required))&nbsp;</span><span id="Codehighlighter1_378_482_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_378_482_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(fTemplatesPage&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fTemplatesPage</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;createTemplatesPage();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;fTemplatesPage;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">.getAdapter(required);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
<img id="Codehighlighter1_577_618_Open_Image" onclick="this.style.display='none'; Codehighlighter1_577_618_Open_Text.style.display='none'; Codehighlighter1_577_618_Closed_Image.style.display='inline'; Codehighlighter1_577_618_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_577_618_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_577_618_Closed_Text.style.display='none'; Codehighlighter1_577_618_Open_Image.style.display='inline'; Codehighlighter1_577_618_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;JavaTemplatesPage&nbsp;createTemplatesPage()&nbsp;</span><span id="Codehighlighter1_577_618_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_577_618_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;JavaTemplatesPage(</span><span style="color: #0000ff">this</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span></div>
</span><br />
当然，大部分人不需要写editor，我们可以在自己的插件里通过使用扩展点来org.eclipse.ui.editors.templates扩展JDT Template，比如我就在GEF项目里面加入了GEF Template，这样编写讨厌的EditPart/EditPolicy/Command就可以少些好多代码。<br />
<br />
<img height="565" alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/tpl-ext.JPG" width="891" border="0" /><br />
<br />
第一张图片看到的swt template就是在上图所示的default-swttemplates.xml里面定义好了的。<br />
<br />
最后想告诉广大Eclipse爱好者的就是，Eclipse SDK写的代码真工整，果然是协作的结晶，整一个代码宝库，根本不用看<strong>代码大全</strong>了:)。 
<img src ="http://www.blogjava.net/lifesting/aggbug/225665.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2008-08-29 23:20 <a href="http://www.blogjava.net/lifesting/archive/2008/08/29/225665.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GEF编辑器中定点action如paste等的解决办法</title><link>http://www.blogjava.net/lifesting/archive/2008/08/20/223309.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Wed, 20 Aug 2008 14:26:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2008/08/20/223309.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/223309.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2008/08/20/223309.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/223309.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/223309.html</trackback:ping><description><![CDATA[GEF中大部分action对位置不敏感，但还是有例外，典型的如paste，context menu中的某个action需要将clipboard中的东西paste到右键单击位置。如下图：<br />
<br />
<img height="504" alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/paste.JPG" width="676" /><br />
即使在GMF中, DiagramAction也是取得是鼠标点击paste时的位置，而不是之前右键单击出现contxt menu的位置。这里<strong>&#8220;定点</strong>&#8221;关键是在选择paste之前<strong><span style="color: red">右键单击的位置已经被记住</span></strong>了，并且对context menu中所有对位置敏感的action都有效，比如merge, duplicate等。<br />
<br />
下面分三步完成：<br />
<br />
<strong>1 定义一个接口，为所有位置敏感action提供位置信息</strong><br />
<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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;ILocationWare&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setLocation(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;y);<br />
}</span></div>
<br />
<strong>2 注册一个listener到GEF editor的context menu，提供位置记忆，这个是关键。</strong><br />
<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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;LivingContextMenu&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ContextMenuProvider&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;LivingEditor&nbsp;editor;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;IMenuListener&nbsp;listener&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;IMenuListener(){<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;menuAboutToShow(IMenuManager&nbsp;manager)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Control&nbsp;canvas&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;getViewer().getControl();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;cursor_location&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;canvas.getDisplay().getCursorLocation();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;relative_canvas&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;canvas.toControl(cursor_location);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setItemLocation(manager,relative_canvas);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setItemLocation(IMenuManager&nbsp;manager,&nbsp;Point&nbsp;relative_canvas)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IContributionItem[]&nbsp;items&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;manager.getItems();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;items.length;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IContributionItem&nbsp;item&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;items[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(item&nbsp;</span><span style="color: #0000ff">instanceof</span><span style="color: #000000">&nbsp;ActionContributionItem)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IAction&nbsp;host_action&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;((ActionContributionItem)item).getAction();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(host_action&nbsp;</span><span style="color: #0000ff">instanceof</span><span style="color: #000000">&nbsp;ILocationWare)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: red">((ILocationWare)host_action).setLocation(relative_canvas.x,&nbsp;relative_canvas.y)</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(item&nbsp;</span><span style="color: #0000ff">instanceof</span><span style="color: #000000">&nbsp;IMenuManager)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setItemLocation((IMenuManager)item,&nbsp;relative_canvas);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;LivingContextMenu(LivingEditor&nbsp;lv)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">((GraphicalViewer)lv.getAdapter(GraphicalViewer.</span><span style="color: #0000ff">class</span><span style="color: #000000">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;editor&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;lv;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addMenuListener(listener);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" />.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" />.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" />.<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;dispose()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;removeMenuListener(listener);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">.dispose();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}</span></div>
原理就是右键单击后，context menu的listener已经记住了鼠标在graphicalviewer control(一般为FigureCanvas)右击位置，并告知给所有context menu中对位置敏感的action。<br />
<br />
<strong>3 对位置敏感的action实现ILocationWare接口，比如paste。</strong><br />
<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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">public</span><span style="color: #000000">&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&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;ILocationWare&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Point&nbsp;location&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Point(</span><span style="color: #000000">10</span><span style="color: #000000">,</span><span style="color: #000000">10</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;contextTrigged</span><span style="color: #000000">=</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;PasteAction(LivingEditor&nbsp;part)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">(part);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;run()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">some&nbsp;operations&nbsp;depend&nbsp;on&nbsp;location</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setLocation(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;y)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;location.setLocation(x,&nbsp;y);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contextTrigged&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">.init();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setId(ActionFactory.PASTE.getId());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ISharedImages&nbsp;workbench_images&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;PlatformUI.getWorkbench().getSharedImages();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setImageDescriptor(workbench_images.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setDisabledImageDescriptor(workbench_images.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE_DISABLED));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<br />
这种解决同样适用于GMF的DiagramAction。(DiagramAction也是Action的子类)<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/lifesting/aggbug/223309.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2008-08-20 22:26 <a href="http://www.blogjava.net/lifesting/archive/2008/08/20/223309.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于GEF 3.4 PaletteGroup的小误会</title><link>http://www.blogjava.net/lifesting/archive/2008/08/17/222636.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Sun, 17 Aug 2008 14:40:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2008/08/17/222636.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/222636.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2008/08/17/222636.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/222636.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/222636.html</trackback:ping><description><![CDATA[最近发现一个很怪的问题，GEF的PaletteGroup在3.3及以下都有border，而在3.4却消失了，我觉得好像是GEF 3.4 PaletteViewer的开发者Hudson和Shah认为不可见的边框更&#8220;友好&#8221;，可是好多人都不习惯了，觉得是bug了，在给gef newsgroup上一个人回答问题的时候顺便把这个hack了一下，效果还不错，哈哈！下面是步骤：<br />
<br />
1 定义一个HackedGroupEditPart:<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.eclipse.draw2d.ColorConstants;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.eclipse.draw2d.Graphics;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.eclipse.draw2d.IFigure;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.eclipse.draw2d.MarginBorder;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.eclipse.draw2d.geometry.Insets;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.eclipse.draw2d.geometry.Rectangle;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.eclipse.gef.internal.ui.palette.editparts.GroupEditPart;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.eclipse.gef.palette.PaletteContainer;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.eclipse.jface.action.Separator;<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;HackedGroupEditPart&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;GroupEditPart&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;HackedGroupEditPart(PaletteContainer&nbsp;group)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">(group);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;refreshVisuals()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">.refreshVisuals();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Insets&nbsp;insets&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getContentPane().getBorder().getInsets(getContentPane());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getContentPane().setBorder(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;MarginBorder(insets){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&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;paint(IFigure&nbsp;figure,&nbsp;Graphics&nbsp;graphics,&nbsp;Insets&nbsp;insets)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rectangle&nbsp;r&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getPaintRectangle(figure,&nbsp;insets);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r.height</span><span style="color: #000000;">--</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;graphics.setForegroundColor(ColorConstants.buttonDarker);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;graphics.drawLine(r.x,&nbsp;r.bottom(),&nbsp;r.right(),&nbsp;r.bottom());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
}<br />
<br />
2 使用这个加了边框的GroupEditPart，在编辑器定义里面重写 <strong>createPaletteViewerProvider </strong>方法，如下：</span><br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;LivingEditor&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;GraphicalEditorWithFlyoutPalette&nbsp;{<br />
<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.<br />
<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.<br />
@Override<br />
</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;PaletteViewerProvider&nbsp;createPaletteViewerProvider()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PaletteViewerProvider(getEditDomain())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;PaletteViewer&nbsp;createPaletteViewer(Composite&nbsp;parent)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">add&nbsp;border&nbsp;for&nbsp;GroupEditPart</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;PaletteEditPartFactory&nbsp;pepf&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PaletteEditPartFactory()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;EditPart&nbsp;createGroupEditPart(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EditPart&nbsp;parentEditPart,&nbsp;Object&nbsp;model)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;HackedGroupEditPart((PaletteContainer)model);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PaletteViewer&nbsp;pViewer&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PaletteViewer(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setEditPartFactory(pepf);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pViewer.createControl(parent);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;configurePaletteViewer(pViewer);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hookPaletteViewer(pViewer);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;pViewer;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><br />
<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><br />
}</span></div>
</div>
<br />
我的Palette定义，使用了三个PaletteGroup，但不改一下根本看不出来<strong>group之间的分隔</strong>：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">public&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;PaletteProvider&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;PaletteRoot&nbsp;provide(LivingEditor&nbsp;livingEditor)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PaletteRoot&nbsp;root&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PaletteRoot();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;createStandardTool(root);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;createConnectionTool(root);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;createModelTool(root);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;root;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;createModelTool(PaletteRoot&nbsp;root)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PaletteGroup&nbsp;model_group&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PaletteGroup(</span><span style="color: #000000;">"</span><span style="color: #000000;">model</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CombinedTemplateCreationEntry&nbsp;person_entry&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;CombinedTemplateCreationEntry(</span><span style="color: #000000;">"</span><span style="color: #000000;">Person</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Create&nbsp;a&nbsp;person</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SimpleFactory(Person.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">icon/person16.png</span><span style="color: #000000;">"</span><span style="color: #000000;">),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">icon/person24.png</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;model_group.add(person_entry);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CombinedTemplateCreationEntry&nbsp;dog_entry&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;CombinedTemplateCreationEntry(</span><span style="color: #000000;">"</span><span style="color: #000000;">Dog</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Create&nbsp;a&nbsp;dog</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SimpleFactory(Dog.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">icon/dog16.gif</span><span style="color: #000000;">"</span><span style="color: #000000;">),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">icon/dog24.gif</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;model_group.add(dog_entry);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.add(model_group);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;createConnectionTool(PaletteRoot&nbsp;root)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConnectionCreationToolEntry&nbsp;relation&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ConnectionCreationToolEntry(</span><span style="color: #000000;">"</span><span style="color: #000000;">relation</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">relation&nbsp;between&nbsp;person&nbsp;and&nbsp;dog</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SimpleFactory(Relation.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">icon/connection16.gif</span><span style="color: #000000;">"</span><span style="color: #000000;">),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">icon/connection24.gif</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PaletteGroup&nbsp;conn_group&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PaletteGroup(</span><span style="color: #000000;">"</span><span style="color: #000000;">relations</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn_group.add(relation);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.add(conn_group);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;createStandardTool(PaletteRoot&nbsp;root)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PaletteGroup&nbsp;std&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PaletteGroup(</span><span style="color: #000000;">"</span><span style="color: #000000;">Standard</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SelectionToolEntry&nbsp;selection&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SelectionToolEntry();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std.add(selection);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.add(std);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
可以看一下修改后的对比：<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/groupcompare.JPG" width="433" height="434" /><br />
<br />
不过这种方法使用了internal API，不适应版本更新，只适合救急。我已经报告了这个<strong>误会</strong>，3.5应该不会有了。<br />
<br />
如果你也有这个困扰，就试试吧。<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/lifesting/aggbug/222636.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2008-08-17 22:40 <a href="http://www.blogjava.net/lifesting/archive/2008/08/17/222636.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过一个小例子看怎样扩展SWT</title><link>http://www.blogjava.net/lifesting/archive/2008/07/24/217236.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Thu, 24 Jul 2008 10:39:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2008/07/24/217236.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/217236.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2008/07/24/217236.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/217236.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/217236.html</trackback:ping><description><![CDATA[对于Eclipse开发者来说，不管Plug-in还是RCP免不了要和SWT打交道，但两者似乎有些不同，Plug-in主要跟Eclipse过招，开发更多是上层应用如UI/JDT/EMF/GMF等，而RCP像是应用程序，时不时与图形系统交互，需求更是五花八门，举几例：<br />
<ul>
    <li>RCP界面要跟Office 2007/Vista一样。
    </li>
    <li>我喜欢上一VC版的水晶按钮。
    </li>
    <li>商业版控件支持。
    </li>
    <li>我的RCP程序要定时启动。 </li>
</ul>
这些效果让RCP下的SWT越来越跟平台相关，但矛盾的是SWT要跨平台，提供的API只能是一个平衡产品+少许补充，更多特性依赖我们对SWT进行扩展。比较常见的是对SWT Win32 API进行扩展，因为Windows的图形特性太丰富了，不用白不用啊。<br />
<br />
下面就以SWT win32 x86来演示一下这个扩展过程。扩展很简单，就是在swt的窗口上加一个自定义系统菜单，最终效果如下图：<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/result.JPG" width="534" height="331" /><br />
<br />
首先要有SWT JNI源代码，在Eclipse plug-in目录下找到org.eclipse.swt.win32.win32.x86.source_3.X.X.vXXX.jar(xx为版本号)，解压缩到c:\build\swt-jni，解完后在会发现有一堆h和c文件，其中比较重要的就是os, gdip, xpcom,wgl,awt，用途分别如下：<br />
<ul>
    <li>os: 主要的JNI，用来创建控件，事件处理等。
    </li>
    <li>gdip: 与windows的dc交互，提供swt的gc画图功能。
    </li>
    <li>xpcom: 供swt调用mozilla系列浏览器如firefox等。
    </li>
    <li>wgl: 与3D相关，一般都用不上。
    </li>
    <li>awt：在swt中调用awt，awt也是jni。 </li>
</ul>
了解swt源代码之后，接下来为build swt做准备。<br />
<ul>
    <li>安装vc6，尝试过用高版本，但不支持。
    </li>
    <li>安装platform SDK 2003 February版，<a href="http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm">下载地址</a>&nbsp; 遵照安装说明将SDK解压缩安装。不要尝试更新版本，不支持。
    </li>
    <li>安装jdk，这个无所谓，1.4, 1.5, 1.6都可以。
    </li>
    <li>下载gecko-sdk(<a href="http://developer.mozilla.org/en/docs/Gecko_SDK#Downloading">下载地址</a>)，请务必使用1.8，swt目前不完全支持1.9。 </li>
</ul>
<p>所以的工具都安装或解压之后，在swt源代码目录下找到build.bat，在:X86 label部分做如下配置，其中配置的目录视你的安装而定：<br />
</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #008080;">&nbsp;1</span><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000;">:X86<br />
</span><span style="color: #008080;">&nbsp;2</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080;">&nbsp;3</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />IF&nbsp;x.%DEV_TOOLS%</span><span style="color: #000000;">==</span><span style="color: #000000;">x.&nbsp;set&nbsp;DEV_TOOLS</span><span style="color: #000000;">=</span><span style="color: #000000;">c:\PROGRA~</span><span style="color: #000000;">1</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;4</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />call&nbsp;%DEV_TOOLS%\MICROS~</span><span style="color: #000000;">2</span><span style="color: #000000;">\vc98\bin\vcvars32.bat<br />
</span><span style="color: #008080;">&nbsp;5</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />IF&nbsp;x.%MSSDK%</span><span style="color: #000000;">==</span><span style="color: #000000;">x.&nbsp;set&nbsp;MSSDK</span><span style="color: #000000;">=</span><span style="color: #000000;">%DEV_TOOLS%\MICROS~</span><span style="color: #000000;">3</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;6</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />call&nbsp;%MSSDK%\setenv&nbsp;/XP32&nbsp;/RETAIL<br />
</span><span style="color: #008080;">&nbsp;7</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />IF&nbsp;x.%OUTPUT_DIR%</span><span style="color: #000000;">==</span><span style="color: #000000;">x.&nbsp;set&nbsp;OUTPUT_DIR</span><span style="color: #000000;">=</span><span style="color: #000000;">..\out<br />
</span><span style="color: #008080;">&nbsp;8</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />IF&nbsp;x.%JAVA_HOME%</span><span style="color: #000000;">==</span><span style="color: #000000;">x.&nbsp;set&nbsp;JAVA_HOME</span><span style="color: #000000;">=</span><span style="color: #000000;">%DEV_TOOLS%\Java\jdk1</span><span style="color: #000000;">.6</span><span style="color: #000000;">.0_</span><span style="color: #000000;">06</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;9</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />IF&nbsp;x.%XULRUNNER_SDK%</span><span style="color: #000000;">==</span><span style="color: #000000;">x.&nbsp;set&nbsp;XULRUNNER_SDK</span><span style="color: #000000;">=</span><span style="color: #000000;">C:\gecko-sdk<br />
</span><span style="color: #008080;">10</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />set&nbsp;XULRUNNER_MAKE</span><span style="color: #000000;">=</span><span style="color: #000000;">make_xulrunner<br />
</span><span style="color: #008080;">11</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />IF&nbsp;x.%</span><span style="color: #000000;">1</span><span style="color: #000000;">==</span><span style="color: #000000;">x.x86&nbsp;shift<br />
</span><span style="color: #008080;">12</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />GOTO&nbsp;MAKE</span></div>
<p><br />
</p>
<p>如果你和我一样的用的是Sun的JDK，且版本是1.5或1.6，还须修改一下和build.bat同目录的make_win32.mak文件。</p>
<p>替换<br />
</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">AWT_LIBS&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">$(JAVA_HOME)\jre\bin\jawt.lib</span><span style="color: #000000;">"<br />
</span></div>
<p>为</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">AWT_LIBS&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">$(JAVA_HOME)\lib\jawt.lib</span><span style="color: #000000;">"</span></div>
<p><br />
</p>
<p>一旦配置完成后，就可以在命令行中运行 <span style="color: red;">build.bat x86 </span>来build swt了，如果你的build过程中出错，使用<span style="color: red;">build x86 clean</span>删除垃圾文件，然后再查明原因。如果没有错误的话，目录下会生成5个dll文件，分别是swt-awt-win32-XXXX.dll, swt-gdip-win32-XXXX.dll, swt-wgl-win32-XXXX.dll, swt-win32-XXXX.dll, swt-xulrunner-win32-XXXX.dll，其中XXXX是视你的Eclipse版本而定。<br />
<br />
要实现我们想要的效果，还需针对SWT的消息处理程序(WndProc) 扩展一下OS，那就是在就在主窗口建立过程中候往系统菜单里面加一自定义项。在Win32中，窗口建立的消息为WM_CREATE(值为1)。为简单起见，这里只是覆盖了SWT的默认消息处理程序，它通过os.c中的&nbsp;OS_NATIVE(DefWindowProcW)方法来实现的(在98以后的版本api都是unicode，所以只覆盖W版本)<br />
<br />
改动之前：</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #008080;">&nbsp;1</span><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000;">#ifndef&nbsp;NO_DefWindowProcW<br />
</span><span style="color: #008080;">&nbsp;2</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />JNIEXPORT&nbsp;jint&nbsp;JNICALL&nbsp;OS_NATIVE(DefWindowProcW)<br />
</span><span style="color: #008080;">&nbsp;3</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;(JNIEnv&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">env,&nbsp;jclass&nbsp;that,&nbsp;jint&nbsp;arg0,&nbsp;jint&nbsp;arg1,&nbsp;jint&nbsp;arg2,&nbsp;jint&nbsp;arg3)<br />
</span><span style="color: #008080;">&nbsp;4</span><span style="color: #000000;"><img id="Codehighlighter1_147_348_Open_Image" onclick="this.style.display='none'; Codehighlighter1_147_348_Open_Text.style.display='none'; Codehighlighter1_147_348_Closed_Image.style.display='inline'; Codehighlighter1_147_348_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_147_348_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_147_348_Closed_Text.style.display='none'; Codehighlighter1_147_348_Open_Image.style.display='inline'; Codehighlighter1_147_348_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_147_348_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_147_348_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">&nbsp;5</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;jint&nbsp;rc&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;6</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;OS_NATIVE_ENTER(env,&nbsp;that,&nbsp;DefWindowProcW_FUNC);<br />
</span><span style="color: #008080;">&nbsp;7</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;rc&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(jint)DefWindowProcW((HWND)arg0,&nbsp;arg1,&nbsp;(WPARAM)arg2,&nbsp;(LPARAM)arg3);<br />
</span><span style="color: #008080;">&nbsp;8</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;OS_NATIVE_EXIT(env,&nbsp;that,&nbsp;DefWindowProcW_FUNC);<br />
</span><span style="color: #008080;">&nbsp;9</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;rc;<br />
</span><span style="color: #008080;">10</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000;"><br />
</span><span style="color: #008080;">11</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">#endif</span></div>
<br />
<p>改动之后：<br />
<br />
</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #008080;">&nbsp;1</span><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000;">#ifndef&nbsp;NO_DefWindowProcW<br />
</span><span style="color: #008080;">&nbsp;2</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080;">&nbsp;3</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;ID_CUSTOM_MENU&nbsp;32888</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;4</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080;">&nbsp;5</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;wchar_t</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;wcTitle</span><span style="color: #000000;">=</span><span style="color: #000000;">L</span><span style="color: #000000;">"</span><span style="color: #000000;">Hello</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;6</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;wchar_t</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;wcContent</span><span style="color: #000000;">=</span><span style="color: #000000;">L</span><span style="color: #000000;">"</span><span style="color: #000000;">World</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;7</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;wchar_t</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;wcName&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;L</span><span style="color: #000000;">"</span><span style="color: #000000;">Bang</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;8</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080;">&nbsp;9</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />LRESULT&nbsp;CALLBACK&nbsp;MyWndProc(HWND&nbsp;hWnd,&nbsp;UINT&nbsp;message,&nbsp;WPARAM&nbsp;wParam,&nbsp;LPARAM&nbsp;lParam)<br />
</span><span style="color: #008080;">10</span><span style="color: #000000;"><img id="Codehighlighter1_241_764_Open_Image" onclick="this.style.display='none'; Codehighlighter1_241_764_Open_Text.style.display='none'; Codehighlighter1_241_764_Closed_Image.style.display='inline'; Codehighlighter1_241_764_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_241_764_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_241_764_Closed_Text.style.display='none'; Codehighlighter1_241_764_Open_Image.style.display='inline'; Codehighlighter1_241_764_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_241_764_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_241_764_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">11</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;wmId,&nbsp;wmEvent;<br />
</span><span style="color: #008080;">12</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;HMENU&nbsp;hSysMenu;<br />
</span><span style="color: #008080;">13</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">switch</span><span style="color: #000000;">&nbsp;(message)<br />
</span><span style="color: #008080;">14</span><span style="color: #000000;"><img id="Codehighlighter1_299_751_Open_Image" onclick="this.style.display='none'; Codehighlighter1_299_751_Open_Text.style.display='none'; Codehighlighter1_299_751_Closed_Image.style.display='inline'; Codehighlighter1_299_751_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_299_751_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_299_751_Closed_Text.style.display='none'; Codehighlighter1_299_751_Open_Image.style.display='inline'; Codehighlighter1_299_751_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_299_751_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_299_751_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">15</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;WM_CREATE:<br />
</span><span style="color: #008080;">16</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hSysMenu&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;GetSystemMenu(hWnd,FALSE);<br />
</span><span style="color: #008080;">17</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InsertMenuW(hSysMenu,</span><span style="color: #000000;">1</span><span style="color: #000000;">,MF_BYPOSITION&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;MF_STRING,ID_CUSTOM_MENU,wcName);<br />
</span><span style="color: #008080;">18</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">19</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;WM_DESTROY:<br />
</span><span style="color: #008080;">20</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostQuitMessage(</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">21</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">22</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;WM_SYSCOMMAND:<br />
</span><span style="color: #008080;">23</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wmId&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;LOWORD(wParam);<br />
</span><span style="color: #008080;">24</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(wmId</span><span style="color: #000000;">==</span><span style="color: #000000;">ID_CUSTOM_MENU)<br />
</span><span style="color: #008080;">25</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBoxW(hWnd,wcTitle,wcContent,MB_OK);<br />
</span><span style="color: #008080;">26</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">27</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;DefWindowProcW(hWnd,&nbsp;message,&nbsp;wParam,&nbsp;lParam);<br />
</span><span style="color: #008080;">28</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">29</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">default</span><span style="color: #000000;">:<br />
</span><span style="color: #008080;">30</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;DefWindowProcW(hWnd,&nbsp;message,&nbsp;wParam,&nbsp;lParam);<br />
</span><span style="color: #008080;">31</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
</span><span style="color: #008080;">32</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">33</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000;"><br />
</span><span style="color: #008080;">34</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080;">35</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />JNIEXPORT&nbsp;jint&nbsp;JNICALL&nbsp;OS_NATIVE(DefWindowProcW)<br />
</span><span style="color: #008080;">36</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;(JNIEnv&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">env,&nbsp;jclass&nbsp;that,&nbsp;jint&nbsp;arg0,&nbsp;jint&nbsp;arg1,&nbsp;jint&nbsp;arg2,&nbsp;jint&nbsp;arg3)<br />
</span><span style="color: #008080;">37</span><span style="color: #000000;"><img id="Codehighlighter1_888_1084_Open_Image" onclick="this.style.display='none'; Codehighlighter1_888_1084_Open_Text.style.display='none'; Codehighlighter1_888_1084_Closed_Image.style.display='inline'; Codehighlighter1_888_1084_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_888_1084_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_888_1084_Closed_Text.style.display='none'; Codehighlighter1_888_1084_Open_Image.style.display='inline'; Codehighlighter1_888_1084_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_888_1084_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_888_1084_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">38</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;jint&nbsp;rc&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">39</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;OS_NATIVE_ENTER(env,&nbsp;that,&nbsp;DefWindowProcW_FUNC);<br />
</span><span style="color: #008080;">40</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;rc&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(jint)MyWndProc((HWND)arg0,&nbsp;arg1,&nbsp;(WPARAM)arg2,&nbsp;(LPARAM)arg3);<br />
</span><span style="color: #008080;">41</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;OS_NATIVE_EXIT(env,&nbsp;that,&nbsp;DefWindowProcW_FUNC);<br />
</span><span style="color: #008080;">42</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;rc;<br />
</span><span style="color: #008080;">43</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000;"><br />
</span><span style="color: #008080;">44</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080;">45</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">#endif</span></div>
<p>改动的目的就是在系统菜单里面加了一个菜单项 "Bang"，点击后会出现&#8220;Hello world&#8221; 对话框。<br />
<br />
重新在swt源目录下运行build x86，生成的swt就是扩展以后的版本。<br />
<br />
现在我们来测试一下效果，写一个如下所示的HelloWorld1.java，放到swt源目录下，先运行javac HelloWorld1.java，再运行java HelloWorld1。不用担心classpath与library path，build之后它们默认都在当前目录下。</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.eclipse.swt.widgets.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_60_411_Open_Image" onclick="this.style.display='none'; Codehighlighter1_60_411_Open_Text.style.display='none'; Codehighlighter1_60_411_Closed_Image.style.display='inline'; Codehighlighter1_60_411_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_60_411_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_60_411_Closed_Text.style.display='none'; Codehighlighter1_60_411_Open_Image.style.display='inline'; Codehighlighter1_60_411_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;HelloWorld1&nbsp;</span><span id="Codehighlighter1_60_411_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_60_411_Open_Text"><span style="color: #000000;">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_104_300_Open_Image" onclick="this.style.display='none'; Codehighlighter1_104_300_Open_Text.style.display='none'; Codehighlighter1_104_300_Closed_Image.style.display='inline'; Codehighlighter1_104_300_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_104_300_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_104_300_Closed_Text.style.display='none'; Codehighlighter1_104_300_Open_Image.style.display='inline'; Codehighlighter1_104_300_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main&nbsp;(String&nbsp;[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_104_300_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_104_300_Open_Text"><span style="color: #000000;">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;Display&nbsp;display&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Display&nbsp;();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;Shell&nbsp;shell&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;HelloWorld1&nbsp;().open&nbsp;(display);<br />
<img id="Codehighlighter1_221_277_Open_Image" onclick="this.style.display='none'; Codehighlighter1_221_277_Open_Text.style.display='none'; Codehighlighter1_221_277_Closed_Image.style.display='inline'; Codehighlighter1_221_277_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_221_277_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_221_277_Closed_Text.style.display='none'; Codehighlighter1_221_277_Open_Image.style.display='inline'; Codehighlighter1_221_277_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">shell.isDisposed&nbsp;())&nbsp;</span><span id="Codehighlighter1_221_277_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_221_277_Open_Text"><span style="color: #000000;">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">display.readAndDispatch&nbsp;())&nbsp;display.sleep&nbsp;();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;display.dispose&nbsp;();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000;"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_340_409_Open_Image" onclick="this.style.display='none'; Codehighlighter1_340_409_Open_Text.style.display='none'; Codehighlighter1_340_409_Closed_Image.style.display='inline'; Codehighlighter1_340_409_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_340_409_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_340_409_Closed_Text.style.display='none'; Codehighlighter1_340_409_Open_Image.style.display='inline'; Codehighlighter1_340_409_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Shell&nbsp;open&nbsp;(Display&nbsp;display)&nbsp;</span><span id="Codehighlighter1_340_409_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_340_409_Open_Text"><span style="color: #000000;">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;Shell&nbsp;shell&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Shell&nbsp;(display);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;shell.open&nbsp;();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;shell;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000;"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
<p><br />
在窗口标题栏单击右键，点击出现的Bang菜单会有如下效果图：<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/box.JPG" border="0" width="441" height="427" /><br />
<br />
这个例子虽然简单，但大致描述了扩展swt的过程，更复杂的扩展等待<span style="font-size: 24pt;">YOU</span>来实现！<br />
<br />
&nbsp;</p>
<img src ="http://www.blogjava.net/lifesting/aggbug/217236.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2008-07-24 18:39 <a href="http://www.blogjava.net/lifesting/archive/2008/07/24/217236.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>或许你不知道的一个调试功能</title><link>http://www.blogjava.net/lifesting/archive/2008/07/22/216735.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Tue, 22 Jul 2008 15:10:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2008/07/22/216735.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/216735.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2008/07/22/216735.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/216735.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/216735.html</trackback:ping><description><![CDATA[调试其实是门很深的学问，在分析Eclipse源代码的过程中积累了很多经验，但大多与多数人无用，现介绍一个简单而非常有用的调试功能及它的适用场合。<br />
<br />
首先看一段代码：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Simple&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&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;</span><span style="color: #000000;">10</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&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&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;max&nbsp;;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;simpleAction(i);<br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;simpleAction(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i)&nbsp;{<br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;tmp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;i;<br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">)<br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;NullPointerException(</span><span style="color: #000000;">"</span><span style="color: #000000;">5&nbsp;is&nbsp;invalid&nbsp;number!</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">Number&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">tmp</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;reached!</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">}<br />
</span><span style="color: #008080;">18</span> <span style="color: #000000;"><br />
这段代码非常简单，就是打印10个数字，但中间一个出了异常，假设我们忘记Eclipse的Exception BreakPoint(在复杂的场合，不一定抛Exception)，于是看到控制台除了异常信息之后，我们可在第7行和第12行设置断点，看调用i到底发生了什么。<br />
<br />
启动调试后一切正常，除了你必须F8 4次，因为0-4正常，但也在断点处，很烦人。有没有可能激活断点一次呢？当然可以。<br />
<br />
从控制台看到5 is invalid number，那么这次调试只针对5，我们可以简单的设置一下：<br />
<br />
第一步：<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/setproperties.JPG" width="400" height="336" /><br />
<br />
第二步在出现的对话框内，选中Enable Condition，接着输入我们的condition: i==5<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/inputcondition.JPG" width="626" height="539" /><br />
<br />
OK，再调试启动Simple，发现断点激活是在i=5的时候，我们就可以F6一步一步看到底发生了什么。<br />
<br />
这种条件调试在使用复杂的框架的时候极其有用，举个例子：<br />
GMF的AbstractActionHandler有N多子类，你必须直接或间接的继承它，同时使用它的API，在它的API很复杂而我还在探索</span><span style="color: #000000;">的情况下</span><span style="color: #000000;">，出错在所难免，出错后在AbstractActionHandler的某个API里设置了一断点，但<span style="color: red;">你只想关心自己写的子类</span>，否则</span><span style="color: #000000;">会</span><span style="color: #000000;">按F8超过1分钟，那么我们可以在上面的condition text里面输入：<br />
<br />
<strong><span style="font-size: 14pt;"><span style="font-size: 12pt;">this.getClass().getName().equals("foo.bar.MyDiagramAction")</span></span></strong><br />
<br />
就可以省掉很多麻烦。<br />
<br />
当然condition可以写的很复杂，可以针对断点的context写任意Java代码。<br />
<br />
</span></div>
<br />
<br />
<img src ="http://www.blogjava.net/lifesting/aggbug/216735.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2008-07-22 23:10 <a href="http://www.blogjava.net/lifesting/archive/2008/07/22/216735.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>因为Eclipse包结构改动带来的RCP启动失败。</title><link>http://www.blogjava.net/lifesting/archive/2008/05/30/204061.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Fri, 30 May 2008 05:08:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2008/05/30/204061.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/204061.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2008/05/30/204061.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/204061.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/204061.html</trackback:ping><description><![CDATA[最近要将原来的RCP 3.2的项目从GEF改为GMF 2，只能使用Eclipse 3.3来开发，当我把在3.2下运行很好的项目倒入到3.3启动的时候报告一个很奇怪的错误：<br />
<br />
!ENTRY org.eclipse.osgi 4 0 2008-05-30 12:54:33.671<br />
!MESSAGE Application error<br />
!STACK 1<br />
java.lang.RuntimeException: <span style="color: red;">Application "org.eclipse.ui.ide.workbench" could not be found in the registry.</span> The applications available are: org.eclipse.jdt.core.JavaCodeFormatter, org.eclipse.update.core.standaloneUpdate, org.eclipse.update.core.siteOptimizer, org.eclipse.equinox.app.error.<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.equinox.internal.app.EclipseAppContainer.startDefaultApp(EclipseAppContainer.java:242)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.equinox.internal.app.EclipseAppContainer.start(EclipseAppContainer.java:98)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.equinox.internal.app.Activator.addingService(Activator.java:112)<br />
&nbsp;&nbsp; &nbsp;at org.osgi.util.tracker.ServiceTracker$Tracked.trackAdding(ServiceTracker.java:1064)<br />
&nbsp;&nbsp; &nbsp;at org.osgi.util.tracker.ServiceTracker$Tracked.trackInitialServices(ServiceTracker.java:926)<br />
&nbsp;&nbsp; &nbsp;at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:330)<br />
&nbsp;&nbsp; &nbsp;at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:274)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.equinox.internal.app.Activator.start(Activator.java:54)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.osgi.framework.internal.core.BundleContextImpl$2.run(BundleContextImpl.java:999)<br />
&nbsp;&nbsp; &nbsp;at java.security.AccessController.doPrivileged(Native Method)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:993)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:974)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:346)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:260)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:400)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.core.runtime.internal.adaptor.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:111)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:417)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:189)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.osgi.framework.internal.core.BundleLoader.findLocalClass(BundleLoader.java:340)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.osgi.framework.internal.core.SingleSourcePackage.loadClass(SingleSourcePackage.java:37)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.osgi.framework.internal.core.BundleLoader.findClassInternal(BundleLoader.java:405)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:369)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:357)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:83)<br />
&nbsp;&nbsp; &nbsp;at java.lang.ClassLoader.loadClass(ClassLoader.java:251)<br />
&nbsp;&nbsp; &nbsp;at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.core.internal.runtime.PlatformActivator.startAppContainer(PlatformActivator.java:47)<br />
&nbsp;&nbsp; &nbsp;at org.eclipse.core.internal.runtime.PlatformActivator.start(PlatformActivator.java:32)<br />
....<br />
<br />
红色字体表示workbench这个application并没有加载到RCP runtime中来，Plugin registry里面没有注册信息，在3.2中 extension org.eclipse.ui.ide.workbench是申明在插件org.eclipse.ui.ide中的，通过Plugin Registry Search，发现在3.3中，这个extension declaration被挪到插件org.eclipse.ui.ide.application中了，于是<strong><span style="color: red;">在项目的product配置中加入org.eclipse.ui.ide.application这个插件依赖，然后选中这个插件，点击"Add Required Plug-ins"</span></strong>，再clear, 启动，运行正常。<br />
<br />
从这个令人恼火的改动来看，Eclipse在逐渐向它的两个趋势之一靠拢，即成为产品开发平台(RCP)。(另外一个是向OSGi标准看齐)<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/lifesting/aggbug/204061.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2008-05-30 13:08 <a href="http://www.blogjava.net/lifesting/archive/2008/05/30/204061.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse文件转码插件</title><link>http://www.blogjava.net/lifesting/archive/2008/04/11/192250.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Fri, 11 Apr 2008 10:54:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2008/04/11/192250.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/192250.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2008/04/11/192250.html#Feedback</comments><slash:comments>22</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/192250.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/192250.html</trackback:ping><description><![CDATA[<p><a href="/Files/lifesting/com.lifesting.tool.encoding.rar">插件源代码下载</a>&nbsp;(导入插件在workspace中，右键export-&gt;Plug-in Development-&gt;Deployable plug-ins and fragments，然后生成插件binar文件)<br />
<a href="/Files/lifesting/com.lifesting.tool.encoding_1.0.0.zip">二进制包下载</a>&nbsp;&nbsp; （<span style="color: #ff0000"><strong>因为blogjava不许上传jar文件，请下载后将zip后缀改为jar后缀然后拷贝到eclipse/plugins目录</strong></span>)<br />
<br />
<br />
一般在使用Eclipse过程中会有两种跟<strong>文件编码(charset)</strong>有关的情况让我们不愉快。<br />
<br />
<strong>1 导入一个项目。</strong><br />
&nbsp; 假设你的同事做好了一个项目，为了更好的支持国际化，里面的jsp页面都采用UTF-8，然后发给你，你导入到Eclipse的workspace中，一般情况下，在Eclipse中，这些jsp都变成了GBK编码，你双击打开，一堆乱码。假设你知道原因，稍微如下设置一下可以解决问题：<br />
<br />
<img height="540" alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/setcharset.JPG" width="747" border="0" /><br />
(图1 设置文件编码)<br />
但是，这个项目可能包含1000个jsp文件，且你还可能反反复复碰到这个问题，真是一个体力活。<br />
<br />
<strong>2 改变一个项目文件的编码</strong><br />
这种情况发生比较少，但发生了就是一个大难题。比如公司有两个团队，一个开发的项目jsp采用UTF-8编码，另外一个采用GBK编码。一段时间之后，需要整合两个项目，jsp页面只能采用一种编码，UTF-8/GBK或其它。有经验的人知道这是一个<strong>拷贝/设置编码/粘贴</strong>的过程：<br />
&nbsp;2.1 将某个jsp的内容全部拷贝下来。<br />
&nbsp;2.2 如图1所示将编码设置为统一编码如UTF-8。<br />
&nbsp;2.3 把设置过编码的jsp文件清空，然后粘贴。<br />
&nbsp;好像解决问题很完美，但是Eclipse没有宏，如果文件很多，比如2000个，将是一个恐怖的任务。<br />
<br />
因为这两个问题老是反复的困扰着我的同事，相信也困扰了不少Java开发者，Eclipse转码插件很好很方便的解决了这个问题，它基于Eclipse 3.3开发，所以编译环境最好采用Eclipse 3.3。<br />
<br />
下面是使用步骤<br />
<br />
<span style="color: red">step1.</span> 将插件com.lifesting.tool.encoding_1.0.0.jar拷贝到eclipse/plugins目录下，重启Eclipse。<br />
<br />
<span style="color: red">step2.</span> 选择某个项目，右键选择properties，然后点击Convert Setting进行转码规则设置，如下图：<br />
<img height="528" alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/projectsetting.JPG" width="768" border="0" /></p>
(图2 项目转码规则设置)<br />
这个表格有四列，分别是<strong>文件后缀</strong>，<strong>文件目前编码</strong>，<strong>转换后的编码</strong>，<strong>是否转换文件内容，</strong>如果转换文件内容，那么对应的是前面所说的第二种情况，不转换文件内容对应的是第一种情况。比如图2的转码规则就是<span style="color: #0000ff">对项目的jsp文件，不管原来是什么编码，统一转为UTF-8编码，并且同时转换文件内容</span>。可以点击右边的Add /Remove按钮来增加/删除规则。最后点击Apply来保存设置。<br />
<br />
<span style="color: #ff0000">step3</span>. 转码<br />
&nbsp;在设置了转码规的项目上，右键选择项目，某几个文件夹或某几个文件(当然一个也可以)，然后点击Lifesting Tools-&gt;Set Encoding。插件将完成转码工作。如果我们选择的是项目，将转换整个项目；如果选择的是文件夹，转换文件夹下所有满足规则的文件；如果选择的是文件，只转换文件。<br />
<img height="672" alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/changeencoding.JPG" width="542" border="0" /><br />
(图3 转码)<br />
除了这方式外，我们还可以利用Eclipse的文件搜索功能，将搜到的文件进行转码，如下图：<br />
<img height="298" alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/searchencoding.JPG" width="787" border="0" /><br />
(图4 在search view里转码)<br />
如上图所示，我们搜到了整个workspace的jsp文件，然后点击绿色E小图标，插件将会把所有满足结果的文件转码，每个文件的转换规则依赖它所属项目的转码规则设置。<br />
<br />
<img src ="http://www.blogjava.net/lifesting/aggbug/192250.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2008-04-11 18:54 <a href="http://www.blogjava.net/lifesting/archive/2008/04/11/192250.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>当Maven遇上MyEclipse</title><link>http://www.blogjava.net/lifesting/archive/2008/04/02/190367.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Wed, 02 Apr 2008 06:32:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2008/04/02/190367.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/190367.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2008/04/02/190367.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/190367.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/190367.html</trackback:ping><description><![CDATA[<br />
Maven有自己的一套约定目录规则，与MyEclipse的有冲突，其实结合也很简单，因为MyEclipse的目录可配置。<br />
<br />
1 用maven创建一个web project<br />
<strong>&nbsp;mvn archetype:create&nbsp;&nbsp; -DgroupId=com.lifesting&nbsp; -DartifactId=test&nbsp; -DarchetypeArtifactId=maven-archetype-webapp<br />
</strong><br />
2 补全某些目录<br />
&nbsp;cd test\src<br />
&nbsp;mkdir&nbsp;main\java<br />
&nbsp;mkdir test\resources<br />
&nbsp;mkdir test\java<br />
<br />
3 修改pom文件，在生成eclipse项目的时候maven eclipse plugin使用此配置<br />
&nbsp; 在project/build下面插入<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 alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">plugins</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">plugin</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">groupId</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">org.apache.maven.plugins</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">groupId</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">artifactId</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">maven-eclipse-plugin</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">artifactId</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">configuration</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">projectnatures</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">java</span><span style="color: #ff0000">.lang.String</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">com.genuitec.eclipse.j2eedt.core.webnature</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">java.lang.String</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">java</span><span style="color: #ff0000">.lang.String</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">org.eclipse.jdt.core.javanature</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">java.lang.String</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">projectnatures</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">outputDirectory</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">src/main/webapp/WEB-INF/classes</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">outputDirectory</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">configuration</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">plugin</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">plugins</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;</span></div>
project nature是eclipse开发中一个概念，比如加入javanature就表示此项目是一个java project，会绑定一个java builder用来编译java文件，而webnature告诉MyEclipse这是一个MyEclipse web项目，更多MyEclipse projectNature：<br />
webservice-- com.genuitec.eclipse.ws.xfire.wsnature<br />
facelet-- com.genuitec.eclipse.jsf.faceletsnature<br />
jsf--com.genuitec.eclipse.jsf.jsfnature<br />
struts--com.genuitec.eclipse.cross.easystruts.eclipse.easystrutsnature<br />
或者在插件里面使用这个方法：<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 alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">IProject&nbsp;project&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ResourcesPlugin.getWorkspace().getRoot().getProject(</span><span style="color: #000000">"</span><span style="color: #000000">test</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img id="Codehighlighter1_86_217_Open_Image" onclick="this.style.display='none'; Codehighlighter1_86_217_Open_Text.style.display='none'; Codehighlighter1_86_217_Closed_Image.style.display='inline'; Codehighlighter1_86_217_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_86_217_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_86_217_Closed_Text.style.display='none'; Codehighlighter1_86_217_Open_Image.style.display='inline'; Codehighlighter1_86_217_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_86_217_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_86_217_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;natures&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;project.getDescription().getNatureIds();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(String&nbsp;nature&nbsp;:natures)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(nature);<br />
<img id="Codehighlighter1_243_271_Open_Image" onclick="this.style.display='none'; Codehighlighter1_243_271_Open_Text.style.display='none'; Codehighlighter1_243_271_Closed_Image.style.display='inline'; Codehighlighter1_243_271_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_243_271_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_243_271_Closed_Text.style.display='none'; Codehighlighter1_243_271_Open_Image.style.display='inline'; Codehighlighter1_243_271_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(CoreException&nbsp;e)&nbsp;</span><span id="Codehighlighter1_243_271_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_243_271_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
可以将项目所有的nature打印出来<br />
<br />
outputDirectory主要是告诉maven eclipse plugin编译输出在什么位置，默认在target/classes下面，web项目不同，应该放在src/main/webapp/WEB-INF/classes 才能够被MyEclipse package到服务器。<br />
<br />
4 在命令行test目录下运行mvn eclipse:eclipse生成Eclipse项目。<br />
<br />
5 在MyEclipse中将test project 导入到workspace，MyEclipse通过projectNature识别到test是一个MyEclipse web project，它会在项目目录下生成一个.mymetadata文件。再关闭MyEclipse，这么做的原因是因为默认MyEclipse的webRoot不可配置。<br />
<br />
6 修改MyEclipse下面的.mymetadata文件，比如我的test项目文件内容为<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 alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">project-module<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="WEB"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;name</span><span style="color: #0000ff">="test"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;id</span><span style="color: #0000ff">="myeclipse.1207117121765"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;j2ee-spec</span><span style="color: #0000ff">="1.4"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;archive</span><span style="color: #0000ff">="test.war"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">attributes</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">attribute&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="webrootdir"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="/WebRoot"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">attributes</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">project-module</span><span style="color: #0000ff">&gt;</span></div>
增加一行，修改一行为：<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 alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">project-module<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="WEB"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;name</span><span style="color: #0000ff">="test"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;id</span><span style="color: #0000ff">="myeclipse.1207117121765"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;context-root</span><span style="color: #0000ff">="/test"</span><span style="color: #ff0000">"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;j2ee-spec</span><span style="color: #0000ff">="1.4"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;archive</span><span style="color: #0000ff">="test.war"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">attributes</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">attribute&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="webrootdir"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="/src/main/webapp"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">attributes</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">project-module</span><span style="color: #0000ff">&gt;</span></div>
<br />
可以看到，增加的一行 context-root="/test" 表示web的上下文为test.<br />
修改的一行为webrootdir的值，将/WebRoot改为maven默认的web项目source目录/src/main/webapp。<br />
<br />
7 重新启动MyEclipse，一切搞定了，调试开发两不误。<br />
<br />
参考资料<br />
<a href="http://www.myeclipseide.com/PNphpBB2-viewtopic-t-17416.html">http://www.myeclipseide.com/PNphpBB2-viewtopic-t-17416.html</a><br />
 <img src ="http://www.blogjava.net/lifesting/aggbug/190367.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2008-04-02 14:32 <a href="http://www.blogjava.net/lifesting/archive/2008/04/02/190367.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>源代码才50K的eclipse中文properties编辑插件（更新)</title><link>http://www.blogjava.net/lifesting/archive/2008/03/31/189772.html</link><dc:creator>Always BaNg.</dc:creator><author>Always BaNg.</author><pubDate>Mon, 31 Mar 2008 06:10:00 GMT</pubDate><guid>http://www.blogjava.net/lifesting/archive/2008/03/31/189772.html</guid><wfw:comment>http://www.blogjava.net/lifesting/comments/189772.html</wfw:comment><comments>http://www.blogjava.net/lifesting/archive/2008/03/31/189772.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.blogjava.net/lifesting/comments/commentRss/189772.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifesting/services/trackbacks/189772.html</trackback:ping><description><![CDATA[<p><a href="/Files/lifesting/com.lifesting.peditor.rar">下载插件源代码</a>(eclipse 3.3)</p>
<p><a href="/Files/lifesting/com.lifesting.peditor_1.0.0.zip">下载eclipse 3.2 binary</a><span style="color: red;">下载后改后缀zip为jar，然后放到eclipse/plugins目录</span><br />
</p>
<p>eclipse内置一个properties editor但是只支持latin-1编码，调用native2ascii太麻烦，sourceforge上有一个很强大的properties editor，日本人搞得，肯定支持中文了，但是版本太老，3.1，还有很多没有什么多大用处的swing, jbuild支持等，我稍微改了一下，做了一个最小化的编辑器。<br />
<br />
严正申明，<strong>此软件属于研究性质，版权属于原作者：http://propedit.sourceforge.jp/index_en.html<br />
<br />
</strong>效果：<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/lifesting/peditor.JPG" border="0" /><br />
<br />
下载后将工程导入到workspace中，export成plugin即可。<br />
</p>
<img src ="http://www.blogjava.net/lifesting/aggbug/189772.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifesting/" target="_blank">Always BaNg.</a> 2008-03-31 14:10 <a href="http://www.blogjava.net/lifesting/archive/2008/03/31/189772.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>