/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.util.designer;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import net.sourceforge.pmd.PMD;
import net.sourceforge.pmd.util.StringUtil;
/**
* This class is responsible for creating the contentpanel for the Create Rule
* XML Frame.
*/
public class CreateXMLRulePanel extends JPanel implements ActionListener {
private JTextField rulenameField = new JTextField(30);
private JTextField rulemsgField = new JTextField(30);
private JTextArea ruledescField = new JTextArea(5, 30);
private JTextArea ruleXMLArea = new JTextArea(30, 30);
private JTextArea xpathQueryArea = new JTextArea();
private CodeEditorTextPane codeEditorPane = new CodeEditorTextPane();
public CreateXMLRulePanel(JTextArea xpathQueryArea, CodeEditorTextPane codeEditorPane) {
super();
this.xpathQueryArea = xpathQueryArea;
this.codeEditorPane = codeEditorPane;
GridBagConstraints gbc = new GridBagConstraints();
// We use a gridbaglayout for a nice and sturdy look and feel
GridBagLayout gbl = new GridBagLayout();
setLayout(gbl);
gbc.gridx = 0;
gbc.gridy = 0;
gbc.fill = GridBagConstraints.NONE;
gbc.anchor = GridBagConstraints.EAST;
gbc.weightx = 0.5;
JLabel rulenameLabel = new JLabel("Rule name : ");
gbl.setConstraints(rulenameLabel, gbc);
add(rulenameLabel);
gbc.weightx = 0.5;
gbc.anchor = GridBagConstraints.WEST;
gbc.gridx = 1;
gbl.setConstraints(rulenameField, gbc);
add(rulenameField);
gbc.gridx = 0;
gbc.gridy = 1;
gbc.anchor = GridBagConstraints.EAST;
gbc.weightx = 0.5;
JLabel rulemsgLabel = new JLabel("Rule msg : ");
gbl.setConstraints(rulemsgLabel, gbc);
add(rulemsgLabel);
gbc.gridx = 1;
gbc.anchor = GridBagConstraints.WEST;
gbc.weightx = 0.5;
gbl.setConstraints(rulemsgField, gbc);
add(rulemsgField);
gbc.gridx = 0;
gbc.gridy = 2;
gbc.anchor = GridBagConstraints.EAST;
gbc.weightx = 0.5;
JLabel ruledescLabel = new JLabel("Rule desc : ");
gbl.setConstraints(ruledescLabel, gbc);
add(ruledescLabel);
gbc.gridx = 1;
gbc.anchor = GridBagConstraints.WEST;
gbc.weightx = 0.5;
ruledescField.setLineWrap(true);
gbl.setConstraints(ruledescField, gbc);
add(ruledescField);
gbc.gridx = 0;
gbc.gridy = 3;
gbc.gridwidth = 2;
gbc.anchor = GridBagConstraints.NORTH;
JButton createRuleBtn = new JButton("Create rule XML");
createRuleBtn.addActionListener(this);
gbl.setConstraints(createRuleBtn, gbc);
add(createRuleBtn);
gbc.gridx = 0;
gbc.gridy = 4;
gbc.anchor = GridBagConstraints.NORTH;
gbc.fill = GridBagConstraints.BOTH;
gbc.weightx = 1.0;
gbc.weighty = 1.0;
JScrollPane ruleXMLPane = new JScrollPane(ruleXMLArea);
gbl.setConstraints(ruleXMLPane, gbc);
add(ruleXMLPane);
repaint();
}
private static void appendLn(StringBuilder sb, String text) {
sb.append(text).append(PMD.EOL);
}
/**
* We let our class implement the ActionListener interface and use it to
* generate the xml code when the user presses the "Create rule XML" button.
*
*/
@Override
public void actionPerformed(ActionEvent exception) {
boolean hasXPathQuery = StringUtil.isNotEmpty(xpathQueryArea.getText());
StringBuilder buffer = new StringBuilder(200);
appendLn(buffer, "<rule name=\"" + rulenameField.getText() + '\"');
appendLn(buffer, " message=\"" + rulemsgField.getText() + '\"');
appendLn(buffer, " class=\"" + (hasXPathQuery ? "net.sourceforge.pmd.lang.rule.XPathRule" : "") + "\">");
appendLn(buffer, " <description>");
appendLn(buffer, " " + ruledescField.getText());
appendLn(buffer, " </description>");
if (hasXPathQuery) {
appendLn(buffer, " <properties>");
appendLn(buffer, " <property name=\"xpath\">");
appendLn(buffer, " <value>");
appendLn(buffer, "<![CDATA[");
appendLn(buffer, xpathQueryArea.getText());
appendLn(buffer, "]]>");
appendLn(buffer, " </value>");
appendLn(buffer, " </property>");
appendLn(buffer, " </properties>");
}
appendLn(buffer, " <priority>3</priority>");
appendLn(buffer, " <example>");
appendLn(buffer, "<![CDATA[");
appendLn(buffer, codeEditorPane.getText());
appendLn(buffer, "]]>");
appendLn(buffer, " </example>");
appendLn(buffer, "</rule>");
ruleXMLArea.setText(buffer.toString());
repaint();
}
}