程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 將Eclipse插件轉換為RCP應用程序(上)

將Eclipse插件轉換為RCP應用程序(上)

編輯:關於JAVA

有不少朋友問到如何把一個已有的Eclipse插件轉換為RCP應用程序,其實這個 過程並不復雜,因為RCP應用也是基於插件的結構,可以說RCP 就是精簡後的 Eclipse平台,只是我們要對這個平台做一些定制工作。將任何一個傳統的 Eclipse插件項目轉換到RCP可以分為兩個步驟,這篇先介紹第一個步驟:建立應 用程序。

在GEF入門系列(三、應用實例)裡我曾做過一個精簡的GEF應用程序(下載) ,這一篇裡我就一步一步的把這個例子轉換為RCP應用程序(點擊下載轉換後的項 目打包)。應用程序(Application)是通過擴展 org.eclipse.core.runtime.applications擴展點建立的,其作用是讓Eclipse知 道你的RCP需要什麼樣的功能,比如界面上有哪些視圖,菜單和工具條,應用程序 窗口的初始大小等等。在plugin.xml裡添加應用程序的定義很簡單,像下面這樣 指定一個id和一個類名就可以了。

<extension
id="myapplication"
point="org.eclipse.core.runtime.applications">
<application>
<run class="com.example.application.MyApplication"/>
</application>
</extension>

接下來我們的主要任務是實現這個類,MyApplication必須實現 org.eclipse.core.runtime.IPlatformRunnable接口,這個接口只定義了一個 run()方法,對於Eclipse Platform來說這個方法就相當於傳統java程序的main() 方法,是入口方法。所有RCP應用程序裡這個方法的實現幾乎是完全一樣的,即啟 動 Workbench,並把一個WorkbenchAdvisor實例作為參數傳給它,如下所示:

public class MyApplication implements IPlatformRunnable {
public Object run(Object args) throws Exception {
Display display = PlatformUI.createDisplay();
try {
int returnCode = PlatformUI.createAndRunWorkbench(display, new MyWorkbenchAdvisor());
if (returnCode == PlatformUI.RETURN_RESTART) {
return IPlatformRunnable.EXIT_RESTART;
}
return IPlatformRunnable.EXIT_OK;
} finally {
display.dispose();
}
}
}

所以應用程序的定制實際上是通過這個WorkbenchAdvisor實例實現的。現在我 們要構造 org.eclipse.ui.application.WorkbenchAdvisor類的一個子類,也就 是上面代碼裡出現的 MyWorkbenchAdvisor,然後覆蓋它的一些方法。比較重要的 是這兩個方法:createWorkbenchWindowAdvisor() 返回一個 WorkbenchWindowAdvisor實例,從類名不難看出它的作用是定制應用程序窗口, 包括菜單和工具條,稍後將詳細介紹; getInitialWindowPerspectiveId()返回 一個透視圖的id字符串,這個透視圖定義RCP應用程序的界面布局,所以如果在原 來的插件裡你沒有定義透視圖,現在必須要新定義一個了。

public class MyWorkbenchAdvisor extends WorkbenchAdvisor {
private static final String PERSPECTIVE_ID = "com.example.ui.MyPerspective";
public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(
IWorkbenchWindowConfigurer configurer) {
return new MyWorkbenchWindowAdvisor(configurer);
}
public String getInitialWindowPerspectiveId() {
return PERSPECTIVE_ID;
}
public void initialize(IWorkbenchConfigurer configurer) {
super.initialize(configurer);
//The workaround call
WorkbenchAdapterBuilder.registerAdapters();
}
}

注意:因為我們這個RCP裡用到了Resource視圖,而這個視圖依賴 org.eclipse.ui.ide,所以要在上面的 initialize()方法裡手動注冊一下 Adapter,否則Resource視圖裡無法顯示現有項目。(Resource視圖在RCP裡不推 薦使用,這個調用是無奈之舉,請參考這條bug報告)

現在來看一下前面代碼裡MyWorkbenchWindowAdvisor是怎樣實現的,它繼承自 org.eclipse.ui.application.WorkbenchWindowAdvisor類,為了定義窗口大小和 標題要覆蓋 preWindowOpen()方法,可以看到我們還順便隱藏了工具條;要定義 窗口的菜單和工具條,應該覆蓋 createActionBarAdvisor()方法,返回的 ActionBarAdvisor實例馬上會介紹到。

