1. 程式人生 > 實用技巧 >快速掌握Eclipse Plugin / RCP開發思想

快速掌握Eclipse Plugin / RCP開發思想

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

快速掌握EclipsePlugin/RCP開發思想

李曉明([email protected])

引言

本文不是快速入門的文章,只面向有一定基礎的開發人員,至少看這篇文章之前你應該瞭解什麼是Eclipse,什麼是RCP,什麼是Plugin,什麼是架構,什麼是軟體框架等等概念。否則的話這篇文章也幫不了你什麼。另外,本人對RCP的理解也是處於一知半解的程度,如有錯誤還請指出。

Eclipse是一種面向開發人員的程式設計環境(IDE),同時它也是一個很好的平臺,它提供了一種架構,或者說一種軟體框架,可以讓開發人員相對比較容易的開發出功能比較強大的,帶有人機互動功能的應用程式。

Eclipse這種強大的功能是通過其外掛(Plugin)來實現的,RCP也是如此。RCP的全稱是RichClientPlatform,其根本就是把Eclipse的應用平臺剝離了其他的外掛之後剩下的東西,自然其架構和原理與eclipse本身是一樣的。RCP也可以通過外掛來進行擴充套件,但RCP往往是用來開發一些像Eclipse一樣獨立的應用程式。

本文幫助對RCP不是很清楚的人快速的理解EclipseRCPPlugin的工作原理與開發方法。

基本知識

讓我們閉上眼睛靜下心來冥想一下,我們可以想象,如果要開發一個帶有人機互動的應用程式,必備的幾個部分是什麼?

1人機介面。人機介面在某些應用程式中基本上就可以當成是軟體的核心了,特別是一些輕量級的應用中。

VB這方面做的就很好,它基本上就是一個以介面為核心的開發環境,我曾經在上課的時候講過,VB程式設計基本上就兩步,第一步畫好介面,第二步寫介面的響應程式碼(事件處理程式)。這個思路基本上可以解決百分之八十的Vb程式設計應用。人機介面實際上是人機互動的一部分,它可以將各種資料用圖形化的方法呈現給操作者。雖然有人會認為人機介面還應當包括使用者對介面操作所作出的響應,例如使用者在用滑鼠點選按鈕時按鈕的按下效果等,但這本質上還是屬於可視介面的範疇,而且是提前預定好的,並不是一種真正的互動。

2資料模型。這在應用程式中是至關重要的,因為介面所顯示的內容主要是從資料模型中獲取的,另外使用者通過介面錄入的資料也是要儲存到資料模型中去的。這也是軟體存在目的之一,獲取資料,管理資料和修改資料等。對於資料和資料模型,一般的程式設計師都有著深刻的理解,這裡就不贅述了。不是一度計算機軟體被宣稱等於資料加演算法的嗎?

3使用者命令輸入。人機互動的另一部分,即使用者可以通過人機介面輸入(或者釋放)相應的命令。在目前的人機互動模型中,使用者命令的輸入通常是通過一些控制元件來實現的,例如按鈕,文字框,快捷鍵,選單等。在觸控介面中還包括手勢,在智慧系統中甚至包括語音等。

4業務邏輯。這是軟體的主要功能,也是使用者需求的集中體現。業務邏輯通常是使用者命令激發的,包括對資料進行分析和處理,並獲得新的可供展示的資料的過程。當然也有一些業務邏輯是在後臺執行的。

用圖形的方式來展示這四個部分的功能:

220850_Sc8R_1272624.png

大家都是做軟體開發的,不知道大家有沒有想過,這四個部分其實是可以做到相互之間是獨立的。其實大家都知道有一個著名的MVC模型(Model-View-Control)模型和這個基本上是一樣的。但是MVC我一直以來也沒有搞明白其中的Control是什麼功能,所以我認為我上面提出的四個部分的功能分解是比較好理解的。

Eclipse的框架裡,由於Eclipse是面向人機互動的,所以在框架裡是不包含資料模型這一塊的,業務邏輯這塊也只包括使用者命令處理這一部分,其框架的大部分功能都集中在人互動這塊。用圖形表述一下是這樣的:

220910_hVhp_1272624.png

EclipsePlatform的名詞介紹

接下來介紹一下Eclipse裡的常用到的術語。

介面

首先看一下介面部分。下圖是Eclipse應用程式的介面。

220926_7Rp6_1272624.png

介面最外面的叫做WorkbenchWindow。也是應用程式最頂層的介面模組。一般來說一個應用會有一個WorkbenchWindow,不過根據Eclipse的手冊說明,其實也可以有多個WorkbenchWindow,但是怎麼實現還不清楚,目前接觸的例子都是單視窗的。

WorkbenchWindow包含了主選單(MenuBar),工具條(ToolBar),狀態條(StatusBar)和一個頁面Page。這些都是典型的GUI程式鎖必備的。

