原始贴子见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了。
本文介绍如何在Eclipse中通过自定义标记和装饰器来区分并处理特定的资源文件夹,使得编译和打包过程更加灵活。具体步骤包括扩展资源标记、实现文件夹装饰器以及利用标记进行资源识别。

被折叠的 条评论
为什么被折叠?



