Eclipse開發:瞭解RCP應用的實現

阿-甘發表於2008-08-06

通過PDE的嚮導,使用者能很容易地建立RCP的應用,但如果要在此基礎上繼續擴充套件,則要了解RCP的組成及各部分的功能。

Plugin.xml描述

RCP程式是基於外掛架構的,所以開發RCP程式首先是開發Eclipse外掛,把使用者開發的外掛整合到Eclipse的核心中,共同組成RCP應用,RCP程式也是通過Plugin.xml檔案描述外掛的。在上一節的mail示例中,Plugin.xml檔案描述了實現擴充套件點的幾個部分,介紹如下。

(1)檢視:mail應用定義了兩個檢視,一個為Message檢視,另一個為Mailboxes檢視,如以下程式碼所示。
            point="org.eclipse.ui.views">
                  name="Message"
            allowMultiple="true"
            icon="icons/sample2.gif"
            class="com.free.rcp.mail.View"
            id="com.free.rcp.mail.view">
     

                  name="Mailboxes"
            allowMultiple="true"
            icon="icons/sample3.gif"
            class="com.free.rcp.mail.NavigationView"
            id="com.free.rcp.mail.navigationView">
     

  


(2)預設透檢視:在mail應用中,透檢視只包含了應用中定義的檢視,其定義如以下程式碼所示。

            point="org.eclipse.ui.perspectives">
                  name="Mail Perspective"
            class="com.free.rcp.mail.Perspective"
            id="com.free.rcp.mail.perspective">
     

  


(3)應用:RCP應用中都要實現自己的應用,如以下程式碼所示。

            id="application"
         point="org.eclipse.core.runtime.applications">
     
                        class="com.free.rcp.mail.Application">
        

     

  


(4)產品:可以通過產品來發布使用者定義的應用,如以下程式碼所示。

          id="product"
         point="org.eclipse.core.runtime.products">
                  application="com.free.rcp.mail.application"
            name="RCP Product">
                        name="aboutText"
               value="%aboutText">
        

                        name="windowImages"
               value="icons/sample2.gif">
        

                        name="aboutImage"
               value="product_lg.gif">
        

     

 


mail示例是一個比較完整的RCP應用,使用者可以看到,mail實現了自己的檢視、視角和產品的擴充套件點,組織應用的佈局和相關的實現。下面將介紹RCP應用中所實現的功能。

RCP應用的入口Application

Eclipse的執行時元件通過“org.eclipse.core.runtime.applications”擴充套件點找到RCP應用的入口,執行應用。應用擴充套件點要實現IPlatformRunnable介面,Eclipse會執行應用實現類的run方法,程式碼如例程1所示。

例程1  Application.java
package com.free.rcp.mail;

import org.eclipse.core.runtime.IPlatformRunnable;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PlatformUI;

public class Application implements IPlatformRunnable {

 public Object run(Object args) throws Exception {
  //得到display
  Display display = PlatformUI.createDisplay();
  try {
   //建立工作臺
   int returnCode = PlatformUI.createAndRunWorkbench(display,
    new ApplicationWorkbenchAdvisor());
   if (returnCode == PlatformUI.RETURN_RESTART) {
    return IPlatformRunnable.EXIT_RESTART;
   }
   return IPlatformRunnable.EXIT_OK;
  } finally {
   display.dispose();
  }
 }
}
Application類實現了IPlatformRunnable介面,Eclipse核心會執行run方法執行應用。在run方法中,通過PlatformUI類的createAndRunWorkbench方法建立了應用的工作臺。

工作臺ApplicationWorkbenchAdvisor

Application通過PlatformUI的createAndRunWorkbench建立應用的工作臺,其中第二個引數為WorkbenchAdvisor,表示工作臺的配置等。例如可以獲得應用的視角,程式碼如例程2所示。

例程2  ApplicationWorkbenchAdvisor.java
package com.free.rcp.mail;

import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
import org.eclipse.ui.application.WorkbenchAdvisor;
import org.eclipse.ui.application.WorkbenchWindowAdvisor;

