Eclipse插件开发笔记一:对Eclipse的理解

来源:互联网 发布:mac移动硬盘加密 编辑:程序博客网 时间:2024/04/29 01:05

在Eclipse的结构中,最下面是Runtime;在Runtime的上面,有两部分,一部分是Resource;一部分是SWT、JFace和UI。

 

在Eclipse中,workspace、project、Folder、File都是Resource;Eclipse IDE启动后,选择的Workspace对应的一个大的文件夹,该文件夹下面有多个Project的文件夹和一个.metadata的文件夹存储workspace的信息。在启动过程中,选择的Workspace下的所有project都会被导入内存,在内存中形成一个一个的对象,这些对象就是IProject、IFile;甚至,java文件生成class文件,都在内存中有一个对应的对象。由于Eclipse可以支持多种类型的项目,比如Java项目、C++项目、C#项目,每一种类型的项目都有特定的组织结构,以Java项目为例,它编译生成的class文件被存储在bin目录下,有一个Java Model的类,就是用来生成Java项目模型的。

 

Eclipse的架构是一个runtime core,在这个core的上面,全部都是插件。Resource就是一个插件,叫ResourcePlugin。那么,我如何访问插件中的数据信息呢?有几种方法;如果我本身就在插件内部,直接访问插件内部的数据就可以了;如果我是另外一个插件,怎么访问呢?一种办法就是由core来维护这个数据;一种方法就是直接访问这个插件来获取这个数据(如果被访问的插件提供了访问特定数据的接口的话)。

 

如果我在自己的插件中,要访问工作区的某个项目,就是用ResourcePlugin.getWorkspace();由此可见,使用的前面所说的最后一种方法(直接访问插件来获取数据)。同理,如果我要在自己的插件中实现这样一个功能:改变某个选项会改变另一个插件中的状态。那么,前提是另一个插件提供了接口能够被改变。

 

如果我要在自己的插件中,访问当前选中的项目,那么,仅仅是ResourcePlugin就不够了,因为ResourcePlugin只是负责管理Resource,它并不知道当前选中的是哪一个Project,也不知道当前选中的是Project还是File;这部分的信息由UI管理。

 

Eclipse runtime core上一层的另外一部分就是SWT、JFace和UI。

什么是SWT?SWT就是一组原生态的小窗口组件集。什么是JFace?SWT中的数据都是一些简单的、基本的数据,JFace在SWT的基础上提供了更多的数据类型接口,比如Tree、List等。

在SWT和JFace中,有一些概念,比如Widget、Control;比如Listener、Action、ISelection;这些概念都是很好理解的。

 

假设我们要做一个简单的窗口系统,该怎么做?就是管理好X、Y、Z;在内部维持一个链表,这个链表中的每一个节点都是一个窗口;窗口在链表中的位置代表了它们在Z轴上的位置;在每一个节点中,记录了X、Y、W、H,代表了窗口的位置和大小。

当一个点击事件在窗口系统上发生时,窗口系统就去这个链表中查找,看这个点在哪个窗口中,然后把事件传递给这个窗口;这个窗口对这个点击事件进行转换,按照自己的逻辑,将转换后的事件传出去,于是,窗口变成了控件。

窗口系统知道当前有哪几个窗口是可见的,当需要绘制时,按照它们在Z轴上的位置,依次调用这几个窗口的绘制方法就OK了。

这是最简单的窗口系统,一般来讲,X、Y、W、H还有窗口的状态信息都是存储在窗口对象中的,窗口对象会提供接口使外部能够获取这些状态;例如,某个点是否在该窗口中,boolean isPtIn(int x,int y);

在窗口创建时,需要把自己注册进窗口系统中。这个注册的操作,一般都是封装了的。比如Win32中的CreateWindow。

 

在SWT中,所有的小窗口组件都是继承自Control(org.eclipse.swt.widgets.Control);这个Control有很多addListener方法。比如MouseMove、Focus、Key;当添加了这些Listener后,当事件在Control上发生后,Eclipse的窗口系统会将对应的事件传递给Control;而继承了Control的控件(例如Button)会按照自己的逻辑将事件转换后发出新的事件(例如SelectionEvent)。

 

ISelection与IAction;

IAction代表了一个点击的事件,这个事件中有command id;ISelection代表的是选中;因此,ISelection属于org.eclipse.jface.viewers包;而IAction属于org.eclipse.jface.action包;

 

 

 

 

 

 

 

原创粉丝点击