/******************************************************************************* * Copyright (c) 2008 Scott Stanchfield * 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 *******************************************************************************/ package com.javadude.dependencies.editparts; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.draw2d.Figure; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.draw2d.graph.CompoundDirectedGraph; import org.eclipse.draw2d.graph.Node; import org.eclipse.draw2d.graph.Subgraph; import org.eclipse.gef.editparts.AbstractGraphicalEditPart; import org.eclipse.jdt.core.ElementChangedEvent; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IElementChangedListener; import org.eclipse.jdt.core.IJavaElementDelta; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.swt.widgets.Display; import com.javadude.dependencies.DependenciesPlugin; import com.javadude.dependencies.Dependency; public class WorkspaceRootEditPart extends AbstractGraphicalEditPart implements GraphContributor { public WorkspaceRootEditPart() { JavaCore.addElementChangedListener(new IElementChangedListener() { public void elementChanged(final ElementChangedEvent event) { Display.getDefault().asyncExec(new Runnable() { public void run() { //get the workspace changes from the ElementChangedEvent IJavaElementDelta[] changedChildren = event.getDelta().getAffectedChildren(); boolean refreshProjects = false; for (int i = 0; i < changedChildren.length; i++) { IJavaElementDelta delta = changedChildren[i]; //If the changed element is a java project if (delta.getElement() instanceof IJavaProject) { refreshProjects = true; } } refresh(); if (refreshProjects) { for (@SuppressWarnings("rawtypes") Iterator iter = getChildren().iterator(); iter.hasNext();) { AbstractGraphicalEditPart editPart = (AbstractGraphicalEditPart) iter.next(); editPart.refresh(); } } } }); } }); } @Override protected IFigure createFigure() { Figure tempFigure = new Figure(); tempFigure.setOpaque(true); // set the layout manager to be a graph layout manager. this will ensure the user // does not move the project or dependencies in the view. tempFigure.setLayoutManager(new GraphLayoutManager(this)); return tempFigure; } @Override protected void refreshVisuals() { super.refreshVisuals(); } @SuppressWarnings("rawtypes") @Override protected List getModelChildren() { List<String> geronimoLibs = new ArrayList<String>(); // return the java projects IWorkspaceRoot root = (IWorkspaceRoot) getModel(); List<IJavaProject> javaProjects = new ArrayList<IJavaProject>(); Map<IPath, IJavaProject> projectFinder = new HashMap<IPath, IJavaProject>(); for (int i = 0; i < root.getProjects().length; i++) { IProject project = root.getProjects()[i]; try { if (project.isOpen() && project.hasNature(JavaCore.NATURE_ID)) { IJavaProject javaProject = JavaCore.create(project); javaProjects.add(javaProject); projectFinder.put(javaProject.getPath(), javaProject); } } catch (CoreException e) { DependenciesPlugin.error(142, "Could not check project nature", e); } } // need to make this more efficient -- should only process deltas // set up dependencies DependencyManager.clear(); for (Iterator iter = javaProjects.iterator(); iter.hasNext();) { IJavaProject project = (IJavaProject) iter.next(); try { IClasspathEntry[] rawClasspath = project.getRawClasspath(); for (int i = 0; i < rawClasspath.length; i++) { IClasspathEntry entry = rawClasspath[i]; if (entry.getEntryKind() == IClasspathEntry.CPE_PROJECT) { IPath path = entry.getPath(); IJavaProject targetProject = projectFinder.get(path); Dependency dependency = new Dependency(project, targetProject, entry.isExported()); DependencyManager.add(dependency); } } } catch (JavaModelException e) { DependenciesPlugin.error(342, "Could not get classpath", e); } } List<Object> results = new ArrayList<Object>(javaProjects); results.addAll(geronimoLibs); return results; } @Override protected void createEditPolicies() { // do nothing } @SuppressWarnings("unchecked") public void contributeNodesToGraph(CompoundDirectedGraph graph, Subgraph s, @SuppressWarnings("rawtypes") Map map) { // GraphAnimation.recordInitialState(getContentPane()); Subgraph me = new Subgraph(this, s); // me.rowOrder = getActivity().getSortIndex(); me.outgoingOffset = 5; me.incomingOffset = 5; // IFigure fig = getFigure(); me.innerPadding = GraphContributor.INNER_PADDING; me.setPadding(GraphContributor.PADDING); map.put(this, me); graph.nodes.add(me); for (int i = 0; i < getChildren().size(); i++) { GraphContributor activity = (GraphContributor)getChildren().get(i); activity.contributeNodesToGraph(graph, me, map); } } public void contributeEdgesToGraph(CompoundDirectedGraph graph, @SuppressWarnings("rawtypes") Map map) { @SuppressWarnings("rawtypes") List outgoing = getSourceConnections(); for (int i = 0; i < outgoing.size(); i++) { DependencyEditPart part = (DependencyEditPart)getSourceConnections().get(i); part.contributeToGraph(graph, map); } for (int i = 0; i < getChildren().size(); i++) { GraphContributor child = (GraphContributor)children.get(i); child.contributeEdgesToGraph(graph, map); } } protected void applyChildrenResults(CompoundDirectedGraph graph, @SuppressWarnings("rawtypes") Map map) { for (int i = 0; i < getChildren().size(); i++) { GraphContributor part = (GraphContributor)getChildren().get(i); part.applyGraphResults(graph, map); } } public void applyGraphResults(CompoundDirectedGraph graph, @SuppressWarnings("rawtypes") Map map) { Node n = (Node)map.get(this); getFigure().setBounds(new Rectangle(n.x, n.y, n.width, n.height)); for (int i = 0; i < getSourceConnections().size(); i++) { DependencyEditPart trans = (DependencyEditPart) getSourceConnections().get(i); trans.applyGraphResults(graph, map); } applyChildrenResults(graph, map); } }