自己動手寫開發(fā)工具-基于Eclipse的工具開發(fā)_第1頁
自己動手寫開發(fā)工具-基于Eclipse的工具開發(fā)_第2頁
自己動手寫開發(fā)工具-基于Eclipse的工具開發(fā)_第3頁
自己動手寫開發(fā)工具-基于Eclipse的工具開發(fā)_第4頁
自己動手寫開發(fā)工具-基于Eclipse的工具開發(fā)_第5頁
已閱讀5頁,還剩61頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、 本文由kira_kira貢獻 pdf文檔可能在WAP端瀏覽體驗不佳。建議您優(yōu)先選擇TXT,或下載源文件到本機查看。 ChinaPub 在線購買:/computers/common/info.asp?id=36806 CSDN 在線閱讀:/bookfiles/550/ CowNew 開源團隊: 內(nèi)容介紹: 本書系統(tǒng)地介紹了 SWT、Draw2D、GEF、JET 等與 Eclipse 插件開發(fā)相關(guān)的基礎(chǔ)知識,并且以實際的開發(fā)案例來演示 這些知識的實戰(zhàn)性應(yīng)用,通過對這些實際開

2、發(fā)案例的學(xué)習(xí),讀者可以非常輕松地掌握 Eclipse 插件開發(fā)的技能,從而開發(fā)出滿 足個性化需求的插件。 本書以一個簡單而實用的枚舉生成器作為入門案例,通過該案例讀者能學(xué)習(xí)到擴展點、SWT、JET 等 Eclipse 插件開發(fā)的 基本技能;接著對 Eclipse 插件開發(fā)中的基礎(chǔ)知識進行了介紹,并且對屬性視圖的使用做了重點介紹;最后以兩個具有一定復(fù) 雜程度的插件(Hibernate 建模工具和界面設(shè)計器)為案例介紹了 SWT、Draw2D、GEF、JET 等技術(shù)的綜合運用。 第 1 章 Eclipse 插件 1 1.1 插件的安裝 1 1.1.1 直接復(fù)制安裝 1 1.1.2 links 安裝

3、方式 2 1.1.3 Eclipse 在線安裝方式 3 1.2 內(nèi)置 JUnit 插件的使用 5 1.3 可視化 GUI 設(shè)計插件 Visual Editor 9 1.3.1 Visual Editor 的安裝 9 1.3.2 一個登錄界面的開發(fā) 10 1.4 Eclipse 的反編譯插件 21 1.4.1 為什么要反編譯 21 1.4.2 常用 Java 反編譯器 22 1.4.3 反編譯不完全的代碼的 查看 23 1.5 WTP 插件使用 26 第 2 章 Eclipse 插件開發(fā) 30 2.1 Eclipse 插件開發(fā)介紹 30 2.1.1 開發(fā)插件的步驟 30 2.1.2 Eclips

4、e 插件開發(fā)學(xué)習(xí)資源的 取得 31 2.2 簡單的案例插件功能描述 31 2.3 插件項目的建立 33 2.3.1 建立項目 33 2.3.2 以調(diào)試方式運行插件項目 38 2.4 改造 EnumGeneratorNewWizardPage 類 39 2.4.1 修改構(gòu)造函數(shù) 39 2.4.2 修改 createControl 方法 40 2.4.3 修改 initialize 方法 41 2.4.4 修改 handleBrowse 方法 46 2.4.5 修改 dialogChanged 方法 49 2.4.6 分析 updateStatus 方法 50 2.4.7 取得界面控件值的方法 5

5、1 2.5 開發(fā)枚舉項編輯向?qū)ы?51 2.5.1 初始化 53 2.5.2 相關(guān)環(huán)境數(shù)據(jù)的處理 54 2.5.3 代碼生成 54 2.6 編寫代碼生成器 57 2.7 功能演示、打包安裝 64 第 3 章 插件開發(fā)導(dǎo)航 68 3.1 程序界面的基礎(chǔ)SWT/JFace. 68 3.1.1 SWT 的類庫結(jié)構(gòu) 68 3.1.2 SWT 中的資源管理 70 3.1.3 在非用戶線程中訪問 用戶線程的 GUI 資源 70 3.1.4 訪問對話框中的值 72 3.1.5 如何知道部件支持 哪些 style. 73 3.2 SWT 疑難點 74 3.2.1 Button 部件 74 3.2.2 Text

6、 部件 74 3.2.3 Tray. 74 3.2.4 Table. 74 3.2.5 在 SWT 中顯示 AWT/Swing 對象 75 3.3 異步作業(yè)調(diào)度 76 3.4 對話框 79 3.4.1 信息提示框 79 3.4.2 值輸入對話框 80 3.4.3 錯誤對話框 81 3.4.4 顏色選擇對話框 82 3.4.5 字體對話框 83 3.4.6 目錄選擇對話框 83 3.4.7 文件選擇對話框 84 3.4.8 自定義對話框及配置保存與 加載 85 3.5 首選項 86 3.6 Eclipse 資源 API 和文件系統(tǒng) 88 3.6.1 資源相關(guān)接口的常見方法 89 3.6.2 方法

