/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.ctecinf.combobox;

import br.com.ctecinf.swing.ListModel;
import java.io.Serializable;
import java.util.List;
import javax.swing.MutableComboBoxModel;

/**
 *
 * @author Cássio Conceição
 * @param <T>
 * @since 24/09/2019
 * @version 1909
 * @see http://ctecinf.com.br/
 */
public class ComboBoxModel<T> extends ListModel<T> implements MutableComboBoxModel<T>, Serializable {

    private Object selected;
    private int width;

    public ComboBoxModel() {
        super();
        width = 0;
    }

    public ComboBoxModel(T[] data) {
        super(data);
        width = 0;
    }

    public ComboBoxModel(List<T> data) {
        super(data);
        width = 0;
    }

    @Override
    public void addElement(T item) {
        add(item);
    }

    @Override
    public void removeElement(Object obj) {
        remove(getData().indexOf(obj));
    }

    @Override
    public void insertElementAt(T item, int index) {
        update(index, item);
    }

    @Override
    public void removeElementAt(int index) {
        remove(index);
    }

    @Override
    public void setSelectedItem(Object anItem) {

        int index = indexOf(anItem);

        if (index == -1) {
            selected = null;
        } else {
            selected = anItem;
        }

        fireContentsChanged(this, index, index);
    }

    @Override
    public Object getSelectedItem() {
        return selected;
    }

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int indexOf(Object anItem) {

        for (T t : getData()) {
            if (t != null && anItem != null && t.toString().equalsIgnoreCase(anItem.toString())) {
                return getData().indexOf(t);
            }
        }

        return -1;
    }
}
