原始贴子见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了。