public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor {
 
 //視角ID
 private static final String PERSPECTIVE_ID = "com.free.rcp.mail.perspective";

 //建立工作臺視窗
    public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(
      IWorkbenchWindowConfigurer configurer) {
        return new ApplicationWorkbenchWindowAdvisor(configurer);
    }

    //獲得當前工作臺的視角
 public String getInitialWindowPerspectiveId() {
  return PERSPECTIVE_ID;
 }  
}
如以上程式碼所示,通過ApplicationWorkbenchAdvisor類的getInitialWindowPerspectiveId可以獲得當前工作臺的視角,通過createWorkbenchWindowAdvisor方法能建立當前工作臺的視窗。

另外,使用者可以通過實現WorkbenchAdvisor類,以及重寫WorkbenchAdvisor的方法,控制工作臺的生命週期中每個切入點的執行方法,主要有如下的方法。

(1)工作臺生命週期相關方法

WorkbenchAdvisor類有幾個方法和工作臺的生命週期有關,使用者能通過重寫這幾個方法,在工作臺生命週期的某個特定點執行自己的程式碼,如表1所示。

1 工作臺生命週期相關方法

方 法

描 述

參 數

initialize

工作臺初始化

IWorkbenchConfigurer

preStartup

initialize之後,工作臺視窗被開啟之前執行

postStartup

在所有的工作臺視窗被開啟之後執行

preShutdown

工作臺被停止之前(視窗被關閉之前)執行

postShutdown

工作臺被停止之後(視窗被關閉之後)執行

2)訊息迴圈相關方法

訊息迴圈負責處理使用者的輸入,然後把輸入分配到相關的監聽器進行處理,WorkbenchAdvisor中提供了一些鉤子方法,處理訊息迴圈的某些問題,如表2所示。

2 訊息迴圈相關方法

方 法

描 述

參 數

eventLoopException

當訊息迴圈中有未處理的異常時執行

Throwable

eventLoopIdle

當訊息佇列中無處理的訊息時執行

Display

(3)配置相關方法
WorkbenchAdvisor中能通過重寫一些方法,實現工作臺的配置,其中最常用的是getInitialWindowPerspectiveId方法,返回視角的ID。

工作臺視窗ApplicationWorkbenchWindowAdvisor

ApplicationWorkbenchAdvisor類通過createWorkbenchWindowAdvisor方法能建立工作臺視窗。通過實現WorkbenchWindowAdvisor類,使用者能定製工作臺視窗的大小、狀態列、工具欄等資訊,程式碼如例程3所示。

例程3 ApplicationWorkbenchWindowAdvisor.java

package com.free.rcp.mail;


import org.eclipse.swt.graphics.Point;

import org.eclipse.ui.application.ActionBarAdvisor;

import org.eclipse.ui.application.IActionBarConfigurer;

import org.eclipse.ui.application.IWorkbenchWindowConfigurer;

import org.eclipse.ui.application.WorkbenchWindowAdvisor;


public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {

 


public ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {

super(configurer);

}


//建立Action Bar

public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer) {

return new ApplicationActionBarAdvisor(configurer);

}


public void preWindowOpen() {

IWorkbenchWindowConfigurer configurer = getWindowConfigurer();

//設定工作臺視窗的大小

configurer.setInitialSize(new Point(600, 400));

//是否顯示CoolBar

configurer.setShowCoolBar(true);

//是否顯示狀態列

configurer.setShowStatusLine(false);

}

}

使用者也可以通過重寫WorkbenchWindowAdvisor中的方法,控制工作臺視窗生命週期的執行過程。例如,上例的preWindowOpen方法,在視窗開啟直接設定視窗的大小、是否顯示狀態列等屬性,這些方法大多數以“pre”、“post”和“create”開始。

工作臺“Action Bar”ApplicationActionBarAdvisor

Eclipse中,“Action Bar”是選單、工具欄和狀態列的統稱,通過ActionBarAdvisor可以定製RCP應用的“Action Bar”,程式碼如例程4所示。

例程4  ApplicationActionBarAdvisor.java
package com.free.rcp.mail;

/**
 * 為了節省篇幅,所有的import類已經被註釋
 * 讀者可以通過ctrl+shift+o快捷鍵,自動引入所依賴的類
 * 如果有問題可發郵件到ganshm@gmail.com
 * */
public class ApplicationActionBarAdvisor extends ActionBarAdvisor {

    private IWorkbenchAction exitAction;
    private IWorkbenchAction aboutAction;
    private IWorkbenchAction newWindowAction;
    private OpenViewAction openViewAction;
    private Action messagePopupAction;
   

    public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {
        super(configurer);
    }
   