7、中 force 參數(shù)的意義 91 3.6.3 資源相關(guān)接口的方法使用 示例 91 3.6.4 在 Eclipse 中沒有當前項目 92 3.7 Java 項目模型 92 3.7.1 類結(jié)構(gòu) 92 3.7.2 常用工具類 94 3.7.3 常用技巧 95 3.7.4 設(shè)定構(gòu)建路徑實戰(zhàn) 100 3.7.5 如何研讀 JDT 代碼 105 3.8 插件開發(fā)常見的問題 106 3.8.1 InvocationTargetException 異常的處理 106 3.8.2 Adaptable 與 Extension Object/Interface 模式 107 3.8.3 千萬不要使用 interna

8、l 包 111 3.8.4 打開視圖 111 3.8.5 查找擴展點的實現(xiàn)插件 111 3.8.6 項目 nature. 111 3.8.7 透視圖開發(fā) 112 3.8.8 關(guān)于工具條路徑 113 3.8.9 Eclipse 的日志 116 第 4 章 屬性視圖 117 4.1 基本使用 117 4.1.1 IPropertySource 接口說明 118 4.1.2 對象實現(xiàn) IPropertySource 接口 120 4.1.3 對象適配成 IPropertySource 對象 125 4.2 屬性視圖高級話題 128 4.2.1 屬性分類 128 4.2.2 復(fù)合屬性 133 4.2.

9、3 常用屬性編輯器 140 4.2.4 自定義屬性描述器 146 第 5 章 開發(fā) Hibernate 插件 154 5.1 功能描述 154 5.2 XML 文件的處理 158 5.2.1 XML 處理技術(shù)比較 158 5.2.2 Dom4j 的使用 159 5.2.3 XStream 的使用 165 5.3 實體模型文件創(chuàng)建向?qū)?169 5.4 模型的定義和模型文件處理 176 5.5 實體屬性描述器 187 5.6 實體編輯器 193 5.6.1 字段的編輯 193 5.6.2 編輯器基類 200 5.6.3 實體編輯器核心配置界面 203 5.6.4 多頁實體編輯器 224 5.7 代

10、碼生成 228 5.7.1 代碼生成器接口 228 5.7.2 代碼生成器配置文件 232 5.7.3 代碼生成向?qū)?235 5.7.4 公共工具類 CommonUtils. 243 5.8 Hibernate 代碼生成器 245 5.8.1 命名策略 246 5.8.2 工具類 247 5.8.3 代碼生成的 JET 代碼 251 5.9 CowNewStudio 使用實例 259 第 6 章 基于 GEF 的界面設(shè)計工具 263 6.1 GEF 簡介 263 6.1.1 Draw2D. 263 6.1.2 請求與編輯策略 264 6.1.3 視圖與編輯器 264 6.1.4 GEF 的工作

11、過程 265 6.2 系統(tǒng)需求 265 6.2.1 界面設(shè)計工具的分類 265 6.2.2 功能描述 266 6.3 構(gòu)建模型 267 6.4 實現(xiàn)控制器 275 6.4.1 窗體和組件的控制器 275 6.4.2 編輯策略 279 6.4.3 命令對象 283 6.5 窗體文件創(chuàng)建向?qū)?287 6.6 組件加載器 289 6.7 編輯器 295 6.8 代碼生成和構(gòu)建器 310 6.8.1 代碼生成 310 6.8.2 構(gòu)建器 313 6.8.3 為項目增加構(gòu)建器 320 6.9 實現(xiàn)常用組件 323 6.9.1 標簽組件 323 6.9.2 按鈕組件 327 6.9.3 復(fù)選框 331 6

12、.9.4 編輯框 336 6.9.5 列表框 338 6.10 使用演示 346 前 言 Eclipse 是一款非常優(yōu)秀的開源 IDE,非常適合 Java 開發(fā),由于支持插件技術(shù),受到了越來越多的開發(fā)者 的歡迎。 作為一款優(yōu)秀的平臺,如果我們只是使用 Eclipse 的現(xiàn)有功能進行開發(fā),無疑不能發(fā)揮出 Eclipse 的全部 威力, 如果能根據(jù)需要開發(fā)基于 Eclipse 的插件, 那么將會大大提高開發(fā)效率。 現(xiàn)在市場上已經(jīng)有了幾本 Eclipse 的相關(guān)書籍,但基本上都是偏重于 Eclipse 的使用,很少有涉及到基于 Eclipse 的插件開發(fā)的書籍,即使有講 述到 Eclipse 插件開

13、發(fā)的,其內(nèi)容也是淺嘗輒止,根本沒有對有一定復(fù)雜程度和實用性的插件開發(fā)進行講解。 Eclipse 的插件體系是非常復(fù)雜的,學(xué)習(xí)門檻也非常高,為了幫助國內(nèi)開發(fā)人員掌握 Eclipse 的插件開發(fā) 技術(shù),從而開發(fā)出滿足自己要求的插件,本書將系統(tǒng)地介紹 Eclipse 插件各方面的知識,并且通過實際的開發(fā) 案例來演示這些知識的實戰(zhàn)性應(yīng)用。 書中的對應(yīng)的 Eclipse 版本為 Eclipse 3.2,可以從 網(wǎng)站免費下載。 本書內(nèi)容安排: 第 1 章介紹常用的 Eclipse 插件的安裝和使用。 2 章以一個枚舉生成器插件的開發(fā)為案例講解一個簡單、 第 實用

