package es.icarto.gvsig.navtable.navigation;
import java.util.Comparator;
import javax.swing.DefaultRowSorter;
import org.apache.log4j.Logger;
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
import com.hardcode.gdbms.engine.values.Value;
import com.hardcode.gdbms.engine.values.ValueFactory;
import com.iver.cit.gvsig.fmap.layers.SelectableDataSource;
import es.udc.cartolab.gvsig.navtable.utils.ValueComparator;
public class NTRowSorter<M extends SelectableDataSource> extends
DefaultRowSorter<M, Integer> {
private static final Logger logger = Logger.getLogger(NTRowSorter.class);
private final M model;
private final ValueComparator comparator;
public NTRowSorter(M model) {
super();
this.model = model;
setMaxSortKeys(5);
setModelWrapper(new NTRowSorterModelWrapper());
setSortsOnUpdates(true);
comparator = new ValueComparator();
}
/**
* DefaultRowSorter translates all values to string and then uses
* Collator.getInstace() as Comparator. To avoid it a custom comparator for
* each column should be set using setComparator, but in our case, as the
* ValueComparator handles all the available object is easy to override this
* method
*/
@Override
public Comparator<Value> getComparator(int column) {
return comparator;
}
private class NTRowSorterModelWrapper extends ModelWrapper<M, Integer> {
@Override
public M getModel() {
return model;
}
@Override
public int getColumnCount() {
try {
return model.getFieldCount();
} catch (ReadDriverException e) {
logger.error(e.getStackTrace(), e);
}
return 0;
}
@Override
public int getRowCount() {
try {
return (int) model.getRowCount();
} catch (ReadDriverException e) {
logger.error(e.getStackTrace(), e);
}
return 0;
}
@Override
public Object getValueAt(int row, int column) {
try {
return model.getFieldValue(row, column);
} catch (ReadDriverException e) {
logger.error(e.getStackTrace(), e);
}
return ValueFactory.createNullValue();
}
@Override
public Integer getIdentifier(int row) {
return row;
}
}
}