模拟SVN使用decorator与marker进行IProject扩展

原始贴子见http://www.ceclipse.org/read-cec-tid-27222.html

当时大家讨论的是如何拓展IProject,来满足对默认的Project的一些修改,比如将某些文件夹设定为src folder,某些文件夹设定为res folder。

再三思考以后,觉得并不需要使用CNF框架,来对扩展已有的Project Navigator,而是采用一个稍微绕一点的方法来实现,想到SVN和CVS的实现方式了。

需求如下:需要将project中的某些文件夹设定为资源文件夹,以便于在编译、打包时进行特殊处理;
基本思路:因为目前只是对某些文件夹进行特殊处理,而文件夹下面的内容仍然按照默认的方式显示,考虑采用
                 org.eclipse.ui.decorators给指定的文件夹加上修饰,以区别于普通文件夹,使
                 org.eclipse.core.resources.markers记录下这些文件夹,以便于编程处理。
实现如下:

1,扩展org.eclipse.core.resources.markers,添加一个marker,记录下资源文件夹类型。

<extension
         id="org.salever.rcp.marker.resFolderMarker"
         name="Resource Folder Marker"
         point="org.eclipse.core.resources.markers">
      <persistent
            value="true"> <!-- 一定要设置为true,否则重启IDE后marker就没了-->
      </persistent>
      <super
            type="org.eclipse.core.resources.bookmark"><!--加上这个类型是为了在book marker view中显示-->
      </super>
 </extension>

 

    接着在创建这类文件夹时,给它们加上这个marker,代码很简单

public static void createResourceMarker(IFolder ifolder)
            throws CoreException {
        IMarker marker;
        marker = ifolder.createMarker("org.salever.rcp.marker.resFolderMarker");
        marker.setAttribute(IMarker.MESSAGE, "Resource Folder");
        marker.setAttribute(IMarker.LOCATION, ifolder.getFullPath().toString());
   }
 


2,扩展org.eclipse.ui.decorators,区别显示res folder

<extension
         point="org.eclipse.ui.decorators">
      <decorator
            adaptable="true"
            class="org.salever.rcp.decorator.ResFolderLabelDecorator" <!-- 如果是lightweight的话,实现
                                                                                                                          ILightweightLabelDecorator-->
            icon="icons/resourece_decorator.gif"
            id="org.salever.rcp.decorator.resFolderDecorator"
            label="Resource Decorator"
            lightweight="true"
            location="BOTTOM_RIGHT"
            state="true">
         <enablement>
            <and>
               <objectClass
                     name="org.eclipse.core.resources.IFolder">
               </objectClass>
               <objectClass
                     name="org.eclipse.core.resources.IResource">
               </objectClass>
            </and>
         </enablement>
      </decorator>
 </extension>

  这个扩展的decorator只对folder类型的资源有效,重点在于类ResFolderLabelDecorator,它需要实现ILightweightLabelDecorator,去给指定的资源添加decorator。主要代码为:

@Override
    public void decorate(Object element, IDecoration decoration) {
        if (isResourceFolder(element)) {
            decoration.addOverlay(RESOURCE_FOLDER_IMAGE, // RESOURCE_FOLDER_IMAGE为decorator
                                                                                                          // 的图形,ImageDescriptor类型
                    IDecoration.BOTTOM_LEFT);

        }
    }
        public static boolean isResourceFolder(Object element) {

        if (!(element instanceof IFolder)) {
            return false;
        }
        try {
            IMarker[] markers = ((IResource) element).findMarkers(
                    "org.salever.rcp.marker.resFolderMarker", true, IResource.DEPTH_INFINITE);
            return markers.length > 0;

        } catch (CoreException e) {
            // Do nothing.
        }
        return false;
    }
 

 这时候,对于拥有org.salever.rcp.marker.resFolderMarker类型marker的文件夹,IDE就会给它添加一个decorator了,在编译和打包的时候,同样可以通过这个marker,判断指定的文件夹是否为res folder。

3,事情解决,没有用到CNF,因为目前的需求仅仅是区别某些文件夹,如果需要对某些文件进行处理,比如使proerties文件能够将内容展开,就需要使用CNF了。

 

另见http://www.ceclipse.org/read-cec-tid-27306.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值