14、的插件的開發(fā)步驟。 3 章介紹 Eclipse 插件開發(fā)中常用的基礎(chǔ)知識。 4 章介紹插件對屬性視圖的支持。 第 第 第 5 章以 Hibernate 建模插件為案例講解有一定復(fù)雜程度和實用性的插件的開發(fā)。 6 章以界面設(shè)計器插件為 第 案例講解基于 GEF 技術(shù)的圖形插件的開發(fā)。 本書相關(guān)的后續(xù)資料將會發(fā)布到 如果您對本書有任何意見和建議, 可以發(fā)送郵件到 , CowNew 開源團隊網(wǎng)站()中。 楊中科 序言 “自己動手寫開發(fā)工具”是很多開發(fā)人員的夢想,雖然市場上已經(jīng)有了各種開發(fā)工具,但是在一些情況 下還是有編寫自己開發(fā)工

15、具的需求的: l 使用的編程語言沒有合適的開發(fā)工具。比如在 Eclipse 出現(xiàn)之前,Python、Ruby、JavaScript 等語言都沒 有很好的全面支持代碼編寫、調(diào)試以及重構(gòu)的開發(fā)工具,使用這些語言進行開發(fā)非常麻煩。 l 為自己開發(fā)的語言配備開發(fā)工具。有時我們會開發(fā)一款新的開發(fā)語言,為了方便使用,我們也需要為其 提供相應(yīng)的開發(fā)工具。 l 為控件庫、框架等提供開發(fā)工具。Echo2、Tapestry、Spring 等都是非常優(yōu)秀的產(chǎn)品,但是通過手工編碼 的方式使用這些產(chǎn)品仍然是非常麻煩的,如果能配備圖形化的開發(fā)工具,那么通過簡單地鼠標拖拽就可 以快速完成工作。 l 為產(chǎn)品提供二次開發(fā)工具。

16、很多公司都有自己的產(chǎn)品,而這些產(chǎn)品一般都提供了二次開發(fā)的能力,開發(fā) 人員只要進行少量的編碼或者配置就可以很輕松的實現(xiàn)針對特定客戶的個性化功能。由于二次開發(fā)人員 的技術(shù)水平相對較差,如果能提供一個圖形化的二次開發(fā)工具也必將提高二次開發(fā)的效率及質(zhì)量。 對于上面的幾種情況, 已經(jīng)有很多開發(fā)人員探索著實現(xiàn)了, 比如 Boa Constructor 就是一款用 Python 語言 編寫的 Python 開發(fā)工具, 潤乾報表提供了用 Swing 技術(shù)實現(xiàn)的報表設(shè)計器。 這種所有功能全盤自己實現(xiàn)的方 式有如下的缺點: l 必須自己處理所有的細節(jié)問題。比如實現(xiàn)一個語言的開發(fā)工具就必須自己處理語法高亮、語法分析

17、、代 碼提示、調(diào)試、重構(gòu)、可視化的界面編輯器以及代碼生成等,這些問題的處理對開發(fā)人員的要求非常高, 而且開發(fā)工作量也非常大。 l 各個工具的差異性非常大,增加了用戶的學(xué)習(xí)成本。 l 不同的工具之間的集成非常困難。由于不同的工具是由各個廠商獨立開發(fā)出來的,互相之間的集成非常 麻煩,不僅使用的時候需要運行多個工具,而且經(jīng)常需要在多個實現(xiàn)相似功能的工具之間做出取舍。 Delphi、VS.Net Studio、JBuilder、NetBeans 等都提供了一定的擴展機制,我們只要按照要求編寫插件就 能在這些工具中開發(fā)擴展功能,但是這些工具提供的擴展功能是非常簡單和有限的,我們幾乎無法完成編寫 開發(fā)工具

18、這樣復(fù)雜的功能。 做為 IDE 界的一匹黑馬,Eclipse 在幾年內(nèi)異軍突起,很多開源項目或者商業(yè)化的產(chǎn)品都提供了相應(yīng)的 Eclipse 插件,比如 Echo2、GWT、Struts 等開源產(chǎn)品以及 IBM Websphere、Crystal、金蝶、普元等商業(yè)公司 的開發(fā)工具都基于 Eclipse 進行開發(fā),甚至 Borland 也將新版本的 JBuilder 移植到 Eclipse 上。Eclipse 能夠得 到這么多廠商的支持,究其原因有如下幾點:免費且開源;開放性;可擴展性強;對開發(fā)工具的開發(fā)提供了 強大的支持;基于 Eclipse 的產(chǎn)品更專業(yè);各種插件可以組合使用。 免費且開源 大

19、多數(shù)開發(fā)工具都是按用戶數(shù)收費的,對于開發(fā)人員比較多的公司來說開發(fā)工具的支出是一筆不小的費 用, 而且基于這些開發(fā)工具開發(fā)出來的擴展插件在發(fā)布的時候也會涉及到授權(quán)的問題。 Eclipse 是免費使用的, 這樣就為公司節(jié)省了不小的一筆開支,而且只要遵守 EPL 協(xié)議,那么基于 Eclipse 開發(fā)的擴展插件可以任意 發(fā)布。Eclipse 是開源的,通過研讀 Eclipse 的代碼,我們能更快的開發(fā)出高質(zhì)量的插件。 開放性 Eclipse 并沒有局限于 Java 語言,我們可以開發(fā)非 Java 語言的開發(fā)插件,比如 Ruby、Python、C/C+、 C#以及 PHP 等語言都有了 Eclipse

