Eclipse开发:了解RCP应用的实现

通过PDE的向导,用户能很容易地创建RCP 的应用,但如果要在此基础上继续扩展,则要了解RCP的组成及各部分的功能。
7Q#|8Mz:yO V3@0
ITPUB个人空间8G hC%TH4E0U$V s?5y*c
Plugin.xml描述ITPUB个人空间B%/,D]ef)W%D
ITPUB个人空间&HO'`{J Nf0zzI(K9v
RCP程序是基于插件架构的,所以开发RCP程序首先是开发Eclipse 插件,把用户开发的插件集成到Eclipse的内核中,共同组成RCP应用,RCP程序也是通过Plugin.xml文件描述插件的。在上一节的mail示例中,Plugin.xml文件描述了实现扩展点的几个部分,介绍如下。
hf ]0Y1E7r!D0
Q#IK~#]%s0 (1)视图:mail应用定义了两个视图,一个为Message视图,另一个为Mailboxes视图,如以下代码所示。ITPUB个人空间A W _G:M7]$oK
   <extension
T6Zz#_u,J(z_0          point="org.eclipse.ui.views">
.D#`v`�MZPzC;w(w0       <viewITPUB个人空间gYo�_X/E
            name="Message"ITPUB个人空间AG I!`;U5r7tQ
            allowMultiple="true"ITPUB个人空间`8F#H;Br*J}(j
            icon="icons/sample2.gif"ITPUB个人空间Gw6/1oK Ik ~
            class="com.free.rcp.mail.View"ITPUB个人空间u�z.^Q MMjQ?
            id="com.free.rcp.mail.view">
Q)G E0VI0       </view>
1t@#@1c#A U5GC)S0       <view
6~(ru ok�NG3y4`0             name="Mailboxes"
*lDt bpv:Qy0U0             allowMultiple="true"ITPUB个人空间^6z#Q0Xayl�T
            icon="icons/sample3.gif"
b*a7@{Dh0             class="com.free.rcp.mail.NavigationView"ITPUB个人空间Oe r(Jm5h6s
            id="com.free.rcp.mail.navigationView">ITPUB个人空间w{ fY4Np2I7aa
      </view>ITPUB个人空间qhsX.?'d6iO
   </extension>ITPUB个人空间h+Wu1/'mD5_

4l(fQe*Z7Y_Ye]0 (2)默认透视图:在mail应用中,透视图只包含了应用中定义的视图,其定义如以下代码所示。
muM*l7F9h~+e0
)khG,OR,DJ;yV0    <extensionITPUB个人空间|M'z fI%Y
         point="org.eclipse.ui.perspectives">
MEt(Byq*B(w0       <perspectiveITPUB个人空间%w`P7x|yN-c_;P
            name="Mail Perspective"
]iLw%O�RS6~d0             class="com.free.rcp.mail.Perspective"ITPUB个人空间SR3T?:/{@$`9F.@
            id="com.free.rcp.mail.perspective">ITPUB个人空间$xAw8g)Y'rB%?:T'x
      </perspective>ITPUB个人空间0s�p@V�V
   </extension>
7[~M@1M�IH l2c!l0 ITPUB个人空间)n/n#t)Zs8q*?
(3)应用:RCP应用中都要实现自己的应用,如以下代码所示。ITPUB个人空间 _DA3_'Ys K

R E2ycL1|0    <extension
K&S W;k A1F(@|�c q/r6k0          id="application"
9}ap:BO0          point="org.eclipse.core.runtime.applications">
A"p4Htc,z:X?8?/b0       <application>ITPUB个人空间sw0A_^Kq
         <run
9DpXF*p L h0                class="com.free.rcp.mail.Application">
IP`#Gc5}N[0          </run>
9W)H7Pq@2f0       </application>
RvT^M0    </extension>ITPUB个人空间o*I/w i4f F]3{;q

y,~~f:mo}0 (4)产品:可以通过产品来发布用户定义的应用,如以下代码所示。
foC OD0 ITPUB个人空间1d9vSjF
 <extension
{s%u ^5^x0          id="product"ITPUB个人空间arb)J3Bxr.l
         point="org.eclipse.core.runtime.products">ITPUB个人空间1N /2z$SN@Y4]?U
      <product
