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