深入 Common Navigator Framework 之 navigatorContent

3.1 概述

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,这些都在扩展点的配置中显示指定。

3.2 扩展点

下面我们看看扩展点org.eclipse.ui.navigator.navigatorContent/navigatorContent的具体内容:


这里对contentProvider属性和LabelProvider属性进行讲解,其他的属性请自行查阅帮助文档。

 

3.2.1 contentProvider属性

contentProvider需要指定一个类,这个类等同于JFace Viewer的Content Provider,因此它需要实现TreeContentProvider或者是ICommonContentProvider接口。后者提供了更丰富的功能,其定义为:
public interface ICommonContentProvider extends ITreeContentProvider,IMementoAware

3.2.2 labelProvider属性

与contentProvider属性类似,它提供了CNF的Viewer显示所用的标签,指定为labelProvider的类需要实现接口ILabelProvide。鉴于Navigator Viewer中的节点(比如文件)的显示名称的复杂性,Eclipse还提供了额外的接口,方便用户实现这些复杂的功能,比如工具条提示、状态栏提示等:

  • 1.    org.eclipse.ui.navigator.IDescriptionProvider,提供状态栏提示信息,具体效果为,当点击某个文件时候,Eclipse最下方的状态栏上会提示一些信息。

 

  • 2.    org.eclipse.ui.navigator.ICommonContentProvider,它继承了ILabelProvider,IMementoAware,IDescriptionProvider,除了能提供状态栏提示以外,它还提供了Memento支持。

3.2.3 triggerPoints

这个用来指定何时使用这个contentProvider,按字面意思理解就是“触发点”。

3.2.4 possibleChildren

这个用来指定contentProvider中的子节点模型。
看看Eclipse的workingset contentProvider中的设置:

 

3.3 Eclipse实现

接下来讲一讲Eclipse中的Navigator的contentProvider的实现,这里基本版本3.5(或者以上)。

 

navigatorContent的声明:

 


 
主要就是contentProvider和labelProvider的值,分别为:

 

  • 对应的content provider则由ResourceExtensionContentProvider提供,它位于包org.eclipse.ui.internal.navigator.resources.workbench.下。下面看看它的类型层次结构:

 

  • 对应的label provider则由ResourceExtensionLabelProvider实现,它位于包org.eclipse.ui.internal.navigator.resources.workbench下,下面是它的类型层次结构图:


其实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 机制,大家不妨去深入研究一下。

你可能感兴趣的:(eclipse,cnf)