All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.sf.javagimmicks.swing.model.ComboBoxModelAdapter Maven / Gradle / Ivy

package net.sf.javagimmicks.swing.model;

import java.util.List;

import javax.swing.ComboBoxModel;

public class ComboBoxModelAdapter extends ListModelAdapter implements ComboBoxModel
{
	private static final long serialVersionUID = -5100057877489621837L;

	protected Object m_oSelectedItem;

	public ComboBoxModelAdapter()
	{
		super();
	}

	public ComboBoxModelAdapter(List oInternalList)
	{
		super(oInternalList);
	}
	
    public Object getSelectedItem()
    {
        return m_oSelectedItem;
    }

    public void setSelectedItem(Object oItem)
    {
        if(m_oSelectedItem != null && !m_oSelectedItem.equals(oItem) || m_oSelectedItem == null && oItem != null)
        {
            m_oSelectedItem = oItem;
            fireContentsChanged(this, -1, -1);
        }
    }
    
	@Override
	public ComboBoxModelAdapter subList(int iFromIndex, int iToIndex)
	{
		return new SubListDecorator(this, iFromIndex, iToIndex);
	}

	@Override
	public boolean equals(Object o)
	{
        if(!(o instanceof ComboBoxModelAdapter))
        {
            return false;
        }

        ComboBoxModelAdapter oOther = (ComboBoxModelAdapter) o;

        boolean bSelectedEqual = (this.m_oSelectedItem == null && oOther.m_oSelectedItem == null)
        	|| this.m_oSelectedItem == null
        	|| oOther.m_oSelectedItem == null
        	|| (this.m_oSelectedItem.equals(oOther.m_oSelectedItem));
        
        return bSelectedEqual && super.equals(o);
	}

	@Override
	public int hashCode()
	{
		return super.hashCode() + (1 << 15) + (m_oSelectedItem == null ? 0 : m_oSelectedItem.hashCode());
	}

	// Unfortunately I had to duplicate the code from ListModelListDecorator to here
	// in order to keep the type ComboBoxModelListDecorator also for the sub list.
	// Maybe there is a much better way. If you know one, please send me your proposal.
    protected static class SubListDecorator extends ComboBoxModelAdapter
    {
		private static final long serialVersionUID = -5301211360041031237L;

		protected final int m_iOffset;
        protected final ComboBoxModelAdapter m_oParent;
        
        protected SubListDecorator(ComboBoxModelAdapter oParent, int iFromIndex, int iToIndex)
        {
            super(oParent._internalList.subList(iFromIndex, iToIndex));
            
            m_oParent = oParent;
            m_iOffset = iFromIndex;
        }

        protected void fireContentsChanged(Object source, int index0, int index1)
        {
            super.fireContentsChanged(source, index0, index1);
            
            if(source == this && index0 >= 0 && index1 >= 0)
            {
                m_oParent.fireContentsChanged(m_oParent, m_iOffset + index0, m_iOffset + index1);
            }
        }

        protected void fireIntervalAdded(Object source, int index0, int index1)
        {
            super.fireIntervalAdded(source, index0, index1);

            if(source == this)
            {
                m_oParent.fireIntervalAdded(m_oParent, m_iOffset + index0, m_iOffset + index1);
            }
        }

        protected void fireIntervalRemoved(Object source, int index0, int index1)
        {
            super.fireIntervalRemoved(source, index0, index1);

            if(source == this)
            {
                m_oParent.fireIntervalRemoved(m_oParent, m_iOffset + index0, m_iOffset + index1);
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy