Eclipse开发中编辑器(Editors)和视图(View)总结

1.视图(Views)

视图(实现了org.eclipse.ui.IViewPart接口)包含在视图站点(org.eclipse.ui.IViewSite)中,并通过视图站点包含在工作台页面(IWorkbenchPage)中。视图通过getViewSite()来获得视图站点,而视图站点通过实现继承自工作台站点(IWorkbenchSite)的方法getPage()来获得工作台页面。
在工作台页面中保存了视图的参考信息(org.eclipse.ui.IViewReference)的实例,通过IViewReference所提供的方法getView()来间接获得视图。这样避免了工作台页面直接保存视图本身,从而使引用视图和加载定义视图的插件分离,可以避免或延迟插件的加载。

除了IViewPart以外,IEditorPart也继承自IWorkbenchPart,这就说明了视图和编辑器共享一个共同的行为集合,使得二者有很多相似之处。

Eclipse中包含了很多预定义的视图,这些视图为开发者提供了多个角度去观察资源或编辑器的状态,为应用程序的开发带来了很大的方便。
如,
1)ResourceNavigator类实现了导航器(Navigator),提供了Eclipse工作空间资源的功能
2)抽象类PageBookView是AbstractDebugView/ContentOutline/PropertyView的父类,它支持视图显示某个工作台   组件(IWorkbenchPart)的状态信息。
3)ContentOutline大纲视图,用来显示编辑器内容的大纲,它是由Workbench创建并管理的,无法被再次实例化也无法被继承。
4)属性视图(org.eclipse.ui.views.PropertySheet)/任务视图(org.eclipsee.ui.views.TaskList)/书签视图(org.eclipse.ui.views.BookmarkNavigator)
5)项目资源管理器
使用CommonNavigation类来管理项目的资源(Eclipse3.2新增的org.eclipse.ui.navigatorContnt扩展点,为配置CommonNavigator的扩展提供了强大的支持)
----------------------------
Eclipse提供的org.eclipse.core.runtime.IAdaptable接口,它允许一个对象把他不理解的类型丢下转换成另一种可以访问和控制的类型对象。这是对Adapter模式的经典使用。
Adapter模式是一种结构型的模式,又名包装器 Wrapper,很多时候,为了复用设计的工具类不能被复用的原因仅仅是因为它的接口与专业应用领域所需要的接口不匹配,这个时候只需要实现IAdapter接口并重写getAdapter(Class adapter)方法就ok了,这样当调用getAdapter()的时候传入一个特定接口的Class对象,该方法就会返回一个具有该接口的对象。
-------------------------------------------------------
2.编辑器(Editors)

编辑器必须实现org.eclipse.ui.IEditorPart接口,通常编辑器都作为该接口的默认扩展org.eclipse.ui.part.EditorPart的子类,因而它也是org.eclipse.ui.part.WorkbenchPart的间接子类(public abstract class EditorPart extends WorkbenchPart implements IEditorPart )
编辑器必须包含在org.eclipse.ui.IEditorSite中,IEditorSite又包含在工作台页面(IWorkbench
Page)中。同视图一样,工作台页面中保存了编辑器的查考信息(org.eclipse.ui.IEditorReference)的实例,通过IEditorReference提供的方法getEditor()来间接的获得编辑器。这样就避免了工作台页面直接保存编辑器本身,从而使引用编辑器和加载定义编辑器的插件分离开,可以避免或延迟加载相关的插件。

下面介绍几个重要的编辑器类:
1)AbstractTextEditor类
基于文本的编辑器,实现了编辑器是许多基础功能(如,剪切,拷贝,粘贴,上下文管理,响应工作空间中资源的更改等)。

AbstractTextEditor将文本模型和显示分离开,当前文本为编辑器提供IDocumentProvider的实例,这样就允许不同编辑器访问同一个文本模型。IDocumentProvider实例还负责保存正在使用的文本。当在AbstractTextEditor中执行doSave()和doRevertToSaved()等保存操作时,AbstractTextEditor将调用IDocumentProvider实例相关的方法。

2)MultiEditor类
MultiEditor类在一个GUI组件中合并了不同的编辑器,当开发者需要使用不同类型的编辑器显示同一个资源模型时,可以使用这个类。

3)MultiPageEditorPart类抽象的MultiPageEditorPart类用来实现多页编辑器。

4)FormEditor类
FormEditor类也是抽象类,它继承了MultiPageEditorPart类,用来实现基于表格的编辑器。子类必须实现addPages()方法来为FormEditor填充编辑器页面。
----
编辑器页面

org.eclipse.ui.forms.editor.FormPage(class FormPage extends EditorPart implements IFormPage)是构建FormEditor的页面的一个基本类型,所有加入FormEditor的页面都必须是FormPage的子类。

FormPage的子类型可以通过重写creatFormContent(ManagedForm)来构建特定页面的内容。
1)Master-Detail(主-从)风格的FormPage。
抽象类 org.eclipse.ui.forms.MasterDetailsBlock是关键。MasterDetailsBlock类采用注册页面的方式来构建主-从块。registerPages()方法用来具体的从属页面注册到所允许的数据模型,从而建立起从属页面和数据模型的一一对应关系。从属页面也是采用注册方式在
createDetailsPart()方法中注册到主页面中。
MasterDetailsBlock创建主-从页面的过程:
创建MasterPart:createMasterPart(managedForm,sashForm)--->创建DetailsPart:
createDetailsPart(managedForm,sashForm)--->注册页面:regesterPages();--->创建工具栏Action:createToolBarActions(managedForm)

Eclipse的Form组件创建SWT元素时同普通SWT元素的创建不同,需要首先得到Form的工具包--FormTookit,然后通过Form工具包创建SWT元素,例:
FormToolKit toolkit=managedForm.getToolkit();
toolkit.createSection(parent,type);
toolkit.createComposite(parent,type);
toolkit.createButton(parent,type);
FormText rText=toolkit.createFormText(parent,true);
rText.setText(...);
... ...

构建Details部分需要实现IDetailsPage接口。
public interface IDetailsPage extends IFormPart, IPartSelectionListener {
   void createContents(Composite parent);
}
Details部分作为一个特定的表格部分,它需要拥有管理表格生命周期的方法于是就继承了IFormPart接口;另外需要监听Master部分的选择做出改变,因此需要继承
IPartSelectionListener接口。
-------------------------------------------------------------

猜你喜欢

转载自niub.iteye.com/blog/1814039