package captor.windowsystem.formcomponent.ncp; import java.awt.Dimension; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.WindowEvent; import java.util.Vector; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.SwingConstants; import javax.swing.table.DefaultTableModel; import captor.lib.intl.MyIntl; import captor.modelsystem.Model; import captor.modelsystem.Project; import captor.windowsystem.CaptorFrame; import captor.windowsystem.formcomponent.FormComponent; /** * @author Kicho * */ public class FElementChooserFrame extends CaptorFrame implements ActionListener, ItemListener { public static final long serialVersionUID = 145; private FComponentPanel fep; private JComboBox combo; private JTable table; private DefaultTableModel tableModel; private JButton plus, minus, help, edit; private Element element; //------------------------------------------------------------------------- public FElementChooserFrame(Model model, FComponentPanel fep, Element element) { super(model, model.getGui().getCaptorWindow()); this.model = model; this.fep = fep; this.element = element; displayDataIfAny(); } public FElementChooserFrame(Model model, FComponentPanel fep) { super(model, model.getGui().getCaptorWindow()); this.model = model; this.fep = fep; } //------------------------------------------------------------------------- private void displayDataIfAny() { for ( int i = 0; i < combo.getItemCount(); i++ ) { String classname = (String) combo.getItemAt(i); if ( classname == null && element.getClassname() != null ) continue; if ( classname.trim().equals(element.getClassname()) ) { combo.setSelectedIndex(i); break; } } for ( int i = 0; i < element.getParameters().size(); i++ ) { Parameter p = (Parameter) element.getParameters().get(i); addParameter(p.getName(), p.getValue()); } } //------------------------------------------------------------------------- protected void init() throws Exception { setCenterSize(456, 373); setResizable(false); setState(Frame.NORMAL); setTitle(MyIntl.NCP_LABEL_FECHOOSER); addWindowListener(this); Dimension minSize = new Dimension(5, 10); Dimension prefSize = new Dimension(20, 80); Dimension prefSize2 = new Dimension(40, 80); Dimension maxSize = new Dimension(150, 300); //--------------- JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); panel.add(new Box.Filler(minSize, prefSize, maxSize)); panel.add(comboPanel()); panel.add(new Box.Filler(minSize, prefSize2, maxSize)); panel.add(new Box.Filler(minSize, prefSize2, maxSize)); panel.add(new Box.Filler(minSize, prefSize2, maxSize)); panel.add(parameterPanel()); panel.add(new Box.Filler(minSize, prefSize2, maxSize)); panel.add(footer()); panel.add(new Box.Filler(minSize, prefSize, maxSize)); this.add(panel); } //------------------------------------------------------------------------- //------------------------------------------------------------------------- //------------------------------------------------------------------------- private JPanel parameterPanel() { String[] columnNames = {MyIntl.NCP_LABEL_NAME, MyIntl.NCP_LABEL_VALUE}; String data[][] = {}; tableModel = new DefaultTableModel(data, columnNames); table = new JTable(tableModel); JScrollPane scrollPane = new JScrollPane(table); //--------------- JLabel textLabel = new JLabel(MyIntl.NCP_LABEL_PARAMETERS); textLabel.setPreferredSize(new Dimension(80,12)); textLabel.setHorizontalAlignment(SwingConstants.RIGHT); plus = new JButton(MyIntl.NCP_LABEL_ADD); plus.addActionListener(this); minus = new JButton(MyIntl.NCP_LABEL_REMOVE); minus.addActionListener(this); edit = new JButton(MyIntl.NCP_LABEL_EDIT); edit.addActionListener(this); help = new JButton(MyIntl.NCP_LABEL_HELP); help.addActionListener(this); Dimension d = new Dimension(80,25); plus.setMinimumSize(d); plus.setMaximumSize(d); plus.setPreferredSize(d); minus.setMinimumSize(d); minus.setMaximumSize(d); minus.setPreferredSize(d); help.setMinimumSize(d); help.setMaximumSize(d); help.setPreferredSize(d); edit.setMinimumSize(d); edit.setMaximumSize(d); edit.setPreferredSize(d); JPanel bPanel = new JPanel(); bPanel.setLayout(new BoxLayout(bPanel, BoxLayout.Y_AXIS)); bPanel.add(plus); bPanel.add(Box.createRigidArea(new Dimension(5,5))); bPanel.add(minus); bPanel.add(Box.createRigidArea(new Dimension(5,5))); bPanel.add(edit); bPanel.add(Box.createRigidArea(new Dimension(5,5))); bPanel.add(help); bPanel.add(Box.createVerticalGlue()); bPanel.add(new JLabel(" ")); //--------------- JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); panel.add(textLabel); panel.add(scrollPane); panel.add(new JLabel(" ")); panel.add(bPanel); panel.add(Box.createRigidArea(new Dimension(10,0))); panel.setMinimumSize(new Dimension(200,240)); //--------------- return panel; } //------------------------------------------------------------------------- private JPanel comboPanel() { JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); JLabel label = new JLabel(MyIntl.NCP_LABEL_ELEMENT); label.setPreferredSize(new Dimension(70,12)); label.setHorizontalAlignment(SwingConstants.RIGHT); Vector elements = FEUtil.getComboData(model); String choices[] = new String[elements.size()]; for ( int i = 0; i < elements.size(); i++ ) { String s = (String) elements.get(i); if ( s!= null && !s.equals("")) { choices[i] = (String) elements.get(i); } } combo = new JComboBox(); combo.setEditable(true); for (int i=0;i<choices.length;i++) { combo.addItem (choices[i]); } combo.setPreferredSize(new Dimension(295,22)); combo.addItemListener(this); JButton test = new JButton(MyIntl.NCP_LABEL_TEST); test.addActionListener(this); panel.add(Box.createHorizontalGlue()); panel.add(label); panel.add(combo); panel.add(new JLabel(" ")); panel.add(test); panel.add(Box.createHorizontalGlue()); return panel; } //------------------------------------------------------------------------- private JPanel footer() { JButton okButton = new JButton(MyIntl.NCP_LABEL_OK); JButton cancelButton = new JButton(MyIntl.NCP_LABEL_CANCEL); okButton.addActionListener(this); cancelButton.addActionListener(this); JPanel buttonPanel = new JPanel(); buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.X_AXIS)); buttonPanel.add(Box.createHorizontalGlue()); buttonPanel.add(okButton); buttonPanel.add(Box.createRigidArea(new Dimension(12,20))); buttonPanel.add(cancelButton); buttonPanel.add(Box.createRigidArea(new Dimension(12,20))); return buttonPanel; } //------------------------------------------------------------------------- //------------------------------------------------------------------------- //------------------------------------------------------------------------- public void actionPerformed (ActionEvent e) { if ( e.getActionCommand().equals(MyIntl.NCP_LABEL_CANCEL) ) { this.setVisible(false); } else if ( e.getActionCommand().equals(MyIntl.NCP_LABEL_ADD) ) { addAction(); } else if ( e.getActionCommand().equals(MyIntl.NCP_LABEL_TEST) ) { testAction(); } else if ( e.getActionCommand().equals(MyIntl.NCP_LABEL_EDIT) ) { editAction(); } else if ( e.getActionCommand().equals(MyIntl.NCP_LABEL_REMOVE) ) { removeAction(); } else if ( e.getActionCommand().equals(MyIntl.NCP_LABEL_HELP) ) { showHelpAction(); } else if ( e.getActionCommand().equals(MyIntl.NCP_LABEL_OK) ) { okAction(); } } //------------------------------------------------------------------------- public void windowClosing2(WindowEvent e) { close(); } //------------------------------------------------------------------------- public void itemStateChanged(ItemEvent e) { if ( this.isVisible() == false ) return; String s = (String) combo.getSelectedItem(); if ( e.getStateChange() == ItemEvent.SELECTED && !s.equals("") ) { updateParametersList(); } } //------------------------------------------------------------------------- //------------------------------------------------------------------------- //------------------------------------------------------------------------- //------------------------------------------------------------------------- public void addParameter(String name, String value) { Vector data = tableModel.getDataVector(); for ( int i = 0; i < data.size(); i++ ) { Vector rowData = (Vector) data.get(i); String mname = (String) rowData.get(0); String mvalue = (String) rowData.get(1); if ( mname.trim().equals(name.trim()) && mvalue.trim().equals(value.trim())) { return; } if ( mname.trim().equals(name.trim()) && !mvalue.trim().equals(value.trim())) { tableModel.setValueAt(value, i, 1); return; } } data = new Vector(); data.add(name); data.add(value); tableModel.addRow(data); } //------------------------------------------------------------------------- //------------------------------------------------------------------------- //------------------------------------------------------------------------- //------------------------------------------------------------------------- private void addAction() { String classname = (String) combo.getSelectedItem(); classname = classname.trim(); if ( classname.equals("") ) { JOptionPane.showMessageDialog(this, MyIntl.MSG114); return; } ParameterSetterFrame ps = new ParameterSetterFrame(model, this); ps.setVisible(true); } //------------------------------------------------------------------------- private void showHelpAction() { String fullname = (String) combo.getSelectedItem(); if ( fullname == null ) { JOptionPane.showMessageDialog(this, MyIntl.MSG97); return; } fullname = fullname.trim(); if ( fullname.equals("") ) { JOptionPane.showMessageDialog(this, MyIntl.MSG97); return; } FormComponent fe = FEUtil.getFormElementInstance(this, model, fullname); if ( fe == null ) { //the error was already sinalized by FEUtil (JOption dialog) return; } ShowParametersFrame spf = new ShowParametersFrame(model, this, fe.getRequiredParameters()); spf.setVisible(true); } //------------------------------------------------------------------------- private void editAction() { int index = table.getSelectedRow(); if ( index < 0 ) { JOptionPane.showMessageDialog(this, MyIntl.MSG96); return; } Vector data = (Vector) tableModel.getDataVector().get(index); String name = (String) data.get(0); String value = (String) data.get(1); String classname = (String) combo.getSelectedItem(); if ( isMandatory(classname, name) ) { ParameterSetterFrame ps = new ParameterSetterFrame(model, this, name, value, true); ps.setVisible(true); } else { ParameterSetterFrame ps = new ParameterSetterFrame(model, this, name, value, true); ps.setVisible(true); } } //------------------------------------------------------------------------- private void okAction() { String classname = (String) combo.getSelectedItem(); classname = classname.trim(); //validation if ( classname.equals("") ) { JOptionPane.showMessageDialog(this, MyIntl.MSG98); return; } boolean create = false; if ( element == null ) { element = new Element(model); create = true; } //updating model based on widgets values if ( !element.getClassname().equals(classname) ) { element.setClassname(classname); model.getProject().setStatus(Project.UNSAVED); } Vector data = tableModel.getDataVector(); boolean alreadyExists = false; for ( int i = 0; i < data.size(); i++ ) { Vector pdata = (Vector) data.get(i); String name = (String) pdata.get(0); String value = (String) pdata.get(1); alreadyExists = false; for ( int j = 0; j < element.getParameters().size(); j++ ) { Parameter ep = (Parameter) element.getParameters().get(j); if ( ep.getName().equals(name) ) { alreadyExists = true; } if ( ep.getName().equals(name) && !ep.getValue().equals(value) ) { ep.setValue(value); model.getProject().setStatus(Project.UNSAVED); } } if ( !alreadyExists ) { Parameter p = new Parameter(); p.setName(name); p.setValue(value); element.addParameter(p); model.getProject().setStatus(Project.UNSAVED); } } //removes the parameters that is no on the list for ( int j = 0; j < element.getParameters().size(); j++ ) { Parameter ep = (Parameter) element.getParameters().get(j); alreadyExists = false; for ( int i = 0; i < data.size(); i++ ) { Vector pdata = (Vector) data.get(i); String name = (String) pdata.get(0); if ( name.trim().equals(ep.getName().trim()) ) alreadyExists = true; } if ( !alreadyExists ) { element.removeParameterByName(ep.getName()); model.getProject().setStatus(Project.UNSAVED); } } String errorDescription = element.validate(this); if ( errorDescription != null ) { JOptionPane.showMessageDialog(this, errorDescription); return; } //searching for unused parameters if ( hasUnusedParameters(element) != null ) { int res = JOptionPane.showConfirmDialog(this, MyIntl.MSG99 + hasUnusedParameters(element) + MyIntl.MSG100, MyIntl.MSG101, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE ); if ( res == JOptionPane.NO_OPTION ) { return; } } if ( create ) model.getProject().setStatus(Project.UNSAVED); fep.addElement(element); this.setVisible(false); } //------------------------------------------------------------------------- private void removeAction() { int index = table.getSelectedRow(); if ( index < 0 ) { JOptionPane.showMessageDialog(this, MyIntl.MSG96); return; } //verificar se � mandatory Vector data = (Vector) tableModel.getDataVector().get(index); String name = (String) data.get(0); String classname = (String) combo.getSelectedItem(); if ( !isMandatory(classname, name) ) { tableModel.removeRow(index); return; } JOptionPane.showMessageDialog(this, MyIntl.MSG102); } //------------------------------------------------------------------------- private void testAction() { String classname = (String) combo.getSelectedItem(); if ( classname.trim().equals("") ) { JOptionPane.showMessageDialog(this, "Choose a element in the select box first."); return; } ShowFormElementFrame sfef = new ShowFormElementFrame(model, this, classname, tableModel); if ( sfef.initialize() ) sfef.setVisible(true); } //------------------------------------------------------------------------- private void updateParametersList() { String classname = (String) combo.getSelectedItem(); FormComponent fe = FEUtil.getFormElementInstance(this, model, classname); if ( fe == null ) { //the error is already sinalized by FEUtil return; } cleanTable(); for ( int i = 0; i < fe.getRequiredParameters().size(); i++ ) { captor.windowsystem.formcomponent.Parameter p = (captor.windowsystem.formcomponent.Parameter) fe.getRequiredParameters().get(i); if ( p.isRequired() ) { Vector data = new Vector(); data.add(p.getName()); data.add(p.getDefaultValue()); tableModel.addRow(data); } } } //------------------------------------------------------------------------- private void cleanTable() { while ( tableModel.getRowCount() > 0 ) { tableModel.removeRow(0); } } //------------------------------------------------------------------------- private String hasUnusedParameters(Element element) { StringBuffer sb = new StringBuffer(); FormComponent fe = FEUtil.getFormElementInstance(this, model, element.getClassname()); if ( fe == null ) return null; Vector parameterName = new Vector(); //getting all parameters name for ( int i = 0; i < fe.getRequiredParameters().size(); i++ ) { captor.windowsystem.formcomponent.Parameter p = (captor.windowsystem.formcomponent.Parameter) fe.getRequiredParameters().get(i); parameterName.add(p.getName()); } for ( int i = 0; i < element.getParameters().size(); i++ ) { Parameter p = (Parameter) element.getParameters().get(i); if ( !contain(parameterName, p.getName()) ) { sb.append(" Parameter: " + p.getName() + "\n"); } } if ( sb.toString().equals("") ) return null; else return sb.toString(); } //------------------------------------------------------------------------- private boolean contain(Vector v, String s) { for ( int i = 0; i < v.size(); i++ ) { String aux = (String) v.get(i); if ( aux.equals(s) ) return true; } return false; } //------------------------------------------------------------------------- private boolean isMandatory(String classname, String parameterName) { if ( classname == null || parameterName == null ) return false; FormComponent fe = FEUtil.getFormElementInstance(null, model, classname); if ( fe == null ) { return false; } for ( int i = 0; i < fe.getRequiredParameters().size(); i++ ) { captor.windowsystem.formcomponent.Parameter parameter = (captor.windowsystem.formcomponent.Parameter) fe.getRequiredParameters().get(i); if ( parameter.getName().trim().equals(parameterName) && parameter.isRequired() ) { return true; } } return false; } //------------------------------------------------------------------------- }