在Eclipse RCP中使用ResourceNavigator

Posted on 2007-06-28 00:30 nemo 阅读(3554) 评论(12)  编辑  收藏 所属分类: EclipseRCP/SWT/JFACE
Eclipse 的资源浏览器很强大,可以很方便的查看工作空间中可供适配的资源,并且提供了对排序、过滤等功能的支持。Eclipse的RCP项目组不赞成我们在富客户端应用程序中使用ResourceNavigator,原因是ResourceNavigator的实现代码位于Eclipse IDE中,如果使用资源浏览器,生成的RCP产品将会增加二十多兆的空间,而且会增加许多我们的产品中并不使用的功能,很浪费磁盘和系统资源。他们赞成我们根据需要,为应用程序量身定做树形浏览器视图,但是,基于方便和对强大功能的追求,以及对Eclipse代码优良性的肯定,插件开发者们仍然希望将资源浏览器直接加入到我们的RCP程序中。为了满足广大Eclipse开发者强烈的要求,本文对在Eclipse RCP中使用ResourceNavigator的方法做较为全面的介绍。

同资源导航器相关的ID为:
ID:           org.eclipse.ui.views.ResourceNavigator
   CLASS:   org.eclipse.ui.ide/org.eclipse.ui.views.navigator/ResourceNavigator.class
   ICON:      位于org.eclipse.ui.ide工程目录的icons文件夹中,名称为fileNav_nav.gif。可通过解压.jar文件获得图像文件。

1. 如果我们的RCP程序中的默认透视图中要使用导航器,可能需要在RCP插件(包含有Application.java文件的插件)的plugin.xml中加入这个视图:
plugin.xml

2. 如果我们需要在RCP程序中默认显示导航器,则需要在定义的透视图(假设透视图已经定义)类中加入类似下面的代码:
Perspective.java

第1、2两行创建一个IFolderLayout实例,表示在编辑器区域左侧创建一个FolderLayout。
第3行为ResourceNavigator添加一个占位符,使用的是ResourceNavigator的ID,后面的“:*”表示还可以有更多的内容,即可以同更多的视图共享这个位置。
第4行将ResourceNavigator加入这个布局中,从而在应用程序启动,默认透视图打开时,导航器出现在页面的左侧。

3. 导航器在RCP程序中无法显示的问题。
许多开发者在使用Navigator生成RCP程序时都遇到过这样的错误:
Log

这个问题的具体描述我已经在前面的博客中介绍了,它需要安装兼容性插件同以前的系统兼容。在PDE环境下,打开plugin.xml,在“Dependencies”页面中加入下面的插件:
org.eclipse.core.runtime.compatibility

上述所说的问题便解决了。

4. 工作空间的资源在导航器中无法显示的问题。
解决了第三个问题后,导航器中的资源可以显示了,但是其中的工程文件夹图标仍然无法显示,只能光秃秃的显示一个项目名,如下图所示:


为了正确的显示项目的图标,我们需要在RCP插件的ApplicationWorkbenchAdvisor类中加入如下代码:
ApplicationWorkbenchAdvisor

上面代码的第4行中的路径"icons/prj_obj.gif"为我们为工程文件夹提供的图标相对于RCP插件中的位置,YOURPlugin代表RCP插件中的插件类(或XXXActivator)
这样我们便得到了我们希望的Navigaotor:


上面3-4行代码也同时给我们提供了修改Eclipse Navigator中默认图标的一种方式。Just Enjoy it!


其他的话:

Eclipse 3.2版本出台后,Eclipse团队专门提供出了org.eclipse.ui.navigator插件,用来支持在ProjectExplorer的基础上进行的二次开发。而从GMF(Grapic Modeling Framework)2.0 M6开始,对自动生成树形浏览器视图提供了支持,所用到的正是这个插件所提供的功能强大的 org.eclipse.ui.navigatorContent扩展点:http://wiki.eclipse.org/index.php/GMF_New_and_Noteworthy#2.0_M6,这使得我们在对资源定制的基础上,可以对资源中的元素进行定制,因而功能更为强大(不过这个扩展点是我见过的最为复杂的扩展点之一)。这使得我们对ResourceNavigator的要求有所降低。Anyway,直接使用Eclipse的ResourceNavigator可以为快速定制的原型系统提供基本的支持,这对开发者来说还是非常有用的。

Feedback

# re: 在Eclipse RCP中使用ResourceNavigator  回复  更多评论   

2007-06-30 12:56 by nemo
现在,随着激动人心的eclipse3.3的正式发布,令人庆幸的一件事情发生了:eclipse中的IDE被移植到了单独的包中:

IDE application moved to new plug-in
The portion of the org.eclipse.ui.ide plug-in that defines the application has been moved into a new plug-in: org.eclipse.ui.ide.application. This allows people writing their own RCP application to use existing views or APIs defined by org.eclipse.ui.ide without having a dependency on the application.

# re: 在Eclipse RCP中使用ResourceNavigator[未登录]  回复  更多评论   

