`
salever
  • 浏览: 254167 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Common Navigator Framework初探

    博客分类:
  • RCP
阅读更多

这篇文章是继《Eclipse RCP/Plugin 入门自学教程》专题21之“Common Navigator Framework初探”,后重新整理的CNF知识。

参考链接:http://help.eclipse.org/helios/index.jsp?topic=/org.eclipse.platform.doc.isv/guide/cnf.htm


1 CNF 简介

Common Navigator Framework ,简称 CNF JFace Viewer 使用内容器( Content Provider )处理它对应的模型,而 CNF 与此类似,使用了一个或者多个 Content Provider 来管理视图的模型,除了基本的 Content Provider 以外,它还提供了 Label Provider Sorter Filter ,这一系列的 API 可以方便用户进行基于 Eclipse 资源导航视图的扩展。

CNF 是由 org.eclipse.ui.navigator 实现的,它仅依赖于 org.eclipse.ui ,因此它即可以用于 plugin 开发中,也可以用在 RCP 开发中。

2 组成部分

下面讲一下 CNF 的主要组成部分:

  •   View Part :由 org.eclipse.ui.navigator.CommonNavigator 实现,这个就是 Eclipse 自带的 Navgator 的实现类了。

  • Viewer :由 org.eclipse.ui.navigator.CommonViewer 实现,它的主要功能就是显示一个树形结构视图, CommonNavigator 就使用了 CommonViewer 来进行各种资源的显示。 Eclipse 允许用户扩展 CommonViewer ,当然用户也可以自己实现 Viewer

  • Navigator Content Extensions :“ org.eclipse.ui.navigator.navigatorContent ”,导航内容器扩展点。这个是 CNF 的核心,通过它将资源模型与 Viewer 连接起来,它的功能与 JFace Viewer Content Provider 类似,不过 CNF 已经将 Content Provider 封装为一个扩展点了,只需要实现这个扩展点就行,当然扩展点中会包含一个 content Provider 实现。

 

  •   Navigator Viewer :“ org.eclipse.ui.navigator.viewer ”,导航视图扩展点,与 Navigator Content Extensions 类似, CNF 也将 Viewer 进行了封装,使用中只需要实现这个扩展点就行了,当然扩展点中包含一个 Viewer Part 的实现。

 

 

  • Resource Support :资源支持, CNF 还提供了许多资源操作,具体参考 org.eclipse.ui.navigator.resources 包下面的类

 

2 主要功能

  2.1 Navigator

Navigator CNF 的直接表现形式,在 Eclipse IDE 中就有三个与 CNF 相关的 Navigator ,分别为:

 

  • Project Explorer :默认的工程导航视图, org.eclipse.ui.navigator.resources.ProjectExplorer ,继承自 org.eclipse.ui.navigator.CommonNavigator ,为所有的 Eclipse 工程提供导航功能;
  • Package Explorer Java 工程导航视图,属于 JDT Java Development Toolkit ),该视图与 Project Explorer 在处理 Java 工程上几乎一模一样,一个很重要的原因就是 CNF 的适配性和扩展性,这里就不对 JDT Package Explorer 的实现进行分析,有兴趣的可以去看看 http://www.ceclipse.org/read-cec-tid-27476.html
  • Navigator :默认的导航视图,目前暂时由 org.eclipse.ui.views.navigator.ResourceNavigator 实现,不过该类已经废弃,不建议使用,它不是由 CNF 实现的,也不具备扩展性,新版本中将逐步用 org.eclipse.ui.navigator.CommonNavigator ”替代。

2.2 Navigator Content Extensions

如果想使用 CNF ,必须学会使用这个扩展点,它提供了 CNF 的视图需要的 Content Provider Lable Provider ,以及可能的各种过滤、模型隐藏呢。

 

2.3 Common Filters

配置过滤器,具体效果可以看看 Project Explorer Filters

 

2.4 Common Wizards

配置基于 CNF 的视图的右键新建向导,这对于自定义向导很有帮助。

 

2.5 Action Providers

配置基于 CNF 的视图的右键菜单,很多时候用户只需要调用一下 Eclipse 中已经实现的菜单显示即可,比如常见的复制、粘贴、剪切等。

 

2.6 Drag and Drop Support

提供一些拖拽操作。

 

2.7 Link with Editor Support

将当前选中的文件节点与对应的编辑器(可能的)关联起来,此功能的效果见 Project Explorer Link with editor

 

3 示例

下面以一个示例,来讲解如何使用 CNF ,示例的结果为在自定义的视图中,给 properties 属性文件添加子节点,子节点为属性对。效果如下图:

 

 

3.1 新建 plugin 工程

新建工程“ org.salever.rcp.tech.cnf ”,选择 plugin

注:以下代码为在 eclipse 官网上的 navigator example 基础上修改而来的。

 

3.2 添加视图

打开 META-INF 下的 MANIFEST.MF 文件,转到 Extension Tab 页,添加 org.eclipse.ui.view 扩展点,具体为:

这里我们使用默认的 CommonNavigator

 

3.3 添加 Navigator Viewer

继续添加扩展点“ org.eclipse.ui.navigator.viewer ”,这个扩展点就比较重要的,用于配置 CNF Viewer ,这里我们使用刚刚定义的“ org.salever.rcp.tech.cnf.navigator.view ”。

马上我们会继续修改这个扩展点。

 

3.4 添加 Navigator Content

添加扩展点“ org.eclipse.ui.navigator.navigatorContent ”,点击右键添加 navigatorContent ,具体为:

 

注意这里有几个需要说明的:

 

  • contentProvider :提供内容器的类,一般实现 ITreeContentProvider ,与 JFace 类似

  • labelProvider :提供标签显示的类,一般继承自 LabelProvider ,与 JFace 类似
  • triggerPoints :比较重要的子元素,用于提供触发 content provider 的情况,这里为:


    <triggerPoints>
                 <or>
                       <and>
                           <instanceof value="org.eclipse.core.resources.IResource" />
                            <test
                                  forcePluginActivation="true"
                                 property="org.eclipse.core.resources.extension"
                                 value="properties" />
                        </and>
                               <instanceof value="org.salever.rcp.tech.cnf.PropertiesTreeData" />
                        </or>
     </triggerPoints>
    
    
    
    
    
      作用为:在资源为 IResource ,而且资源后缀名为 properties ,或者资源为 PropertiesTreeData 触发此 content provider 。
  • possibleChildren :子节点的配置,这里为:       
      <possibleChildren>
                <or>
                   <instanceof value="org.salever.rcp.tech.cnf.PropertiesTreeData"/>
                </or>
      </possibleChildren>
    
    
    
    
     
         作用为:仅显示类型为 PropertiesTreeData 的子节点。

    3.5 添加 Common Filters

    在刚刚添加的扩展点“ org.eclipse.ui.navigator.navigatorContent ”,点击右键添加 commonFilter ,这里添加一个过滤非 java 工程的过滤器:

    3.6 plugin.xml

    至此,我们已经配置了 Viewer 、 Navigator Content 、 Common Filter ,下面是完整的 plugin.xml :
    <?xml version="1.0" encoding="UTF-8"?>
    <?eclipse version="3.0"?>
    <plugin>
    
       <!-- Phase 1 -->
       <!-- Declare the view part to hold the default implementation --> 
       <extension
             point="org.eclipse.ui.views">
          <category
                id="org.salever.rcp.tech.cnf.navigator.category"
                name="Common Navigator Examples"/>
          <view
                allowMultiple="false"
                category="org.salever.rcp.tech.cnf.navigator.category"
                class="org.eclipse.ui.navigator.CommonNavigator"
                icon="icons/filenav_nav.gif"
                id="org.salever.rcp.tech.cnf.navigator.view"
                name="Example View"/>
       </extension>
       
       <!-- Declare the viewer configuration, and the default content/action bindings -->
       <extension
             point="org.eclipse.ui.navigator.viewer">
          <viewer viewerId="org.salever.rcp.tech.cnf.navigator.view.view"/>
          <viewerContentBinding viewerId="org.salever.rcp.tech.cnf.navigator.view">
             <includes>
                <contentExtension pattern="org.eclipse.ui.navigator.resourceContent"/>
                <contentExtension pattern="org.eclipse.ui.navigator.resources.filters.*"/> 
                <contentExtension pattern="org.eclipse.ui.examples.navigator.filters.*"/>
                <contentExtension
                      pattern="org.salever.rcp.tech.cnf.navigator.propertiesContent">
                </contentExtension> 
             </includes>
          </viewerContentBinding>
          <viewerActionBinding viewerId="org.salever.rcp.tech.cnf.navigator.view">
             <includes>
                <actionExtension pattern="org.eclipse.ui.navigator.resources.*"/>
             </includes>
          </viewerActionBinding>
       </extension>
       
       <!-- Declare a simple filter example that uses core expressions -->
      
      <!-- Phase 2 -->
      <!-- Declare a content extension that renders the contents of a properties file -->
      <extension
             point="org.eclipse.ui.navigator.navigatorContent">
             
          <navigatorContent 
                id="org.salever.rcp.tech.cnf.navigator.propertiesContent" 
                name="Properties File Contents"
                contentProvider="org.salever.rcp.tech.cnf.PropertiesContentProvider"
                labelProvider="org.salever.rcp.tech.cnf.PropertiesLabelProvider" 
                activeByDefault="true"
                icon="icons/prop_ps.gif"
                priority="normal" >
             <triggerPoints>
             	<or>
    	            <and>
    	               <instanceof value="org.eclipse.core.resources.IResource"/>
    	               <test
    	                     forcePluginActivation="true"
    	                     property="org.eclipse.core.resources.extension"
    	                     value="properties"/>
    	            </and>
    				<instanceof value="org.salever.rcp.tech.cnf.PropertiesTreeData"/>
    			</or>
             </triggerPoints>
             <possibleChildren>
                <or>
                   <instanceof value="org.salever.rcp.tech.cnf.PropertiesTreeData"/> 
                </or>
             </possibleChildren>
          </navigatorContent>
          <commonFilter
                id="org.eclipse.ui.examples.navigator.filters.hideNonJavaProjects"
                name="Hide non-Java Projects">
             <filterExpression>
                <not>
                   <adapt
                         type="org.eclipse.core.resources.IProject">
                      <test
                            property="org.eclipse.core.resources.projectNature"
                            value="org.eclipse.jdt.core.javanature">
                      </test>
                   </adapt>
                </not>
             </filterExpression>
          </commonFilter>
       </extension>
       <!-- Bind the Properties content extension to the viewer -->
      
    </plugin>
    
    
    
    
    

3.7 测试

右键运行“ Eclipse Application ”,在新打开的 IDE 中,打开视图“ Common Navigator Examples ”——“ Navigator Example ”:

 

新建一个一般工程“ TestProject ”,分别新建文件夹“ folder ”,文件“ test.txt ”“ test.properties ”,然后修改 test.properties 内容为:

 

 

key1=value1
key2=value2
key3=value3 

 

点击左侧视图中,查看效果:

 

 

打开Customize View,查看filter配置:

 

 

勾选上Hide no-Java Projects,如果你刚刚新建的不是java 工程,确定以后,发现testProject不见了,被过滤掉了。


       右键菜单与Project Explorer一致,因为我们在Navigator Example中引入了常见的action provider:

 

 

<viewerActionBinding viewerId="org.salever.rcp.tech.cnf.navigator.view">
         <includes>
            <actionExtension pattern="org.eclipse.ui.navigator.resources.*"/>
         </includes>
</viewerActionBinding>



 

 

 


        最后可能有人要问,为什么会自己的视图中也会出现工程、文件夹和文件树形结构,很简单,因为我们引入了“org.eclipse.ui.navigator.resourceContent”,这个Eclipse提供的IResource Navigator Content 。

 

<viewerContentBinding viewerId="org.salever.rcp.tech.cnf.navigator.view">
         <includes>
            <contentExtension pattern="org.eclipse.ui.navigator.resourceContent"/>
            <contentExtension pattern="org.eclipse.ui.navigator.resources.filters.*"/>
            <contentExtension pattern="org.eclipse.ui.examples.navigator.filters.*"/>
            <contentExtension
                  pattern="org.salever.rcp.tech.cnf.navigator.propertiesContent">
            </contentExtension>
         </includes>
</viewerContentBinding>

 

 

 

 

0
0
分享到:
评论
3 楼 dahuk 2012-01-11  
 
2 楼 salever 2011-12-21  
mtsw2011 写道
请教个问题,我想屏蔽一些用不到的菜单该怎么实现?

看看这个http://salever.iteye.com/blog/1285699
1 楼 mtsw2011 2011-12-20  
请教个问题,我想屏蔽一些用不到的菜单该怎么实现?

相关推荐

    CommonNavigatorFramework(CNF)实例源码

    `CommonNavigator`类是实现此功能的基础,开发者可以通过扩展这个类并重写相关方法来自定义视图行为。 3. **AdapterFactories**:CNF使用适配器工厂(AdapterFactory)将模型对象转换为可以被视图渲染的结构。...

    Common Navigator Framework学习资料

    Common Navigator Framework(CNF)是Eclipse平台中的一个重要组件,主要负责提供一种统一的方式来展示和操作项目的导航结构。这个框架允许开发者创建自定义的导航视图,以适应各种不同的项目类型和开发环境。以下是...

    salever_Common_Navigator_Framework_分析

    《Salever Common Navigator Framework 分析》 Salever Common Navigator Framework(CNF)是基于Eclipse平台的一个可扩展的导航框架,它为开发人员提供了一种高效的方式来构建和展示复杂的、层次化的数据结构。CNF...

    定义自己的Common Navigator二

    Common Navigator Framework (CNF) 是Eclipse中用于构建可扩展、可定制的资源导航视图的API。它提供了基本的结构,如树状视图,以及处理模型、适配器、过滤器、排序等功能。开发者可以通过实现一系列接口和扩展点,...

    Eclipse RCP Common Navigator Demo

    在Eclipse RCP中,Common Navigator Framework (CNF) 是一个关键组件,它提供了一种灵活的方式来展示资源树结构,类似于Eclipse IDE中的“Package Explorer”或“Project Explorer”。"Eclipse RCP Common Navigator...

    CommonNavigator

    在IT行业中,CommonNavigator是一个非常重要的概念,尤其是在Android应用开发领域。它是一种设计模式,用于构建通用的导航视图,帮助开发者实现具有统一导航结构的应用界面。标题"CommonNavigator"和描述...

    使用CommonNavigator开发资源管理器.doc

    【使用CommonNavigator开发资源管理器】的文档主要介绍了如何利用Eclipse的Common Navigator Framework (CNF) 插件来创建自定义的资源管理器。Common Navigator Framework是Eclipse平台的一部分,它提供了一套完整的...

    eclipse插件开发之Common Navigator View

    【Eclipse插件开发之Common Navigator View】是关于在Eclipse插件开发中创建和定制一个基于Common Navigator View(CNV)的视图的过程。Common Navigator View是一种通用的视图结构,通常用于显示项目的资源层次结构...

    CNF导航----building-common-navigator-framework-viewer

    在本文档中,我们将深入探讨如何构建一个基于Eclipse平台的通用导航框架(Common Navigator Framework, CNF)查看器。这不仅适用于Eclipse平台的新手开发者,也适合希望深入了解CNF工作原理及其实现细节的高级用户。...

    Eclipse RCP Plug-in开发自学教程(Eclipse3.6)

    21. **专题六**:COMMON NAVIGATOR FRAMEWORK初探 - 对Eclipse通用导航框架的基本介绍。 通过本教程,开发者可以逐步掌握Eclipse RCP的各个关键概念和技术,从而能够开发出自己的富客户端应用程序。每个章节都包含...

    【资料整理】中国Eclipse社区开发资料整理

    《中国Eclipse社区开发资料整理》是一份针对Eclipse开发工具的重要资源集合,主要涵盖了如何构建通用导航框架(Common Navigator Framework)的详细教程。在Eclipse这个强大的集成开发环境中,Common Navigator ...

    使用CommonNavigator开发资源管理器.pdf

    在Eclipse插件开发中,`CommonNavigator`框架是一个用于构建自定义资源管理器的关键组件。这个框架允许开发者创建和扩展资源视图,比如Eclipse的项目管理器。本篇文章将详细讲解如何利用`CommonNavigator`开发资源...

    CNF导航----building-common-navigator-framework-viewer-ii

    本篇文章将继续深入探讨如何构建一个通用导航框架(Common Navigator Framework,简称CNF)查看器,并着重介绍如何向该查看器添加内容扩展。通过本教程的学习,您将能够掌握在CNF查看器中展示特定文件类型数据的方法...

    CNF导航----building-common-navigator-framework-viewer-IV

    在前一篇文章中,我们探讨了如何为一个通用导航器(Common Navigator)实例配置弹出菜单。我们了解到,通用导航器可以通过 `org.eclipse.ui.navigator.viewer` 扩展点声明所有菜单插入点,并且可以指定是否应尊重对 ...

    CNF导航----building-common-navigator-framework-viewer-III

    2. **通过`org.eclipse.ui.navigator.navigatorContent`作为动作提供者贡献操作**:有时客户需要更程序化的控制,具体包括哪些操作贡献到特定上下文下的某个菜单,以及根据当前选择配置了哪些可重定向操作。...

    Eclipse Rcp comon Navigator demo

    在本"Common Navigator demo"中,我们将深入探讨如何利用Eclipse RCP创建一个基于Common Navigator的简单应用,并了解如何扩展这一基础功能。 首先,Common Navigator是Eclipse RCP中用于显示项目、文件和其他资源...

    wincc web Navigator发布教程(局域网与外网)

    1. 安装Windows功能:勾选上IIS可承载的WEB核心,Internet信息服务,.NET Framework 3.5,windows process AcTIvation Service选项。 2. 打开一个现有的WinCC工程。 3. 进行“web组态器”设置:定义一个标准Web站点...

Global site tag (gtag.js) - Google Analytics