/******************************************************************************* * Copyright (c) 2002 - 2006 IBM Corporation. * 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 * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package com.ibm.wala.ide.ui; import org.eclipse.jface.action.Action; import org.eclipse.jface.viewers.IStructuredSelection; import com.ibm.wala.ipa.callgraph.CGNode; import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.ssa.IR; import com.ibm.wala.util.WalaException; import com.ibm.wala.viz.PDFViewUtil; /** * An SWT action that spawns spawns a ghostview to see the IR for a call graph node which is the current selection in a tree viewer. */ public class ViewIRAction extends Action { /** * Governing tree viewer */ private final SWTTreeViewer viewer; /** * Governing call graph */ private final CallGraph cg; /** * name of postscript file to generate */ private final String psFile; /** * name of dot file to generate */ private final String dotFile; /** * path to dot.exe */ private final String dotExe; /** * path to ghostview executable */ private final String gvExe; /** * @param viewer Governing tree viewer * @param cg Governing call graph */ public ViewIRAction(SWTTreeViewer viewer, CallGraph cg, String psFile, String dotFile, String dotExe, String gvExe) { if (viewer == null) { throw new IllegalArgumentException("null viewer"); } this.viewer = viewer; this.cg = cg; this.psFile = psFile; this.dotFile = dotFile; this.dotExe = dotExe; this.gvExe = gvExe; setText("View IR"); } /** * @see org.eclipse.jface.action.IAction#run() * * @throws IllegalStateException if the viewer is not running */ @Override public void run() { IR ir = getIRForSelection(); // spawn the viewer System.err.println("Spawn IR Viewer for " + ir.getMethod()); try { PDFViewUtil.ghostviewIR(cg.getClassHierarchy(), ir, psFile, dotFile, dotExe, gvExe); } catch (WalaException e) { e.printStackTrace(); } } /** * @throws IllegalStateException if the viewer is not running */ protected IR getIRForSelection() { // we assume the tree viewer's current selection is a CGNode IStructuredSelection selection = viewer.getSelection(); if (selection.size() != 1) { throw new UnsupportedOperationException("did not expect selection of size " + selection.size()); } CGNode first = (CGNode) selection.getFirstElement(); // get the IR for the node return first.getIR(); } protected CGNode getNodeForSelection() { // we assume the tree viewer's current selection is a CGNode IStructuredSelection selection = viewer.getSelection(); if (selection.size() != 1) { throw new UnsupportedOperationException("did not expect selection of size " + selection.size()); } CGNode first = (CGNode) selection.getFirstElement(); return first; } protected SWTTreeViewer getViewer() { return viewer; } protected CallGraph getCg() { return cg; } protected String getDotExe() { return dotExe; } protected String getDotFile() { return dotFile; } protected String getGvExe() { return gvExe; } protected String getPsFile() { return psFile; } }