package de.ovgu.cide.colorfilter; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Set; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IResource; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.swt.widgets.Display; 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 color changes and updates the view (including the filter) at the * according positions * * * @author cKaestner * */ public class ColorFilterUpdater implements IColorChangeListener { private StructuredViewer viewer; private IAction filterAction; ColorFilterUpdater(EnableColorFilterAction action, StructuredViewer viewer) { this.viewer = viewer; this.filterAction = action; } public void astColorChanged(ASTColorChangedEvent event) { if (filterAction.isChecked()) update(Collections.singleton(event.getColoredSourceFile() .getResource().getParent())); } public void fileColorChanged(FileColorChangedEvent event) { if (filterAction.isChecked()) { Set<IContainer> parentFolders = new HashSet<IContainer>(); for (IContainer container : event.getAffectedFolders()) parentFolders.add(container.getParent()); update(parentFolders); } } private void update(final Collection<? extends IResource> resources) { Display.getDefault().syncExec(new Runnable() { public void run() { try { viewer.getControl().setRedraw(false); for (IResource res : resources) if (res != null) viewer.refresh(res, false); } finally { viewer.getControl().setRedraw(true); } } }); } public void colorListChanged(ColorListChangedEvent event) { if (filterAction.isChecked()) if (event.anyChangeOf(ChangeType.COLOR) || event.anyChangeOf(ChangeType.VISIBILITY)) update(Collections.singleton(event.getProject())); } }