
import java.util.Vector;

import javax.swing.AbstractListModel;

public class FragmentListModel extends AbstractFragmentListModel {

	private Vector<Fragment> elements;
	
	public FragmentListModel() {
		elements = new Vector<Fragment>();		
	}
	
	public Object getElementAt(int pos) {

		return elements.elementAt(pos);
		
	}
	
	
	public int getSize() {
		return elements.size();
	}
	
	public void setElements(Vector<Fragment> newElements) {
	
		if (elements.size() > 0)
			fireIntervalRemoved(this, 0, elements.size()-1);
		elements = newElements;
		fireIntervalAdded(this, 0, elements.size()-1);		
		
	}
	
	public int getPosition(Fragment frag) {
	
		return elements.indexOf(frag);
		
	}
	
	public int addElement(Fragment newItem, boolean notify) {
		int id = newItem.getId();
		int newPos = -1;
		
		if (elements.isEmpty()) {
			newPos = 0;
			elements.add(newItem);
		}		
		else if (elements.lastElement().getId() < id) {
			newPos = elements.size();
			elements.add(newItem);
		}
		else if (elements.firstElement().getId() > id) {
			newPos = 0;
			elements.add(0, newItem);
		}
		else {
			
			int start = 0;
			int end = elements.size() - 1;
			
			while (end > start) {
				
				int middle = (start + end) / 2;
//				System.out.println("Start: " + start + " End: " + end + " Middle: " + middle);
				if (elements.elementAt(middle).getId() > id) {
					
					if (elements.elementAt(middle-1).getId() < id) {
						newPos = middle;
						elements.add(middle, newItem);
						break;
					}
					end = middle;	
				}
				else {
					
					if (elements.elementAt(middle+1).getId() > id) {
						newPos = middle;
						elements.add(middle+1, newItem);
						break;
					}
					start = middle;
					
				}
				
			}			
			
		}
		
		if ((newPos > -1) && notify)
			fireIntervalAdded(this, newPos, newPos);
		return newPos;		
	}
	
	public int removeElement(Fragment toRemove, boolean notify) {
		
		int oldPos = elements.indexOf(toRemove);
		if (oldPos == -1)
			return -1;
		
		elements.remove(toRemove);
		
		if (notify)
			fireIntervalRemoved(this, oldPos, oldPos);
		
		return oldPos;
		
	}
	
	public void clear() {
		int size = elements.size();
		elements.clear();
		if (size > 0)
			fireIntervalRemoved(this, 0, size-1);
	}
}