aF }�^SV(E5h0             application="com.free.rcp.mail.application"
5P j%s au/}B0             name="RCP Product">
y[*b7B T/./�vG$T0          <property
hw"q7N!h D se]tz0                name="aboutText"ITPUB个人空间(/ {"^Z @ bt"j*W
               value="%aboutText">ITPUB个人空间$f,|n+F Ti
         </property>
|l3z9R4b*Q+y9z0          <propertyITPUB个人空间7|IjF/DL1ia
               name="windowImages"
o#d _0bv"Y'TF3M0                value="icons/sample2.gif">
"Y p5F@;Tc8ap])d0          </property>
)m ^;/4}QK,L0          <property
^"II.q|0                name="aboutImage"ITPUB个人空间.ot(U/'|wt
               value="product_lg.gif">
v#B0}wMF LD3@g�M0          </property>
T(q,d D(`zlY0       </product>ITPUB个人空间$O [1? Hc js
  </extension>ITPUB个人空间dL8p2vg_t`1{$K

qk5] `6E |%jwW0 mail示例是一个比较完整的RCP应用,用户可以看到,mail实现了自己的视图、视角和产品的扩展点,组织应用的布局和相关的实现。下面将介绍RCP应用中所实现的功能。ITPUB个人空间 WU_[+d%_xzY!W`
ITPUB个人空间4{ XKvc*k
RCP应用的入口Application
#@1Od/M{y3ib0
8I4~+m2o!F:m0 Eclipse 的运行时组件通过“org.eclipse.core.runtime.applications”扩展点找到RCP应用的入口,执行应用。应用扩展点要 实现IPlatformRunnable接口,Eclipse会执行应用实现类的run方法,代码如例程1所示。
)a#`.r&~4ut;d^{%_bt0 ITPUB个人空间 `4guT s1}*F
例程1  Application.java
h/_M([�c7YR t2W0 package com.free.rcp.mail;

import org.eclipse.core.runtime.IPlatformRunnable;
H;E)UV:l k4dV&d2wF0 import org.eclipse.swt.widgets.Display;ITPUB个人空间�f&QxF"~ U|!E)D
import org.eclipse.ui.PlatformUI;

public class Application implements IPlatformRunnable {

 public Object run(Object args) throws Exception {
.@B KT!K6W0   //得到displayITPUB个人空间8mT.j&H5Yhf4gL^M
  Display display = PlatformUI.createDisplay();ITPUB个人空间@8P3q/O3?
  try {ITPUB个人空间hXO!g6tu
   //创建工作台
zs-G3k1O0    int returnCode = PlatformUI.createAndRunWorkbench(display,ITPUB个人空间`e!Fw,h$X_?.c
    new ApplicationWorkbenchAdvisor());
M S,tX|O0    if (returnCode == PlatformUI.RETURN_RESTART) {ITPUB个人空间:mR2NS0O1r%[0X
    return IPlatformRunnable.EXIT_RESTART;ITPUB个人空间K~/YA6_
   }ITPUB个人空间V `K k8~,K}$I
   return IPlatformRunnable.EXIT_OK;ITPUB个人空间myC G*D
  } finally {ITPUB个人空间 Ls#n;i f"h4v
   display.dispose();
4K b;]^ |0   }ITPUB个人空间g[-`yL!pA^6u
 }ITPUB个人空间9RUn5C7Y GyRZ x&z
}
_p$Z"X[0 Application类实现了IPlatformRunnable接口,Eclipse内核会执行run方法运行应用。在run方法中,通过PlatformUI类的createAndRunWorkbench方法创建了应用的工作台。
8v&wlb-k:Y-i0
N bO`"FDh+B0 工作台ApplicationWorkbenchAdvisor
B!Xv0zC//6`0 ITPUB个人空间 m/r)u7zzm.yo
Application通过PlatformUI的createAndRunWorkbench创建应用的工作台,其中第二个参数为WorkbenchAdvisor,表示工作台的配置等。例如可以获得应用的视角,代码如例程2所示。
I)GF }? @a2CA0 ITPUB个人空间Gh0S7S~;S0k*T
例程2  ApplicationWorkbenchAdvisor.javaITPUB个人空间Oz9x9oo s0D
package com.free.rcp.mail;

import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
~&Frv oJ�N0 import org.eclipse.ui.application.WorkbenchAdvisor;ITPUB个人空间w*HY7~!HH;Bfd
import org.eclipse.ui.application.WorkbenchWindowAdvisor;

public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor {
&V8G$B�P(Q3J(m"X0  
2Uzrd/y(H T Q0  //视角ID
./(GJ9O�|)K-BbFg0  private static final String PERSPECTIVE_ID = "com.free.rcp.mail.perspective";

 //创建工作台窗口ITPUB个人空间~"|:q'~A'tn.}P
    public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(ITPUB个人空间T*a"BM.d)N
      IWorkbenchWindowConfigurer configurer) {
b6Ao$M LU0         return new ApplicationWorkbenchWindowAdvisor(configurer);ITPUB个人空间:V].a ]9?Y#M
    }

    //获得当前工作台的视角ITPUB个人空间#P/+Q z3V3{
 public String getInitialWindowPerspectiveId() {
0gj:PbUi+kb0   return PERSPECTIVE_ID;
8Zgpj9c(?q0  }  ITPUB个人空间1jt.L(iE/KB R-m
}ITPUB个人空间4PJ{h3^W2j
如以上代码所示,通过ApplicationWorkbenchAdvisor类的getInitialWindowPerspectiveId可以获得当前工作台的视角,通过createWorkbenchWindowAdvisor方法能创建当前工作台的窗口。ITPUB个人空间1K r;{ k(f
ITPUB个人空间Z,ADg tQT
另外,用户可以通过实现WorkbenchAdvisor类,以及重写WorkbenchAdvisor的方法,控制工作台的生命周期中每个切入点的执行方法,主要有如下的方法。
e^7Sh[�Y z0
2s)Bn&l Nh0 (1)工作台生命周期相关方法ITPUB个人空间F ]'I$fiBGt9u

!U%_T-LL4C0 WorkbenchAdvisor类有几个方法和工作台的生命周期有关,用户能通过重写这几个方法,在工作台生命周期的某个特定点执行自己的代码,如表1所示。

1 工作台生命周期相关方法

方 法

描 述

参 数

initialize

工作台初始化

IWorkbenchConfigurer

preStartup

initialize 之后,工作台窗口被打开之前执行

postStartup

在所有的工作台窗口被打开之后执行

preShutdown

工作台被停止之前(窗口被关闭之前)执行

postShutdown

工作台被停止之后(窗口被关闭之后)执行

2 )消息循环相关方法

消息循环负责处理用户的输入,然后把输入分配到相关的监听器进行处理,WorkbenchAdvisor 中提供了一些钩子方法,处理消息循环的某些问题,如表2 所示。

2 消息循环相关方法

方 法

描 述

参 数

eventLoopException

当消息循环中有未处理的异常时执行

Throwable

eventLoopIdle

当消息队列中无处理的消息时执行

Display

(3)配置相关方法ITPUB个人空间&H V8ZP3hw+H5O
WorkbenchAdvisor中能通过重写一些方法,实现工作台的配置,其中最常用的是getInitialWindowPerspectiveId方法,返回视角的ID。

工作台窗口ApplicationWorkbenchWindowAdvisor
b7Nm1h'NgP0 ITPUB个人空间G @PZu1AC
ApplicationWorkbenchAdvisor 类通过createWorkbenchWindowAdvisor方法能创建工作台窗口。通过实现WorkbenchWindowAdvisor类,用户 能定制工作台窗口的大小、状态栏、工具栏等信息,代码如例程3所示。

例程3 ApplicationWorkbenchWindowAdvisor.java

package com.free.rcp.mail;

ITPUB个人空间 pu9@"J*A8/W Y
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;


/?exa({#lDx0 public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {

 

ITPUB个人空间+G#y,Lp&c!c@^
public ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {

super(configurer);

}

ITPUB个人空间.|ce3m;X(N;{&F0r`
//创建Action Bar

public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer) {

return new ApplicationActionBarAdvisor(configurer);

}


LQtSxRWM;Zz0 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
7r"f6Q0mf5JX'N0 package com.free.rcp.mail;

/**ITPUB个人空间!a1G4z7cA0]YJU%z
 * 为了节省篇幅,所有的import类已经被注释ITPUB个人空间;NM D+CuwQa
 * 读者可以通过ctrl+shift+o快捷键,自动引入所依赖的类ITPUB个人空间 x1OE,/'IG3P6e
 * 如果有问题可发邮件到ganshm@gmail.com
g jxj1eV0  * */
B&D:x#p6x6}wg0 public class ApplicationActionBarAdvisor extends ActionBarAdvisor {

    private IWorkbenchAction exitAction;ITPUB个人空间)rI9s5q-m)~
    private IWorkbenchAction aboutAction;
v$N-KA*RE0     private IWorkbenchAction newWindowAction;
e6Vs-J1v#B8h2H0     private OpenViewAction openViewAction;ITPUB个人空间/gyG!E-T
    private Action messagePopupAction;
0N9F)T'vo0    

    public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {ITPUB个人空间4{*|uG"x4i W*Z
        super(configurer);ITPUB个人空间2p*a-Z^'I
    }
4^5i;{"|0by-Q/gZ0    
? Q Vr9q![D.L0     protected void makeActions(final IWorkbenchWindow window) {
LJ/Lse9s0    ITPUB个人空间.w CL h,b,|;s|%qd
        //创建相应的ActionITPUB个人空间6j_-AG+K
        exitAction = ActionFactory.QUIT.create(window);ITPUB个人空间w `1dS#?#x9x?~#|
        register(exitAction);
g0Kx�P? a0        ITPUB个人空间�o#Y ^CM Yg
        aboutAction = ActionFactory.ABOUT.create(window);ITPUB个人空间{G@,u.u|(?5U
        register(aboutAction);ITPUB个人空间/!VRl;G+r1V v#@
       ITPUB个人空间j:p-aC"`X,V{
        newWindowAction = ActionFactory.OPEN_NEW_WINDOW.create(window);ITPUB个人空间`$vQ|S8BA{5V
        register(newWindowAction);ITPUB个人空间2x7C3f0s7Jd2Ge
       
6r~9TN4e1[0         penViewAction = new OpenViewAction(window, "Open Another Message View", View.ID);ITPUB个人空间 t5f!|'j`;D$A Z
        register(openViewAction);ITPUB个人空间 |B{jq5i ik bR
       
/YJ1j,y z0         messagePopupAction = new MessagePopupAction("Open Message", window);ITPUB个人空间/l8u_n]2V
        register(messagePopupAction);ITPUB个人空间M[h/s y.m
    }
6G-{ {C` p3R0    
}a"UQi+F-w5X0     protected void fillMenuBar(IMenuManager menuBar) {ITPUB个人空间$kC#b/Px'@
     //添加文件和帮助菜单
.^ UvAXV0         MenuManager fileMenu = new MenuManager("&File",ITPUB个人空间`pC"U(xx,c
          IWorkbenchActionConstants.M_FILE);
a4Jui;m3zBD5{)F0         MenuManager helpMenu = new MenuManager("&Help",ITPUB个人空间3~ pL7gb
          IWorkbenchActionConstants.M_HELP);
9} }}'R//K!n[0        ITPUB个人空间$m,Yq{#H4d J
        menuBar.add(fileMenu);ITPUB个人空间G7S{6M8l#o5v*S8m,?
        // Add a group marker indicating where action set menus will appear.ITPUB个人空间c~ H,A8rns6mH6Qn
        menuBar.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
c&|#liL/G0         menuBar.add(helpMenu);ITPUB个人空间!T+r a4h,W!V.kA9F
       ITPUB个人空间dL?8v r:n$UY {
        //添加文件菜单的ActionITPUB个人空间r,MUw&Y$y
        fileMenu.add(newWindowAction);
/o_c{x,/0         fileMenu.add(new Separator());
ZY k"Eg l U0         fileMenu.add(messagePopupAction);
r$w4Lj n0         fileMenu.add(openViewAction);
g'p~@#X%AEA0         fileMenu.add(new Separator());ITPUB个人空间/ggF b7X Z z$e
        fileMenu.add(exitAction);ITPUB个人空间7j/Tz`D7l�gl r
       
/f5o$Mir.V0         //添加帮助菜单的ActionITPUB个人空间6PR?p["b7K�~}
        helpMenu.add(aboutAction);
J(X[~2L-cW9L0     }
,WUhW` et(z W�^!N a$[0    
|URLo&A+l*S(c Vx0     protected void fillCoolBar(ICoolBarManager coolBar) {
H!X&u3j S ^*Z Z0      //添加CoolBar
;v VfT,[6whV.Z0         IToolBarManager toolbar = new ToolBarManager(SWT.FLAT | SWT.RIGHT);
@w9Xd*Ms2/0         //添加ToolBar到CoolBar中
|cBV~ p0         coolBar.add(new ToolBarContributionItem(toolbar, "main"));  ITPUB个人空间o'f}oZT zTtc
        //添加Action到ToolBar中ITPUB个人空间'F8]-DBv
        toolbar.add(openViewAction);ITPUB个人空间gq fd"X:|N
        toolbar.add(messagePopupAction);ITPUB个人空间0Q&th&vB2Y
    }
%l)d#Twp A;m^0 }ITPUB个人空间!k$q6j"gi
以上程序通过makeActions方法创建了所有的Action,通过fillMenuBar方法添加了文件菜单和帮助菜单,通过fillCoolBar方法添加了CoolBar工具栏项。菜单和工具栏共用相关的Action。ITPUB个人空间Y;[e3aY8x/Hp/
ITPUB个人空间%r/^6Cumat
RCP应用的透视图(perspective)
+IC,YP&NP�~0
ITPUB个人空间de'k&f&lT�u
WorkbenchAdvisor 中getInitialWindowPerspectiveId方法是一个抽象方法,也就是说要通过WorkbenchAdvisor创建工作台,用户必 须实现自己的透视图(也可以是Eclipse中现有的视角)。工作台会通过getInitialWindowPerspectiveId方法得到透视图扩 展点的ID,并用此透视图对视图布局。本例中透视图的实现代码如例程5所示。
Q&Sp�y,x+h0 ITPUB个人空间v3y|u?e.i&uHy#A,H
例程5  Perspective.javaITPUB个人空间:C4c P BFsD
package com.free.rcp.mail;

import org.eclipse.ui.IFolderLayout;
@1n3S8o4v$o0 import org.eclipse.ui.IPageLayout;ITPUB个人空间%zTO s{'Q$u,W%rmxO
import org.eclipse.ui.IPerspectiveFactory;

public class Perspective implements IPerspectiveFactory {

 public void createInitialLayout(IPageLayout layout) {
CT`!f x'B$`q0   String editorArea = layout.getEditorArea();ITPUB个人空间MGI!J /3N;Z&E
  //设置编辑区域不可见
+_wn0W2Vy-K#D$i4Eke0   layout.setEditorAreaVisible(false);ITPUB个人空间lZ[Wf m
  
2k'na Z/ @0   //添加视图
*ReBK `*jp#^.X0   layout.addStandaloneView(NavigationView.ID, ITPUB个人空间 U.]!y0s*O�h
    false, IPageLayout.LEFT, 0.25f, editorArea);ITPUB个人空间 ^ pDw;cwS]9K}
  //添加Folder,并在Folder中添加视图
"?a9nV0I)tAY0   IFolderLayout folder = layout.createFolder("messages",
{/r|gu0m!p-z0     IPageLayout.TOP, 0.5f, editorArea);
2i-Lp�Td,Z,^0m0   folder.addPlaceholder(View.ID + ":*");
!cR#Jx4?k)u0   folder.addView(View.ID);
8G#{^ tt8q6f@I0   ITPUB个人空间b]+Ba:N9v/yog@
  //设置NavigationView视图不可关闭
sD!Q J#{:zC2a.C/c0   layout.getViewLayout(NavigationView.ID).setCloseable(false);ITPUB个人空间/F0t%A-Z[TFu
 }
_r`uU9Sp.t0 }
jcT|)m E)Rz0
`n-|;P;xjj _YY0 在Perspective视角中设置了编辑区域不可见,并添加了两个视图,其中messages视图放在一个Folder中,在此Folder中还能添加其他的视图,最后通过setCloseable方法设置NavigationView视图是不可关闭的。ITPUB个人空间T&@ g�q?c5AAQ

#S-|0Y+z3/+? sg0 在此,视图和其他扩展点的实现就不介绍了,读者可以参考源代码了解mail应用的实现。
![-Z�B(g~-T4x1t3m0 ITPUB个人空间 B&v(OD(C_
RCP是Eclipse 3.0以后发展起来的,目的在于以Eclipse平台为框架,开发出基于Java 的独立运行的应用。可以断言,随着Eclipse开发的不断深入和广为用户接受,RCP程序将会在Java的桌面应用中占据一席之地。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值