Common Navigator Framework初探


这篇文章是继《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 的情况,这里为:

        <span><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>  
        </span>  

     作用为:在资源为 IResource ,而且资源后缀名为 properties ,或者资源为 PropertiesTreeData 触发此 content provider 。
  • possibleChildren :子节点的配置,这里为:      
        <span>  <possibleChildren>  
                    <or>  
                       <instanceof value="org.salever.rcp.tech.cnf.PropertiesTreeData"/>  
                    </or>  
          </possibleChildren></span>  

     
         作用为:仅显示类型为 PropertiesTreeData 的子节点。

    3.5 添加 Common Filters

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

    3.6 plugin.xml

    至此,我们已经配置了 Viewer 、 Navigator Content 、 Common Filter ,下面是完整的 plugin.xml :
    Xml代码   收藏代码
        <span><?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>  
        </span>  

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:

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

 


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

    <span><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></span>  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值