package leaf.ui;

import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import leaf.data.OrderedMap;

import siprp.database.cayenne.objects.TrabalhadoresEcd;


import com.evolute.utils.tables.BaseTableModel;
import com.evolute.utils.tables.models.SortableModel;

public class LeafTableModel extends BaseTableModel
{

	private static final long serialVersionUID = 1L;

	private OrderedMap<Object> map = new OrderedMap<Object>();

	public LeafTableModel(String n[])
	{
		super( n, null );
		setChangeable( false );
	}

	public void clearAll()
	{
		int i = map.rows();
		if( i > 0 )
		{
			map.clear();
			fireTableRowsDeleted( 0, i - 1 );
		}
	}

	@Override
	public int innerGetRowCount()
	{
		return map == null ? 0 : map.rows();
	}

	@Override
	public Object innerGetValueAt( int row, int col )
	{
		return map.getValueAt( row, col );
	}

	@Override
	public void deleteRow( int row )
	{
		map.deleteRow( row );
	}

	public Object getKey( int row )
	{
		Object result = null;
		if( row < map.rows() )
		{
			result = map.getKeyForRow( row );
		}
		return result;
	}

	public void setValues( Collection<? extends Object> v )
	{
		Iterator<? extends Object> iterator = v.iterator();
		while( iterator.hasNext() )
		{
			Object value = iterator.next();
			map.putLast( value, value.toString() );
		}
		fireTableDataChanged();
	}

	public void setValues( OrderedMap<? extends Object> map )
	{
		this.map = (OrderedMap<Object>) map;
		fireTableDataChanged();
	}
	
	public void order(int ... colNumber )
	{
		if(colNumber != null)
		{
			map.order(colNumber);
			fireTableDataChanged();
		}
	}
	
	@Override
	public void appendEmptyRow()
	{
		map.putLast( map.rows(), (Object) null );
	}

	@Override
	public void innerSetValueAt( Object obj, int row, int col )
	{
		if( isCellEditable( row, col ) && map.getValueAt( row, col ) != null )
		{
			map.setValueAt( row, col, obj );
		}
	}

	@Override
	public boolean isRowEmpty( int row )
	{
		List<Object> line = map.getRow( row );
		return line != null && line.size() > 0;
	}

	@Override
	public boolean innerIsCellEditable( int row, int col )
	{
		return false;
	}

	public void printContents()
	{
		for( int r = 0; r < getRowCount(); r++ )
		{
			for( int c = 0; c < getColumnCount(); c++ )
			{
				Object val = getValueAt( r, c );
				if( val != null )
				{
					System.out.print( val.toString() + "\t" );
				}
			}
			System.out.println( "" );
		}
	}

	// public void insertRowAt( Object rowObj, int row )
	// {
	// values.add( row, rowObj );
	// fireTableDataChanged();
	// }
	//
	// public void removeRowAt( int row )
	// {
	// values.remove( row );
	// fireTableDataChanged();
	// }
	//
	// public Object getRowAt( int row )
	// {
	// return values.elementAt( row );
	// }

	// public void swapRows( int row1, int row2 )
	// {
	// if( row1 == row2 || row1 < 0 || row2 < 0 || row1 >= getRowCount() || row2
	// >= getRowCount() )
	// {
	// return;
	// }
	// // Collections.swap( values, row1, row2 );
	// Object row1Data = getRowAt( row1 );
	// Object row2Data = getRowAt( row2 );
	// if( row1 < row2 )
	// {
	// removeRowAt( row2 );
	// removeRowAt( row1 );
	// insertRowAt( row2Data, row1 );
	// insertRowAt( row1Data, row2 );
	// }
	// else
	// {
	// removeRowAt( row1 );
	// removeRowAt( row2 );
	// insertRowAt( row1Data, row2 );
	// insertRowAt( row2Data, row1 );
	// }
	// }

}
