package captor.windowsystem.formcomponent.gren; import java.awt.KeyboardFocusManager; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.WindowEvent; import java.util.Vector; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.BorderFactory; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.SwingConstants; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import captor.modelsystem.Model; import captor.modelsystem.Project; import captor.windowsystem.CaptorFrame; /** * @author Kicho * */ public class GRENAttributePanel extends CaptorFrame implements ActionListener, ListSelectionListener, KeyListener { public static final long serialVersionUID = 100; JList list; DefaultListModel listModel; JLabel jLabelAttListAtt; JPanel panel; JButton jButtonNovo; JButton jButtonRemove; JButton jButtonSave; JButton jButtonClose; JLabel jLabelAttName; JLabel jLabelAttType; JLabel jLabelAttLenght; JTextField jTextFieldAttName; JTextField jTextFieldAttLenght; JComboBox jComboBoxAttType; JLabel jLabelClassName; JScrollPane scrollPane; JPopupMenu popup; JMenuItem menuItem; private AttWinKeyEventDispatcher kev; private GRENClass grenClass; private Vector sysAttrs; public GRENAttributePanel(Model model, GRENClass grenClass, Vector sysAttrs) { super(model); this.grenClass = grenClass; this.sysAttrs = sysAttrs; init2(); } //------------------------------------------------------------------------- private void init2() { if ( sysAttrs != null ) { for ( int i = 0; i < sysAttrs.size(); i++ ) { listModel.addElement(sysAttrs.get(i)); } } if ( grenClass != null ) { for ( int i = 0; i < grenClass.getAttrs().size(); i++ ) { listModel.addElement(grenClass.getAttrs().get(i)); } } popup = new JPopupMenu(); menuItem = new JMenuItem("Copy"); menuItem.addActionListener(this); popup.add(menuItem); menuItem = new JMenuItem("Cut"); menuItem.addActionListener(this); popup.add(menuItem); menuItem = new JMenuItem("Paste"); menuItem.addActionListener(this); popup.add(menuItem); kev = new AttWinKeyEventDispatcher(this); KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(kev); } //------------------------------------------------------------------------- protected void init() throws Exception { this.setLayout(null); this.setCenterSize(560,280); this.getContentPane().setLayout(null); this.setTitle("Attributes"); this.setResizable(false); listModel = new DefaultListModel(); list = new JList(listModel); list.addListSelectionListener(this); list.addMouseListener(new AttListListener(model, list, this)); jLabelAttListAtt = new JLabel(); panel = new JPanel(); jButtonNovo = new JButton(); jButtonRemove = new JButton(); jButtonSave = new JButton(); jButtonClose = new JButton(); jLabelAttName = new JLabel(); jLabelAttType = new JLabel(); jLabelAttLenght = new JLabel(); jTextFieldAttName = new JTextField(); jTextFieldAttLenght = new JTextField(); jLabelClassName = new JLabel(); scrollPane = new JScrollPane(list); // String[] types = { "", "char", "integer", "float", "date", "discrete list", "list from a table", "multiples values from"}; String[] types = { "", "char", "integer", "float", "date"}; jComboBoxAttType = new JComboBox(types); jComboBoxAttType.addActionListener(this); jTextFieldAttName.addKeyListener(this); jTextFieldAttLenght.addKeyListener(this); jComboBoxAttType.addKeyListener(this); jButtonRemove.addActionListener(this); jButtonNovo.addActionListener(this); jButtonSave.addActionListener(this); jButtonClose.addActionListener(this); jLabelAttListAtt.setDoubleBuffered(false); panel.setBorder(BorderFactory.createEtchedBorder()); panel.setLayout(null); jButtonNovo.setText("New"); jButtonRemove.setText("Remove"); jButtonSave.setText("Save"); jButtonClose.setText("Close"); jLabelAttName.setAlignmentX((float) 0.0); jLabelAttName.setHorizontalAlignment(SwingConstants.RIGHT); jLabelAttType.setAlignmentX((float) 0.0); jLabelAttType.setHorizontalAlignment(SwingConstants.RIGHT); jLabelAttName.setText (" Attribute name:"); jLabelAttType.setText (" Attribute type:"); jLabelAttLenght.setText("Attribute lenght:"); jLabelAttLenght.setAlignmentX((float) 0.0); jLabelAttLenght.setHorizontalAlignment(SwingConstants.RIGHT); jTextFieldAttName.setText(""); jTextFieldAttLenght.setText(""); jLabelAttListAtt.setText("List of attributes for class:"); jLabelClassName.setFont(new java.awt.Font("Dialog", 1, 11)); jLabelClassName.setText("ClassName"); jLabelAttListAtt.setBounds(new Rectangle(10, 15, 132, 15)); jLabelClassName.setBounds(new Rectangle(145, 15, 233, 15)); list.setBounds(new Rectangle(10, 40, 174, 191)); scrollPane.setBounds(new Rectangle(10, 40, 174, 191)); panel.setBounds(new Rectangle(200, 40, 342, 146)); jButtonNovo.setBounds(new Rectangle (200, 204, 73, 25)); jButtonRemove.setBounds(new Rectangle(290, 204, 73, 25)); jButtonSave.setBounds(new Rectangle (380, 204, 73, 25)); jButtonClose.setBounds(new Rectangle (470, 204, 73, 25)); jLabelAttName.setBounds(new Rectangle (8, 25, 85, 15)); jLabelAttType.setBounds(new Rectangle (8, 60, 85, 15)); jLabelAttLenght.setBounds(new Rectangle (8, 95, 85, 15)); jTextFieldAttName.setBounds(new Rectangle(106, 25, 215, 21)); jComboBoxAttType.setBounds(new Rectangle (106, 60, 215, 21)); jTextFieldAttLenght.setBounds(new Rectangle(106, 95, 215, 21)); jTextFieldAttName.setEnabled(false); jTextFieldAttLenght.setVisible(false); jLabelAttLenght.setVisible(false); jComboBoxAttType.setEnabled(false); jButtonSave.setEnabled(false); jButtonRemove.setEnabled(false); panel.add(jLabelAttLenght, null); panel.add(jLabelAttType, null); panel.add(jLabelAttName, null); panel.add(jTextFieldAttName, null); panel.add(jComboBoxAttType, null); panel.add(jTextFieldAttLenght, null); this.getContentPane().add(scrollPane, null); this.getContentPane().add(jLabelAttListAtt, null); this.getContentPane().add(jLabelClassName, null); this.getContentPane().add(jButtonClose, null); this.getContentPane().add(jButtonNovo, null); this.getContentPane().add(jButtonRemove, null); this.getContentPane().add(jButtonSave, null); this.getContentPane().add(panel, null); } //------------------------------------------------------------------------- protected void windowClosing2(WindowEvent e) { dispose(); } //------------------------------------------------------------------------- public void actionPerformed(ActionEvent e) { //System. out.println(e); if ( e.getActionCommand().equals("Close") ) { setVisible(false); dispose(); } else if ( e.getActionCommand().equals("New") ) { newAttr(); } else if ( e.getActionCommand().equals("Save") ) { saveAttr(); } else if ( e.getActionCommand().equals("Remove") ) { removeAttr(); } else if ( e.getActionCommand().equals("comboBoxChanged") ) { typeChanged(); } } private void typeChanged() { String item = (String) jComboBoxAttType.getSelectedItem(); if ( item.equals("char") ) { jTextFieldAttLenght.setVisible(true); jLabelAttLenght.setVisible(true); } else { jTextFieldAttLenght.setVisible(false); jLabelAttLenght.setVisible(false); } } //------------------------------------------------------------------------- private void newAttr() { jTextFieldAttName.setText(""); jTextFieldAttLenght.setText(""); jComboBoxAttType.setSelectedIndex(0); jTextFieldAttName.setEnabled(true); jComboBoxAttType.setEnabled(true); jButtonSave.setEnabled(true); jTextFieldAttName.requestFocus(); } //------------------------------------------------------------------------- private void removeAttr() { int index = list.getSelectedIndex(); int size = listModel.getSize(); if ( size == 0 ) { JOptionPane.showMessageDialog(panel, "There is no element to be removed."); jButtonRemove.setEnabled(false); return; } if ( index == -1 ) { JOptionPane.showMessageDialog(panel, "You must first select a attribute element in the list before you try to remove it."); return; } GRENAttribute ga = (GRENAttribute) list.getSelectedValue(); if ( ga.isAttSystem() ) { JOptionPane.showMessageDialog(panel, "This attribute cannot be removed.\nIt is a required attribute in this pattern."); return; } grenClass.removeAttr(ga); listModel.removeElementAt(index); size = listModel.getSize(); if ( size == 0 ) jButtonRemove.setEnabled(false); grenClass.removeAttr((GRENAttribute) list.getSelectedValue()); jTextFieldAttName.setText(""); jComboBoxAttType.setSelectedIndex(0); jTextFieldAttLenght.setText(""); model.getProject().setStatus(Project.UNSAVED); } //------------------------------------------------------------------------- private void saveAttr() { //valida��o dos resultados if ( jTextFieldAttName.getText().equals("") ) { JOptionPane.showMessageDialog(panel, "The field attribute name cannot be blank."); return; } if ( jComboBoxAttType.getSelectedIndex() == 0 ) { JOptionPane.showMessageDialog(panel, "The field attribute type cannot be blank."); return; } Integer lenght = null; if ( jTextFieldAttLenght.isVisible() ) { if ( jTextFieldAttLenght.getText().equals("") ) { JOptionPane.showMessageDialog(panel, "The field attribute lenght cannot be blank."); return; } String aux = jTextFieldAttLenght.getText(); lenght = null; try { lenght = new Integer(aux); } catch (NumberFormatException e) { JOptionPane.showMessageDialog(panel, "The field attribute lenght must be a valid integer."); return; } if ( jComboBoxAttType.getSelectedIndex() == 0 ) { JOptionPane.showMessageDialog(panel, "You have to choose a value for the field attribute type."); return; } //validar o intervalo do tamanho do atributo if ( lenght.intValue() <= 0 ) { JOptionPane.showMessageDialog(panel, "The attribute lenght must be greater than 0."); return; } } //validar o formato do nome do atributo String regexp = "[(a-zA-Z)][(A-Za-z\\-_0-9)]*"; Pattern p = Pattern.compile(regexp); Matcher m = p.matcher(jTextFieldAttName.getText().trim()); if ( !m.matches() ) { JOptionPane.showMessageDialog(panel, "Invalid attribute name. It doesn't match the regular expression: " + regexp); return; } //atualizar os elementos do frame jTextFieldAttName.setEnabled(false); jComboBoxAttType.setEnabled(false); jButtonSave.setEnabled(false); jButtonRemove.setEnabled(true); GRENAttribute gattr = new GRENAttribute(); gattr.setName(jTextFieldAttName.getText()); gattr.setType((String)jComboBoxAttType.getSelectedItem()); if ( jTextFieldAttLenght.isVisible() && lenght != null ) gattr.setLenght(lenght.intValue()); //inserir o atributo no jlist addAttribute(gattr); } //------------------------------------------------------------------------- public void addAttribute(GRENAttribute gattr) { //percorrer toda a lista e verificar se tem um atributo com o mesmo nome de gattr for ( int i = 0; i < listModel.getSize(); i++ ) { GRENAttribute attr = (GRENAttribute) listModel.get(i); if ( attr.getName().equals(gattr.getName()) ) { JOptionPane.showMessageDialog(this, "Cannot paste attribute '" + gattr.getName() + "' because the list already contain an attribute with this name."); return; } } listModel.addElement(gattr); grenClass.addAttr(gattr); model.getProject().setStatus(Project.UNSAVED); } //------------------------------------------------------------------------- public void valueChanged(ListSelectionEvent e) { // System.out.println(e.getSource().getClass().getName()); // System.out.println(e.getSource()); //mostrar o atributo no panel do lado direito GRENAttribute gattr = (GRENAttribute) list.getSelectedValue(); if ( gattr == null ) return; jComboBoxAttType.setSelectedIndex(0); jTextFieldAttName.setText(""); jTextFieldAttLenght.setText(""); jTextFieldAttName.setText(gattr.getName()); jTextFieldAttLenght.setText(new Integer(gattr.getLenght()).toString()); jComboBoxAttType.setSelectedItem(gattr.getType()); jButtonRemove.setEnabled(true); } //------------------------------------------------------------------------- public void keyTyped(KeyEvent e) {} public void keyReleased(KeyEvent e) {} public void keyPressed(KeyEvent e) { if ( e.getKeyCode() == 10 ) { saveAttr(); } } //------------------------------------------------------------------------- }