/*******************************************************************************
* Copyright (c) 2009, 2010 Innovation Gate GmbH.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Innovation Gate GmbH - initial API and implementation
******************************************************************************/
package de.innovationgate.eclipse.editors.decorators;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.viewers.ILabelDecorator;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.LabelProviderChangedEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import de.innovationgate.eclipse.editors.helpers.DirectAccessCompositeImageDescriptor;
import de.innovationgate.eclipse.utils.wga.WGADesignStructureHelper;
public class TMLFileDecorator extends LabelProvider implements ILabelDecorator, IResourceChangeListener {
public TMLFileDecorator() {
ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE);
}
@Override
public void dispose() {
ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
super.dispose();
}
public Image decorateImage(Image image, Object element) {
DirectAccessCompositeImageDescriptor descriptor = new DirectAccessCompositeImageDescriptor(image);
if (element instanceof IFile) {
IFile file = (IFile) element;
if (file.getFileExtension() != null && file.getFileExtension().equals("tml")) {
if (WGADesignStructureHelper.isDirectAccess(file)) {
descriptor.getImageData();
return descriptor.createImage();
}
}
}
return image;
}
public String decorateText(String text, Object element) {
return text;
}
private void fireLabelEvent(final LabelProviderChangedEvent event) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
fireLabelProviderChanged(event);
}
});
}
public void resourceChanged(IResourceChangeEvent event) {
try {
final List<IResource> resourcesChanged = new ArrayList<IResource>();
event.getDelta().accept(new IResourceDeltaVisitor() {
public boolean visit(IResourceDelta delta) throws CoreException {
if (delta.getResource() instanceof IFile) {
IFile file = (IFile)delta.getResource();
if (file.getFileExtension().equals("tml")) {
resourcesChanged.add(file);
} else if (file.getFileExtension().equals("xml") && WGADesignStructureHelper.isMetadataFolder(file.getParent())) {
resourcesChanged.addAll(Arrays.asList(file.getParent().getParent().members(IResource.FILE)));
}
} else if (delta.getResource() instanceof IFolder) {
IFolder folder = (IFolder) delta.getResource();
if (WGADesignStructureHelper.isMetadataFolder(folder)) {
resourcesChanged.addAll(Arrays.asList(folder.getParent().members(IResource.FILE)));
}
}
return true;
}
});
if (resourcesChanged.size() > 0) {
fireLabelEvent(new LabelProviderChangedEvent(this,resourcesChanged.toArray()));
}
}
catch (CoreException e) {
}
}
}