20、上的開發(fā)插件。而且 Eclipse 也沒有限定插件的應(yīng)用領(lǐng)域,所以 Eclipse 成 為了很多領(lǐng)域開發(fā)工具的基礎(chǔ),不僅 IBM、金蝶、普元等企業(yè)級系統(tǒng)開發(fā)商選擇 Eclipse 做為其開發(fā)工具的 基礎(chǔ),而且像風(fēng)河系統(tǒng)公司、Accelerated 科技、Altera、TI 和 Xilinx 等嵌入式系統(tǒng)公司也將 Eclipse 平臺作為 自身開發(fā)工具的基礎(chǔ)。 可擴展性強 Eclipse 采用微內(nèi)核架構(gòu),其核心只有幾兆大小,我們平時使用的代碼編輯、調(diào)試、查找以及重構(gòu)等功能 都是以插件的形式提供的。我們不僅可以擴展現(xiàn)有插件,而且還可以提供擴展點,這樣其他用戶同樣可以基 于我們的插件開發(fā)擴展插件從而

21、滿足用戶的個性化需求,這樣我們只需要實現(xiàn)我們個性化的功能即可,通用 功能由基礎(chǔ)插件來完成。比如我曾經(jīng)開發(fā)過一個 Python 的遠程調(diào)試插件,由于 PyDev 已經(jīng)提供了本地調(diào)試 的功能,所以我對 PyDev 進行了少量擴展開發(fā)就完成了這個插件。 對開發(fā)工具的開發(fā)提供了強大的支持 Eclipse 提供了新建向?qū)А?代碼編輯、 調(diào)試、運行、圖形化界面以及代碼生成等開發(fā)工具常見功能的支持, 這大大簡化了一個復(fù)雜開發(fā)工具的開發(fā)。只需數(shù)十行代碼就可以實現(xiàn)語法高亮、代碼提示等代碼編輯功能、 只需數(shù)百行代碼就可以實現(xiàn)調(diào)試功能、只需數(shù)百行代碼就可以實現(xiàn)一個所見即所得的圖形化編輯器,這一切 讓開發(fā)一個專業(yè)的開

22、發(fā)工具變得如此簡單。這樣廠商只要按照自己領(lǐng)域相關(guān)的邏輯進行定制,其他的基礎(chǔ)功 能則由 Eclipse 提供, 這使得廠商能夠把更多的精力投入到自己熟悉的業(yè)務(wù)領(lǐng)域。 比如我們要開發(fā)一個 Python 的所見即所得的界面繪制工具, 那么我們只需要基于 GEF 進行少量開發(fā)即可實現(xiàn)一個所見即所得的圖形化編 輯器,而生成的 Python 代碼的編輯、調(diào)試以及重構(gòu)等功能則由現(xiàn)有的 PyDev 插件來完成??梢韵胂袢绻麤] 有 Eclipse 的話,我們從頭開發(fā)一個 Python 的圖形化編輯器需要我們處理多少的技術(shù)難題! 基于 Eclipse 的產(chǎn)品更專業(yè) 一個專業(yè)的開發(fā)工具通常需要考慮很多問題,比如需要

23、考慮被選擇對象的屬性編輯方式、長時間操作的 進度條展示、 編輯窗口的布局方式以及工具選項的配置等問題, 這些問題 Eclipse 的開發(fā)人員已經(jīng)替我們考慮 好了,我們開發(fā)的插件將自動擁有這些功能,這使得我們的插件顯得更加專業(yè)。 各種插件可以組合使用 以前每開發(fā)一個開發(fā)工具,都需要實現(xiàn)代碼版本控制等功能,而在 Eclipse 中則已經(jīng)有了支持 VSS、CVS 和 SVN 等版本控制協(xié)議的插件,我們只要實現(xiàn)我們的開發(fā)工具即可,這些版本控制插件可以正交的和我們 的插件組合使用,并且用戶可以選擇任何他們喜歡的版本控制插件,使得我們的工具使用起來更加靈活。 現(xiàn)在市場上已經(jīng)有了 XML 編輯器、版本控制、

24、UML 繪制工具及 EJB 開發(fā)工具等插件,并且這些插件也 有不同的廠商實現(xiàn)的多個版本, 這樣用戶可以隨意挑選他們喜歡的插件, 在同一個 Eclipse 環(huán)境中任意組合這 些插件來完成復(fù)雜的功能。 Eclipse 的出現(xiàn)使得 IDE 市場出現(xiàn)了一個新的格局,主流的開發(fā)工具都開始向 Eclipse 靠攏,這不僅使得 開發(fā)工具的開發(fā)變得更容易了,中小型企業(yè)甚至個人也能開發(fā)一個實用的開發(fā)工具出來。這些基于 Eclipse 的開發(fā)工具不僅能提高開發(fā)效率, 而且將用戶統(tǒng)一到 Eclipse 平臺中, 減少了用戶的學(xué)習(xí)成本。 相信基于 Eclipse 的插件開發(fā)將成為未來開發(fā)工具的主流,那么就讓我們開始激

