package de.ovgu.cide.navigator;
import java.util.Collection;
import java.util.Collections;
import org.eclipse.core.resources.IResource;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.navigator.CommonNavigator;
import org.eclipse.ui.navigator.CommonViewer;
import org.eclipse.ui.navigator.resources.ProjectExplorer;
import de.ovgu.cide.ASTColorChangedEvent;
import de.ovgu.cide.ChangeType;
import de.ovgu.cide.ColorListChangedEvent;
import de.ovgu.cide.FileColorChangedEvent;
import de.ovgu.cide.IColorChangeListener;
/**
* listens to changes to the .dircolor files and publishes them as
* FileColorChangedEvent events (which are used to update the colors and filters
* in the view)
*
* @author ckaestne
*
*/
public class FileColorUpdater implements IColorChangeListener {
public void astColorChanged(ASTColorChangedEvent event) {
// ignore, does not affect resource view
}
public void fileColorChanged(FileColorChangedEvent event) {
refresh(event.getAffectedFolders());
}
/**
*
* @param items
* null-> draw all
*/
private void refresh(final Collection<? extends IResource> items) {
Display.getDefault().syncExec(new Runnable() {
public void run() {
IWorkbench wb = PlatformUI.getWorkbench();
IWorkbenchWindow ww = wb.getActiveWorkbenchWindow();
IWorkbenchPage ap = ww.getActivePage();
IViewPart view = ap.findView(ProjectExplorer.VIEW_ID);
if (view instanceof CommonNavigator) {
CommonViewer viewer = ((CommonNavigator) view)
.getCommonViewer();
try {
viewer.getControl().setRedraw(false);
if (items == null)
viewer.refresh(true);
else
for (IResource folder : items)
viewer.refresh(folder, true);
} finally {
viewer.getControl().setRedraw(true);
}
}
}
});
}
public void colorListChanged(ColorListChangedEvent event) {
if (event.anyChangeOf(ChangeType.COLOR))
refresh(Collections.singleton(event.getProject()));
}
}