/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * FuelChooser.java
 *
 * Created on Jan 3, 2011, 4:25:22 PM
 */

package usda.weru.weps.fuel;

import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.ItemSelectable;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JList;
import javax.swing.ListCellRenderer;
import javax.swing.event.EventListenerList;
import usda.weru.util.WepsComboBox;

/**
 *
 * @author josephalevin
 */
public class FuelChooser extends javax.swing.JPanel implements ItemSelectable {

    private final static Fuel FUEL_DEFAULT;


    static{
        FUEL_DEFAULT = new Fuel();
        FUEL_DEFAULT.setName("default");
        FUEL_DEFAULT.setDisplayName("(Default)");
    }

    private EventListenerList listeners = new EventListenerList();
    private boolean includeDefaultFuel = false;

    /** Creates new form FuelChooser */
    public FuelChooser() {
        initComponents();        
        initModel();
        combo.setRenderer(new InternalCellRenderer());

        //forward combo events to FuelChooser listeners
        combo.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                ActionListener[] targets = listeners.getListeners(ActionListener.class);
                if(targets != null){
                    ActionEvent payload = null;
                    for (ActionListener target : targets){
                        if(payload == null){
                            payload = new ActionEvent(FuelChooser.this, e.getID(), e.getActionCommand(), e.getWhen(), e.getModifiers());
                        }
                        target.actionPerformed(payload);
                    }
                }
            }
        });

        combo.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                ItemListener[] targets = listeners.getListeners(ItemListener.class);
                if(targets != null){
                    ItemEvent payload = null;
                    for(ItemListener target : targets){
                        if(payload == null){
                            payload = new ItemEvent(FuelChooser.this, e.getID(),e.getItem(), e.getStateChange());
                        }
                        target.itemStateChanged(payload);
                    }
                }
            }
        });

    }

    private void initModel(){
        Fuel selected = getSelectedFuel();

        Fuel[] fuels = FuelDAO.getInstance().getFuels();
        Arrays.sort(fuels, new Comparator<Fuel> (){

            @Override
            public int compare(Fuel fuel1, Fuel fuel2) {
                return fuel1.getDisplayName().compareTo(fuel2.getDisplayName());
            }

        });

        List<Fuel> list = new ArrayList<Fuel>(includeDefaultFuel ? fuels.length + 1 : fuels.length);
        if(includeDefaultFuel){
            list.add(FUEL_DEFAULT);
        }
        list.addAll(Arrays.asList(fuels));

        combo.setModel(new DefaultComboBoxModel(list.toArray()));

        setSelectedFuel(selected);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        combo = new WepsComboBox();

        combo.setBackground(java.awt.Color.white);
        combo.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(combo, 0, 255, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(combo)
        );
    }// </editor-fold>//GEN-END:initComponents


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JComboBox combo;
    // End of variables declaration//GEN-END:variables

    public boolean getIncludeDefaultFuel(){
        return includeDefaultFuel;
    }

    public void setIncludeDefaultFuel(boolean include){
        includeDefaultFuel = include;
        initModel();
    }

    public Fuel getSelectedFuel(){
        if(combo.getSelectedItem() instanceof Fuel){
            Fuel result = (Fuel) combo.getSelectedItem();
            if(result == FUEL_DEFAULT){
                result = null;
            }
            return result;
        }
        else{
            return null;
        }
    }

    public void setSelectedFuel(String name){
        if((name == null || name.trim().length() ==0) && includeDefaultFuel){
            combo.setSelectedItem(FUEL_DEFAULT);
        }
        else if(name == null || name.trim().length() == 0){
            combo.setSelectedItem(null);
            combo.setSelectedIndex(-1);
        }
        else{
            Fuel fuel = findInModel(name);
            combo.setSelectedItem(fuel);
        }
    }

    public void setSelectedFuel(Fuel fuel){
        if(fuel == null && includeDefaultFuel){
            combo.setSelectedItem(FUEL_DEFAULT);
        }
        else if(fuel == null){
            combo.setSelectedItem(null);
            combo.setSelectedIndex(-1);
        }
        else{
            fuel = findInModel(fuel.getName());
            combo.setSelectedItem(fuel);
        }
    }

    private Fuel findInModel(String name){
        for(int i = 0; i < combo.getModel().getSize(); i++){
            Fuel result = (Fuel) combo.getModel().getElementAt(i);
            if(name.equals(result.getName())){
                return result;
            }
        }
        return null;
    }

    private class InternalCellRenderer extends DefaultListCellRenderer implements ListCellRenderer{

        public InternalCellRenderer() {
            setFont(getFont().deriveFont(Font.PLAIN));
            setBackground(Color.WHITE);
            setOpaque(true);
        }


        @Override
        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
            if(value == null){
                value = " ";
            }
            else if(value instanceof Fuel)
            {
                Fuel fuel = (Fuel) value;
                value = fuel.getDisplayName();
                if(value == null){
                    value = fuel.getName();
                }
            }
           
            Component result = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            setOpaque(true);
            if(!isSelected){
                setBackground(Color.WHITE);
            }
            return result;
        }


    }

    public void addActionListener(ActionListener listener){
        listeners.add(ActionListener.class, listener);
    }

    public void removeActionListener(ActionListener listener){
        listeners.remove(ActionListener.class, listener);
    }

    @Override
    public Object[] getSelectedObjects() {
        return combo.getSelectedObjects();
    }

    public void addItemListener(ItemListener listener){
        listeners.add(ItemListener.class, listener);
    }

    public void removeItemListener(ItemListener listener){
        listeners.remove(ItemListener.class, listener);
    }


    @Override
    public void setEnabled(boolean enabled) {
        super.setEnabled(enabled);
        combo.setEnabled(enabled);
    }

    public void showPopup(){
        combo.showPopup();
    }

    public void hidePopup(){
        combo.hidePopup();
    }

    @Override
    public void setBackground(Color bg) {
        super.setBackground(bg);
        if(combo != null){
            combo.setBackground(bg);
        }
    }



}
