/*
 * 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.event.EventListenerList;
import usda.weru.util.WepsComboBox;

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

    private static final long serialVersionUID = 1L;

    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<Object>(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<Object>();

        combo.setModel(new javax.swing.DefaultComboBoxModel<Object>(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<Object> combo;
    // End of variables declaration//GEN-END:variables

    /**
     *
     * @return
     */
    public boolean getIncludeDefaultFuel() {
        return includeDefaultFuel;
    }

    /**
     *
     * @param include
     */
    public void setIncludeDefaultFuel(boolean include) {
        includeDefaultFuel = include;
        initModel();
    }

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

    /**
     *
     * @param name
     */
    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);
        }
    }

    /**
     *
     * @param 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;
    }

    // LEW Changes Ascough's programmers made to compile under Java 7
    private class InternalCellRenderer extends DefaultListCellRenderer { //implements ListCellRenderer{

        private static final long serialVersionUID = 1L;

        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;
        }

    }

    /**
     *
     * @param listener
     */
    public void addActionListener(ActionListener listener) {
        listeners.add(ActionListener.class, listener);
    }

    /**
     *
     * @param listener
     */
    public void removeActionListener(ActionListener listener) {
        listeners.remove(ActionListener.class, listener);
    }

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

    /**
     *
     * @param listener
     */
    @Override
    public void addItemListener(ItemListener listener) {
        listeners.add(ItemListener.class, listener);
    }

    /**
     *
     * @param listener
     */
    @Override
    public void removeItemListener(ItemListener listener) {
        listeners.remove(ItemListener.class, listener);
    }

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

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

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

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

}
