1 package net.sourceforge.pmd.swingui;
2
3 import net.sourceforge.pmd.Rule;
4 import net.sourceforge.pmd.swingui.event.ListenerList;
5 import net.sourceforge.pmd.swingui.event.RulesEditingEvent;
6 import net.sourceforge.pmd.swingui.event.RulesEditingEventListener;
7
8 import javax.swing.JComboBox;
9 import javax.swing.JLabel;
10 import javax.swing.JPanel;
11 import javax.swing.JScrollPane;
12 import javax.swing.JTextArea;
13 import javax.swing.JTextField;
14 import javax.swing.UIManager;
15 import javax.swing.border.EmptyBorder;
16 import javax.swing.border.TitledBorder;
17 import java.awt.BorderLayout;
18 import java.awt.Color;
19 import java.awt.Component;
20 import java.awt.Font;
21 import java.awt.GridBagConstraints;
22 import java.awt.GridBagLayout;
23 import java.awt.Insets;
24 import java.awt.Window;
25 import java.awt.event.FocusEvent;
26 import java.awt.event.FocusListener;
27 import java.text.MessageFormat;
28
29 /***
30 *
31 * @author Donald A. Leckie
32 * @since August 29, 2002
33 * @version $Revision: 1.20 $, $Date: 2003/05/28 18:08:34 $
34 */
35 class RuleEditingPanel extends JPanel {
36
37 private JLabel m_nameLabel;
38 private JTextField m_name;
39 private JLabel m_classNameLabel;
40 private JTextField m_className;
41 private JLabel m_messageLabel;
42 private JTextArea m_message;
43 private JScrollPane m_messageScrollPane;
44 private JLabel m_descriptionLabel;
45 private JTextArea m_description;
46 private JScrollPane m_descriptionScrollPane;
47 private JLabel m_exampleLabel;
48 private JTextArea m_example;
49 private JScrollPane m_exampleScrollPane;
50 private JLabel m_priorityLabel;
51 private JComboBox m_priority;
52 private boolean m_enabled;
53 private RulesTreeNode m_currentDataNode;
54 private boolean m_isEditing;
55 private String m_originalName;
56 private FocusListener m_focusListener = new RuleNameFocusListener();
57
58 /***
59 *******************************************************************************
60 *
61 * @return
62 */
63 protected RuleEditingPanel() {
64 super(new BorderLayout());
65
66 EmptyBorder emptyBorder = new EmptyBorder(5, 5, 5, 5);
67
68 setBorder(emptyBorder);
69
70 JPanel panel;
71 TitledBorder titledBorder;
72 GridBagLayout layout;
73 GridBagConstraints constraints;
74
75 int[] columnWidths = {50, 100, 100, 100, 100, 100};
76
77 layout = new GridBagLayout();
78 layout.columnWidths = columnWidths;
79 panel = new JPanel(layout);
80 titledBorder = ComponentFactory.createTitledBorder(" Rule ");
81
82 panel.setBorder(titledBorder);
83 add(panel, BorderLayout.CENTER);
84
85 Font labelFont = UIManager.getFont("labelFont");
86
87 // Rule Name Label
88 m_nameLabel = new JLabel("Name");
89 m_nameLabel.setFont(labelFont);
90 m_nameLabel.setHorizontalAlignment(JLabel.RIGHT);
91 constraints = layout.getConstraints(m_nameLabel);
92 constraints.gridx = 0;
93 constraints.gridy = 0;
94 constraints.gridwidth = 1;
95 constraints.gridheight = 1;
96 constraints.anchor = GridBagConstraints.NORTHEAST;
97 constraints.fill = GridBagConstraints.NONE;
98 constraints.insets = new Insets(4, 2, 4, 2);
99 panel.add(m_nameLabel, constraints);
100
101 // Rule Name Text
102 m_name = new JTextField();
103 m_name.setFont(UIManager.getFont("dataFont"));
104 m_name.addFocusListener(m_focusListener);
105 m_name.setRequestFocusEnabled(true);
106 m_name.setOpaque(true);
107 constraints = layout.getConstraints(m_name);
108 constraints.gridx = 1;
109 constraints.gridy = 0;
110 constraints.gridwidth = 2;
111 constraints.gridheight = 1;
112 constraints.anchor = GridBagConstraints.NORTHWEST;
113 constraints.fill = GridBagConstraints.BOTH;
114 constraints.insets = new Insets(4, 2, 4, 2);
115 panel.add(m_name, constraints);
116
117 // Rule Class Name Label
118 m_classNameLabel = new JLabel("Class Name");
119 m_classNameLabel.setFont(labelFont);
120 m_classNameLabel.setHorizontalAlignment(JLabel.RIGHT);
121 constraints = layout.getConstraints(m_name);
122 constraints.gridx = 0;
123 constraints.gridy = 1;
124 constraints.gridwidth = 1;
125 constraints.gridheight = 1;
126 constraints.anchor = GridBagConstraints.NORTHEAST;
127 constraints.fill = GridBagConstraints.NONE;
128 constraints.insets = new Insets(4, 2, 4, 2);
129 panel.add(m_classNameLabel, constraints);
130
131 // Rule Class Name Text
132 m_className = new JTextField();
133 m_className.setFont(UIManager.getFont("dataFont"));
134 m_className.setBackground(UIManager.getColor("disabledTextBackground"));
135 m_className.setForeground(Color.black);
136 m_className.setSelectedTextColor(Color.black);
137 m_className.setDisabledTextColor(Color.black);
138 m_className.setEditable(false);
139 m_className.setEnabled(false);
140 m_className.setOpaque(true);
141 constraints = layout.getConstraints(m_name);
142 constraints.gridx = 1;
143 constraints.gridy = 1;
144 constraints.gridwidth = GridBagConstraints.REMAINDER;
145 constraints.gridheight = 1;
146 constraints.anchor = GridBagConstraints.NORTHWEST;
147 constraints.fill = GridBagConstraints.BOTH;
148 constraints.insets = new Insets(4, 2, 4, 2);
149 panel.add(m_className, constraints);
150
151 // Rule Message Label
152 m_messageLabel = new JLabel("Message");
153 m_messageLabel.setFont(labelFont);
154 m_messageLabel.setHorizontalAlignment(JLabel.RIGHT);
155 constraints = layout.getConstraints(m_name);
156 constraints.gridx = 0;
157 constraints.gridy = 2;
158 constraints.gridwidth = 1;
159 constraints.gridheight = 1;
160 constraints.anchor = GridBagConstraints.NORTHEAST;
161 constraints.fill = GridBagConstraints.NONE;
162 constraints.insets = new Insets(4, 2, 4, 2);
163 panel.add(m_messageLabel, constraints);
164
165 // Rule Message Text
166 m_message = ComponentFactory.createTextArea("");
167
168 // Rule Message Scroll Pane;
169 m_messageScrollPane = ComponentFactory.createScrollPane(m_message);
170 constraints = layout.getConstraints(m_name);
171 constraints.gridx = 1;
172 constraints.gridy = 2;
173 constraints.gridwidth = GridBagConstraints.REMAINDER;
174 constraints.gridheight = 1;
175 constraints.ipady = 4 * 20; // 4 lines * 20 pixels/line
176 constraints.anchor = GridBagConstraints.NORTHWEST;
177 constraints.fill = GridBagConstraints.BOTH;
178 constraints.insets = new Insets(4, 2, 4, 2);
179 panel.add(m_messageScrollPane, constraints);
180
181 // Rule Description Label
182 m_descriptionLabel = new JLabel("Description");
183 m_descriptionLabel.setFont(labelFont);
184 m_descriptionLabel.setHorizontalAlignment(JLabel.RIGHT);
185 constraints = layout.getConstraints(m_name);
186 constraints.gridx = 0;
187 constraints.gridy = 3;
188 constraints.gridwidth = 1;
189 constraints.gridheight = 1;
190 constraints.anchor = GridBagConstraints.NORTHEAST;
191 constraints.fill = GridBagConstraints.NONE;
192 constraints.insets = new Insets(4, 2, 4, 2);
193 panel.add(m_descriptionLabel, constraints);
194
195 // Rule Description Text
196 m_description = ComponentFactory.createTextArea("");
197
198 // Rule Description Scroll Pane;
199 m_descriptionScrollPane = ComponentFactory.createScrollPane(m_description);
200 constraints = layout.getConstraints(m_name);
201 constraints.gridx = 1;
202 constraints.gridy = 3;
203 constraints.gridwidth = GridBagConstraints.REMAINDER;
204 constraints.gridheight = 1;
205 constraints.ipady = 4 * 20; // 4 lines * 20 pixels/line
206 constraints.anchor = GridBagConstraints.NORTHWEST;
207 constraints.fill = GridBagConstraints.BOTH;
208 constraints.insets = new Insets(4, 2, 4, 2);
209 panel.add(m_descriptionScrollPane, constraints);
210
211 // Rule Example Label
212 m_exampleLabel = new JLabel("Example");
213 m_exampleLabel.setFont(labelFont);
214 m_exampleLabel.setHorizontalAlignment(JLabel.RIGHT);
215 constraints = layout.getConstraints(m_name);
216 constraints.gridx = 0;
217 constraints.gridy = 4;
218 constraints.gridwidth = 1;
219 constraints.gridheight = 1;
220 constraints.anchor = GridBagConstraints.NORTHEAST;
221 constraints.fill = GridBagConstraints.NONE;
222 constraints.insets = new Insets(4, 2, 4, 2);
223 panel.add(m_exampleLabel, constraints);
224
225 // Rule Example Text
226 m_example = ComponentFactory.createTextArea("");
227 m_example.setFont(UIManager.getFont("codeFont"));
228
229 // Rule Example Scroll Pane;
230 m_exampleScrollPane = ComponentFactory.createScrollPane(m_example);
231 constraints = layout.getConstraints(m_name);
232 constraints.gridx = 1;
233 constraints.gridy = 4;
234 constraints.gridwidth = GridBagConstraints.REMAINDER;
235 constraints.gridheight = 1;
236 constraints.ipady = 6 * 20; // 6 lines * 20 pixels/line
237 constraints.anchor = GridBagConstraints.NORTHWEST;
238 constraints.fill = GridBagConstraints.BOTH;
239 constraints.insets = new Insets(4, 2, 4, 2);
240 panel.add(m_exampleScrollPane, constraints);
241
242 // Rule Priority Label
243 m_priorityLabel = new JLabel("Priority");
244 m_priorityLabel.setFont(labelFont);
245 m_priorityLabel.setHorizontalAlignment(JLabel.RIGHT);
246 constraints = layout.getConstraints(m_name);
247 constraints.gridx = 0;
248 constraints.gridy = 5;
249 constraints.gridwidth = 1;
250 constraints.gridheight = 1;
251 constraints.anchor = GridBagConstraints.NORTHEAST;
252 constraints.fill = GridBagConstraints.NONE;
253 constraints.insets = new Insets(4, 2, 4, 2);
254 panel.add(m_priorityLabel, constraints);
255
256 // Rule Priority
257 m_priority = new JComboBox(Rule.PRIORITIES);
258 constraints = layout.getConstraints(m_name);
259 constraints.gridx = 1;
260 constraints.gridy = 5;
261 constraints.gridwidth = 1;
262 constraints.gridheight = 1;
263 constraints.anchor = GridBagConstraints.WEST;
264 constraints.fill = GridBagConstraints.NONE;
265 constraints.insets = new Insets(4, 2, 4, 2);
266 panel.add(m_priority, constraints);
267
268 enableData(false);
269
270 ListenerList.addListener(new RulesEditingEventHandler());
271 }
272
273 /***
274 *******************************************************************************
275 *
276 * @param dataNode
277 */
278 private void saveData(RulesTreeNode dataNode) {
279 if ((dataNode != null) && m_isEditing) {
280 if (dataNode.isRule() || dataNode.isProperty()) {
281 String ruleName = m_name.getText().trim();
282
283 if (ruleName.length() == 0) {
284 String message = "The rule name is missing. The change will not be applied.";
285
286 m_name.removeFocusListener(m_focusListener);
287 MessageDialog.show(getParentWindow(), message);
288 m_name.addFocusListener(m_focusListener);
289
290 if (m_name.hasFocus()) {
291 m_name.requestFocus();
292 }
293
294 ruleName = m_originalName;
295 } else if (ruleName.equalsIgnoreCase(m_originalName) == false) {
296 if (dataNode.getSibling(ruleName) != null) {
297 String template = "Another rule already has the name \"{0}\". The change will not be applied.";
298 String[] args = {ruleName};
299 String message = MessageFormat.format(template, args);
300
301 m_name.removeFocusListener(m_focusListener);
302 MessageDialog.show(getParentWindow(), message);
303 m_name.addFocusListener(m_focusListener);
304
305 if (m_name.hasFocus()) {
306 m_name.requestFocus();
307 }
308
309 ruleName = m_originalName;
310 }
311 }
312
313 dataNode.setName(ruleName);
314 dataNode.setClassName(m_className.getText());
315 dataNode.setMessage(m_message.getText());
316 dataNode.setDescription(m_description.getText());
317 dataNode.setExample(m_example.getText());
318 dataNode.setPriority(m_priority.getSelectedIndex() + 1);
319 }
320 }
321 }
322
323 /***
324 *******************************************************************************
325 *
326 * @param isEditing
327 */
328 protected void setIsEditing(boolean isEditing) {
329 m_isEditing = isEditing;
330 }
331
332 /***
333 *******************************************************************************
334 *
335 * @param dataNode
336 */
337 private void loadData(RulesTreeNode dataNode) {
338 if (dataNode == null) {
339 enableData(false);
340 } else if (dataNode.isRuleSet()) {
341 enableData(false);
342 } else if (dataNode.isRule()) {
343 loadData_(dataNode);
344 } else if (dataNode.isProperty()) {
345 loadData_(dataNode.getParentRuleData());
346 } else {
347 enableData(false);
348 }
349 }
350
351 /***
352 *******************************************************************************
353 *
354 * @param dataNode
355 */
356 private void loadData_(RulesTreeNode dataNode) {
357 if (m_enabled == false) {
358 enableData(true);
359 }
360
361 m_name.setText(dataNode.getName());
362 m_className.setText(dataNode.getClassName());
363 m_message.setText(dataNode.getMessage());
364 m_description.setText(dataNode.getDescription());
365 m_example.setText(dataNode.getExample());
366 m_priority.setSelectedIndex(dataNode.getPriority() - 1);
367 m_originalName = dataNode.getName();
368 m_currentDataNode = dataNode;
369 }
370
371 /***
372 *******************************************************************************
373 *
374 */
375 private void enableData(boolean enable) {
376 if (enable) {
377 // Just to be sure the focus listener isn't already set.
378 m_name.removeFocusListener(m_focusListener);
379 m_name.addFocusListener(m_focusListener);
380
381 m_nameLabel.setEnabled(true);
382
383 m_name.setEnabled(true);
384 m_name.setBackground(Color.white);
385
386 m_messageLabel.setEnabled(true);
387
388 m_message.setEnabled(true);
389 m_message.setBackground(Color.white);
390
391 m_classNameLabel.setEnabled(true);
392
393 m_descriptionLabel.setEnabled(true);
394
395 m_description.setEnabled(true);
396 m_description.setBackground(Color.white);
397
398 m_exampleLabel.setEnabled(true);
399
400 m_example.setEnabled(true);
401 m_example.setBackground(Color.white);
402
403 m_priorityLabel.setEnabled(true);
404
405 m_priority.setEnabled(true);
406 m_priority.setBackground(Color.white);
407 } else {
408 m_name.removeFocusListener(m_focusListener);
409
410 Color background = UIManager.getColor("disabledTextBackground");
411
412 m_nameLabel.setEnabled(false);
413
414 m_name.setText("");
415 m_name.setEnabled(false);
416 m_name.setBackground(background);
417
418 m_messageLabel.setEnabled(false);
419
420 m_message.setText("");
421 m_message.setEnabled(false);
422 m_message.setBackground(background);
423
424 m_classNameLabel.setEnabled(false);
425
426 m_className.setText("");
427
428 m_descriptionLabel.setEnabled(false);
429
430 m_description.setText("");
431 m_description.setEnabled(false);
432 m_description.setBackground(background);
433
434 m_exampleLabel.setEnabled(false);
435
436 m_example.setText("");
437 m_example.setEnabled(false);
438 m_example.setBackground(background);
439
440 m_priorityLabel.setEnabled(false);
441
442 m_priority.setSelectedIndex(0);
443 m_priority.setEnabled(false);
444 m_priority.setBackground(background);
445
446 m_currentDataNode = null;
447 }
448
449 m_enabled = enable;
450 }
451
452 /***
453 *******************************************************************************
454 *
455 * @return
456 */
457 private Window getParentWindow() {
458 Component component = getParent();
459
460 while ((component != null) && ((component instanceof Window) == false)) {
461 component = component.getParent();
462 }
463
464 return (Window) component;
465 }
466
467 /***
468 ************************************************************************************
469 ************************************************************************************
470 ************************************************************************************
471 */
472
473 private class RuleNameFocusListener implements FocusListener {
474
475 /***
476 **************************************************************************
477 *
478 * @param event
479 */
480 public void focusGained(FocusEvent event) {
481 }
482
483 /***
484 **************************************************************************
485 *
486 * @param event
487 */
488 public void focusLost(FocusEvent event) {
489 String ruleName = m_name.getText().trim();
490
491 if (ruleName.length() == 0) {
492 String message = "The rule name is missing.";
493 m_name.removeFocusListener(this);
494 MessageDialog.show(getParentWindow(), message);
495 m_name.addFocusListener(this);
496 m_name.requestFocus();
497 } else if (ruleName.equalsIgnoreCase(m_originalName) == false) {
498 if (m_currentDataNode.getSibling(ruleName) != null) {
499 String template = "Another rule already has the name \"{0}\".";
500 String[] args = {ruleName};
501 String message = MessageFormat.format(template, args);
502 m_name.removeFocusListener(this);
503 MessageDialog.show(getParentWindow(), message);
504 m_name.addFocusListener(this);
505 m_name.requestFocus();
506 }
507 }
508 }
509 }
510
511 /***
512 ************************************************************************************
513 ************************************************************************************
514 ************************************************************************************
515 */
516 private class RulesEditingEventHandler implements RulesEditingEventListener {
517
518 /***
519 *************************************************************************
520 *
521 * @param event
522 */
523 public void loadData(RulesEditingEvent event) {
524 RuleEditingPanel.this.loadData(event.getDataNode());
525 }
526
527 /***
528 *************************************************************************
529 *
530 * @param event
531 */
532 public void saveData(RulesEditingEvent event) {
533 RuleEditingPanel.this.saveData(event.getDataNode());
534 }
535 }
536 }
This page was automatically generated by Maven