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
机制,大家不妨去深入研究一下。
分享到:
相关推荐
【使用CommonNavigator开发资源管理器】的文档主要介绍了如何利用Eclipse的Common Navigator Framework (CNF) 插件来创建自定义的资源管理器。Common Navigator Framework是Eclipse平台的一部分,它提供了一套完整的...
在本文档中,我们将深入探讨如何构建一个基于Eclipse平台的通用导航框架(Common Navigator Framework, CNF)查看器。这不仅适用于Eclipse平台的新手开发者,也适合希望深入了解CNF工作原理及其实现细节的高级用户。...
本篇文章将继续深入探讨如何构建一个通用导航框架(Common Navigator Framework,简称CNF)查看器,并着重介绍如何向该查看器添加内容扩展。通过本教程的学习,您将能够掌握在CNF查看器中展示特定文件类型数据的方法...
<menuContribution locationURI="popup:org.eclipse.ui.navigator.CommonNavigator#menu"> commandId="com.example.deletePropertyCommand" label="Delete Property" style="push"> ``` 这里,`...
2. **通过`org.eclipse.ui.navigator.navigatorContent`作为动作提供者贡献操作**:有时客户需要更程序化的控制,具体包括哪些操作贡献到特定上下文下的某个菜单,以及根据当前选择配置了哪些可重定向操作。...