blob: 4b08da0f616792115c068350bc8b81c57eb007a8 [file] [log] [blame]
package org.eclipse.cdt.make.ui;
/*
* (c) Copyright QNX Software Systems Ltd. 2002. All Rights Reserved.
*/
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.cdt.make.core.IMakeTarget;
import org.eclipse.cdt.make.core.IMakeTargetListener;
import org.eclipse.cdt.make.core.MakeCorePlugin;
import org.eclipse.cdt.make.core.MakeTargetEvent;
import org.eclipse.core.resources.IContainer;
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.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.widgets.Control;
public class MakeContentProvider implements ITreeContentProvider, IMakeTargetListener, IResourceChangeListener {
protected boolean bFlatten;
protected StructuredViewer viewer;
/**
* Constructor for MakeContentProvider
*/
public MakeContentProvider() {
this(false);
}
public MakeContentProvider(boolean flat) {
bFlatten = flat;
}
public Object[] getChildren(Object obj) {
if (obj instanceof IWorkspaceRoot) {
try {
return MakeCorePlugin.getDefault().getTargetManager().getTargetBuilderProjects();
} catch (CoreException e) {
}
} else if (obj instanceof IContainer) {
ArrayList children = new ArrayList();
try {
IResource[] resource = ((IContainer) obj).members();
for (int i = 0; i < resource.length; i++) {
if (resource[i] instanceof IContainer) {
children.add(resource[i]);
}
}
children.addAll(Arrays.asList(MakeCorePlugin.getDefault().getTargetManager().getTargets((IContainer) obj)));
} catch (CoreException e) {
}
return children.toArray();
}
return new Object[0];
}
public Object getParent(Object obj) {
if (obj instanceof IMakeTarget) {
return ((IMakeTarget) obj).getContainer();
} else if (obj instanceof IContainer) {
return ((IContainer) obj).getParent();
}
return null;
}
public boolean hasChildren(Object obj) {
return getChildren(obj).length > 0;
}
public Object[] getElements(Object obj) {
if (bFlatten) {
List list = new ArrayList();
Object[] children = getChildren(obj);
for (int i = 0; i < children.length; i++) {
list.add(children[i]);
list.addAll(Arrays.asList(getElements(children[i])));
}
return list.toArray();
}
return getChildren(obj);
}
public void dispose() {
if (viewer != null) {
MakeCorePlugin.getDefault().getTargetManager().removeListener(this);
}
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
if (this.viewer == null) {
MakeCorePlugin.getDefault().getTargetManager().addListener(this);
}
this.viewer = (StructuredViewer) viewer;
IWorkspace oldWorkspace = null;
IWorkspace newWorkspace = null;
if (oldInput instanceof IWorkspace) {
oldWorkspace = (IWorkspace) oldInput;
} else if (oldInput instanceof IContainer) {
oldWorkspace = ((IContainer) oldInput).getWorkspace();
}
if (newInput instanceof IWorkspace) {
newWorkspace = (IWorkspace) newInput;
} else if (newInput instanceof IContainer) {
newWorkspace = ((IContainer) newInput).getWorkspace();
}
if (oldWorkspace != newWorkspace) {
if (oldWorkspace != null) {
oldWorkspace.removeResourceChangeListener(this);
}
if (newWorkspace != null) {
newWorkspace.addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE);
}
}
}
public void targetChanged(final MakeTargetEvent event) {
final Control ctrl = viewer.getControl();
if (ctrl != null && !ctrl.isDisposed()) {
switch (event.getType()) {
case MakeTargetEvent.PROJECT_ADDED :
case MakeTargetEvent.PROJECT_REMOVED :
ctrl.getDisplay().syncExec(new Runnable() {
public void run() {
if (ctrl != null && !ctrl.isDisposed()) {
viewer.refresh();
}
}
});
break;
case MakeTargetEvent.TARGET_ADD :
case MakeTargetEvent.TARGET_CHANGED :
case MakeTargetEvent.TARGET_REMOVED :
ctrl.getDisplay().syncExec(new Runnable() {
public void run() {
if (ctrl != null && !ctrl.isDisposed()) {
if (bFlatten) {
viewer.refresh();
} else {
viewer.refresh(event.getTarget().getContainer());
}
}
}
});
break;
}
}
}
void processDelta(IResourceDelta delta) {
// Bail out if the widget was disposed.
Control ctrl = viewer.getControl();
if (ctrl == null || ctrl.isDisposed() || delta == null) {
return;
}
// Get the affected resource
IResource resource = delta.getResource();
IResourceDelta[] affectedChildren = delta.getAffectedChildren(IResourceDelta.CHANGED);
// Not interested in Content changes.
for (int i = 0; i < affectedChildren.length; i++) {
if ((affectedChildren[i].getFlags() & IResourceDelta.TYPE) != 0) {
return;
}
}
// Handle changed children recursively.
for (int i = 0; i < affectedChildren.length; i++) {
processDelta(affectedChildren[i]);
}
// Handle removed children. Issue one update for all removals.
affectedChildren = delta.getAffectedChildren(IResourceDelta.REMOVED);
if (affectedChildren.length > 0) {
ArrayList affected = new ArrayList(affectedChildren.length);
for (int i = 0; i < affectedChildren.length; i++) {
if (affectedChildren[i].getResource() instanceof IContainer) {
affected.add(affectedChildren[i].getResource());
}
}
if (affected.size() != 0) {
if (viewer instanceof AbstractTreeViewer) {
((AbstractTreeViewer) viewer).remove(affected.toArray());
} else {
viewer.refresh(resource);
}
}
}
// Handle added children. Issue one update for all insertions.
affectedChildren = delta.getAffectedChildren(IResourceDelta.ADDED);
if (affectedChildren.length > 0) {
ArrayList affected = new ArrayList(affectedChildren.length);
for (int i = 0; i < affectedChildren.length; i++) {
if (affectedChildren[i].getResource() instanceof IContainer) {
affected.add(affectedChildren[i].getResource());
}
}
if (affected.size() != 0) {
if (viewer instanceof AbstractTreeViewer) {
((AbstractTreeViewer) viewer).add(resource, affected.toArray());
} else {
viewer.refresh(resource);
}
}
}
}
public void resourceChanged(IResourceChangeEvent event) {
final IResourceDelta delta = event.getDelta();
Control ctrl = viewer.getControl();
if (ctrl != null && !ctrl.isDisposed()) {
// Do a sync exec, not an async exec, since the resource delta
// must be traversed in this method. It is destroyed
// when this method returns.
ctrl.getDisplay().syncExec(new Runnable() {
public void run() {
processDelta(delta);
}
});
}
}
}