public class MyWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {
public MyWorkbenchWindowAdvisor (IWorkbenchWindowConfigurer configurer) {
super (configurer);
}
public ActionBarAdvisor createActionBarAdvisor(
IActionBarConfigurer configurer) {
return new MyActionBarAdvisor(configurer);
}
public void preWindowOpen() {
IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
configurer.setInitialSize(new Point(700, 500));
configurer.setShowCoolBar(false);
configurer.setShowStatusLine(false);
configurer.setTitle ("My RCP Application");
}
}

有沒有注意到,我們新建(和即將新建)的幾個類有這樣的引用關系: MyApplication->MyWorkbenchAdvisor- >MyWorkbenchWindowAdvisor- >MyActionbarAdvisor,在3.1M5以前的Eclipse RCP版本中,還沒有 ActionbarAdvisor這個類,大部分應用程序定制工作都是在 WorkbenchWindowAdvisor這一個類中做的,帶來的問題是這個類的代碼很長,可 復用的程度比較低;采用現在這種方式就方便多了,比如可以定義幾個 ActionbarAdvisor然後在 WorkbenchWindowAdvisor中根據需要做出選擇,得到的 應用程序就具有不同的功能,等等。

現在就來看看MyActionbarAdvisor是怎麼實現的,它繼承 org.eclipse.ui.application.ActionBarAdvisor類,我們先在makeActions()裡 構造需要出現在菜單或工具條上的命令,注意要調用register()方法注冊這些命 令,作用是在應用程序結束後釋放資源,同時支持快捷鍵操作;然後在 fillMenuBar()方法裡把這些命令加入主菜單,因為我們隱藏了工具條,所以沒有 覆蓋fillCoolBar()方法,另外你還可以通過覆蓋 fillStatusLine()定義自己的 狀態欄。我們的這個類實現得很簡單,只是一個退出程序菜單項,你應該根據需 要添加自己的命令。

public class MyActionBarAdvisor extends ActionBarAdvisor {
private IWorkbenchAction exitAction;
public MyActionBarAdvisor (IActionBarConfigurer configurer) {
super(configurer);
}
protected void makeActions(final IWorkbenchWindow window) {
exitAction = ActionFactory.QUIT.create(window);
register(exitAction);
}
protected void fillMenuBar (IMenuManager menuBar) {
MenuManager fileMenu = new MenuManager("&File",
IWorkbenchActionConstants.M_FILE);
menuBar.add (fileMenu);
fileMenu.add(exitAction);
}
}

現在,應用程序需要的類都寫好了,讓我們檢查一下應用程序是否可以正常啟 動。在Eclipse主菜單上選擇Run->Debug...命令,在對話框左邊的“Eclipse Application”組下新建一個運行項“gefpractice-rcp”,在“Program to Run ”組下選擇“Run an application”,然後在下拉列表裡找到我們的應用程序id ,要說明的是在applications擴展點裡我們指定的id是 “myapplication”,而 這裡列出的id則添加了插件id作為前綴,變成了“GefPractice- RCP.myapplication”,如圖1所示。

因為缺省運行會啟動Eclipse的全部插件,這樣在應用程序裡會出現多余的菜 單項和功能,所以要設置為只啟動我們的這一個插件,方法是切換到 Plug-ins屬 性頁,選擇“Choose plug-ins and fragments to launch from the list”,點 擊右邊的“Deselect All”按鈕清空選擇列表,勾選上我們的插件項目,再按 “Add Required Plug-ins”讓Eclipse自動添加它依賴的其他插件就可以了,如 圖2所示。

現自使用這個運行配置啟動我們的應用程序,會得到一個很“干淨”的界面, 如圖3所示,如果不是那些Eclipse特有的編輯器/視圖的標題欄,你能猜出它是一 個Eclipse應用程序嗎?作為對比,這是Eclipse插件的版本的運行截圖。

建立了應用程序,代碼的部分就算是完成了,但要得到一個完整的可獨立運行 的產品這樣還不夠,下一個帖子裡將介紹另一個步驟:將應用程序包裝為產品。 如果等不及可以先看Branding Your Application這篇文章,只是這篇文章寫得比 較早,我下個部分要寫的是使用.product配置產品,可以更方便的達到相同的目 的。關於建立應用程序的更多內容請參考Rich Client Tutorial,這個教程共有 三個部分,我當時就是通過它學習的,後來它按照RCP API的發展又及時更新了內 容,是難得的入門材料。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved