在Eclipse RCP中使用ResourceNavigator

          Posted on 2007-06-28 00:30 nemo 閱讀(3585) 評(píng)論(12)  編輯  收藏 所屬分類: EclipseRCP/SWT/JFACE
          Eclipse 的資源瀏覽器很強(qiáng)大,可以很方便的查看工作空間中可供適配的資源,并且提供了對(duì)排序、過(guò)濾等功能的支持。Eclipse的RCP項(xiàng)目組不贊成我們?cè)诟豢蛻舳藨?yīng)用程序中使用ResourceNavigator,原因是ResourceNavigator的實(shí)現(xiàn)代碼位于Eclipse IDE中,如果使用資源瀏覽器,生成的RCP產(chǎn)品將會(huì)增加二十多兆的空間,而且會(huì)增加許多我們的產(chǎn)品中并不使用的功能,很浪費(fèi)磁盤和系統(tǒng)資源。他們贊成我們根據(jù)需要,為應(yīng)用程序量身定做樹形瀏覽器視圖,但是,基于方便和對(duì)強(qiáng)大功能的追求,以及對(duì)Eclipse代碼優(yōu)良性的肯定,插件開發(fā)者們?nèi)匀幌M麑①Y源瀏覽器直接加入到我們的RCP程序中。為了滿足廣大Eclipse開發(fā)者強(qiáng)烈的要求,本文對(duì)在Eclipse RCP中使用ResourceNavigator的方法做較為全面的介紹。

          同資源導(dǎo)航器相關(guān)的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。可通過(guò)解壓.jar文件獲得圖像文件。

          1. 如果我們的RCP程序中的默認(rèn)透視圖中要使用導(dǎo)航器,可能需要在RCP插件(包含有Application.java文件的插件)的plugin.xml中加入這個(gè)視圖:
          plugin.xml

          2. 如果我們需要在RCP程序中默認(rèn)顯示導(dǎo)航器,則需要在定義的透視圖(假設(shè)透視圖已經(jīng)定義)類中加入類似下面的代碼:
          Perspective.java

          第1、2兩行創(chuàng)建一個(gè)IFolderLayout實(shí)例,表示在編輯器區(qū)域左側(cè)創(chuàng)建一個(gè)FolderLayout。
          第3行為ResourceNavigator添加一個(gè)占位符,使用的是ResourceNavigator的ID,后面的“:*”表示還可以有更多的內(nèi)容,即可以同更多的視圖共享這個(gè)位置。
          第4行將ResourceNavigator加入這個(gè)布局中,從而在應(yīng)用程序啟動(dòng),默認(rèn)透視圖打開時(shí),導(dǎo)航器出現(xiàn)在頁(yè)面的左側(cè)。

          3. 導(dǎo)航器在RCP程序中無(wú)法顯示的問(wèn)題。
          許多開發(fā)者在使用Navigator生成RCP程序時(shí)都遇到過(guò)這樣的錯(cuò)誤:
          Log

          這個(gè)問(wèn)題的具體描述我已經(jīng)在前面的博客中介紹了,它需要安裝兼容性插件同以前的系統(tǒng)兼容。在PDE環(huán)境下,打開plugin.xml,在“Dependencies”頁(yè)面中加入下面的插件:
          org.eclipse.core.runtime.compatibility

          上述所說(shuō)的問(wèn)題便解決了。

          4. 工作空間的資源在導(dǎo)航器中無(wú)法顯示的問(wèn)題。
          解決了第三個(gè)問(wèn)題后,導(dǎo)航器中的資源可以顯示了,但是其中的工程文件夾圖標(biāo)仍然無(wú)法顯示,只能光禿禿的顯示一個(gè)項(xiàng)目名,如下圖所示:


          為了正確的顯示項(xiàng)目的圖標(biāo),我們需要在RCP插件的ApplicationWorkbenchAdvisor類中加入如下代碼:
          ApplicationWorkbenchAdvisor

          上面代碼的第4行中的路徑"icons/prj_obj.gif"為我們?yōu)楣こ涛募A提供的圖標(biāo)相對(duì)于RCP插件中的位置,YOURPlugin代表RCP插件中的插件類(或XXXActivator)
          這樣我們便得到了我們希望的Navigaotor:


          上面3-4行代碼也同時(shí)給我們提供了修改Eclipse Navigator中默認(rèn)圖標(biāo)的一種方式。Just Enjoy it!


          其他的話:

          Eclipse 3.2版本出臺(tái)后,Eclipse團(tuán)隊(duì)專門提供出了org.eclipse.ui.navigator插件,用來(lái)支持在ProjectExplorer的基礎(chǔ)上進(jìn)行的二次開發(fā)。而從GMF(Grapic Modeling Framework)2.0 M6開始,對(duì)自動(dòng)生成樹形瀏覽器視圖提供了支持,所用到的正是這個(gè)插件所提供的功能強(qiáng)大的 org.eclipse.ui.navigatorContent擴(kuò)展點(diǎn):http://wiki.eclipse.org/index.php/GMF_New_and_Noteworthy#2.0_M6,這使得我們?cè)趯?duì)資源定制的基礎(chǔ)上,可以對(duì)資源中的元素進(jìn)行定制,因而功能更為強(qiáng)大(不過(guò)這個(gè)擴(kuò)展點(diǎn)是我見過(guò)的最為復(fù)雜的擴(kuò)展點(diǎn)之一)。這使得我們對(duì)ResourceNavigator的要求有所降低。Anyway,直接使用Eclipse的ResourceNavigator可以為快速定制的原型系統(tǒng)提供基本的支持,這對(duì)開發(fā)者來(lái)說(shuō)還是非常有用的。

          Feedback

          # re: 在Eclipse RCP中使用ResourceNavigator  回復(fù)  更多評(píng)論   

          2007-06-30 12:56 by nemo
          現(xiàn)在,隨著激動(dòng)人心的eclipse3.3的正式發(fā)布,令人慶幸的一件事情發(fā)生了:eclipse中的IDE被移植到了單獨(dú)的包中:

          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[未登錄](méi)  回復(fù)  更多評(píng)論   

          2007-10-10 15:22 by z
          “在Eclipse RCP中使用ResourceNavigator”文章中,我建立的項(xiàng)目中navigator不僅不顯示圖片,連項(xiàng)目名和文件名都不顯示。不知道是什么原因,希望可以指點(diǎn)一下。

          # re: 在Eclipse RCP中使用ResourceNavigator  回復(fù)  更多評(píng)論   

          2007-10-10 15:26 by dashan
          你好,麻煩你能給講一下YOURPlugin代表的具體是什么嗎,我沒(méi)有理解你文章里說(shuō)的意思?

          # re: 在Eclipse RCP中使用ResourceNavigator[未登錄](méi)  回復(fù)  更多評(píng)論   

          2007-10-11 10:20 by nemo
          to z:
          這個(gè)問(wèn)題可能是因?yàn)闆](méi)有引用org.eclipse.ui.ide的緣故,或者新版本的org.eclipse.ui.ide已經(jīng)將ResourceNavigator從該項(xiàng)目包中去掉(這個(gè)我不是很了解,最近沒(méi)有跟蹤Eclipse3.3版本)。最好能夠提供一些具體的細(xì)節(jié)。

          to dashan:
          YOURPlugin是你的插件類,在Eclipse3.1以后使用了OSGi技術(shù),是指插件的Activator類。

          # re: 在Eclipse RCP中使用ResourceNavigator[未登錄](méi)  回復(fù)  更多評(píng)論   

          2007-10-11 16:34 by z
          navigator 基本可以用了,但是,我在navigator中建立的文件再次打開的時(shí)候只能得到它的相對(duì)路徑,有沒(méi)有辦法讓文件再次打開時(shí)得到絕對(duì)路徑(謝謝你的解答)

          # re: 在Eclipse RCP中使用ResourceNavigator[未登錄](méi)  回復(fù)  更多評(píng)論   

          2007-10-11 17:32 by nemo
          不太懂你的意思。你是指想要以編程的方式來(lái)獲得文件的絕對(duì)路徑么?應(yīng)該可以吧。resource中有g(shù)etAbsolutePath()方法吧。。。?

          # re: 在Eclipse RCP中使用ResourceNavigator  回復(fù)  更多評(píng)論   

          2007-10-24 16:25 by homer
          樓主好:我按照你說(shuō)的方法設(shè)置了ResourceNavigator后,把org.eclipse.ui.ide.jar包也導(dǎo)入工程了,org.eclipse.core.runtime.compatibility包也加入了,但是報(bào)下面的錯(cuò)誤信息,rcp工程啟動(dòng)不了,請(qǐng)幫忙看一下是什么原因?謝謝!

          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[未登錄](méi)  回復(fù)  更多評(píng)論   

          2007-10-25 10:43 by nemo
          @homer
          這個(gè)問(wèn)題應(yīng)該是你的GefTest.application沒(méi)有被找到。跟ResourceNavigator類關(guān)系不大。你可以查看一下你RCP插件(擁有Application類的插件)中的Application類所在的插件工程的plugin.xml中,org.eclipse.core.runtime.application擴(kuò)展點(diǎn)中察看一下你所指定的Application類對(duì)不對(duì),以及Application Id 和你在XXX.product中所指定的Id是否一致(如果擁有產(chǎn)品文件的話)。
          如果沒(méi)有問(wèn)題的話,確保你的RCP插件中的插件依賴項(xiàng)和xxx.product中的依賴項(xiàng)一致。
          還有可能是依賴項(xiàng)的順序問(wèn)題...這就比較麻煩了。

          # re: 在Eclipse RCP中使用ResourceNavigator  回復(fù)  更多評(píng)論   

          2007-10-26 13:02 by homer
          謝謝!nemo,我想建一個(gè)自己的導(dǎo)航器,麻煩你能告訴我擴(kuò)展ResourceNavigator時(shí)怎么做嗎?直接繼承是不是不行?謝謝,我剛剛學(xué)習(xí)GEF,很多都不懂,別見笑。

          # re: 在Eclipse RCP中使用ResourceNavigator[未登錄](méi)  回復(fù)  更多評(píng)論   

          2007-10-26 14:38 by nemo
          @homer
          可以直接擴(kuò)展ResourceNavigator,網(wǎng)上有相關(guān)的文章:

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

          不知道你有什么樣的需求,如果是基于GEF/EMF做的話,可以考慮使用ProjectExplorer。如果你要保留Eclipse資源所支持的大部分功能,在此基礎(chǔ)上定制一些自己的樹結(jié)點(diǎn),只要擴(kuò)展org.eclipse.ui.navigator.navigatorContent擴(kuò)展點(diǎn),定義一些triggerpoint,并且自己提供navigatorContentProvider, navigatorLableProvider, navigatorActionProvider,就可以達(dá)到此目的。

          nemo

          # re: 在Eclipse RCP中使用ResourceNavigator  回復(fù)  更多評(píng)論   

          2007-10-26 16:38 by homer
          @nemo
          謝謝,我試試,遇到不懂的地方再向你請(qǐng)教。能夠留一下你的郵箱嗎?我的mail是homer4503@126.com

          # re: 在Eclipse RCP中使用ResourceNavigator  回復(fù)  更多評(píng)論   

          2007-10-26 20:03 by homer
          @nemo
          nemo,你好,請(qǐng)問(wèn)在gef中如何把view和editpart聯(lián)系起來(lái)呢?

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

          Copyright © nemo

          主站蜘蛛池模板: 庆安县| 成安县| 和顺县| 泽库县| 溧水县| 慈利县| 菏泽市| 原阳县| 个旧市| 盐亭县| 石棉县| 织金县| 义马市| 太湖县| 离岛区| 尼木县| 茌平县| 商洛市| 新沂市| 武山县| 利津县| 观塘区| 清徐县| 嘉禾县| 理塘县| 柏乡县| 天镇县| 五大连池市| 民勤县| 泽普县| 尚志市| 延吉市| 淅川县| 长兴县| 穆棱市| 多伦县| 周至县| 隆回县| 古田县| 垣曲县| 潮州市|