View Javadoc
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