blob: d5c686152fafc69451831cc7d9f855e84b61d42b [file] [log] [blame]
package org.eclipse.ptp.pldt.sampleCDTstaticAnalysis.handlers;
import java.util.Iterator;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ptp.pldt.mpi.analysis.cdt.graphs.GraphCreator;
import org.eclipse.ptp.pldt.mpi.analysis.cdt.graphs.ICallGraph;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.handlers.HandlerUtil;
/**
* This handler extends AbstractHandler, an IHandler base class. This handler
* builds a call graph for the selected resource(s) in the Project Explorer view. <br>
*
* Two steps to building call graph: <br>
* 1. collect all function definitions in the call graph <br>
* 2. construct the caller and callee relationship among the CallGraphNodes
* <br>Most of the work is done by GraphCreator
*
* @author Beth Tibbitts tibbitts@us.ibm.com
*
* @see org.eclipse.core.commands.IHandler
* @see org.eclipse.core.commands.AbstractHandler
* @see org.eclipse.ptp.pldt.mpi.analysis.cdt.graphs.GraphCreator
*/
public class BuildCallGraphHandler extends AbstractHandler implements
ISelectionListener {
private IStructuredSelection selection;
protected ICallGraph callGraph;
protected GraphCreator graphCreator;
protected IWorkbenchWindow window;
/**
* The constructor.
*/
public BuildCallGraphHandler() {
graphCreator = new GraphCreator();
}
/**
* Execute the command: extract extract the needed information from the
* application context. <br>
* A new call graph is constructed for the selected resources.
*
* @param event
* @return the result of the execution. Reserved for future use by IHandler
* interface, must be <code>null</code>.
*/
public Object execute(ExecutionEvent event) throws ExecutionException {
window = HandlerUtil.getActiveWorkbenchWindowChecked(event);
System.out.println("BuildCallGraphHandler.execute()");
// create an empty call graph to begin with
callGraph = graphCreator.initCallGraph();
// Get the current selection
if (selection == null) {
ISelection sel = HandlerUtil.getCurrentSelection(event);
if (sel instanceof IStructuredSelection) {
selection = (IStructuredSelection) sel;
}
if (selection == null) {
message("No selection detected. Please select a file, folder, or project in the Projects View.");
selection=null;
return null;
}
}
// We iterate here only to handle the possibility of multiple-selection.
// graphCreator will descend into child nodes.
for (Iterator iter = selection.iterator(); iter.hasNext();) {
Object obj = (Object) iter.next();
// It can be a Project, Folder, File, etc...
if (obj instanceof IAdaptable) {
IAdaptable iad = (IAdaptable) obj;
final IResource res = (IResource) iad.getAdapter(IResource.class);
// Note: put this in a Job or WorkspaceModifyOperation if resources
// will be changed.
if (res != null) {
callGraph = graphCreator.initCallGraph(res);
} else {
message("Please select a file, folder, or project in the Projects view");
selection=null;
return null;
}
}
}
System.out.println("resources scanned. Now search for callers/callees");
graphCreator.computeCallGraph(callGraph);
System.out.println("showCallGraph...");
graphCreator.showCallGraph(callGraph);
System.out.println("showCallGraph complete.");
return null;
}
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
if (selection instanceof IStructuredSelection) {
this.selection = (IStructuredSelection) selection;
System.out.println("BuildCallGraphHandler got selection");
}
}
public void message(String msg) {
MessageDialog.openInformation(window.getShell(),
"Houston, we have a problem", msg);
}
}