/**
 * 
 */
package view.tool.JEditableComboBox;

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemListener;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

import tool.observable.EasyObserver;
import view.Vue;
import view.vuePopup.JObservablePopup;
import view.vuePopup.PopupAjouterAdresse;

/**
 * @author alexis
 *
 */
public class JEditableComboBox extends Vue implements ActionListener, EasyObserver{
	/**
	 * 
	 */
	private static final long serialVersionUID = -4952166912821083026L;
	private JComboBox<String> combo;
	private JButton plus;
	private JButton minus;
	private Vue popup;
	private Object messageOnAdd;
	private Object messageOnRemove;
	private GridBagConstraints constraint;
	
	private JEditableComboBox(String[] items, Vue popUp_plus, Object messageOnAdd, Object messageOnRemove, boolean hasMinus) {
		super(new GridBagLayout());
		constraint = new GridBagConstraints();
		popup = popUp_plus;
		this.messageOnAdd = messageOnAdd;
		this.messageOnRemove = messageOnRemove;
		
		combo = new JComboBox<String>(new DefaultComboBoxModel<String>(items));
		plus = new JButton("+");
		plus.addActionListener(this);
		
		constraint.fill = GridBagConstraints.BOTH;
		constraint.weightx = 1;
		constraint.weighty = 0;
		constraint.gridx = 0;
		constraint.gridy = 0;
		this.add(combo,constraint);
		
		constraint.fill = GridBagConstraints.BOTH;
		constraint.weightx = 0;
		constraint.weighty = 0;
		constraint.gridx = 1;
		constraint.gridy = 0;
		this.add(plus,constraint);
		if(hasMinus)
		{
			minus = new JButton("-");
			minus.addActionListener(this);
			
			constraint.fill = GridBagConstraints.BOTH;
			constraint.weightx = 0;
			constraint.weighty = 0;
			constraint.gridx = 2;
			constraint.gridy = 0;
			this.add(minus);
		}
	}
	
	public static JEditableComboBox hasPlus(String[] items, Vue popUp_plus, Object messageOnAdd){
		return new JEditableComboBox(items,popUp_plus,messageOnAdd,null,false);
	}
	
	public static JEditableComboBox hasPlusAndMinus(String[] items, Vue popUp_plus, Object messageOnAdd, Object messageOnRemove){
		return new JEditableComboBox(items,popUp_plus,messageOnAdd,messageOnRemove,true);
	}
	
	public void addItem(String data){
		combo.addItem(data);
	}
	
	public void removeAllItems(){
		combo.removeAllItems();
	}
	
	public String getItemAt(int index) {
		return combo.getItemAt(index);
	}

	public int getItemCount() {
		return combo.getItemCount();
	}

	public String getSelectedItem(){
		return combo.getSelectedItem().toString();
	}
	
	public void addItemListener(ItemListener listener){
		combo.addItemListener(listener);
	}
	
	@Override
	public void setEnabled(boolean enabled){
		combo.setEnabled(enabled);
		plus.setEnabled(enabled);
		if(minus != null)
			minus.setEnabled(enabled);
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource().equals(plus))
		{
			int answer = JOptionPane.showConfirmDialog(null, popup, "Ajout",JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
			if(answer == JOptionPane.OK_OPTION)
			{
				DefaultComboBoxModel<String> model = (DefaultComboBoxModel<String>)combo.getModel();
				model.addElement(popup.toString());
				combo.setModel(model);
				combo.setSelectedIndex(model.getSize()-1);
				this.getObservable().notifyObservers(messageOnAdd);
			}
		}
		else
		{
			this.getObservable().notifyObservers(messageOnRemove);
			DefaultComboBoxModel<String> model = (DefaultComboBoxModel<String>)combo.getModel();
			model.removeElementAt(combo.getSelectedIndex());
			combo.setSelectedIndex(0);
			combo.setModel(model);
		}
	}
	
	@Override
	public void update(Object e, Object text) {
		DefaultComboBoxModel<String> model = (DefaultComboBoxModel<String>)combo.getModel();
		model.addElement((String)text);
		combo.setModel(model);
		combo.setSelectedIndex(model.getSize()-1);
	}

	/**
	 * @param args
	 */
	/* *** */
	public static void main(String[] args) {
		JFrame a = new JFrame();
		a.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		
		//JPanelObservable pane = new PopupAjouterTelephone();
		JObservablePopup pane = new PopupAjouterAdresse();
		JEditableComboBoxControler b = new JEditableComboBoxControler(pane);
		JEditableComboBox c = JEditableComboBox.hasPlusAndMinus(new String[]{"1","2","3"},pane,b.plus,b.moin);
		c.setMaximumSize(new Dimension(100,100));
		c.getObservable().addObserver(b);
		a.add(c);
		a.setVisible(true);
		a.pack();
	}
}
