package senseiTests.domainsTest;

import sensei.middleware.domains.Property;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import java.util.Map;
import java.util.TreeMap;

class PropertySelector extends JDialog  implements ActionListener
{
  public PropertySelector(Property[] props, JFrame owner, String title, String name, String value, boolean add,
    boolean allowCancel)
  {
    super(owner, title, true);
    this.allowCancel=false;
    convertToMap(props);
    init(name, value, add, allowCancel, properties.keySet().toArray());
    pack();
    setLocation(owner.getLocation());
  }

  Property getInput()
  {
    pressedOk=false;
    show();
    Property ret;
    if (pressedOk || (!allowCancel))
    {
      String name = (String)(names.getSelectedItem());
      String val = (String)(value.getText());
      ret=new Property(name, val);
    }
    else
      ret=null;
    return ret;
  }

  void init(String nameField, String valueField, boolean add, boolean allowCancel, Object [] props)
  {
    JPanel total = new JPanel(new BorderLayout());
    JPanel twoLines = new JPanel(new GridLayout(0,1,5,5));
    JPanel buttons = new JPanel(new BorderLayout());

    JPanel labelPlusField = new JPanel(new BorderLayout());
    names = new JComboBox(props);
    names.addActionListener(this);
    labelPlusField.add(new JLabel(nameField+": "), BorderLayout.WEST);
    labelPlusField.add(names, BorderLayout.CENTER);
    twoLines.add(labelPlusField);

    labelPlusField = new JPanel(new BorderLayout());
    value = new JTextField();
    labelPlusField.add(new JLabel(valueField+": "), BorderLayout.WEST);
    labelPlusField.add(value, BorderLayout.CENTER);
    twoLines.add(labelPlusField);

    twoLines.setBorder(BorderFactory.createTitledBorder("Property"));

    okButton = new JButton("Ok");
    okButton.setMnemonic(KeyEvent.VK_O);
    okButton.addActionListener(this);
    if (allowCancel)
    {
      cancelButton = new JButton("Cancel");
      cancelButton.setMnemonic(KeyEvent.VK_C);
      cancelButton.addActionListener(this);
      JPanel okCancel = new JPanel(new GridLayout(1,0,5,5));
      okCancel.add(okButton);
      okCancel.add(cancelButton);
      buttons.add(okCancel, BorderLayout.EAST);
    }
    else
    {
      buttons.add(okButton, BorderLayout.NORTH);
    }

    total.add(twoLines, BorderLayout.NORTH);
    total.add(buttons, BorderLayout.SOUTH);
    getContentPane().add(total, BorderLayout.NORTH);

    names.setEditable(add);
    value.setEditable(add);

    changedSelection();
  }

  void convertToMap(Property[] props)
  {
    properties = new TreeMap();
    int size = props.length;
    while(size-->0)
      properties.put(props[size].nam, props[size].val);
  }

  public void actionPerformed(ActionEvent e)
  {
    Object obj = e.getSource();
    if (obj==names)
      changedSelection();
    else if (obj==okButton)
    {
      pressedOk=true;
      dispose();
    }
    else if (obj==cancelButton)
      dispose();
  }

  void changedSelection()
  {
    String name = (String)(names.getSelectedItem());
    String val = (String) (properties.get(name));
    value.setText(val==null? "" : val);
  }

  Map properties;
  JButton okButton, cancelButton;
  JComboBox names;
  JTextField value;
  boolean pressedOk, allowCancel;
};