1 package net.sourceforge.pmd.util.viewer.gui;
2
3 import net.sourceforge.pmd.TargetJDK1_3;
4 import net.sourceforge.pmd.TargetJDK1_4;
5 import net.sourceforge.pmd.TargetJDK1_5;
6 import net.sourceforge.pmd.TargetJDKVersion;
7 import net.sourceforge.pmd.ast.ParseException;
8 import net.sourceforge.pmd.util.viewer.model.ViewerModel;
9 import net.sourceforge.pmd.util.viewer.model.ViewerModelEvent;
10 import net.sourceforge.pmd.util.viewer.model.ViewerModelListener;
11 import net.sourceforge.pmd.util.viewer.util.NLS;
12
13 import javax.swing.*;
14 import java.awt.BorderLayout;
15 import java.awt.FlowLayout;
16 import java.awt.event.ActionEvent;
17 import java.awt.event.ActionListener;
18
19
20 /***
21 * viewer's main frame
22 *
23 * @author Boris Gruschko ( boris at gruschko.org )
24 * @version $Id: MainFrame.java,v 1.13 2006/02/10 14:15:31 tomcopeland Exp $
25 */
26
27 public class MainFrame
28 extends JFrame
29 implements ActionListener, ActionCommands, ViewerModelListener {
30 private ViewerModel model;
31 private SourceCodePanel sourcePanel;
32 private ASTPanel astPanel;
33 private XPathPanel xPathPanel;
34 private JButton compileBtn;
35 private JButton evalBtn;
36 private JLabel statusLbl;
37 private JRadioButtonMenuItem jdk13MenuItem;
38 private JRadioButtonMenuItem jdk14MenuItem;
39 private JRadioButtonMenuItem jdk15MenuItem;
40
41 /***
42 * constructs and shows the frame
43 */
44 public MainFrame() {
45 super(NLS.nls("MAIN.FRAME.TITLE"));
46 init();
47 }
48
49 private void init() {
50 model = new ViewerModel();
51 model.addViewerModelListener(this);
52 sourcePanel = new SourceCodePanel(model);
53 astPanel = new ASTPanel(model);
54 xPathPanel = new XPathPanel(model);
55 getContentPane().setLayout(new BorderLayout());
56 JSplitPane editingPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, sourcePanel, astPanel);
57 editingPane.setResizeWeight(0.5d);
58 JPanel interactionsPane = new JPanel(new BorderLayout());
59 interactionsPane.add(xPathPanel, BorderLayout.SOUTH);
60 interactionsPane.add(editingPane, BorderLayout.CENTER);
61 getContentPane().add(interactionsPane, BorderLayout.CENTER);
62 compileBtn = new JButton(NLS.nls("MAIN.FRAME.COMPILE_BUTTON.TITLE"));
63 compileBtn.setActionCommand(COMPILE_ACTION);
64 compileBtn.addActionListener(this);
65 evalBtn = new JButton(NLS.nls("MAIN.FRAME.EVALUATE_BUTTON.TITLE"));
66 evalBtn.setActionCommand(EVALUATE_ACTION);
67 evalBtn.addActionListener(this);
68 evalBtn.setEnabled(false);
69 statusLbl = new JLabel();
70 statusLbl.setHorizontalAlignment(SwingConstants.RIGHT);
71 JPanel btnPane = new JPanel(new FlowLayout(FlowLayout.LEFT));
72 btnPane.add(compileBtn);
73 btnPane.add(evalBtn);
74 btnPane.add(statusLbl);
75 getContentPane().add(btnPane, BorderLayout.SOUTH);
76
77 JMenuBar menuBar = new JMenuBar();
78 JMenu menu = new JMenu("JDK");
79 ButtonGroup group = new ButtonGroup();
80 jdk13MenuItem = new JRadioButtonMenuItem("JDK 1.3");
81 jdk13MenuItem.setSelected(false);
82 group.add(jdk13MenuItem);
83 menu.add(jdk13MenuItem);
84 jdk14MenuItem = new JRadioButtonMenuItem("JDK 1.4");
85 jdk14MenuItem.setSelected(true);
86 group.add(jdk14MenuItem);
87 menu.add(jdk14MenuItem);
88 jdk15MenuItem = new JRadioButtonMenuItem("JDK 1.5");
89 jdk15MenuItem.setSelected(false);
90 group.add(jdk15MenuItem);
91 menu.add(jdk15MenuItem);
92 menuBar.add(menu);
93 setJMenuBar(menuBar);
94
95 setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
96 pack();
97 setSize(800, 600);
98 setVisible(true);
99 }
100
101 private TargetJDKVersion createJDKVersion() {
102 if (jdk14MenuItem.isSelected()) {
103 return new TargetJDK1_4();
104 } else if (jdk13MenuItem.isSelected()) {
105 return new TargetJDK1_3();
106 }
107 return new TargetJDK1_5();
108 }
109
110 /***
111 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
112 */
113 public void actionPerformed(ActionEvent e) {
114 String command = e.getActionCommand();
115 long t0, t1;
116 if (command.equals(COMPILE_ACTION)) {
117 try {
118 t0 = System.currentTimeMillis();
119 model.commitSource(sourcePanel.getSourceCode(), createJDKVersion());
120 t1 = System.currentTimeMillis();
121 setStatus(NLS.nls("MAIN.FRAME.COMPILATION.TOOK") + " " + (t1 - t0) + " ms");
122 } catch (ParseException exc) {
123 setStatus(NLS.nls("MAIN.FRAME.COMPILATION.PROBLEM") + " " + exc.toString());
124 new ParseExceptionHandler(this, exc);
125 }
126 } else if (command.equals(EVALUATE_ACTION)) {
127 try {
128 t0 = System.currentTimeMillis();
129 model.evaluateXPathExpression(xPathPanel.getXPathExpression(), this);
130 t1 = System.currentTimeMillis();
131 setStatus(NLS.nls("MAIN.FRAME.EVALUATION.TOOK") + " " + (t1 - t0) + " ms");
132 } catch (Exception exc) {
133 setStatus(NLS.nls("MAIN.FRAME.EVALUATION.PROBLEM") + " " + exc.toString());
134 new ParseExceptionHandler(this, exc);
135 }
136 }
137 }
138
139 /***
140 * Sets the status bar message
141 *
142 * @param string the new status, the empty string will be set if the value is <code>null</code>
143 */
144 private void setStatus(String string) {
145 statusLbl.setText(string == null ? "" : string);
146 }
147
148 /***
149 * @see ViewerModelListener#viewerModelChanged(ViewerModelEvent)
150 */
151 public void viewerModelChanged(ViewerModelEvent e) {
152 evalBtn.setEnabled(model.hasCompiledTree());
153 }
154 }