/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd.util.viewer.gui; import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JPanel; import javax.swing.JRadioButtonMenuItem; import javax.swing.JSplitPane; import javax.swing.SwingConstants; import javax.swing.WindowConstants; import net.sourceforge.pmd.PMD; import net.sourceforge.pmd.lang.LanguageRegistry; import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.lang.ast.ParseException; import net.sourceforge.pmd.util.viewer.model.ViewerModel; import net.sourceforge.pmd.util.viewer.model.ViewerModelEvent; import net.sourceforge.pmd.util.viewer.model.ViewerModelListener; import net.sourceforge.pmd.util.viewer.util.NLS; /** * viewer's main frame * * @author Boris Gruschko ( boris at gruschko.org ) */ public class MainFrame extends JFrame implements ActionListener, ViewerModelListener { private ViewerModel model; private SourceCodePanel sourcePanel; private XPathPanel xPathPanel; private JButton evalBtn; private JLabel statusLbl; private JRadioButtonMenuItem jdk13MenuItem; private JRadioButtonMenuItem jdk14MenuItem; private JRadioButtonMenuItem jdk15MenuItem; // NOPMD private JRadioButtonMenuItem jdk16MenuItem; private JRadioButtonMenuItem jdk17MenuItem; private JRadioButtonMenuItem plsqlMenuItem; /** * constructs and shows the frame */ public MainFrame() { super(NLS.nls("MAIN.FRAME.TITLE") + " (v " + PMD.VERSION + ')'); init(); } private void init() { model = new ViewerModel(); model.addViewerModelListener(this); sourcePanel = new SourceCodePanel(model); ASTPanel astPanel = new ASTPanel(model); xPathPanel = new XPathPanel(model); getContentPane().setLayout(new BorderLayout()); JSplitPane editingPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, sourcePanel, astPanel); editingPane.setResizeWeight(0.5d); JPanel interactionsPane = new JPanel(new BorderLayout()); interactionsPane.add(xPathPanel, BorderLayout.SOUTH); interactionsPane.add(editingPane, BorderLayout.CENTER); getContentPane().add(interactionsPane, BorderLayout.CENTER); JButton compileBtn = new JButton(NLS.nls("MAIN.FRAME.COMPILE_BUTTON.TITLE")); compileBtn.setActionCommand(ActionCommands.COMPILE_ACTION); compileBtn.addActionListener(this); evalBtn = new JButton(NLS.nls("MAIN.FRAME.EVALUATE_BUTTON.TITLE")); evalBtn.setActionCommand(ActionCommands.EVALUATE_ACTION); evalBtn.addActionListener(this); evalBtn.setEnabled(false); statusLbl = new JLabel(); statusLbl.setHorizontalAlignment(SwingConstants.RIGHT); JPanel btnPane = new JPanel(new FlowLayout(FlowLayout.LEFT)); btnPane.add(compileBtn); btnPane.add(evalBtn); btnPane.add(statusLbl); getContentPane().add(btnPane, BorderLayout.SOUTH); JMenuBar menuBar = new JMenuBar(); JMenu menu = new JMenu("Language"); ButtonGroup group = new ButtonGroup(); jdk13MenuItem = new JRadioButtonMenuItem("JDK 1.3"); jdk13MenuItem.setSelected(false); group.add(jdk13MenuItem); menu.add(jdk13MenuItem); jdk14MenuItem = new JRadioButtonMenuItem("JDK 1.4"); jdk14MenuItem.setSelected(true); group.add(jdk14MenuItem); menu.add(jdk14MenuItem); jdk15MenuItem = new JRadioButtonMenuItem("JDK 1.5"); jdk15MenuItem.setSelected(false); group.add(jdk15MenuItem); menu.add(jdk15MenuItem); jdk16MenuItem = new JRadioButtonMenuItem("JDK 1.6"); jdk16MenuItem.setSelected(false); group.add(jdk16MenuItem); menu.add(jdk16MenuItem); jdk17MenuItem = new JRadioButtonMenuItem("JDK 1.7"); jdk17MenuItem.setSelected(false); group.add(jdk17MenuItem); menu.add(jdk17MenuItem); // PLSQL plsqlMenuItem = new JRadioButtonMenuItem("PLSQL"); plsqlMenuItem.setSelected(false); group.add(plsqlMenuItem); menu.add(plsqlMenuItem); menuBar.add(menu); setJMenuBar(menuBar); setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); pack(); setSize(800, 600); setVisible(true); } private LanguageVersion getLanguageVersion() { String javaName = "Java"; if (jdk14MenuItem.isSelected()) { return LanguageRegistry.getLanguage(javaName).getVersion("1.4"); } else if (jdk13MenuItem.isSelected()) { return LanguageRegistry.getLanguage(javaName).getVersion("1.3"); } else if (jdk15MenuItem.isSelected()) { return LanguageRegistry.getLanguage(javaName).getVersion("1.5"); } else if (jdk16MenuItem.isSelected()) { return LanguageRegistry.getLanguage(javaName).getVersion("1.6"); } else if (jdk17MenuItem.isSelected()) { return LanguageRegistry.getLanguage(javaName).getVersion("1.7"); } else if (plsqlMenuItem.isSelected()) { return LanguageRegistry.getLanguage("PLSQL").getDefaultVersion(); } return LanguageRegistry.getLanguage(javaName).getVersion("1.5"); } /** * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) */ @Override public void actionPerformed(ActionEvent e) { String command = e.getActionCommand(); long t0; long t1; if (ActionCommands.COMPILE_ACTION.equals(command)) { try { t0 = System.currentTimeMillis(); model.commitSource(sourcePanel.getSourceCode(), getLanguageVersion()); t1 = System.currentTimeMillis(); setStatus(NLS.nls("MAIN.FRAME.COMPILATION.TOOK") + " " + (t1 - t0) + " ms"); } catch (ParseException exc) { setStatus(NLS.nls("MAIN.FRAME.COMPILATION.PROBLEM") + " " + exc.toString()); new ParseExceptionHandler(this, exc); } } else if (ActionCommands.EVALUATE_ACTION.equals(command)) { try { t0 = System.currentTimeMillis(); model.evaluateXPathExpression(xPathPanel.getXPathExpression(), this); t1 = System.currentTimeMillis(); setStatus(NLS.nls("MAIN.FRAME.EVALUATION.TOOK") + " " + (t1 - t0) + " ms"); } catch (Exception exc) { setStatus(NLS.nls("MAIN.FRAME.EVALUATION.PROBLEM") + " " + exc.toString()); new ParseExceptionHandler(this, exc); } } } /** * Sets the status bar message * * @param string * the new status, the empty string will be set if the value is * <code>null</code> */ private void setStatus(String string) { statusLbl.setText(string == null ? "" : string); } /** * @see ViewerModelListener#viewerModelChanged(ViewerModelEvent) */ @Override public void viewerModelChanged(ViewerModelEvent e) { evalBtn.setEnabled(model.hasCompiledTree()); } }