package captor.windowsystem.formcomponent.gren;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.tree.DefaultMutableTreeNode;
import org.w3c.dom.DOMException;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import captor.lib.def.Constant;
import captor.lib.intl.MyIntl;
import captor.lib.util.IntegerUtil;
import captor.modelsystem.Model;
import captor.modelsystem.Project;
import captor.projectsystem.xmlgen.CCBuffer;
import captor.windowsystem.formcomponent.FormComponent;
import captor.windowsystem.formcomponent.Parameter;
/**
* @author Kicho
*
*/
public class GRENClassPanel extends FormComponent implements ActionListener, KeyListener {
public static final long serialVersionUID = 142;
JTextField resource, pluralForm;
JButton attr;
JLabel resourceLabel, pluralFormLabel;
GRENAttributePanel attrPanel;
Vector sysAttrs;
private GRENClass grenClass;
private String classname, readFrom;
public GRENClassPanel(Model model, DefaultMutableTreeNode node) {
super(model, node);
grenClass = new GRENClass();
create();
classname = "";
readFrom = "";
sysAttrs = new Vector();
}
//-------------------------------------------------------------------------
private void fillMainValues(Node node) {
NodeList nodeList = node.getChildNodes();
for ( int i = 0; i < nodeList.getLength(); i++ ) {
Node aux = nodeList.item(i);
if ( aux.getFirstChild() != null ) {
if ( aux.getNodeName().toUpperCase().equals("CLASS")) {
resource.setText(aux.getFirstChild().getNodeValue());
}
else if ( aux.getNodeName().toUpperCase().equals("PLURALFORM")) {
pluralForm.setText(aux.getFirstChild().getNodeValue());
}
else if ( aux.getNodeName().toUpperCase().equals("ATTRIBUTES")) {
fillAttributes(aux);
}
}
}
}
private void fillAttributes(Node node) {
NodeList nodeList = node.getChildNodes();
for ( int i = 0; i < nodeList.getLength(); i++ ) {
Node aux = nodeList.item(i);
if ( aux.getNodeName().toUpperCase().equals("ATTRIBUTE")) {
fillAttribute(aux);
}
}
}
private void fillAttribute(Node node) {
NodeList nodeList = node.getChildNodes();
GRENAttribute gattr = null;
gattr = new GRENAttribute();
for ( int i = 0; i < nodeList.getLength(); i++ ) {
Node aux = nodeList.item(i);
if ( aux.getNodeName().toUpperCase().equals("NAME")) {
gattr.setName(aux.getFirstChild().getNodeValue());
}
else if ( aux.getNodeName().toUpperCase().equals("TYPE")) {
gattr.setType(aux.getFirstChild().getNodeValue());
}
else if ( aux.getNodeName().toUpperCase().equals("LENGTH")) {
if ( aux.getFirstChild() != null ) {
try {
Integer intAux = new Integer(aux.getFirstChild().getNodeValue());
gattr.setLenght(intAux.intValue());
}
catch (NumberFormatException e) {}
catch (DOMException e) {}
}
}
}
if ( gattr != null ) {
grenClass.addAttr(gattr);
}
}
//--------------------------------------------------------------------------
private void readFrom() {
resource.setEnabled(false);
pluralForm.setEnabled(false);
attr.setEnabled(false);
FormComponent fe = getFormElement(readFrom);
if ( fe != null ) {
if ( fe instanceof GRENClassPanel ) {
GRENClassPanel gcp = (GRENClassPanel) fe;
JTextField fromResourceTF = gcp.getResourceTF();
JTextField fromResourcePLTF = gcp.getResourcePLTF();
new ReadFromListener(fromResourceTF, resource);
new ReadFromListener(fromResourcePLTF, pluralForm);
}
}
return;
}
//--------------------------------------------------------------------------
public void create() {
this.setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
resourceLabel = new JLabel();
resource = new JTextField();
pluralForm = new JTextField();
attr = new JButton("Attributes");
attr.addActionListener(this);
resource.addKeyListener(this);
pluralForm.addKeyListener(this);
Dimension d = new Dimension(169,20);
resource.setSize(d);
resource.setPreferredSize(d);
pluralForm.setSize(d);
pluralForm.setPreferredSize(d);
resource.setMaximumSize(d);
pluralForm.setMaximumSize(d);
resourceLabel.setPreferredSize(new Dimension(Constant.LABEL_WIDTH,20));
resourceLabel.setHorizontalAlignment(SwingConstants.RIGHT);
resourceLabel.setText("Class: ");
this.add(resourceLabel);
panel.add(resource);
panel.add(new JLabel(" "));
pluralFormLabel = new JLabel("Plural form: ");
panel.add(pluralFormLabel);
panel.add(pluralForm);
panel.add(new JLabel(" "));
panel.add(attr);
panel.add(Box.createHorizontalGlue());
panel.add(new JLabel(" "));
this.add(panel);
}
//-------------------------------------------------------------------------
public String getId() {
return classname;
}
//-------------------------------------------------------------------------
public String getValues() {
return resource.getText();
}
//-------------------------------------------------------------------------
public void actionPerformed(ActionEvent e) {
attrPanel = new GRENAttributePanel(model, grenClass, sysAttrs);
attrPanel.setVisible(true);
model.getProject().getPatternTree().print();
}
//-------------------------------------------------------------------------
public boolean validateParameters() {
String value = (String) parameter.get("CLASS");
if ( value == null ) {
errorMsg = "This element requires the 'class' parameter.\n";
return false;
}
for ( int i = 0; i < 9; i++ ) {
value = (String) parameter.get("SYS_ATT" + i);
if ( value != null && !validateSysAtt(value)) {
errorMsg = "'SYS_ATT" + i + "' parameter invalid value.\n";
return false;
}
}
value = (String) parameter.get("ATTRIBUTES");
if ( value != null ) {
if ( !(value.equals("false") || value.equals("true")) ) {
return false;
}
}
return true;
}
//-------------------------------------------------------------------------
private boolean validateSysAtt(String value) {
if ( value == null )
return true;
String []values = value.split(":");
if ( values.length != 3 ) {
return false;
}
if ( !(values[1].equals("char") || values[1].equals("date") ||
values[1].equals("integer") || values[1].equals("float")) ) {
return false;
}
if ( values[2] != null && !values[2].equals("") ) {
if ( !IntegerUtil.isInt(values[2]) ) {
return false;
}
}
return true;
}
//-------------------------------------------------------------------------
public void updateValues() {
String value = (String) parameter.get("READ_FROM");
if ( value != null ) {
readFrom = value;
value = null;
readFrom();
}
}
//-------------------------------------------------------------------------
public void parseParameters() {
String value = (String) parameter.get("CLASS");
if ( value != null ) {
classname = value;
String aux = value.concat(": ");
resourceLabel.setText(aux);
value = null;
}
else {
model.getGui().getGuiView().setWarningView(MyIntl.VE_GENERAL_1 + " - 1");
model.getGui().getGuiView().setConsoleView("");
}
value = (String) parameter.get("READ_FROM");
if ( value != null ) {
readFrom = value;
value = null;
readFrom();
}
value = (String) parameter.get("SYS_ATT1");
if ( value != null ) {
addSysAtt(value);
}
value = (String) parameter.get("SYS_ATT2");
if ( value != null ) {
addSysAtt(value);
}
value = (String) parameter.get("SYS_ATT3");
if ( value != null ) {
addSysAtt(value);
}
value = (String) parameter.get("SYS_ATT4");
if ( value != null ) {
addSysAtt(value);
}
value = (String) parameter.get("SYS_ATT5");
if ( value != null ) {
addSysAtt(value);
}
value = (String) parameter.get("SYS_ATT6");
if ( value != null ) {
addSysAtt(value);
}
value = (String) parameter.get("SYS_ATT7");
if ( value != null ) {
addSysAtt(value);
}
value = (String) parameter.get("SYS_ATT8");
if ( value != null ) {
addSysAtt(value);
}
value = (String) parameter.get("SYS_ATT9");
if ( value != null ) {
addSysAtt(value);
}
value = (String) parameter.get("ATTRIBUTES");
if ( value != null ) {
if ( value.equals("false") ) {
attr.setEnabled(false);
}
}
}
//-------------------------------------------------------------------------
private void addSysAtt(String value) {
String []values = value.split(":");
int len = 0;
if ( values != null && values.length >= 3 ) {
if ( values[2] != null && !values[2].equals("") ) {
try {
Integer i = new Integer(values[2]);
len = i.intValue();
} catch (NumberFormatException e) {
return;
}
}
}
GRENAttribute ga = new GRENAttribute();
ga.setName(values[0]);
ga.setType(values[1]);
ga.setLenght(len);
ga.setAttSystem(true);
sysAttrs.add(ga);
}
//-------------------------------------------------------------------------
public boolean validateFields() {
//return true for ready only fields
String value = (String) parameter.get("READ_FROM");
if ( value != null ) {
return true;
}
//valida��o da classe
String required = (String) parameter.get("CLASS_USE");
if ( required == null )
required = "";
if ( !required.toUpperCase().equals("NOT_REQUIRED") ) {
if ( resource.getText().trim().equals("") ) {
cleanErrorLine();
addErrorLine("'" + resourceLabel.getText().substring(0, resourceLabel.getText().length() - 2) + "' value cannot be blank.");
return false;
}
}
String regexp = "[(a-zA-Z)][(A-Za-z\\-_0-9)]*";
Pattern p = Pattern.compile(regexp);
Matcher m = p.matcher(resource.getText().trim());
if ( !required.toUpperCase().equals("NOT_REQUIRED") ) {
if ( !m.matches() ) {
cleanErrorLine();
addErrorLine("'" + resourceLabel.getText().substring(0, resourceLabel.getText().length() - 2) + "' invalid format.");
addErrorLine("Possible values: " + regexp);
return false;
}
}
if ( required.toUpperCase().equals("NOT_REQUIRED") &&
resource.getText().trim().equals("") &&
!pluralForm.getText().trim().equals("") ) {
cleanErrorLine();
addErrorLine("If the class " + resourceLabel.getText().substring(0, resourceLabel.getText().length() - 2) + " is empty, it's pluralForm must be empty too.");
return false;
}
if ( required.toUpperCase().equals("NOT_REQUIRED") &&
!resource.getText().trim().equals("") &&
pluralForm.getText().trim().equals("") ) {
cleanErrorLine();
addErrorLine("If the class " + resourceLabel.getText().substring(0, resourceLabel.getText().length() - 2) + " is not empty, it's pluralForm must not be empty.");
return false;
}
//valida��o da forma plural
if ( !required.toUpperCase().equals("NOT_REQUIRED") ) {
if ( pluralForm.getText().trim().equals("") ) {
cleanErrorLine();
addErrorLine(resourceLabel.getText().substring(0, resourceLabel.getText().length() - 2) + " plural form value cannot be null.");
return false;
}
}
m = p.matcher(pluralForm.getText().trim());
if ( !required.toUpperCase().equals("NOT_REQUIRED") && !resource.getText().trim().equals("")) {
if ( !m.matches() ) {
cleanErrorLine();
addErrorLine("'" + pluralFormLabel.getText().substring(0, pluralFormLabel.getText().length() - 2) + " invalid format. Possible values: " + regexp);
return false;
}
}
//DIRTY BUG FIX
String aux = resource.getText();
aux = aux.replace(" ", "");
aux = aux.replace(" ", "");
aux = aux.replace(" ", "");
if ( !aux.equals("") ) {
String firstLetter = resource.getText().substring(0, 1);
if ( !firstLetter.equals(firstLetter.toUpperCase())) {
cleanErrorLine();
addErrorLine("The first letter of a class name (" + resource.getText() + ") must be in upper case.");
return false;
}
}
return true;
}
//-------------------------------------------------------------------------
public void toXML(CCBuffer out) {
//DIRTY FIX
String aux = resource.getText();
aux = aux.replace(" ", "");
aux = aux.replace(" ", "");
aux = aux.replace("", "");
if ( aux.equals("") )
return;
resource.setText(resource.getText().trim());
pluralForm.setText(pluralForm.getText().trim());
if ( resource.getText().equals("") )
return;
String description = resourceLabel.getText();
description = description.substring(0, description.length() - 2);
description = description.concat(" (").concat(resource.getText() + ")");
out.newLine();
out.ident();
out.appendln("<grenclass name=\"" + classname + "\">");
out.ident();
out.append("<class>");
out.append(resource.getText(), true);
out.append("</class>", true);
out.newLine();
out.append("<object>");
out.append(resource.getText().substring(0, 1).toLowerCase().concat(resource.getText().substring(1, resource.getText().length())), true);
out.append("</object>", true);
out.newLine();
out.append("<pluralForm>");
out.append(pluralForm.getText(), true);
out.append("</pluralForm>", true);
out.newLine();
out.newLine();
out.appendln("<attributes>");
Vector v = grenClass.getAttrs();
for ( int i = 0; i < v.size(); i++ ) {
GRENAttribute attr = (GRENAttribute) v.get(i);
out.ident();
out.appendln("<attribute>");
out.ident();
out.append("<name>");
out.append(attr.getName(), true);
out.appendln("</name>", true);
out.append("<uname>");
out.append(attr.getName().substring(0,1).toUpperCase().concat(attr.getName().substring(1, attr.getName().length())), true);
out.appendln("</uname>", true);
out.append("<type>");
out.append(attr.getType(), true);
out.appendln("</type>", true);
out.append("<length>");
out.append(attr.getLenght(), true);
out.appendln("</length>", true);
out.dident();
out.appendln("</attribute>");
out.dident();
}
out.appendln("</attributes>");
out.dident();
out.appendln("</grenclass>");
out.dident();
}
//-------------------------------------------------------------------------
public void load(Node data) {
String currentClass = (String) parameter.get("CLASS");
if ( currentClass == null )
return;
NodeList nodeList = data.getChildNodes();
for ( int i = 0; i < nodeList.getLength(); i++ ) {
Node node = nodeList.item(i);
if ( node.getNodeName().toUpperCase().equals("GRENCLASS") ) {
NamedNodeMap nnm = node.getAttributes();
Node nameAtt = nnm.getNamedItem("name");
if ( nameAtt.getNodeValue().toUpperCase().equals(currentClass.toUpperCase())) {
fillMainValues(node);
}
}
}
}
//--------------------------------------------------------------------------
public JTextField getResourceTF() {
return resource;
}
public JTextField getResourcePLTF() {
return pluralForm;
}
public void setResourceTFText(String text) {
resource.setText(text);
}
public void setResourcePLTFText(String text) {
pluralForm.setText(text);
}
//--------------------------------------------------------------------------
/**
* @return Returns the classname.
*/
public String getClassname() {
return classname;
}
/**
* @param classname The classname to set.
*/
public void setClassname(String classname) {
this.classname = classname;
}
/**
* @return Returns the grenClass.
*/
public GRENClass getGrenClass() {
return grenClass;
}
/**
* @param grenClass The grenClass to set.
*/
public void setGrenClass(GRENClass grenClass) {
this.grenClass = grenClass;
}
/**
* @return Returns the pluralForm.
*/
public JTextField getPluralForm() {
return pluralForm;
}
/**
* @param pluralForm The pluralForm to set.
*/
public void setPluralForm(JTextField pluralForm) {
this.pluralForm = pluralForm;
}
/**
* @return Returns the readFrom.
*/
public String getReadFrom() {
return readFrom;
}
/**
* @param readFrom The readFrom to set.
*/
public void setReadFrom(String readFrom) {
this.readFrom = readFrom;
}
//--------------------------------------------------------------------------
public Vector getRequiredParameters() {
Vector v = new Vector();
v.add(new Parameter("class" , "string", "", "class" , "Unique identifier" , "", true));
v.add(new Parameter("read_from" , "string", "", "" , "Read value from path" , "", false));
v.add(new Parameter("attributes" , "string", "", "" , "Read value from path" , "", false));
for ( int i = 1; i < 10; i++ )
v.add(new Parameter("sys_attr" + i, "string", "", "" , "Read value from path" , "", false));
return v;
}
//--------------------------------------------------------------------------
public void keyTyped(KeyEvent e) {}
public void keyPressed(KeyEvent e) {}
public void keyReleased(KeyEvent e) {
model.getProject().setStatus(Project.UNSAVED);
}
//--------------------------------------------------------------------------
}