頁面Page是應用程式視窗的主介面,也是工作區介面。Page裡包括各種的ViewEditorViewEditor都稱為Part。所以View也稱為ViewPartEditor也稱為EditorPartViewEditor的區別在於:View通常是用來顯示目錄樹,屬性視窗,文件結構圖等類似內容,可以把View看成是資料在某個功能介面上的反映,而且View所做的修改會立刻生效。Editor顧名思義是用來編輯文件的,或者修改文件內容的,Editor所做的修改必需通過專門的儲存命令進行儲存生效。在Editor介面關閉的時候會檢查文件內容是否為“髒”,並提示使用者儲存為“髒”的文件。除此之外,兩者太大的區別。

在程式設計行為上看,editorView最大區別就是:同一類(來自同一個類)的View在介面中只能有一個,而同一類的Editor可以有多個,但是同一個文件只能開啟一個對應的Editor

擴充套件點(ExtensionPoint

Eclipse的外掛開發全靠擴充套件點這個玩意了。擴充套件點顧名思義就是開發者可以對原程式進行功能和介面擴充套件的地方。

我的理解,擴充套件點就是應用程式留下來的插座,擴充套件程式通過使用擴充套件點,可以把自己編寫的程式碼接入到原有程式中。但是不同的擴充套件點,可以接入的東西是不一樣的,需要程式設計師仔細體會。從Java程式開發的角度來看,只要寫的類使用了約定的介面,就可以被平臺類載入和呼叫。從這個意義上來講,擴充套件點接入的實際上不是程式碼,而是對接入程式碼的描述。通過擴充套件點接入的宣告,可以告訴Eclipse平臺,使用什麼功能的時候呼叫什麼類,新的外掛提供了哪些功能,或者擴充套件了原有的哪些功能等。從這個意義上將,擴充套件點本質上是配置資訊。

RCP中的擴充套件點非常多,而且RCP甚至還允許開發者建立新的擴充套件點!所以,這裡我們只給大家介紹一下RCP中的基本的擴充套件點。

需要說明的是,RCP中強調的是儘量的少寫程式碼。特別是介面這塊,因此,大部分的介面相關的東西都是可以通過擴充套件點實現的。當然有很多功能用程式碼也可以實現,但是簡單的用XML配置檔案就可以實現一個介面豈不是更好嗎?

擴充套件點使用方法

org.eclipse.ui.views

這個擴充套件點定義了系統當中的所有的View

<extension

point="org.eclipse.ui.editors">

<editor

class="org.eclipse.ui.examples.contributions.editor.InfoEditor"

icon="icons/editor.gif"

id="org.eclipse.ui.examples.contributions.editor"

name="%contributions.editor.name">

</editor>

</extension>

Category主要用於分類引數配置。Eclipse有自己專門的引數設定介面,屬於同一個Category的類會出現在同一個設定面板中,其他沒有什麼作用。

這裡可以用自己寫的View,也可以用別人已經寫好的Viewclass這個選項的值指向的是具體執行這個檢視的類。這個View的程式碼需要自己寫,必需繼承ViewPart這個虛擬類或者實現IViewPart這個介面。

org.eclipse.ui.editors

這個擴充套件點下面要給出軟體系統中所有的Editor

<extension

point="org.eclipse.ui.editors">

<editor

class="org.eclipse.ui.examples.contributions.editor.InfoEditor"

icon="icons/editor.gif"

id="org.eclipse.ui.examples.contributions.editor"

name="%contributions.editor.name">

</editor>

</extension>

Editor有自己特有的一些屬性,例如extension屬性,可以指定editor能夠開啟的檔案型別等。對於某些不需要編輯器的應用,可以忽略這部分內容,因為大部分的不需要編輯器的應用實際上不需要Editor,只需要View

org.eclipse.ui.commands

這個擴充套件點裡面收集了大量的命令。之前一節講到了命令這個概念,大家千萬不要誤會這裡的命令。這裡的命令指的是使用者可以通過介面產生的命令,但是這裡的命令是沒有實現的。也就是說,你可以在這裡自己定義大量的命令,但可以自己不實現,等待後續有人寫新的擴充套件來實現你制定的命令。當然,絕大多數我們寫的程式不會期望別人來幫我們寫程式碼,自己還是要寫程式碼來實現這裡的命令的,但是我們寫的程式碼不會在這裡有體現,而是體現在後面要講的handler裡。

<extension

point="org.eclipse.ui.commands">

<command

categoryId="org.eclipse.ui.examples.contributions.commands.category"

id="org.eclipse.ui.examples.contributions.view.count"

description="%contributions.view.count.desc"

name="%contributions.view.count.name">

</command>

<category

name="%contributions.commands.category.name"

description="%contributions.commands.category.desc"

id="org.eclipse.ui.examples.contributions.commands.category">

</category>

</extension>

org.eclipse.ui.menus

這個擴充套件點對於咱們程式設計序的人來說太重要了。前面我們剛看到了command,會疑惑說,command實際上就是一個花架子,其實什麼都不做,這樣子弄個command什麼用處呢?用處太大了。Command好比定義了使用者的一條指令,比方說在View上弄個曲線什麼的。但是這個指令怎麼發出的呢?Command這個擴充套件點並沒有說明,原因就是要留到這裡說。Menus這個擴充套件點裡要定義的,就是使用者的Command如何發出的問題。

一般情況下,使用者的command主要通過人機介面發出,常用到的控制元件為選單,工具條,快捷鍵等。快捷鍵暫且不表,這裡主要定義了選單(各種型別)以及工具條。

<extension

point="org.eclipse.ui.menus">

<menuContribution

locationURI="menu:org.eclipse.ui.examples.contributions.view?after=additions">

<command

commandId="org.eclipse.ui.examples.contributions.view.count"

mnemonic="%contributions.view.count.mnemonic">

</command>

<command

commandId="org.eclipse.ui.examples.contributions.view.edit"

mnemonic="%contributions.view.edit.mnemonic">

</command>

<command

commandId="org.eclipse.ui.file.refresh"

mnemonic="%contributions.view.refresh.mnemonic">

</command>

</menuContribution>

...

一個MenuContribution就定義了一個選單。Command標籤定義了選單對應的命令。通過這些文字,就將選單與命令結合了起來。Command裡的label屬性定義了選單的標籤,自然也可以定義圖示,選單的屬性(push,還是radio),以及tooltip等。

其中一個很重要的屬性是locationURI。它定義了選單在什麼地方顯示。下面幾個例子有所說明:

menu:org.eclipse.ui.main.menu?after=window

在主選單中插入選單

menu:file?after=additions

同上

menu:org.eclipse.ui.views.ContentOutline?after=additions

View上顯示選單(又叫做快捷選單)

toolbar:org.eclipse.ui.views.ContentOutline?after=additions

View上的工具條位置上顯示選單(實際上是工具按鈕)

popup:org.eclipse.ui.examples.propertysheet.outline?after=additions

在某個View上顯示彈出選單(右鍵選單)

可見,通過上述方法,可以定義任意地方上的選單,工具條等。關鍵的一點是,你不需要寫任何程式碼,非常的爽。

org.eclipse.ui.handlers

儘管在介面上放置選單是不需要寫任何程式碼的,但是對命令的處理時必須要寫程式碼的,這個時候就需要handler擴充套件了。

Handler是對命令的實現。可以放在這裡:

<commandcategoryId="org.eclipse.ui.examples.contributions.commands.category"

defaultHandler="org.eclipse.ui.examples.contributions.handlers.GlobalMenuHandler"

id="org.eclipse.ui.examples.contributions.commands.globalCommand"

name="%contributions.commands.globalCommand.name">

</command>

也可以放在這裡:

<handler

class="org.eclipse.ui.examples.contributions.handlers.GlobalMenuHandler"

commandId="org.eclipse.ui.examples.contributions.commands.globalCommand">

</handler>

無非就是將實現類與commandid關聯起來。這個實現類必須要繼承AbstractHandler或者實現IHandler介面。

需要說明的是,一個命令可以有多個Handler,因為每個handler有自己的scope(作用域),一般說來,越具體的UI元件所實現的Handler具有越高的優先順序。不過這個屬於比較高階的話題,感興趣的可以去研究一下Eclipse的幫助文件。(注:此段可能有誤)

RCP程式的開發方法

這裡簡明扼要的介紹一個RCP應用程式的開發方法,類似介紹網上較多,可以去搜索學習。

一般情況下利用嚮導得到的應用程式,程式碼裡包括這麼幾個檔案:

220957_PP4w_1272624.png

Application.java這個檔案裡包括了應用程式的一些資訊,包括啟動介面和關閉介面。如果你需要在開啟介面的時候做一些事情(例如讓使用者輸入驗證密碼等),可以在這個檔案裡進行處理。

ApplicationWorkbenchAdvisor.java這個檔案用來配置平臺的一些資訊。這個裡面一個重要的方法是返回預設的Perspective

ApplicationWorkbenchWindowAdvisor.java這個檔案用來配置視窗的一些屬性的。

ApplicationActionBarAdvisor.java是用來配置工具欄的。

221018_3MZa_1272624.png

最重要的是配置plugin.xml這個檔案。Eclipse提供了各種的輔助工具來編輯這個檔案,裡面最重要的是這個extensions標籤。這個可以用右鍵新增各種item。最重要的是用來編輯menusviewscommandshandlers。其屬性在前面已經介紹過了,如果有不明白的可以查閱幫助。


轉載於:https://my.oschina.net/drjones/blog/280337