2010年1月28日 星期四

Eclipse RCP (Rich Client Platform) Life Cycle

Eclipse RCP (Rich Client Platform) life cycle
我們可以從What is the Eclipse RCP (Rich Client Platform)?明白application class會來實做(implements)具bootstrap功能的介面(interface) IApplication。 指定應用程式的執行進入點。而RCP就是實作IApplication的開發平台,因為我們可以在只被平台呼叫的而不可以直接程叫的start function 中(圖一),了解RCP application說穿了就是一個一直在workbench中執行的事件。
生命週期:(圖一)
1. 建立display (SWT):圖形系統的實作,負責接收事件傳給RCP的listen來完成事件處理。
2. 建立workbench advisor:控制workbench 的生命週期,異常處理,傳遞重要參數給Workbench。
3. 執行workbench:一個RCP應用程式,只能有一個Workbench
4. 回覆中斷碼
5. 結束display

(圖一) start function

Workbench是Eclipse 最上層的user interface,所以一個RCP應用程式,只能有一個Workbench,用由管理workbench windows, dialogs, wizards, 和其他的workbench-related windows。而PlatformUI是一個核心的class,它利用Workbench class來Create display (createDisplay)及create work bench advisor(ApplicationWorkbenchAdvisor),存取Eclipse platform user interface(createAndRunWorkbench); (1)Workbench.createAndRunWorkbench(Display display, WorkbenchAdvisor advisor)建創一個workbench且結合display 和workbench advisor(new Workbench(display, advisor)), 再執行workbench UI ((2)workbench.runUI())進行開啟應用程式的主視窗,等待且處理按鍵,滑鼠等視窗事件,直到主視窗關閉,是屬於一個持繼處理event 的loop。
而workbench.runUI()會先初始化Workbench包括JFace, window manager, service order, default services, activity support, fonts, colors, applicationColorss等等所有的初始化,接下來會先對workbench做充分的初始化,才會turn on advisor ( 2-1)WorkbenchAdvisor.initialize -> (2-2)WorkbenchAdvisor.preStartup(只有在第一個workbench window被open或被restore 之前被執行特別的code,一般是不會被override實作的,除了特別需求) -> (2-3) WorkbenchAdvisor.openWindows(流程是先讀取以前設定的workbench狀態(IWorkbenchConfigurer.restoreWorkbenchState)會參考workbench.xml檔,當讀取失敗了才會執行IWorkbenchConfigurer.openFirstTimeWindow來取得不是儲存的值而是初始化的workbench值, 不管是否讀取成功最後才開啟一個特別的perspective pag和一個新建的workbench window (2-3-1) WorkbenchWindow.WorkbenchWindow以及初始化的(2-3-1-3)shell style和(2-3-1-4)action bars(WorkbenchWindow.fillActionBars)
(新建的workbench window (2-3-1) WorkbenchWindow.WorkbenchWindow的流程:為新的workbench window初始化command-based服務, addMenuBar, addCoolBar, addStatusLine 等基本地設定以及一些更多的設定於(2-3-1-1)WorkbenchWindowAdvisor.preWindowOpen(在window被open之前被執行特別的code,一般是不會被override實作的,除了特別需求 -> (2-3-1-2) WorkbenchWindowAdvisor. createWorkbenchWindowAdvisor(新建立Work bench Window Advisor用於控管實體視窗的樣式及生命週期和事件(new ApplicationWorkbenchWindowAdvisor)))
(2-3-2) ApplicationWorkbenchWindowAdvisor.createWindowContents(Shell shell) 用來建立window的內量物,預設值有a menu bar, a cool bar, a status line, a perspective bar, and a fast view bar.
(2-3-3) WorkbenchWindowAdvisor.postWindowRestore(在window被restore之後還沒運作之前被執行特別的code,一般是不會被override實作的,除了特別需求)
(2-3-4)Workbench.openWindowsAfterRestore 在workbench開啟windows
(2-3-4-1)WorkbenchWindowAdvisor.postWindowCreate(在window被restore及create之後還沒運作之前被執行特別的code,一般是不會被override實作的,除了特別需求)
(2-3-4-2) WorkbenchWindowAdvisor.openIntro() 在第一次打開時要看到的內容,之後不要,則可以在這裡設計,因為這方法的IWorkbenchPreferences.SHOW_INTRO預計是true, 第一次打開視窗後,這值會設成false,只有在WorkbenchConfigurer.getSaveAndRestore() 方法返回True,以及關閉視窗後這值才會被更改為true,否則不會被執行設計在第一次打開的時候執行的code。
(2-3-4-3).ApplicationWindow.open開啟main window, ps:最高層級的應用程式視窗的主視窗是嵌入一個非必要的標準menus, 一個非必要的toolbar , 一個非必要的status line。
(2-3-4-4)Workbench.fireWindowOpened開啟listening 去監聽window lifecycle events(ex: part lifecycle events)
(2-3-4-5)WorkbenchWindowAdvisor.postWindowOpen(在window被開啟之後被執行特別的code)

(loop)WorkbenchAdvisor.eventLoopIdle(Display display)


參考:
http://wiki.eclipse.org/images/d/d9/EclipseCon_RCP_Tutorial_2006.pdf
http://www.eclipsecon.org/2005/presentations/EclipseCon2005_Tutorial26.pdf
http://chenying.blog.51cto.com/614874/123516
http://internet.hk/doc-view-24799.html

沒有留言:

張貼留言