25、動人心的 Eclipse 插件開發(fā)學(xué)習(xí)之旅吧! 第2章 Eclipse 插件開發(fā) Eclipse 已經(jīng)不僅僅是一個開發(fā)工具了,它更是一個平臺。在 Eclipse 下開發(fā)的插件可以不僅限用于 Java 語言,現(xiàn)在已經(jīng)出現(xiàn)了 C+、Python、C#等語言的開發(fā)插件,而且我們還可以把它當成一個應(yīng)用框架,用它 開發(fā)與編程無直接關(guān)系的系統(tǒng),比如信息管理軟件、制圖軟件、聊天軟件等。不過目前國內(nèi)大部分開發(fā)人員 還僅僅是把 Eclipse 當成了一個開發(fā)工具來使用, 沒有發(fā)揮它的最大潛力。 開發(fā)人員一直是在網(wǎng)上尋找相應(yīng)功 能的插件,一旦沒有相應(yīng)的插件或者插件安裝失敗就抱怨 Eclipse 沒有 JBuild

26、er 之類的工具強大。 “工欲善其 事,必先利其器” ,Eclipse 的插件開發(fā)其實并不復(fù)雜,我們只要稍加學(xué)習(xí),就能開發(fā)出滿足我們個性化要求 的插件,從而大大提高開發(fā)效率。學(xué)會 Eclipse 插件開發(fā)可在以下幾個方面給人們帶來方便: l l l l 開發(fā)滿足用戶要求的插件。 如果現(xiàn)有的開源第三方插件有一些 bug,我們也可以自己進行修改,而不必依賴于插件的開發(fā)者修 補 bug。 可以在第三方開源插件的基礎(chǔ)上做二次開發(fā),從而使其更能滿足個性化要求。 在使用一些 Eclipse 插件的時候如果出現(xiàn)問題我們也能更快地發(fā)現(xiàn)問題的所在,并快速排除問題。 本章我們將首先介紹插件開發(fā)的一些基礎(chǔ)知識,然后

27、就以一個具有實用價值的插件為例介紹插件開發(fā)的 整個過程,學(xué)習(xí)完整個例子之后,我們就可以開發(fā)一些實用的插件了 。 2.1 Eclipse 插件開發(fā)介紹 2.1.1 開發(fā)插件的步驟 開發(fā)一個插件需要如下幾步。 (1) 標識需要進行添加的擴展點以便與插件進行集成。 (2) 根據(jù)擴展點的規(guī)范來編寫擴展代碼。 (3) 編寫 plugin.xml 文件描述正在提供的擴展以及對應(yīng)的擴展代碼。 如果要完全手動開發(fā)插件的話,我們需要自己去查詢相應(yīng)的擴展點、編寫擴展點實現(xiàn)代碼、編寫 plugin.xml 等配置文件,這項工作非常麻煩、非常容易出錯,而且插件的測試、部署也非常麻煩,為了簡化 插件開發(fā),Eclipse

28、 提供了一個用來開發(fā)插件的插件 PDE(Plug-in Development Environment)。 在 PDE 中,每個正在開發(fā)的插件都被單個的特殊的 Java 項目所代表,這個項目被稱為插件項目。PDE 提供了一個插件創(chuàng)建向?qū)?,可以選擇各種需要的部分創(chuàng)建插件項目。 在 PDE 中,插件配置工作大部分是在項目多頁編輯器中完成的,這個編輯器簡化了插件的配置和開發(fā)。 插件 Manifest 編輯器用到 3 個文件: META-INF/MANIFEST.MF、plugin.xml 和 perties。它允許我們 通過編輯所有必要的屬性來描述一個插件,包括它的基本運行時要求、

29、依賴項、擴展和擴展點等。PDE 提供 了一個特別的啟動配置類型,允許我們使用它的配置中包含的工作區(qū)插件來啟動另外一個工作臺實例(被稱為 運行時工作臺),我們可以像調(diào)試普通 Java 程序一樣調(diào)試插件項目。 2.1.2 Eclipse 插件開發(fā)學(xué)習(xí)資源的取得 如果想快速地學(xué)習(xí) Eclipse 插件開發(fā)的話, 我們可以首先學(xué)習(xí)插件開發(fā)入門文檔, 通過入門項目的開發(fā)對 Eclipse 插件開發(fā)有一個感性的認識,然后再閱讀 Eclipse 幫助文檔中有關(guān)插件開發(fā)的部分(主要在 Platform plug-in Developer Guide、 JDT Plug-in Developer Guide、

30、Plug-in Development Environment Guide 這 3 個項目下), 以便對插件開發(fā)的知識有進一步了解,然后再閱讀一些開源的 Eclipse 插件的源碼,學(xué)習(xí)他人的代碼,最后就 可以根據(jù)自己的需要嘗試進行插件的開發(fā),這個過程經(jīng)常是迭代的,比如在學(xué)習(xí)開源插件源碼的時候還需要 借助 Eclipse 的幫助文檔來查詢某個 API 的說明。 Eclipse 插件開發(fā)涉及到的知識是比較多的,比如 SWT/JFace、JDTAPI、GEF、EMF 等,插件涉及到的 類也非常多,容易使初學(xué)者望而生畏。其實 Eclipse 插件開發(fā)的學(xué)習(xí)是循序漸進的,沒必要對各個方面都了解 得非常

