package com.javadude.dependencies2.views;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaModel;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.zest.core.viewers.GraphViewer;
import org.eclipse.zest.core.viewers.IGraphEntityContentProvider;
import org.eclipse.zest.layouts.LayoutStyles;
import org.eclipse.zest.layouts.algorithms.TreeLayoutAlgorithm;
import com.javadude.dependencies2.Activator;
public class DependencyGraphView extends ViewPart {
private GraphViewer viewer;
class ViewContentProvider implements IGraphEntityContentProvider {
private Map<String, IJavaProject> projects = new HashMap<String, IJavaProject>();
public Object[] getConnectedTo(Object obj) {
IJavaProject javaProject = (IJavaProject) obj;
try {
List<IJavaProject> dependencies = new ArrayList<IJavaProject>();
IClasspathEntry[] classpath = javaProject.getRawClasspath();
for (IClasspathEntry classpathEntry : classpath) {
if (classpathEntry.getEntryKind() == IClasspathEntry.CPE_PROJECT) {
IPath path = classpathEntry.getPath();
dependencies.add(projects.get(path.lastSegment()));
}
}
return dependencies.toArray();
} catch (JavaModelException e) {
Activator.error("Error getting dependencies", e);
throw new RuntimeException(e);
}
}
public Object[] getElements(Object arg0) {
try {
IJavaModel javaModel = JavaCore.create(ResourcesPlugin.getWorkspace().getRoot());
IJavaProject[] javaProjects = javaModel.getJavaProjects();
for (IJavaProject project : javaProjects) {
projects.put(project.getElementName(), project);
}
return javaProjects;
} catch (JavaModelException e) {
Activator.error("Error getting java projects", e);
throw new RuntimeException(e);
}
}
public void dispose() { /* nothing */ }
public void inputChanged(Viewer v, Object oldInput, Object newInput) { /* nothing */ }
}
class ViewLabelProvider extends LabelProvider {
@Override
public String getText(Object obj) {
if (obj instanceof IJavaProject)
return ((IJavaProject) obj).getElementName();
return null;
}
}
@Override public void createPartControl(Composite parent) {
viewer = new GraphViewer(parent, SWT.NONE);
viewer.setContentProvider(new ViewContentProvider());
viewer.setLabelProvider(new ViewLabelProvider());
viewer.setInput(getViewSite());
viewer.setLayoutAlgorithm(new TreeLayoutAlgorithm(LayoutStyles.NO_LAYOUT_NODE_RESIZING));
ResourcesPlugin.getWorkspace().addResourceChangeListener(new IResourceChangeListener() {
public void resourceChanged(IResourceChangeEvent event) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
viewer.refresh();
viewer.applyLayout();
}
});
}
});
getSite().setSelectionProvider(viewer);
// Create the help context id for the viewer's control
PlatformUI.getWorkbench().getHelpSystem().setHelp(viewer.getControl(), "com.javadude.dependencies2.viewer");
}
@Override public void setFocus() {
viewer.getControl().setFocus();
}
}