Eclipse RCP开发(三):RCP项目代码分析
原文链接:https://blog.csdn.net/vking_wang/article/details/8716073
plugin.xml
Eclipse默认用plugin manifest editor打开plugin.xml,主要有如下几个标签页:
1)Overview
显示项目基本信息,其中Test区域的按钮可快速启动或调试plugin程序。
2)Dependencies
可查看该插件所依赖的其他插件,例如本插件依赖于org.eclipse.core.runtime、org.eclipse.ui;
还可通过Dependency Analysis查看dependency hierarchy。
这部分内容实际是定义在MANIFEST.MF文件中:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: RCP_HelloWorld
Bundle-SymbolicName: RCP_HelloWorld; singleton:=true
Bundle-Version: 1.0.0.qualifier
Require-Bundle: org.eclipse.core.runtime,
org.eclipse.ui
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
3)Extensions
扩展,是将类连接到Eclipse结构的机制。
这部分内容实际是定义在plugin.xml中的内容:
<plugin> <extension id="application" point="org.eclipse.core.runtime.applications"> <application> <run class="rcp_helloworld.Application"> </run> </application> </extension> <extension point="org.eclipse.ui.perspectives"> <perspective name="RCP Perspective" class="rcp_helloworld.Perspective" id="RCP_HelloWorld.perspective"> </perspective> </extension> </plugin>
Application
/** * This class controls all aspects of the application's execution */ public class Application implements IApplication { /* (non-Javadoc) * @see org.eclipse.equinox.app.IApplication#start (org.eclipse.equinox.app.IApplicationContext) */ @Override public Object start(IApplicationContext context) throws Exception { Display display = PlatformUI.createDisplay(); try { //-----------WorkbenchAdvisor int returnCode = PlatformUI. createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor()); if (returnCode == PlatformUI.RETURN_RESTART) return IApplication.EXIT_RESTART; else return IApplication.EXIT_OK; } finally { display.dispose(); } } /* (non-Javadoc) * @see org.eclipse.equinox.app.IApplication#stop() */ @Override public void stop() { if (!PlatformUI.isWorkbenchRunning()) return; final IWorkbench workbench = PlatformUI.getWorkbench(); final Display display = workbench.getDisplay(); display.syncExec(new Runnable() { @Override public void run() { if (!display.isDisposed()) workbench.close(); } }); } }
相当于程序入口。
在start方法中,创建了一个Display;然后启动Eclipse Workbench(PlatformUI.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor()))。
Application必须关联到Eclipse Runtime的应用程序扩展点,从而使Runtime知道Application。
一个系统中的多个Eclipse插件可以共享应用程序扩展。
WorkbenchAdvisor
上面Application代码中createAndRunWorkbench方法参数中用到了WorkbenchAdvisor。WorkbenchAdvisor告诉Workbench如何行动:如何做、做什么。
本例的WorkbenchAdvisor:
定义了要显示的透视图
定义了要使用的WorkbenchWindowAdvisor
public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor { private static final String PERSPECTIVE_ID = "RCP_HelloWorld.perspective"; //-----------WorkbenchWindowsAdvisor public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor( IWorkbenchWindowConfigurer configurer) { return new ApplicationWorkbenchWindowAdvisor(configurer); } //----------Perspective public String getInitialWindowPerspectiveId() { return PERSPECTIVE_ID; } }
如果要保存窗口位置和尺寸,以便下次打开的时候不被重置:
@Override public void initialize(IWorkbenchConfigurer configurer){ configurer.setSaveAndRestore(true); }
WorkbenchWindowAdvisor
每个应用程序的每一个窗口都有一个WorkbenchWindowAdvisor,定义如何渲染窗口:设置窗口初始大小、标题、状态栏、工具栏。
public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor { public ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) { super(configurer); } //----------ActionBarAdvisor 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"); //$NON-NLS-1$ } }
Perspective
定义透视图的布局。默认什么都不做:
public class Perspective implements IPerspectiveFactory { public void createInitialLayout(IPageLayout layout) { } }
ActionBarAdvisor
创建窗口所需要的动作,并在窗口中定位它们。控制菜单栏上出现的命令、工具栏、状态栏。默认什么都不做:
public class ApplicationActionBarAdvisor extends ActionBarAdvisor { public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) { super(configurer); } protected void makeActions(IWorkbenchWindow window) { } protected void fillMenuBar(IMenuManager menuBar) { } }
原文地址:https://www.cnblogs.com/lotuses/p/11561457.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- LeetCode 35. 搜索插入位置
- 【面试系列】反射+动态代理,你为何老是搞不懂?
- 我不知道还可以用 JS 做的 6 件事
- 【服务网格架构】Envoy架构概览(7):断路,全局限速和TLS
- 你的消息队列如何保证消息不丢失,且只被消费一次,这篇就教会你
- 【服务网格架构】Envoy架构概览(9):访问日志,MongoDB,DynamoDB,Redis
- Redis Cluster 原理分析
- Ceph介绍及原理架构分享
- 分布式存储Ceph之PG状态详解
- JS中的事件循环机制与宏队列、微队列笔记
- Redis 哨兵机制以及底层原理深入解析,这次终于搞清楚了
- SQL 找出分组中具有极值的行
- 接入层Nginx架构及模块介绍分享
- 【问题修复】mds0: Metadata damage detected
- 【服务网格架构】Envoy架构概览(6):异常检测