31、透徹,比如如果不開發(fā)圖形界面插件,那么就沒必要學(xué)習(xí) GEF,如果不開發(fā)模型相關(guān)的插件就沒必要 學(xué)習(xí) EMF,即便是任何插件開發(fā)人員都躲不掉的 SWT/JFace 也沒必要全部掌握,只要能用 SWT 編寫一個簡 單的界面就可以,其他的東西可以一邊做一邊學(xué)。 本章中所有代碼位于隨書光盤的“代碼/ch2/EnumGenerator”下。 2.2 簡單的案例插件功能描述 在 Internet 搜索引擎中以“Eclipse 插件開發(fā)”為關(guān)鍵字搜索就可以找到數(shù)篇講述 Eclipse 插件開發(fā)的經(jīng) 典入門文章,按著文章中的例子一步一步地做,就可以做出一個顯示 Hello world 對話框的例子。這個例子雖

32、 然簡單,但是卻是一個真正的插件開發(fā)項目,通過這個項目我們就可以理解插件的工作原理以及配置文件各 個配置項的作用。 在本節(jié)中我們來講解一個有一定實用價值的簡單插件, 通過這個插件就可以對 Eclipse 的插件開發(fā)有更多 的認識,并且可以立即應(yīng)用到實際的開發(fā)中去。 JDK 1.5 提供的枚舉大大簡化了我們的開發(fā)工作,但是在有的情況下我們暫時還不能使用 JDK 1.5,那么 此時如果需要枚舉的話就只能自己寫代碼,比如: public class CustomerTypeEnum private String type; public CustomerTypeEnum VIP = new Cust

33、omerTypeEnum(VIP); public CustomerTypeEnum MEMBER = new CustomerTypeEnum(MEMBER); public CustomerTypeEnum NORMAL = new CustomerTypeEnum(NORMAL); private CustomerTypeEnum(String type) super(); this.type = type; public int hashCode() final int PRIME = 31; int result = 1; result = PRIME * result + (typ

34、e = null) ? 0 : type.hashCode(); return result; public boolean equals(Object obj) if (this = obj) return true; if (obj = null) return false; if (getClass() != obj.getClass() return false; final CustomerTypeEnum other = (CustomerTypeEnum) obj; if (type = null) if (other.type != null) return false; el

35、se if (!type.equals(other.type) return false; return true; 如果需要很多枚舉定義的話就會非常繁瑣,因此我們下面就來開發(fā)這樣一個代碼生成器插件來簡化這個 操作。 2.3 插件項目的建立 2.3.1 建立項目 插件項目的建立與普通 Java 項目的建立類似。 (1) 在【包資源管理器】中右擊,在彈出的快捷菜單中選擇【新建】|【項目】命令,在對話框中選擇 【插件項目】選項,然后單擊【下一步】按鈕,在接下來的向?qū)ы撝休斎氩寮椖康拿Q、保存位置等信息, 然后單擊【下一步】按鈕。在接下來的“插件內(nèi)容”界面中進行如圖 2.1 所示的配置。 圖 2.

36、1 插件向?qū)?(2) 設(shè)置完成后,單擊【下一步】按鈕,進入如圖 2.2 所示的界面。 圖 2.2 插件模板選擇 (3) 選擇【定制插件向?qū)А窟x項,單擊【下一步】按鈕,在接下來的“選擇模板”界面中,選中【新建 文件向?qū)А繌?fù)選框,應(yīng)取消選中其他復(fù)選框。單擊【下一步】按鈕,在“新向?qū)нx項”界面中進行如圖 2.3 所示的配置后,單擊【完成】按鈕。 圖 2.3 新建向?qū)?(4) 完成以后的項目結(jié)構(gòu)如圖 2.4 所示。 圖 2.4 插件項目結(jié)構(gòu) 下面看一下各個主要文件的作用。 (1) plugin.xml 這個文件是插件清單文件,它定義了此插件項目中所有的插件: 標記 plugin 內(nèi)可以定義多個 ext

37、ension 標記, 每個標記表示一個對擴展點的擴充, 比如我們這里擴展的是 org.eclipse.ui.newWizards 擴展點, 也就是 “新建向?qū)А?擴展點; category 定義的是對這個擴展點的歸類; wizard 標記是 org.eclipse.ui.newWizards 擴展點自定義的格式, name 屬性定義的是顯示的名稱, icon 屬性定義的是向 導(dǎo)的圖標,category 屬性代表此向?qū)У姆诸?,對向?qū)Х诸惪梢允沟孟驅(qū)Э雌饋砀逦?,比如圖 2.5 中的 CSS、 HTML 等就屬于 Web 分類下。 圖 2.5 向?qū)У姆诸?class 屬性表示此擴展點對應(yīng)的實現(xiàn)類,

38、大部分擴展點的實現(xiàn)都需要編寫實現(xiàn)代碼,因此需要這個屬性來 指定此擴展點使用的是哪個類;id 屬性定義的是此 wizard 的唯一標識,作者的習(xí)慣是定義成和 class 一樣, 這樣一般就不會與其他插件的唯一標識沖突了。 需要注意 extension 標記內(nèi)的 category、wizard 等標記是“org.eclipse.ui.newWizards”擴展點特有的標記, 也就是其他擴展點很可能沒有這些標記。這些特有的標記是 Eclipse 供不同的擴展點用來進行屬性定義的,這 樣靈活性就更加好,每種不同的插件的擴展點的標記定義格式都可以在 Eclipse 幫助文檔中找到。 plugin.xml

