1 package net.sourceforge.pmd.swingui;
2
3 import net.sourceforge.pmd.PMDException;
4 import net.sourceforge.pmd.Rule;
5 import net.sourceforge.pmd.RuleSet;
6 import net.sourceforge.pmd.swingui.event.ListenerList;
7 import net.sourceforge.pmd.swingui.event.RuleSetChangedEvent;
8 import net.sourceforge.pmd.swingui.event.RuleSetEvent;
9 import net.sourceforge.pmd.swingui.event.RulesInMemoryEvent;
10 import net.sourceforge.pmd.swingui.event.RulesInMemoryEventListener;
11 import net.sourceforge.pmd.swingui.event.RulesTreeModelEvent;
12 import net.sourceforge.pmd.swingui.event.RulesTreeModelEventListener;
13
14 import javax.swing.Icon;
15 import javax.swing.JMenu;
16 import javax.swing.JMenuBar;
17 import javax.swing.JMenuItem;
18 import javax.swing.JPanel;
19 import javax.swing.JScrollPane;
20 import javax.swing.JSeparator;
21 import javax.swing.JSplitPane;
22 import javax.swing.KeyStroke;
23 import javax.swing.UIManager;
24 import java.awt.BorderLayout;
25 import java.awt.Color;
26 import java.awt.event.ActionEvent;
27 import java.awt.event.ActionListener;
28 import java.awt.event.KeyEvent;
29 import java.awt.event.MouseAdapter;
30 import java.awt.event.MouseEvent;
31 import java.util.ArrayList;
32 import java.util.Enumeration;
33 import java.util.List;
34
35 /***
36 *
37 * @author Donald A. Leckie
38 * @since August 29, 2002
39 * @version $Revision: 1.21 $, $Date: 2003/05/28 18:08:35 $
40 */
41 class RulesEditor extends JPanel {
42
43 private RulesTree m_tree;
44 private JSplitPane m_splitPane;
45 private RuleEditingTabbedPane m_editingTabbedPane;
46 private JMenuBar m_menuBar;
47 private JMenuItem m_printSelectedRuleMenuItem;
48
49 /***
50 *******************************************************************************
51 *
52 * @param parentWindow
53 */
54 protected RulesEditor() throws PMDException {
55 super(new BorderLayout());
56
57 m_tree = new RulesTree();
58
59 JScrollPane treeScrollPane;
60
61 treeScrollPane = createTreeScrollPane();
62 m_editingTabbedPane = new RuleEditingTabbedPane(m_tree);
63 m_splitPane = ComponentFactory.createHorizontalSplitPane(treeScrollPane, m_editingTabbedPane);
64
65 JPanel contentPanel = new JPanel(new BorderLayout());
66 contentPanel.add(m_splitPane, BorderLayout.CENTER);
67 add(contentPanel, BorderLayout.CENTER);
68
69 createMenuBar();
70
71 ListenerList.addListener((RulesInMemoryEventListener) new RulesInMemoryEventHandler());
72 }
73
74 /***
75 *******************************************************************************
76 *
77 * @return
78 */
79 private JScrollPane createTreeScrollPane() {
80 JScrollPane scrollPane = ComponentFactory.createScrollPane(m_tree);
81 Color background = UIManager.getColor("pmdTreeBackground");
82 scrollPane.getViewport().setBackground(background);
83
84 return scrollPane;
85 }
86
87 /***
88 *********************************************************************************
89 *
90 */
91 private void createMenuBar() {
92 m_menuBar = new JMenuBar();
93 m_menuBar.add(new FileMenu());
94 m_menuBar.add(new HelpMenu());
95 }
96
97 /***
98 *********************************************************************************
99 *
100 */
101 public void adjustSplitPaneDividerLocation() {
102 m_splitPane.setDividerLocation(0.4);
103 }
104
105 /***
106 *********************************************************************************
107 *
108 */
109 protected void setMenuBar() {
110 PMDViewer.getViewer().setJMenuBar(m_menuBar);
111 }
112
113 /***
114 ********************************************************************
115 *
116 */
117 protected void saveData() {
118 m_editingTabbedPane.saveData();
119 saveData((RulesTreeNode) m_tree.getModel().getRoot());
120 }
121
122 /***
123 ********************************************************************
124 *
125 * @param treeNode
126 */
127 private void saveData(RulesTreeNode treeNode) {
128 treeNode.saveData();
129
130 Enumeration children = treeNode.children();
131
132 while (children.hasMoreElements()) {
133 saveData((RulesTreeNode) children.nextElement());
134 }
135 }
136
137 /***
138 *******************************************************************************
139 *******************************************************************************
140 *******************************************************************************
141 */
142 private class SaveActionListener implements ActionListener {
143
144 /***
145 ********************************************************************
146 *
147 * @param event
148 */
149 public void actionPerformed(ActionEvent event) {
150 saveData();
151 writeRuleSets((RulesTreeNode) m_tree.getModel().getRoot());
152 RuleSetChangedEvent.notifyRuleSetsChanged(this);
153 }
154
155 /***
156 ********************************************************************
157 *
158 * @param treeNode
159 */
160 private void writeRuleSets(RulesTreeNode rootNode) {
161 List ruleSetList = new ArrayList();
162 Enumeration ruleSetNodes = rootNode.children();
163
164 while (ruleSetNodes.hasMoreElements()) {
165 RulesTreeNode ruleSetNode = (RulesTreeNode) ruleSetNodes.nextElement();
166 RuleSet ruleSet = ruleSetNode.getRuleSet();
167 Enumeration ruleNodes = ruleSetNode.children();
168
169 ruleSetList.add(ruleSet);
170 ruleSet.getRules().clear();
171
172 while (ruleNodes.hasMoreElements()) {
173 RulesTreeNode ruleNode = (RulesTreeNode) ruleNodes.nextElement();
174
175 ruleSet.addRule(ruleNode.getRule());
176 }
177 }
178
179 RuleSetEvent.notifySaveRuleSets(this, ruleSetList);
180 }
181 }
182
183 /***
184 *******************************************************************************
185 *******************************************************************************
186 *******************************************************************************
187 */
188 private class CancelActionListener implements ActionListener {
189
190 /***
191 ********************************************************************
192 *
193 * @param event
194 */
195 public void actionPerformed(ActionEvent event) {
196 RulesEditor.this.setVisible(false);
197 }
198 }
199
200 /***
201 *********************************************************************************
202 *********************************************************************************
203 *********************************************************************************
204 */
205 private class FileMenu extends JMenu {
206
207 /***
208 ********************************************************************
209 *
210 * @param menuBar
211 */
212 private FileMenu() {
213 super("File");
214
215 setMnemonic('F');
216
217 Icon icon;
218 JMenuItem menuItem;
219
220 //
221 // Save menu item
222 //
223 icon = UIManager.getIcon("save");
224 menuItem = new JMenuItem("Save Changes", icon);
225 menuItem.addActionListener((ActionListener) new SaveActionListener());
226 menuItem.setMnemonic('S');
227 menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, KeyEvent.CTRL_MASK));
228 add(menuItem);
229
230 //
231 // Save As menu item
232 //
233 icon = UIManager.getIcon("cancel");
234 menuItem = new JMenuItem("Cancel Changes", icon);
235 menuItem.addActionListener((ActionListener) new CancelActionListener());
236 menuItem.setMnemonic('C');
237 menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_MASK));
238 add(menuItem);
239
240 //
241 // Separator
242 //
243 add(new JSeparator());
244
245 //
246 // Print Rules menu item
247 //
248 icon = UIManager.getIcon("print");
249 menuItem = new JMenuItem("Print Rules...", icon);
250 menuItem.addActionListener((ActionListener) new PrintRulesActionListener());
251 menuItem.setMnemonic('R');
252 menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, KeyEvent.CTRL_MASK));
253 add(menuItem);
254
255 //
256 // Print Selected Rule menu item
257 //
258 icon = UIManager.getIcon("print");
259 m_printSelectedRuleMenuItem = new JMenuItem("Print Selected Rule...", icon);
260 m_printSelectedRuleMenuItem.addActionListener((ActionListener) new PrintRulesActionListener());
261 m_printSelectedRuleMenuItem.setMnemonic('E');
262 m_printSelectedRuleMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, KeyEvent.CTRL_MASK));
263 add(m_printSelectedRuleMenuItem);
264
265 //
266 // Page Setup menu item
267 //
268 menuItem = new JMenuItem("Page Setup...");
269 menuItem.addActionListener((ActionListener) new PageSetupActionListener());
270 menuItem.setMnemonic('A');
271 menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.CTRL_MASK));
272 add(menuItem);
273
274 //
275 // Separator
276 //
277 add(new JSeparator());
278
279 //
280 // Exit menu item
281 //
282 menuItem = new JMenuItem("Exit...");
283 menuItem.addActionListener((ActionListener) new ExitActionListener());
284 menuItem.setMnemonic('X');
285 add(menuItem);
286
287 addMouseListener(new FileMenuMouseListener());
288 }
289 }
290
291 /***
292 *********************************************************************************
293 *********************************************************************************
294 *********************************************************************************
295 */
296 private class PrintRulesActionListener implements ActionListener {
297
298 public void actionPerformed(ActionEvent event) {
299 MessageDialog.show(PMDViewer.getViewer(), "Printing not available yet.");
300 }
301 }
302
303 /***
304 *********************************************************************************
305 *********************************************************************************
306 *********************************************************************************
307 */
308 private class PageSetupActionListener implements ActionListener {
309
310 public void actionPerformed(ActionEvent event) {
311 MessageDialog.show(PMDViewer.getViewer(), "Page setup not available yet.");
312 }
313 }
314
315 /***
316 *********************************************************************************
317 *********************************************************************************
318 *********************************************************************************
319 */
320 private class ExitActionListener implements ActionListener {
321
322 public void actionPerformed(ActionEvent event) {
323 System.exit(0);
324 }
325 }
326
327 /***
328 *********************************************************************************
329 *********************************************************************************
330 *********************************************************************************
331 */
332 private class FileMenuMouseListener extends MouseAdapter implements RulesTreeModelEventListener {
333
334 private Rule m_rule;
335
336 /***
337 *****************************************************************************
338 *
339 * @param event
340 */
341 public void mouseEntered(MouseEvent event) {
342 try {
343 ListenerList.addListener((RulesTreeModelEventListener) this);
344 RulesTreeModelEvent.notifyRequestSelectedRule(this);
345 boolean enable = (m_rule != null);
346 m_printSelectedRuleMenuItem.setEnabled(enable);
347 } finally {
348 ListenerList.removeListener((RulesTreeModelEventListener) this);
349 }
350 }
351
352 /***
353 ****************************************************************************
354 *
355 * @param event
356 */
357 public void reload(RulesTreeModelEvent event) {
358 }
359
360 /***
361 ****************************************************************************
362 *
363 * @param event
364 */
365 public void requestSelectedRule(RulesTreeModelEvent event) {
366 }
367
368 /***
369 ****************************************************************************
370 *
371 * @param event
372 */
373 public void returnedSelectedRule(RulesTreeModelEvent event) {
374 m_rule = event.getRule();
375 }
376 }
377
378 /***
379 *******************************************************************************
380 *******************************************************************************
381 *******************************************************************************
382 */
383 private class RulesInMemoryEventHandler implements RulesInMemoryEventListener {
384
385 /***
386 ****************************************************************************
387 *
388 * @param event
389 */
390 public void requestAllRules(RulesInMemoryEvent event) {
391 RuleSet rules = new RuleSet();
392 RulesTreeNode rootNode = (RulesTreeNode) m_tree.getModel().getRoot();
393 getRules(rootNode, rules, new IncludeAllRuleFilter());
394 RulesInMemoryEvent.notifyReturnedRules(this, rules);
395 }
396
397 /***
398 ****************************************************************************
399 *
400 * @param event
401 */
402 public void requestIncludedRules(RulesInMemoryEvent event) {
403 try {
404 RuleSet rules = new RuleSet();
405 RulesTreeNode rootNode = (RulesTreeNode) m_tree.getModel().getRoot();
406 int lowestPriority = Preferences.getPreferences().getLowestPriorityForAnalysis();
407 getRules(rootNode, rules, new IncludeSelectedRuleFilter(lowestPriority));
408 RulesInMemoryEvent.notifyReturnedRules(this, rules);
409 } catch (PMDException pmdException) {
410 String message = pmdException.getMessage();
411 Exception exception = pmdException.getReason();
412 MessageDialog.show(PMDViewer.getViewer(), message, exception);
413 }
414 }
415
416 /***
417 ****************************************************************************
418 *
419 * @param event
420 */
421 private void getRules(RulesTreeNode rootNode, RuleSet rules, RuleFilter ruleFilter) {
422 Enumeration ruleSetNodes = rootNode.children();
423
424 while (ruleSetNodes.hasMoreElements()) {
425 RulesTreeNode ruleSetNode = (RulesTreeNode) ruleSetNodes.nextElement();
426
427 if (ruleFilter.include(ruleSetNode)) {
428 Enumeration ruleNodes = ruleSetNode.children();
429
430 while (ruleNodes.hasMoreElements()) {
431 RulesTreeNode ruleNode = (RulesTreeNode) ruleNodes.nextElement();
432
433 if (ruleFilter.include(ruleNode)) {
434 rules.addRule(ruleNode.getRule());
435 }
436 }
437 }
438 }
439 }
440
441 /***
442 ****************************************************************************
443 *
444 * @param event
445 */
446 public void returnedRules(RulesInMemoryEvent event) {
447 }
448 }
449
450 /***
451 *******************************************************************************
452 *******************************************************************************
453 *******************************************************************************
454 */
455 private abstract class RuleFilter {
456
457 /***
458 ***************************************************************************
459 *
460 * @param rule
461 *
462 * @return
463 */
464 protected abstract boolean include(RulesTreeNode treeNode);
465 }
466
467 /***
468 *******************************************************************************
469 *******************************************************************************
470 *******************************************************************************
471 */
472 private class IncludeAllRuleFilter extends RuleFilter {
473
474 /***
475 ***************************************************************************
476 *
477 * @param rule
478 *
479 * @return
480 */
481 protected boolean include(RulesTreeNode treeNode) {
482 return true;
483 }
484 }
485
486 /***
487 *******************************************************************************
488 *******************************************************************************
489 *******************************************************************************
490 */
491 private class IncludeSelectedRuleFilter extends RuleFilter {
492 private int m_lowestPriority;
493
494 /***
495 ***************************************************************************
496 *
497 * @param rule
498 *
499 * @return
500 */
501 private IncludeSelectedRuleFilter(int lowestPriority) {
502 m_lowestPriority = lowestPriority;
503 }
504
505 /***
506 ***************************************************************************
507 *
508 * @param rule
509 *
510 * @return
511 */
512 protected boolean include(RulesTreeNode treeNode) {
513 return treeNode.include() && (treeNode.getPriority() <= m_lowestPriority);
514 }
515 }
516 }
This page was automatically generated by Maven