/* * Copyright (C) 2006, 2007 Dennis Hunziker, Ueli Kistler */ package ch.hsr.ukistler.astgraph; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.FlowLayout; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.SwingUtilities; import javax.swing.filechooser.FileFilter; import org.jgraph.JGraph; import org.jgraph.graph.DefaultGraphCell; import org.jgraph.graph.DefaultGraphModel; import org.jgraph.graph.GraphConstants; import org.jgraph.graph.GraphLayoutCache; import org.jgraph.graph.GraphModel; import org.python.pydev.parser.jython.SimpleNode; import com.aptana.shared_core.structure.Tuple; public class GraphView extends JFrame { /** * */ private static final long serialVersionUID = -3925214828169513991L; private JPanel boxPanel = null; private JFileChooser fc = null; private JGraph graph = null; private JScrollPane graphpane = null; private JPanel navPane = null; private JButton saveImage = null; private JButton loadPython = null; /** * This method initializes * */ public GraphView() { super("Python AST Viewer"); initialize(); } /** * This method initializes this * */ private void initialize() { this.fc = new JFileChooser(); this.setContentPane(getBoxPanel()); this.setSize(new Dimension(640, 480)); this.pack(); this.setExtendedState(javax.swing.JFrame.MAXIMIZED_BOTH); } /** * This method initializes boxPanel * * @return javax.swing.JPanel */ private JPanel getBoxPanel() { if (boxPanel == null) { boxPanel = new JPanel(); boxPanel.setLayout(new BorderLayout()); boxPanel.add(getNavPane(), BorderLayout.NORTH); boxPanel.add(getGraphpane(), BorderLayout.CENTER); } return boxPanel; } /** * This method initializes graphpane * * @return javax.swing.JScrollPane */ private JScrollPane getGraphpane() { if (graphpane == null) { graphpane = new JScrollPane(); this.graph = setupGraph(); graphpane.setViewportView(this.graph); } return graphpane; } /** * This method initializes navPane * * @return javax.swing.JPanel */ private JPanel getNavPane() { if (navPane == null) { navPane = new JPanel(); navPane.setLayout(new FlowLayout()); navPane.add(getSaveImage()); navPane.add(getLoadPython()); } return navPane; } /** * This method initializes saveImage * * @return javax.swing.JButton */ private JButton getSaveImage() { if (saveImage == null) { saveImage = new JButton(); saveImage.setText("Save as PNG"); saveImage.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent event) { FileFilter filter = new PNGFilter(); try { fc.addChoosableFileFilter(filter); int returnVal = fc.showSaveDialog(GraphView.this); if (returnVal == JFileChooser.APPROVE_OPTION) { File file = fc.getSelectedFile(); createImage(file.getAbsolutePath()); } } finally { fc.removeChoosableFileFilter(filter); } } }); } return saveImage; } /** * This method initializes loadPython * * @return javax.swing.JButton */ private JButton getLoadPython() { if (loadPython == null) { loadPython = new JButton(); loadPython.setText("Load Python source"); loadPython.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent event) { FileFilter filter = new PythonFilter(); try { fc.addChoosableFileFilter(filter); int returnVal = fc.showOpenDialog(GraphView.this); if (returnVal == JFileChooser.APPROVE_OPTION) { File file = fc.getSelectedFile(); loadGraph(file.getAbsolutePath()); } } catch (Throwable e) { JOptionPane msgbox = new JOptionPane("Error writing file: " + e.getMessage()); msgbox.setVisible(true); } finally { fc.removeChoosableFileFilter(filter); } } }); } return loadPython; } private JGraph setupGraph() { // Construct Model and Graph GraphModel model = new DefaultGraphModel(); JGraph graph = new JGraph(model); // Control-drag should clone selection graph.setCloneable(true); // Enable edit without final RETURN keystroke graph.setInvokesStopCellEditing(true); // When over a cell, jump to its default port (we only have one, anyway) graph.setJumpToDefaultPort(true); return graph; } private void loadGraph(String fileName) throws FileNotFoundException, IOException, Throwable { ASTGraph ast = new ASTGraph(); Tuple<SimpleNode, Throwable> objects = ast.parseFile(fileName); graph.setGraphLayoutCache(new GraphLayoutCache()); DefaultGraphCell[] cells = ast.generateTree(objects.o1); graph.getGraphLayoutCache().insert(cells); graph.clearSelection(); } private void createImage(String imageName) { if (graph == null) { return; } try { ImageWriter writer; writer = new ImageWriter(graph.getImage(null, GraphConstants.DEFAULTINSET), imageName); SwingUtilities.invokeLater(writer); } catch (Throwable e) { JOptionPane msgbox = new JOptionPane("Error writing file: " + e.getMessage()); msgbox.setVisible(true); } } class PNGFilter extends javax.swing.filechooser.FileFilter { public boolean accept(File file) { if (file.isDirectory()) return true; String filename = file.getName(); return filename.endsWith(".png"); } public String getDescription() { return "PNG image (*.png)"; } } class PythonFilter extends javax.swing.filechooser.FileFilter { public boolean accept(File file) { if (file.isDirectory()) return true; String filename = file.getName(); return filename.endsWith(".py"); } public String getDescription() { return "Python Source code (*.py)"; } } } // @jve:decl-index=0:visual-constraint="10,10"