39、、perties 和 MANIFEST.MF 是插件項目中重要的配置文件,共同配置了插件的不同方 面的信息,雙擊其中任何一個文件都會打開此項目的配置編輯器,3 個文件的配置都在這同一個編輯器中完 成,如圖 2.6 所示。 這個編輯器一共有 9 個選項卡,分別是【概述】 【依賴項】 【運行時】【擴展】【擴展點】 【構(gòu)建】 、 、 、 、 、 、 【MANIFEST.MF】 【plugin.xml】 【perties】 、 、 。其中【概述】 【依賴項】 【運行時】中配置的是 、 、 “MANIFEST.MF”文件的內(nèi)容, 【擴展】【擴展點】中配置的是 plug

40、in.xml 文件中的內(nèi)容, 、 【構(gòu)建】配置的 則 是 perties 中 的 內(nèi) 容 , 我 們 既 可 以 在 前 面 這 些 可 視 化 編 輯 界 面 中 進 行 配 置 , 也 可 以 在 【MANIFEST.MF】【plugin.xml】【perties】這幾個選項卡中直接修改配置文件。建議盡量使用可視 、 、 化編輯界面來進行配置,這樣可以減少很多錯誤。 在后面的章節(jié)中我們會介紹這些配置項的意義。 圖 2.6 插件配置編輯器 (2) Activator.java Activator.java 起著此插件的生命周期控制器的作用。 【代碼 2-1

41、】插件生命周期控制器: public class Activator extends AbstractUIPlugin / The plug-in ID public static final String PLUGIN_ID = EnumGenerator; / The shared instance private static Activator plugin; public Activator() plugin = this; public void start(BundleContext context) throws Exception super.start(context);

42、public void stop(BundleContext context) throws Exception plugin = null; super.stop(context); /* * Returns the shared instance * return the shared instance */ public static Activator getDefault() return plugin; /* * Returns an image descriptor for the image file at the given * plug-in relative path *

43、 * param path the path * return the image descriptor */ public static ImageDescriptor getImageDescriptor(String path) return imageDescriptorFromPlugin(PLUGIN_ID, path); 在 Eclipse 3.2 以前的版本中, 此類習(xí)慣于被命名為*Plugin.java, 它使用了單例模式, 需要通過 getDefault 方法得到此類的實例。當插件被激活的時候 start 方法會被調(diào)用,插件可以在這個方法中編寫初始化的代碼, 當插件被關(guān)閉的

44、時候 stop 方法則會被調(diào)用。 類中還定義了一個靜態(tài)方法 getImageDescriptor,用于得到插件目錄下的圖片資源。 在 Activator 的父類中還定義了很多有用的方法,在這里我們簡要地列出常用的一些方法,在后面的章節(jié) 中會展示這些方法的用途。 l l l l getDialogSettings:得到對話框配置類實例。 getPreferenceStore:得到首選項配置的儲存類實例。 getWorkbench:得到工作臺。 getLog:得到日志記錄類實例。 (3) EnumGeneratorNewWizard.java、EnumGeneratoreNewWizardPage

45、.java 這個兩個文件是向?qū)Ы缑娴膶崿F(xiàn)代碼。為什么是兩個文件呢?一個向?qū)υ捒蛲ǔS胁恢挂粋€界面,因 此整個向?qū)Ш兔總€向?qū)Ы缑嬉謩e由不同的類來維護。 EnumGeneratorNewWizard 是 維 護 所 有 界 面 的 向 導(dǎo) 類 , 在 這 個 例 子 中 只 有 一 個 界 面 , 即 EnumGeneratoreNewWizardPage。 插件模板向?qū)傻?EnumGeneratorNewWizard.java、EnumGeneratoreNewWizardPage.java 這兩個類文件并 不能完全滿足我們的要求,需要進行修改,因此這里暫時不講解類中的代碼。 2.3.2

46、 以調(diào)試方式運行插件項目 在插件項目上右擊,在彈出的快捷菜單中選擇【調(diào)試方式】|【Eclipse 應(yīng)用程序】命令(或運行時工作臺), Eclipse 就會啟動另一個 Eclipse 實例。 在這個新啟動的 Eclipse 中新建的一個 Java 項目,名稱為 EnumGenTest,并創(chuàng)建一個源文件夾,在源文 件夾下創(chuàng)建包 com.cownew.enumtest,在包 com.cownew.enumtest 上右擊,選擇【新建】|【其他】命令,這樣 就可以在 EnumGenerator 分組下看到剛才創(chuàng)建的“枚舉創(chuàng)建向?qū)А绷耍鐖D 2.7 所示。 圖 2.7 新建向?qū)ы?選擇【枚舉創(chuàng)建向?qū)А窟x

