package org.javafxdata.datasources.protocol;

import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import javafx.beans.InvalidationListener;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ListChangeListener.Change;
import javafx.collections.ObservableList;
import javafx.scene.control.TableColumn;

/**
 *
 * Implementations of DataSource contain specific logic that parses
 * data coming from a DataSourceReader. Implementations have 2 main
 * responsibilities:
 * 
 * <br/>
 * 1. provide the required data to the JavaFX Control (via the
 * getItems() call <br/>
 * 2. provide a getColumns() implementation that return TableColumns
 * with the appropirate CellValueFactories.
 * <p>
 * In case the data that has to be rendered in a row is a javafx 
 * bean property, the getColumns() can still be used but the TableColumn
 * can also be directly created using the desired property.
 * 
 * @author johan
 */
public class DataSource<T> {//implements ObservableList<T>{
    
    private List<ListChangeListener> listeners = new LinkedList<ListChangeListener>();

    private ObservableList<T> data = FXCollections.<T>observableArrayList();

    public TableColumn getNamedColumn (String name) {
      throw new UnsupportedOperationException("Not supported yet.");

    }
    
    public void add (T t) {
      data.add(t);
    }

    public ObservableList<T> getData () {
    //  System.out.println("getitems called for "+this+", return "+data);
        return data;
    }
//    
//    @Override
//    public void addListener(ListChangeListener<? super T> listener) {
//        data.addListener(listener);
//    }
//
//    @Override
//    public void removeListener(ListChangeListener<? super T> listener) {
//        data.removeListener(listener);
//    }
//
//    @Override
//    public boolean addAll(T... elements) {
//        return data.addAll(elements);
//    }
//
//    @Override
//    public boolean setAll(T... elements) {
//        return data.setAll(elements);
//    }
//
//    @Override
//    public boolean setAll(Collection<? extends T> col) {
//        data.clear();
//        return data.addAll(col);
//    }
//
//    @Override
//    public boolean removeAll(T... elements) {
//        return data.removeAll(elements);
//    }
//
//    @Override
//    public boolean retainAll(T... elements) {
//        return data.retainAll(elements);
//    }
//
//    @Override
//    public void remove(int from, int to) {
//        data.remove(from, to);
//    }
//
//    @Override
//    public int size() {
//        return data.size();
//    }
//
//    @Override
//    public boolean isEmpty() {
//        return data.isEmpty();
//    }
//
//    @Override
//    public boolean contains(Object o) {
//        return data.contains(o);
//    }
//
//    @Override
//    public Iterator<T> iterator() {
//        return data.iterator();
//    }
//
//    @Override
//    public Object[] toArray() {
//        return data.toArray();
//    }
//
//    @Override
//    public <T> T[] toArray(T[] a) { 
//        return data.toArray(a);
//    }
//
//    @Override
//    public boolean add(T e) {
//      System.out.println("add entry "+e);
//        return data.add(e);
//    }
//
//    @Override
//    public boolean remove(Object o) {
//        return data.remove(o);
//    }
//
//    @Override
//    public boolean containsAll(Collection<?> c) {
//        throw new UnsupportedOperationException("Not supported yet.");
//    }
//
//    @Override
//    public boolean removeAll(Collection<?> c) {
//        throw new UnsupportedOperationException("Not supported yet.");
//    }
//
//    @Override
//    public boolean retainAll(Collection<?> c) {
//        throw new UnsupportedOperationException("Not supported yet.");
//    }
//
//    @Override
//    public void clear() {
//      data.clear();
//    }
//
//    @Override
//    public T get(int index) {
//        if (index >= size()) {
//            return null;
//        }
//        return  data.get(index);
//    }
//
//
//    @Override
//    public int indexOf(Object o) {
//        throw new UnsupportedOperationException("Not supported yet.");
//    }
//
//    @Override
//    public int lastIndexOf(Object o) {
//        throw new UnsupportedOperationException("Not supported yet.");
//    }
//    @Override
//    public void addListener(InvalidationListener listener) {
//        data.addListener(listener);
//    }
//
//    @Override
//    public void removeListener(InvalidationListener listener) {
//        data.removeListener(listener);
//    }
//
//    @Override
//    public boolean addAll(Collection<? extends T> c) {
//        throw new UnsupportedOperationException("Not supported yet.");
//    }
//
//    @Override
//    public boolean addAll(int index, Collection<? extends T> c) {
//        throw new UnsupportedOperationException("Not supported yet.");
//    }
//
//    @Override
//    public T set(int index, T element) {
//        throw new UnsupportedOperationException("Not supported yet.");
//    }
//
//    @Override
//    public void add(int index, T element) {
//        data.add(index, element);
//    }
//
//    @Override
//    public T remove(int index) {
//        throw new UnsupportedOperationException("Not supported yet.");
//    }
//
//    @Override
//    public ListIterator<T> listIterator() {
//        throw new UnsupportedOperationException("Not supported yet.");
//    }
//
//    @Override
//    public ListIterator<T> listIterator(int index) {
//        throw new UnsupportedOperationException("Not supported yet.");
//    }
//
//    @Override
//    public List<T> subList(int fromIndex, int toIndex) {
//        throw new UnsupportedOperationException("Not supported yet.");
//    }

}
