核心运行时-IAdaptable

以属性视图为例。

eclipse核心运行时组件提供了eclipse类型扩展机制。我们以属性视图显示属性的工作方式来展示。

 

显示属性动作涉及两个参与者:property视图和被选中的对象。property视图需要通过接口知道被选中对象的属性,被选中的对象则要提供这个接口。property视图要求的接口是IPropertySource

一、最直接的方法是让被选中的对象实现IPropertySource接口。但存在以下几个问题:

给类添加大量这样接口,显得臃肿;“某个类实现了某项服务”应该是一个实现的细节,我们不希望暴漏出去;最重要的是我们的对象不应该知道property视图的存在。实现模型与UI的解耦合。

二、我们通过某种机制,这种机制能使得我们给一个类添加服务接口,但有不在该类本身的接口上暴漏出来。而且能给现有的类添加行为(方法),同时还不给类添加状态(字段)。最关键的是如何描述、识别这个扩展。

基于上两点,采用eclipse中的IAdaptable扩展支持。该接口只有一个方法,使用者可以通过此方法动态的查询一个对象是否支持某个特定的接口。

eclipse中使用IAdaptable接口的方式有两种:一种是修改现有类的getAdapter()方法,这种方式显而易见直接有if判断参数返回一个adapter就可;另一种是不修改现有方法,getAdapter()通过工厂来实现(从外部扩展现有类的接口)

下面就来看看如何实现第二种方式:

在程序启动的XXXPluginstart()方法中,我们写下

IAdapterManager manager = Platform.getAdapterManager();

propAdapterFactory = new PropAdapterFactory();

manager.registerAdapters(propAdapterFactory, MyObject.class);

……

其中MyObject就是我们要显示其属性的对象类型。propAdapterFactory是产生该对象属性adapter的工厂。我们让这个工厂实现IAdapterFactory接口。在工厂的getAdapterList()注册接口类型(如:return new Class[]{IPropertySource.class …}.getAdapter()中返回的对象需要实现IPropertySource接口。

现在工厂有了,我们怎么能适配器工厂参与到getAdapter()调用中呢?我们修改对象类型MyObject中的getAdapter()方法,方法体如return Platform.getAdapterManager().getAdapter(this,adapter);

另外:在eclipse开发过程中,曾使用以下语句与属性视图交互过。

// 与属性视图交互

 PropertySheet ps = (PropertySheet)getViewSite(). getActiveWorkbenchPage().findView(IPageLayout.ID_PROP_SHEET);

if (null != ps)

{

  ps.selectionChanged(MyView.this, new StructuredSelection(myObject)); }

当然这个myObject的类有一个myObjectFactory来产生MyObjectAdapter的对象。为了在属性视图中显示的属性按一定的顺序排列,在MyView中的getAdapter()中还要加上:

if (adapter == IPropertySheetPage.class)

{

      returnnew MyObjectPropertySheetPage();

 }

在类的creatControl()方法体中加setSorter(new PropertySheetSorter());

如果不加,属性将按照a-z的方式排列。

猜你喜欢

转载自sdfx.iteye.com/blog/1941656