47、項,單擊【下一步】按鈕,進入如圖 2.8 所示的界面。 圖 2.8 枚舉創(chuàng)建向?qū)?這個界面在類 EnumGeneratoreNewWizardPage 中定義。 Container 用來指定生成的文件存放在哪個容器下 邊(容器是進行 Eclipse 插件開發(fā)時要弄懂的概念,這里不詳細說明,可以暫時認為源文件夾、普通文件夾、 項目根目錄都是容器),單擊 Browse 按鈕,在彈出的對話框中可以選擇源文件夾、項目根目錄,甚至還可以 選擇輸出路徑,顯然這不滿足我們的要求,因為我們生成的枚舉類只能放在文件夾下,因此需要對其進行改 造。枚舉項目結(jié)構(gòu)如圖 2.9 所示。 選擇 src/com/cownew

48、/enumtest,然后單擊【確定】按鈕,在 File name 中輸入 TestEnum.java,單擊【完 成】按鈕,向?qū)?TestEnum.java 填充了如下內(nèi)容“This is the initial file contents for *.Java file that should be word-sorted in the Preview page of the multi-page editor” 。 圖 2.9 枚舉項目結(jié)構(gòu) 2.4 改造 EnumGeneratoreNewWizardPage 類 這個類有很多地方不能滿足我們的要求,下面一一地進行修改。 2.4.1 修改構(gòu)

49、造函數(shù) 代碼 2-2 是修改以后的 EnumGeneratoreNewWizardPage 類的構(gòu)造函數(shù)。 【代碼 2-2】修改以后的構(gòu)造函數(shù): public EnumGeneratoreNewWizardPage(ISelection selection) super(wizardPage); setTitle(Multi-page Editor File); setDescription(This wizard creates a new file with *.Java extension that can be opened by a multi-page editor.); this

50、.selection = selection; 在構(gòu)造函數(shù)中首先調(diào)用父類的構(gòu)造函數(shù),然后調(diào)用 setTitle 為向?qū)ы撛O(shè)定標題,調(diào)用 setDescription 方法 為頁設(shè)置描述信息,最后把代表用戶選擇項的 ISelection 賦值給 selection 私有變量。 向?qū)У臉祟}、向?qū)ы摰臉祟}、向?qū)ы摰拿枋鍪遣煌模鐖D 2.10 所示。 圖 2.10 向?qū)Р煌奶崾撅@示 “向?qū)У臉祟}”是一個向?qū)Т翱诘臉祟},這個標題在這個向?qū)У纳芷趦?nèi)是不變的; “向?qū)ы摰臉祟}” 是向?qū)е忻恳豁摰臉祟},它標明了此頁的作用, “向?qū)ы摰拿枋觥笔菍Υ隧摴δ艿倪M一步解釋。 2.4.2 修改 createCo

51、ntrol 方法 createControl 方法是 Override 父類的一個方法,框架會調(diào)用此方法繪制向?qū)ы摻缑妗?【代碼 2-3】修改后的 createControl 方法: public void createControl(Composite parent) Composite container = new Composite(parent, SWT.NULL); GridLayout layout = new GridLayout(); container.setLayout(layout); layout.numColumns = 3; layout.verticalSpac

52、ing = 9; Label label = new Label(container, SWT.NULL); label.setText(&Container:); containerText = new Text(container, SWT.BORDER | SWT.SINGLE); GridData gd = new GridData(GridData.FILL_HORIZONTAL); containerText.setLayoutData(gd); containerText.addModifyListener(new ModifyListener() public void mod

53、ifyText(ModifyEvent e) dialogChanged(); ); Button button = new Button(container, SWT.PUSH); button.setText(Browse); button.addSelectionListener(new SelectionAdapter() public void widgetSelected(SelectionEvent e) handleBrowse(); ); label = new Label(container, SWT.NULL); label.setText(&File name:); f

54、ileText = new Text(container, SWT.BORDER | SWT.SINGLE); gd = new GridData(GridData.FILL_HORIZONTAL); fileText.setLayoutData(gd); fileText.addModifyListener(new ModifyListener() public void modifyText(ModifyEvent e) dialogChanged(); ); initialize(); dialogChanged(); setControl(container); 我們不能直接在 cre

55、ateControl 傳遞過來的 parent 上繪制界面, 因為這個 parent 代表所有向?qū)ы撁?包括向 導(dǎo)選擇頁面)的父 Composite, 如果直接在這個 parent 上繪制界面會導(dǎo)致界面顯示混亂, 所以要調(diào)用 “Composite container = new Composite(parent, SWT.NULL);”創(chuàng)建一個新的 Composite。 接下來為這個 container 設(shè)定布局管理器,在插件項目中采用 GridLayout 是比較方便的。GridLayout 把界 面分成網(wǎng)格,控件都放在這些網(wǎng)格中,與 Swing 的 GridLayout 不同的地方就是它不僅可以為每一列設(shè)定不同 的寬度,而且還可以讓一個控件占據(jù)多個網(wǎng)格。由于插件項目中的界面大部分都是規(guī)矩的表單式排列,因此 采用 GridLayout 布局管理器是比較好的。因此這里采用 GridLayout 作為布局管理器,并設(shè)定其為 3 列。 創(chuàng)建標記控件、按鈕控件、文本框控件等,并為它們設(shè)定合適的 GridData。需要注意的是每個控件的 GridData 不能與其他控件共享,也就是說即使兩個控件使用的 GridData 全部一樣,也要為它們各創(chuàng)建一個 GridData。 在創(chuàng)建控件的時候,給 containerText 控件和 fileText 都增加了

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論