/**
* Copyright (c) 2009-2011, The HATS Consortium. All rights reserved.
* This file is licensed under the terms of the Modified BSD License.
*/
package org.absmodels.abs.plugin.decorators;
import static org.absmodels.abs.plugin.util.Constants.MODULE_DECORATOR_ID;
import static org.absmodels.abs.plugin.util.Images.FOLDER_MARKER;
import java.util.ArrayList;
import org.absmodels.abs.plugin.Activator;
import org.absmodels.abs.plugin.util.UtilityFunctions;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.DecorationOverlayIcon;
import org.eclipse.jface.viewers.IDecoration;
import org.eclipse.jface.viewers.ILightweightLabelDecorator;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.LabelProviderChangedEvent;
import org.eclipse.ui.PlatformUI;
/**
* This Decorator is used for decorating folders with the ABS project icon. Only
* those folders containing ABS files or contain folders with ABS files are
* decorated
*
* @author cseise
*
*/
public class FolderDecorator extends LabelProvider implements ILightweightLabelDecorator {
private final static ImageDescriptor MARKER_DESCRIPTOR = DecorationOverlayIcon.createFromImage(FOLDER_MARKER);
@Override
public void decorate(Object element, IDecoration decoration) {
if (element instanceof IFolder){
if (hasABSFiles((IFolder)element)){
decoration.addOverlay(MARKER_DESCRIPTOR);
}
} else if (element instanceof IFile){
if (UtilityFunctions.isABSPackage((IFile)element)) {
//if (checkFile((IResource)element)){
decoration.addOverlay(MARKER_DESCRIPTOR);
//}
}
}
}
private boolean hasABSFiles(IFolder folder) {
if (folder.isAccessible()) {
try {
IResource[] members = folder.members();
for (IResource member : getNonFolders(members)) {
if(checkFile(member)){
return true;
}
}
for (IResource member : getFolders(members)) {
if (hasABSFiles((IFolder) member)) {
return true;
}
}
} catch (CoreException e) {
Activator.logException(e);
return false;
}
}
return false;
}
private static boolean checkFile(IResource member) {
return UtilityFunctions.isABSSourceFile(member);
}
private static ArrayList<IFolder> getFolders(IResource[] members) {
ArrayList<IFolder> folders = new ArrayList<IFolder>();
for (IResource member : members){
if (member instanceof IFolder){
folders.add((IFolder)member);
}
}
return folders;
}
private static ArrayList<IResource> getNonFolders(IResource[] members) {
ArrayList<IResource> res = new ArrayList<IResource>();
for (IResource member : members){
if (!(member instanceof IFolder)){
res.add((IResource)member);
}
}
return res;
}
/**
* Fires a LabelProviderChangeEvent to force re-decoration.
* This is a workaround for circumventing decorator update problems.
*/
public void refresh(){
boolean isEnabled = PlatformUI.getWorkbench().getDecoratorManager().getEnabled(MODULE_DECORATOR_ID);
if (isEnabled){
this.fireLabelProviderChanged(new LabelProviderChangedEvent(this));
}
}
}