Eclipse为了方便用户使用CNF,将它的资源模型管理功能封装为一个扩展点,用户只需要实现这个扩展点——org.eclipse.ui.navigator.navigatorContent/navigatorContent(注意它只是扩展点org.eclipse.ui.navigator.navigatorContent下的一项 ),就可以使用定制资源模型的显示。
如果你对JFace Viewer的MVC机制有一定的了解的话,就会知道Content Provider和Label Provider的作用,在使用任何的JFace Viewer的时候,必须指定以上两个Provider。CNF的Navigator Content Extension扩展点的功能类似,它提供了CNF的Viewer所需要的Content Provider和Label Provider,这些都在扩展点的配置中显示指定。
下面我们看看扩展点org.eclipse.ui.navigator.navigatorContent/navigatorContent的具体内容:
这里对contentProvider属性和LabelProvider属性进行讲解,其他的属性请自行查阅帮助文档。
contentProvider需要指定一个类,这个类等同于JFace Viewer的Content Provider,因此它需要实现TreeContentProvider或者是ICommonContentProvider接口。后者提供了更丰富的功能,其定义为:
public interface ICommonContentProvider extends ITreeContentProvider,IMementoAware
与contentProvider属性类似,它提供了CNF的Viewer显示所用的标签,指定为labelProvider的类需要实现接口ILabelProvide。鉴于Navigator Viewer中的节点(比如文件)的显示名称的复杂性,Eclipse还提供了额外的接口,方便用户实现这些复杂的功能,比如工具条提示、状态栏提示等:
这个用来指定何时使用这个contentProvider,按字面意思理解就是“触发点”。
这个用来指定contentProvider中的子节点模型。
看看Eclipse的workingset contentProvider中的设置:
接下来讲一讲Eclipse中的Navigator的contentProvider的实现,这里基本版本3.5(或者以上)。
navigatorContent的声明:
主要就是contentProvider和labelProvider的值,分别为:
其实navigator content的主要功能就是提供内容器和标签器,Eclipse将文件系统上的文件资源与Resource包下的IResource进行了一一对应,从而使得Navigator导航视图能够显示属性的文件结构。
值得一提的是,Eclipse的Navigator视图的标签器的实现比较强大,除了能显示工程、文件夹、文件之外,还可以实现其他的效果,比如添加了SVN之后的标记,错误提示等。
这些功能都来自于类org.eclipse.ui.model.WorkbenchLabelProvider,我们不妨简单看一看它的getText()实现:
public final String getText(Object element) {
//query the element for its label
IWorkbenchAdapter adapter = getAdapter(element);
if (adapter == null) {
return ""; //$NON-NLS-1$
}
String label = adapter.getLabel(element);
//return the decorated label
return decorateText(label, element);
}
它借用了Eclipse的Adapter 机制,大家不妨去深入研究一下。