/******************************************************************************* * Copyright (c) 2013 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.viz.viewer; import java.awt.Component; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import javax.swing.JSplitPane; import com.ibm.wala.classLoader.IClassLoader; import com.ibm.wala.classLoader.IMethod; import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.ssa.IR; import com.ibm.wala.viz.viewer.IrViewer.SelectedPcListner; public class IrAndSourceViewer { private IrViewer irViewer; private SourceViewer sourceViewer; private IR ir; public IrAndSourceViewer(CallGraph cg) { } public Component getComponent() { JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT); irViewer = new IrViewer(); splitPane.setLeftComponent(irViewer); sourceViewer = new SourceViewer(); splitPane.setRightComponent(sourceViewer); irViewer.addSelectedPcListner(new SelectedPcListner(){ @Override public void valueChanged(int pc) { IMethod method = ir.getMethod(); int sourceLineNumber = IrViewer.NA; String sourceFileName = null; if (pc != IrViewer.NA){ try{ sourceLineNumber = method.getLineNumber(pc); IClassLoader loader = method.getDeclaringClass().getClassLoader(); sourceFileName = loader.getSourceFileName(method, pc); } catch (Exception e){ e.printStackTrace(); } } if (sourceFileName != null){ URL url; try { url = (new File(sourceFileName)).toURI().toURL(); sourceViewer.setSource(url, sourceLineNumber); } catch (MalformedURLException e) { e.printStackTrace(); } } else { sourceViewer.removeSource(); } } }); return splitPane; } public void setIRAndPc(IR ir, int pc) { this.ir = ir; irViewer.setIRAndPc(ir, pc); } public void setIR(IR ir) { this.ir = ir; irViewer.setIR(ir); } }