import javax.swing.*;
import java.util.*;
/**
 * An implementation of a ComboBoxModel.
 * Also has provisions for a 'fuzzy' search feature, but it needs completed.
 *
 * @author  Michael Pell, Solutions Plus, Inc.
 */

public class DaComboBoxModel extends AbstractListModel implements MutableComboBoxModel
{
	private Vector contents = new Vector(0);
	private Object selectedObject = null;
	
	public DaComboBoxModel(){}
	public void addElement(Object anObj)
	{
		this.contents().add(anObj);
		this.fireContentsChanged(this, 0, contents.size());        
	}
public void addItems(Vector items)
{
	this.contents = items;
	this.fireContentsChanged();
}
public boolean contains(Object anObj)
{
	return this.contents.contains(anObj);
}
	private Vector contents()
	{
		return this.contents;
	}
	public void fireContentsChanged()
	{
		this.fireContentsChanged(this, 0, contents.size());
	}
	public Object getElementAt(int position) 
	{
		return this.contents().elementAt(position);        
	}
	public Object getSelectedItem()
	{
		return this.selectedObject();
	}
	public int getSize()
	{
		return this.contents().size();
	}
	public void insertElementAt(Object anObj, int position) 
	{
		this.contents().insertElementAt(anObj, position);
		this.fireContentsChanged(this, position, position+1);  //is this right?
	}
	public void removeElement(Object anObj)
	{
		this.contents().remove(anObj);
		this.fireContentsChanged(this, 0, contents.size());        
	}
	public void removeElementAt(int position) 
	{
		this.contents().remove(position);
	}
public void removellAllItems()
{
	this.contents = new Vector(0);
	this.fireContentsChanged();
}
public void replaceElements(Vector newContents)
{
	this.contents = newContents;
	this.fireContentsChanged();
}
	private Object selectedObject()
	{
		return this.selectedObject;
	}
	public void selectWithKeyChar(char keyChar, int selectedIndex)
	{
		Character keyCharacter = new Character(Character.toUpperCase(keyChar));
		Character itemCharacter = null;
		Character selectedIndexCharacter = 
			new Character(Character.toUpperCase(((String)contents.elementAt(selectedIndex)).charAt(0)));
		
		for (int i = selectedIndex; i<contents.size(); i++)
		{
			int index = i;
			if (selectedIndexCharacter == keyCharacter)  //this is what selects the next item in a series
				index++;            
			String str = (String)contents.elementAt(index);
			itemCharacter = new Character(Character.toUpperCase(str.charAt(0)));
			
			if (itemCharacter.equals(keyCharacter) )
			{
				this.setSelectedObject(str);
				this.fireContentsChanged(this, i, i );      
				break;
			}
		}
	}
public void setSelectedItem(Object anObj)
{
	this.setSelectedObject(anObj);
	this.fireContentsChanged(this, 0, contents.size());
}
	private void setSelectedObject(Object anObj)
	{
		this.selectedObject = anObj;
	}
}