    protected void makeActions(final IWorkbenchWindow window) {
   
        //建立相應的Action
        exitAction = ActionFactory.QUIT.create(window);
        register(exitAction);
       
        aboutAction = ActionFactory.ABOUT.create(window);
        register(aboutAction);
       
        newWindowAction = ActionFactory.OPEN_NEW_WINDOW.create(window);
        register(newWindowAction);
       
        penViewAction = new OpenViewAction(window, "Open Another Message View", View.ID);
        register(openViewAction);
       
        messagePopupAction = new MessagePopupAction("Open Message", window);
        register(messagePopupAction);
    }
   
    protected void fillMenuBar(IMenuManager menuBar) {
     //新增檔案和幫助選單
        MenuManager fileMenu = new MenuManager("&File",
          IWorkbenchActionConstants.M_FILE);
        MenuManager helpMenu = new MenuManager("&Help",
          IWorkbenchActionConstants.M_HELP);
       
        menuBar.add(fileMenu);
        // Add a group marker indicating where action set menus will appear.
        menuBar.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
        menuBar.add(helpMenu);
       
        //新增檔案選單的Action
        fileMenu.add(newWindowAction);
        fileMenu.add(new Separator());
        fileMenu.add(messagePopupAction);
        fileMenu.add(openViewAction);
        fileMenu.add(new Separator());
        fileMenu.add(exitAction);
       
        //新增幫助選單的Action
        helpMenu.add(aboutAction);
    }
   
    protected void fillCoolBar(ICoolBarManager coolBar) {
     //新增CoolBar
        IToolBarManager toolbar = new ToolBarManager(SWT.FLAT | SWT.RIGHT);
        //新增ToolBar到CoolBar中
        coolBar.add(new ToolBarContributionItem(toolbar, "main"));  
        //新增Action到ToolBar中
        toolbar.add(openViewAction);
        toolbar.add(messagePopupAction);
    }
}
以上程式通過makeActions方法建立了所有的Action,通過fillMenuBar方法新增了檔案選單和幫助選單,通過fillCoolBar方法新增了CoolBar工具欄項。選單和工具欄共用相關的Action。

RCP應用的透檢視(perspective)

WorkbenchAdvisor中getInitialWindowPerspectiveId方法是一個抽象方法,也就是說要通過WorkbenchAdvisor建立工作臺,使用者必須實現自己的透檢視(也可以是Eclipse中現有的視角)。工作臺會通過getInitialWindowPerspectiveId方法得到透檢視擴充套件點的ID,並用此透檢視對檢視佈局。本例中透檢視的實現程式碼如例程5所示。

例程5  Perspective.java
package com.free.rcp.mail;

import org.eclipse.ui.IFolderLayout;
import org.eclipse.ui.IPageLayout;
import org.eclipse.ui.IPerspectiveFactory;

public class Perspective implements IPerspectiveFactory {

 public void createInitialLayout(IPageLayout layout) {
  String editorArea = layout.getEditorArea();
  //設定編輯區域不可見
  layout.setEditorAreaVisible(false);
  
  //新增檢視
  layout.addStandaloneView(NavigationView.ID, 
    false, IPageLayout.LEFT, 0.25f, editorArea);
  //新增Folder,並在Folder中新增檢視
  IFolderLayout folder = layout.createFolder("messages",
    IPageLayout.TOP, 0.5f, editorArea);
  folder.addPlaceholder(View.ID + ":*");
  folder.addView(View.ID);
  
  //設定NavigationView檢視不可關閉
  layout.getViewLayout(NavigationView.ID).setCloseable(false);
 }
}

在Perspective視角中設定了編輯區域不可見,並新增了兩個檢視,其中messages檢視放在一個Folder中,在此Folder中還能新增其他的檢視,最後通過setCloseable方法設定NavigationView檢視是不可關閉的。

在此,檢視和其他擴充套件點的實現就不介紹了,讀者可以參考原始碼瞭解mail應用的實現。

RCP是Eclipse 3.0以後發展起來的,目的在於以Eclipse平臺為框架,開發出基於Java的獨立執行的應用。可以斷言,隨著Eclipse開發的不斷深入和廣為使用者接受,RCP程式將會在Java的桌面應用中佔據一席之地。

下載:com.free.rcp.mail.rar

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13081368/viewspace-420451/,如需轉載,請註明出處,否則將追究法律責任。

相關文章