eclipseRCP深入浅出(学习总结)2015.08.08

5.4.2 Content Providers Overview

TreeViewer需要ContentProvider实现ITreeContentProvider接口,这样Treeviewer才可以遍历input进去的对象的树形结构:
public interface ITreeContentProvider extends IStructuredContentProvider { public Object[] getChildren(Object parentElement); public Object getParent(Object element); public boolean hasChildren(Object element);
}方法中的参数就是treeviewer中要显示的元素,ContactsView创建后会调用TreeView.setInput(Object)方法,这时候反过来ITreeContentProvider会调用getChildren()方法遍历setInput进来的对象,它首先它的第一层元素,但是第一层元素是不用来显示的,它作为一个出发点,用来创建其他可视的树节点。

ContentProvider和input的模型对象该如何交互有如下四种可能的技术:
1、模型对象实现ITreeContentProvider接口;实现接口即给ContactsEntry和ContactsGroup模型添加了它的方法,getChildren()、getParents()等等,这虽然直接但是暴露了底层模型的内在结构,这种方式的缺点就是把模型和UI层耦合在一起,这两层最好还是实现解耦。
2、用一个实现了ITreeContentProvider接口的对象包装模型对象;这样做摆脱了第一种方式的限制,但是却产生了另外一种开销,一个模型对象还有一个对应实现了ITreeContentProvider接口的对象,说白了就是,一个抽象模型对应了两个对象。这样做给每个模型对象的身份鉴定带来了难度,当想鉴定两个抽象模型是否相同时,不仅要比较他们的对象模型,还要比较那个包装对象。一个抽象模型由两个对象唯一标识。
3、自己写一个自定义的ContentProvider;TreeViewer可以自定义,而且我们也可以写自己的ContentProvider,我们只需实现ITreeContentProvider接口,这个接口就可以访问模型对象,遍历它的树形结构。这种方法必须控制所有的provider,而且也不可扩展,因为我们必须提前知道所有可操作对象的类型。
4、给模型对象添加ContentProvider所必须的功能函数;这种方法使用了Eclipse的适配器机制,来继承模型对象的方法,WorkBench定义了标准的ContentProvider叫做BaseWorkBenchContentProvider,它知道如何遍历IWorkBenchAdaptable类型:
public interface IWorkbenchAdapter {
public Object[] getChildren(Object o);
public ImageDescriptor getImageDescriptor(Object object);
public String getLabel(Object o);
public Object getParent(Object o);
}
官方对这个接口的解释是:这个接口为workbench elements提供了可视化描述和层级结构,让这些元素可以在UI组件中显示,而不用知道这些元素的具体实现。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章