1 package net.sourceforge.pmd.swingui;
2
3 import net.sourceforge.pmd.PMDDirectory;
4 import net.sourceforge.pmd.PMDException;
5 import net.sourceforge.pmd.swingui.event.ListenerList;
6 import net.sourceforge.pmd.swingui.event.SetupFilesEvent;
7 import net.sourceforge.pmd.swingui.event.SetupFilesEventListener;
8
9 import javax.swing.ImageIcon;
10 import javax.swing.JFrame;
11 import javax.swing.JMenuBar;
12 import javax.swing.JTabbedPane;
13 import javax.swing.UIManager;
14 import javax.swing.event.ChangeEvent;
15 import javax.swing.event.ChangeListener;
16 import java.awt.Component;
17 import java.awt.Cursor;
18 import java.awt.Dimension;
19 import java.awt.Toolkit;
20 import java.awt.event.MouseAdapter;
21 import java.awt.event.MouseEvent;
22 import java.io.File;
23
24 /***
25 *
26 * @author Donald A. Leckie
27 * @since August 17, 2002
28 * @version $Revision: 1.38 $, $Date: 2003/05/28 18:08:32 $
29 */
30 public class PMDViewer extends JFrame {
31
32 private int m_disabledCounter;
33 private boolean m_firstLayout = true;
34 private TabbedPane m_tabbedPane;
35 private GlassPaneMouseListener m_glassPaneMouseListener;
36 private static PMDViewer m_pmdViewer;
37
38 /***
39 *******************************************************************************
40 *
41 */
42 private PMDViewer() {
43 super("PMD Java Source Code Analyzer");
44
45 Dimension windowSize;
46 Dimension screenSize;
47
48 m_pmdViewer = this;
49 windowSize = ComponentFactory.adjustWindowSize(1200, 1000);
50 screenSize = Toolkit.getDefaultToolkit().getScreenSize();
51
52 if (windowSize.width >= screenSize.width) {
53 windowSize.width = screenSize.width - 10;
54 }
55
56 if (windowSize.height >= screenSize.height) {
57 windowSize.height = screenSize.height - 20;
58 }
59
60 int windowLocationX = (screenSize.width - windowSize.width) / 2;
61 int windowLocationY = (screenSize.height - windowSize.height) / 2;
62
63 setSize(windowSize);
64 setLocation(windowLocationX, windowLocationY);
65 setResizable(true);
66 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
67
68 try {
69 PMDDirectory.open(Preferences.getPreferences().getCurrentPathToPMD());
70 } catch (PMDException pmdException) {
71 String message = pmdException.getMessage();
72 Exception exception = pmdException.getReason();
73 MessageDialog.show(this, message, exception);
74 }
75
76 m_tabbedPane = new TabbedPane();
77 getContentPane().add(m_tabbedPane);
78
79 ImageIcon image = (ImageIcon) UIManager.get("pmdLogoImage");
80 setIconImage(image.getImage());
81
82 m_glassPaneMouseListener = new GlassPaneMouseListener();
83 ListenerList.addListener((SetupFilesEventListener) new SetupFilesEventHandler());
84 }
85
86 /***
87 *********************************************************************************
88 *
89 */
90 public void setVisible(boolean visible) {
91 super.setVisible(visible);
92
93 if (visible && m_firstLayout) {
94 m_tabbedPane.adjustSplitPaneDividerLocation();
95 m_firstLayout = false;
96 }
97 }
98
99 /***
100 *********************************************************************************
101 *
102 * @return
103 */
104 public static final PMDViewer getViewer() {
105 return m_pmdViewer;
106 }
107
108 /***
109 *********************************************************************************
110 *
111 */
112 public static final void run() {
113 try {
114 LoadRootDirectories loadRootDirectories = new LoadRootDirectories();
115 loadRootDirectories.start();
116
117 // Setup the User Interface based on this computer's operating system.
118 // This must be done before calling Java and Swing classes that call the GUI.
119 UIManager.setLookAndFeel("net.sourceforge.pmd.swingui.PMDLookAndFeel");
120
121 PMDViewer pmdViewer = new PMDViewer();
122 pmdViewer.setVisible(true);
123 SetupFilesEvent.notifySetFileList(pmdViewer, loadRootDirectories.getDirectories());
124
125 } catch (Exception exception) {
126 exception.printStackTrace();
127 } catch (Error error) {
128 error.printStackTrace();
129 }
130
131 return;
132 }
133
134 /***
135 *********************************************************************************
136 *
137 * @param enable
138 */
139 protected void setEnableViewer(boolean enable) {
140 if (enable) {
141 m_disabledCounter--;
142
143 if (m_disabledCounter == 0) {
144 Component glassPane = getGlassPane();
145 glassPane.setVisible(false);
146 glassPane.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
147 glassPane.removeMouseListener(m_glassPaneMouseListener);
148 m_tabbedPane.setEnabled(true);
149 JMenuBar menuBar = getJMenuBar();
150 int menuCount = menuBar.getMenuCount();
151
152 for (int n = 0; n < menuCount; n++) {
153 menuBar.getMenu(n).setEnabled(true);
154 }
155 }
156 } else {
157 if (m_disabledCounter == 0) {
158 Component glassPane = getGlassPane();
159 glassPane.setVisible(true);
160 glassPane.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
161 glassPane.addMouseListener(m_glassPaneMouseListener);
162 m_tabbedPane.setEnabled(false);
163 JMenuBar menuBar = getJMenuBar();
164 int menuCount = menuBar.getMenuCount();
165
166 for (int n = 0; n < menuCount; n++) {
167 menuBar.getMenu(n).setEnabled(false);
168 }
169 }
170
171 m_disabledCounter++;
172 }
173 }
174
175 /***
176 *********************************************************************************
177 *
178 * @param args
179 */
180 public static void main(String[] args) {
181 run();
182 }
183
184 /***
185 *********************************************************************************
186 *********************************************************************************
187 *********************************************************************************
188 */
189 private class GlassPaneMouseListener extends MouseAdapter {
190
191 /***
192 *****************************************************************************
193 *
194 * Invoked when the mouse button has been clicked (pressed
195 * and released) on a component.
196 */
197 public void mouseClicked(MouseEvent event) {
198 event.consume();
199 }
200
201 /***
202 *****************************************************************************
203 *
204 * Invoked when a mouse button has been pressed on a component.
205 */
206 public void mousePressed(MouseEvent event) {
207 event.consume();
208 }
209
210 /***
211 *****************************************************************************
212 *
213 * Invoked when a mouse button has been released on a component.
214 */
215 public void mouseReleased(MouseEvent event) {
216 event.consume();
217 }
218 }
219
220 /***
221 *********************************************************************************
222 *********************************************************************************
223 *********************************************************************************
224 */
225 private class SetupFilesEventHandler implements SetupFilesEventListener {
226
227 /***
228 ****************************************************************************
229 *
230 * @param event
231 */
232 public void startSetup(SetupFilesEvent event) {
233 PMDViewer.this.setEnableViewer(false);
234 }
235
236 /***
237 ****************************************************************************
238 *
239 * @param event
240 */
241 public void stopSetup(SetupFilesEvent event) {
242 PMDViewer.this.setEnableViewer(true);
243 }
244
245 /***
246 ****************************************************************************
247 *
248 * @param event
249 */
250 public void setFileList(SetupFilesEvent event) {
251 }
252 }
253
254 /***
255 *********************************************************************************
256 *********************************************************************************
257 *********************************************************************************
258 */
259 private class TabbedPane extends JTabbedPane implements ChangeListener {
260 private AnalysisViewer m_analysisViewer;
261 private SearchViewer m_searchViewer;
262 private RulesEditor m_rulesEditor;
263 private PreferencesEditor m_preferencesEditor;
264 private Component m_currentTab;
265
266 /***
267 *****************************************************************************
268 *
269 */
270 private TabbedPane() {
271 super();
272
273 try {
274 m_analysisViewer = new AnalysisViewer();
275 m_searchViewer = new SearchViewer();
276 m_rulesEditor = new RulesEditor();
277 m_preferencesEditor = new PreferencesEditor();
278
279 setFont(UIManager.getFont("tabFont"));
280 addTab("Analysis Viewer", m_analysisViewer);
281 addTab("Search Viewer", m_searchViewer);
282 addTab("Rules Editor", m_rulesEditor);
283 addTab("Preferences Editor", m_preferencesEditor);
284 addChangeListener(this);
285 } catch (PMDException pmdException) {
286 String message = pmdException.getMessage();
287 Exception exception = pmdException.getReason();
288 MessageDialog.show(m_pmdViewer, message, exception);
289 }
290 }
291
292 /***
293 *****************************************************************************
294 *
295 */
296 private void adjustSplitPaneDividerLocation() {
297 m_analysisViewer.adjustSplitPaneDividerLocation();
298 m_searchViewer.adjustSplitPaneDividerLocation();
299 m_rulesEditor.adjustSplitPaneDividerLocation();
300 m_preferencesEditor.adjustSplitPaneDividerLocation();
301 }
302
303 /***
304 *******************************************************************************
305 *
306 * @param event
307 */
308 public void stateChanged(ChangeEvent event) {
309 if (m_currentTab == m_rulesEditor) {
310 m_rulesEditor.saveData();
311 }
312
313 m_currentTab = getSelectedComponent();
314
315 if (m_currentTab == m_analysisViewer) {
316 m_analysisViewer.setMenuBar();
317 m_analysisViewer.analyze();
318 } else if (m_currentTab == m_searchViewer) {
319 m_searchViewer.setMenuBar();
320 m_searchViewer.analyze();
321 } else if (m_currentTab == m_rulesEditor) {
322 m_rulesEditor.setMenuBar();
323 } else if (m_currentTab == m_preferencesEditor) {
324 m_preferencesEditor.setMenuBar();
325 }
326 }
327 }
328 }
329
330
331 /***
332 *********************************************************************************
333 *********************************************************************************
334 *********************************************************************************
335 */
336 class LoadRootDirectories extends Thread {
337 private File[] m_fileSystemRoots;
338
339 /***
340 ************************************************************************
341 *
342 */
343 protected LoadRootDirectories() {
344 super("Load Root Directories");
345 }
346
347 /***
348 ***************************************************************************
349 *
350 */
351 public void run() {
352 setup();
353 process();
354 cleanup();
355 }
356
357 /***
358 ************************************************************************
359 *
360 */
361 protected void setup() {
362 }
363
364 /***
365 ************************************************************************
366 *
367 */
368 protected void process() {
369 m_fileSystemRoots = File.listRoots();
370 }
371
372 /***
373 ************************************************************************
374 *
375 */
376 protected void cleanup() {
377 }
378
379 /***
380 ************************************************************************
381 *
382 * @return
383 */
384 protected File[] getDirectories() {
385 return m_fileSystemRoots;
386 }
387 }
This page was automatically generated by Maven