22.3.2 应用程序类Application
创建了插件类后,如何来创建主窗口呢?Eclipse运行的程序都是通过扩展点来配置的,初始化的界面程序也 不例外,也是在配置的插件文件中配置好的。创建了插件类后,程序会自动查找plugin.xml文件,是否有对应的应用程序扩展点 org.eclipse.core. runtime. applications。如果有,再找到该运行程序所对应的class,然后创建对象。本例中为 com.fengmanfei.myrcp.Application,表示为com.fengmanfei.myrcp包下的Application类。 具体这个类的代码如下:
Application.java
package com.fengmanfei.myrcp;
import org.eclipse.core.runtime.IPlatformRunnable;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PlatformUI;
/**
* 该类实现了IPlatformRunnable接口
*/
public class Application implements IPlatformRunnable {
/* (non-Javadoc)
* @see org.eclipse.core.runtime.IPlatformRunnable#run(java.lang.Object)
*/
public Object run(Object args) throws Exception {
Display display = PlatformUI.createDisplay();
try {
int returnCode = PlatformUI.createAndRunWorkbench(display, new Application WorkbenchAdvisor());
if (returnCode == PlatformUI.RETURN_RESTART) {
return IPlatformRunnable.EXIT_RESTART;
}
return IPlatformRunnable.EXIT_OK;
} finally {
display.dispose();
}
}
}
在以上的代码中可以看到,首先创建了 Display对象,然后调用PlatformUI的静态方法createAndRunWorkbench创建了 ApplicationWorkbenchAdvisor对象。Application Workbench Advisor对象表示的是工作台对象,用于创建工作台对象。
该类的代码如下:
ApplicationWorkbenchAdvisor.java
package com.fengmanfei.myrcp;
import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
import org.eclipse.ui.application.WorkbenchAdvisor;
import org.eclipse.ui.application.WorkbenchWindowAdvisor;
//继承自WorkbenchAdvisor类,该类为抽象类
public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor {
//定义默认的透视图id字符串常量
private static final String PERSPECTIVE_ID = "com.fengmanfei.myrcp.perspective";
//覆盖父类的方法
public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IworkbenchWindow
Configurer configurer) {
return new ApplicationWorkbenchWindowAdvisor(configurer);
}
//实现的抽象方法
public String getInitialWindowPerspectiveId() {
return PERSPECTIVE_ID;
}
}
该类继承自WorkbenchAdvisor类。由于RCP程序启动后必须指定一个默认的透视图,所以要实现 getInitialWindowPerspectiveId方法,则该方法返回一个透视图的ID。例如,本例中使用的 是"com.fengmanfei.myrcp.perspective"字符,表示首先在plugin.xml文件中找到id为该字符 的<perspective>元素,然后根据这个id找到对应的class类。本例中对应的透视图类是Perspective。
覆盖父类中的方法createWorkbenchWindowAdvisor中将创建一个工作台的窗口类,这里创建的是ApplicationWorkbenchWindowAdvisor对象。
到目前为止,以上所讲的这些类基本上不需要再改动,一个RCP程序总是按照这几个类所定义的模式创建。
22.3.3 工作台窗口类
下面看一下工作台的窗口类,通过工作台对象创建了工作台窗口对象Application WorkbenchWindowAdvisor。该类的代码如下:
ApplicationWorkbenchWindowAdvisor.java
package com.fengmanfei.myrcp;
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,也就是菜单栏、工具栏等对应的Action
public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer) {
return new ApplicationActionBarAdvisor(configurer);
}
//在打开窗口之前对窗口进行设置
public void preWindowOpen() {
IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
configurer.setInitialSize(new Point(400, 300));//设置窗口的初始大小
configurer.setShowCoolBar(false);//设置是否显示工具栏
configurer.setShowStatusLine(false);//设置是否显示状态栏
configurer.setTitle("Hello RCP");//设置窗口显示的标题
}
}
该类创建时首先对工作台进行设置。是在preWindowOpen方法中实现的。该方法会在窗口打开之前调用。另外,也可以通过覆盖父类中的方法来进行窗口打开之前的配置工作和窗口关闭的善后处理工作。以下列举了可覆盖的方法。
● preWindowOpen:在打开窗口前调用该方法。
● postWindowRestore:窗口还原后调用该方法。
● postWindowCreate:窗口创建后调用该方法。
● openIntro:打开介绍窗口时调用该方法。
● postWindowOpen:当窗口打开后,调用该方法。
● preWindowShellClose:窗口关闭前调用该方法。
另外,还可以覆盖以下3种方法。
● createActionBarAdvisor:创建菜单和工具栏。
● createEmptyWindowContents:当窗口中没有页面时,可在该方法中设置自定义的控件。
● createWindowContents:可创建自定义的工作环境。一般不需要覆盖。
22.3.4 操作类
创建窗口时,会创建菜单栏和工具栏,此时创建的是ApplicationActionBarAdvisor对象。该类的代码如下:
ApplicationActionBarAdvisor.java
package com.fengmanfei.myrcp;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.application.ActionBarAdvisor;
import org.eclipse.ui.application.IActionBarConfigurer;
public class ApplicationActionBarAdvisor extends ActionBarAdvisor {
public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {
super(configurer);
}
protected void makeActions(IWorkbenchWindow window) {
}
protected void fillMenuBar(IMenuManager menuBar) {
}
}
在该类中,可以添加各种操作项来创建菜单栏、工具栏和状态栏等。在上面的代码中,还没有进行任何改动,也没有添加各种操作。后文将详细讲述这方面的内容。
22.3.5 透视图类
最后,在创建工作台对象时,要指定一个默认的透视图对象。本例中透视图类为Perspective。该类的代码如下:
Perspective.java
package com.fengmanfei.myrcp;
import org.eclipse.ui.IPageLayout;
import org.eclipse.ui.IPerspectiveFactory;
public class Perspective implements IPerspectiveFactory {
public void createInitialLayout(IPageLayout layout) {
}
}
要实现一个透视图类,就要实现IPerspectiveFactory接口。这里先空实现它。具体的使用方法将在后文分别讲述。
综上所述,现在已经对一个最简单的RCP程序的原理弄清楚了。这部分内容比较抽象,不太容易理解,如果读者此时还有疑惑也没有关系。在后文中,将以实例来讲述,读者就会有比较直接的认识了。
22.4 创建扩展的基本方法
从前面内容可以了解到,开发插件最重要的是如何配置好扩展。幸运的是,Eclipse已经提供了很好的配置扩展的工具,不用输入代码去配置,而是通过UI的界面就可以完成。下面详细讲述如何创建扩展的方法。
22.4.1 使用扩展向导创建
Eclipse内置了一些常用的扩展点扩展的模板。使用模板可以快速地创建扩展。下面就来看一下如何使用向导来创建。步骤如下:
(1)在“扩展”选项卡中单击“添加”按钮,如图22.16所示。
(2)在弹出的“新建扩展”对话框中选择“扩展向导”选项卡,在右侧的列表框中显示了一些已有的扩展模板,这里选择第一项,创建操作的扩展模板,如图22.17所示。
图22.16 “扩展”选项卡页面
图22.17 “扩展向导”选项卡
(3)单击“下一步”按钮,按照选择的模板进行进一步的设置。这里使用默认值。然后单击“完成”按钮。这样,一个扩展自org.eclipse.ui.actionSets的扩展就完成了,如图22.18所示。
图22.18 创建扩展后的界面
左侧列表中显示的是所有已扩展的元素。当单击左侧的一个扩展时,右侧会出现该扩展元素的详细信息,然后可以在这里进行扩展的配置。当配置完成后,plugin.xml文件中将会自动生成相应的源代码。按照以上步骤所创建扩展后的配置文件如下:
<extension
point="org.eclipse.ui.actionSets">
<actionSet
id="com.fengmanfei.myrcp.actionSet"
label="样本操作集"
visible="true">
<menu
id="sampleMenu"
label="样本菜单(&M)">
<separator name="sampleGroup"/>
</menu>
<action
class="com.fengmanfei.myrcp.actions.SampleAction"
icon="icons/sample.gif"
id="com.fengmanfei.myrcp.actions.SampleAction"
label="样本操作(&S)"
menubarPath="sampleMenu/sampleGroup"
toolbarPath="sampleGroup"
tooltip="Hello,Eclipse world"/>
</actionSet>
</extension>
这样就使用向导创建了一个操作集的扩展,并且相应地自动创建了该扩展所使用的一些类。很简单吧!不过虽然使用向导来创建很方便,但Eclipse提供的模板是有限的。若所要创建的扩展没有提供的模板,此时就需要手工去创建扩展了。
22.4.2 手工创建
手工创建虽然不如模板创建那样快捷和方便,但这也是很基础的工作。若要进行更高层次的开发,需要掌握手工创建的方法。手工创建扩展步骤如下:
(1)与向导创建扩展的第一步相同,首先在“扩展”选项卡中单击“添加”按钮,然后在弹出的“新建扩展”对话框中选择“扩展点”选项卡,如图22.19所示。
(2)如图22.19所示的列表中显示了所有可用的扩展点。若选中下方的“只显示必需插件中的扩展点”复选框,列表中则显示的是必要的扩展点。取消选中该复选框则会显示更多的扩展点。这里选中org.eclipse.ui.views扩展点,单击“完成”按钮。
(3)这样就创建了简单的扩展点。在“扩展”选项卡界面上选中刚才创建的扩展,单击鼠标右键,弹出如图22.20所示的快捷菜单。
(4)选择“新建”命令后将弹出子菜单,子菜单中可以创建的元素为当前扩展点可用的元素。可创建的元素也会根 据所选择的扩展点而异。例如,本例是在org.eclipse.ui.views中新建的,可以新建的子元素为category、view和 stictkyView。这里选择view即创建了一个view元素。创建完后,plugin.xml文件中自动增加了以下扩展点配置信息:
图22.19 “扩展点”选项卡 图22.20 创建view元素
<extension
point="org.eclipse.ui.views">
<view
class="myRCP.ViewPart1"
id="MyRCP.view1"
name="MyRCP.view1"/>
</extension>
当然,手工配置的方式只是自动添加了配置文件,而扩展点所对应的类并没有自动创建,这些类还需要手工去创建。
最后需要注意的是,plugin.xml配置信息都可以通过界面的操作方式来进行。所以下文中创建扩展时只列出最后配置的源代码部分,而不详细介绍配置的步骤。
22.4.3 获取扩展点的帮助
有这么多的扩展点,那么如何知道每个扩展点的意义及如何使用呢?Eclispe为配置扩展也提供了很便捷查看帮助的方式。
(1)在每个扩展点详细信息的下方有两个工具链接,如图22.21所示。
(2)单击下方的“打开扩展点描述”链接,将会弹出该扩展点所对应的扩展点描述视图,如图22.22所示。
图22.21 “打开扩展点描述”链接 图22.22 “扩展点的描述”视图
在该视图中就可以查看对应扩展点的详细信息了。在扩展点的描述信息中一般会有以下内容:
● Identifier:扩展点的标识,也就是扩展点的类型。例如,透视图的扩展点为org.eclipse. ui.perspective。
● Description:扩展点的描述信息,包括该扩展点的用途等。
● Configuration Markup:xml标记的Schema,也就是说哪些元素是必需的,哪些元素是可选的,以及每个元素所表示的意义。
● Examples:该扩展点配置的一个具体示例。
● API Information:该扩展点所使用的类需要实现的一些接口。该内容非常重要,需要仔细阅读。
● Supplied Implementation:Eclipse平台中已经实现该扩展点的类。例如,在操作扩展点,Eclipse已经实现了一些“打开文件”、“退出”系统等常用的操作扩展,在开发时可以直接使用这些扩展
来自:http://hi.baidu.com/rooot/blog/item/ef9997002579d684e850cd4a.html