2007-10-10 15:22 by z
“在Eclipse RCP中使用ResourceNavigator”文章中,我建立的项目中navigator不仅不显示图片,连项目名和文件名都不显示。不知道是什么原因,希望可以指点一下。

# re: 在Eclipse RCP中使用ResourceNavigator  回复  更多评论   

2007-10-10 15:26 by dashan
你好,麻烦你能给讲一下YOURPlugin代表的具体是什么吗,我没有理解你文章里说的意思?

# re: 在Eclipse RCP中使用ResourceNavigator[未登录]  回复  更多评论   

2007-10-11 10:20 by nemo
to z:
这个问题可能是因为没有引用org.eclipse.ui.ide的缘故,或者新版本的org.eclipse.ui.ide已经将ResourceNavigator从该项目包中去掉(这个我不是很了解,最近没有跟踪Eclipse3.3版本)。最好能够提供一些具体的细节。

to dashan:
YOURPlugin是你的插件类,在Eclipse3.1以后使用了OSGi技术,是指插件的Activator类。

# re: 在Eclipse RCP中使用ResourceNavigator[未登录]  回复  更多评论   

2007-10-11 16:34 by z
navigator 基本可以用了,但是,我在navigator中建立的文件再次打开的时候只能得到它的相对路径,有没有办法让文件再次打开时得到绝对路径(谢谢你的解答)

# re: 在Eclipse RCP中使用ResourceNavigator[未登录]  回复  更多评论   

2007-10-11 17:32 by nemo
不太懂你的意思。你是指想要以编程的方式来获得文件的绝对路径么?应该可以吧。resource中有getAbsolutePath()方法吧。。。?

# re: 在Eclipse RCP中使用ResourceNavigator  回复  更多评论   

2007-10-24 16:25 by homer
楼主好:我按照你说的方法设置了ResourceNavigator后,把org.eclipse.ui.ide.jar包也导入工程了,org.eclipse.core.runtime.compatibility包也加入了,但是报下面的错误信息,rcp工程启动不了,请帮忙看一下是什么原因?谢谢!

java.lang.RuntimeException: Application "GefTest.application" could not be found in the registry. The applications available are: org.eclipse.ant.core.antRunner.
at org.eclipse.core.internal.runtime.PlatformActivator$1.run(PlatformActivator.java:216)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:376)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:163)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.eclipse.core.launcher.Main.invokeFramework(Main.java:334)
at org.eclipse.core.launcher.Main.basicRun(Main.java:278)
at org.eclipse.core.launcher.Main.run(Main.java:973)
at org.eclipse.core.launcher.Main.main(Main.java:948)

# re: 在Eclipse RCP中使用ResourceNavigator[未登录]  回复  更多评论   

2007-10-25 10:43 by nemo
@homer
这个问题应该是你的GefTest.application没有被找到。跟ResourceNavigator类关系不大。你可以查看一下你RCP插件(拥有Application类的插件)中的Application类所在的插件工程的plugin.xml中,org.eclipse.core.runtime.application扩展点中察看一下你所指定的Application类对不对,以及Application Id 和你在XXX.product中所指定的Id是否一致(如果拥有产品文件的话)。
如果没有问题的话,确保你的RCP插件中的插件依赖项和xxx.product中的依赖项一致。
还有可能是依赖项的顺序问题...这就比较麻烦了。

# re: 在Eclipse RCP中使用ResourceNavigator  回复  更多评论   

2007-10-26 13:02 by homer
谢谢!nemo,我想建一个自己的导航器,麻烦你能告诉我扩展ResourceNavigator时怎么做吗?直接继承是不是不行?谢谢,我刚刚学习GEF,很多都不懂,别见笑。

# re: 在Eclipse RCP中使用ResourceNavigator[未登录]  回复  更多评论   

2007-10-26 14:38 by nemo
@homer
可以直接扩展ResourceNavigator,网上有相关的文章:

http://www.cnblogs.com/Aimd/archive/2006/05/15/400753.html

不知道你有什么样的需求,如果是基于GEF/EMF做的话,可以考虑使用ProjectExplorer。如果你要保留Eclipse资源所支持的大部分功能,在此基础上定制一些自己的树结点,只要扩展org.eclipse.ui.navigator.navigatorContent扩展点,定义一些triggerpoint,并且自己提供navigatorContentProvider, navigatorLableProvider, navigatorActionProvider,就可以达到此目的。

nemo

# re: 在Eclipse RCP中使用ResourceNavigator  回复  更多评论   

2007-10-26 16:38 by homer
@nemo
谢谢,我试试,遇到不懂的地方再向你请教。能够留一下你的邮箱吗?我的mail是homer4503@126.com

# re: 在Eclipse RCP中使用ResourceNavigator  回复  更多评论   

2007-10-26 20:03 by homer
@nemo
nemo,你好,请问在gef中如何把view和editpart联系起来呢?

只有注册用户登录后才能发表评论。


网站导航:
 

posts - 21, comments - 74, trackbacks - 0, articles - 3

Copyright © nemo