package tim.prune.function.deletebydate;
import java.text.DateFormat;
import javax.swing.table.AbstractTableModel;
import tim.prune.I18nManager;
/**
* Table model for selecting which dates to delete
*/
public class DeletionTableModel extends AbstractTableModel
{
/** info list, one for each row of table */
private DateInfoList _infoList = null;
/** Formatter, determining how dates appear in the table */
private static final DateFormat DEFAULT_DATE_FORMAT = DateFormat.getDateInstance();
/** Column heading for date */
private static final String COLUMN_HEADING_DATE = I18nManager.getText("fieldname.date");
/** Column heading for number of points */
private static final String COLUMN_HEADING_NUMPOINTS = I18nManager.getText("details.track.points");
/** Column heading for keep */
private static final String COLUMN_HEADING_KEEP = I18nManager.getText("dialog.deletebydate.column.keep");
/** Column heading for delete */
private static final String COLUMN_HEADING_DELETE = I18nManager.getText("dialog.deletebydate.column.delete");
/**
* Constructor
* @param inList date info list from function
*/
public DeletionTableModel(DateInfoList inList)
{
_infoList = inList;
}
/**
* @return column count
*/
public int getColumnCount()
{
return 4; // always fixed (date, numpoints, keep, delete)
}
/**
* @return row count
*/
public int getRowCount()
{
if (_infoList == null) {return 0;} // shouldn't happen
return _infoList.getNumEntries();
}
/**
* Get the name of the column
* @param inColNum column number
* @return column name
*/
public String getColumnName(int inColNum)
{
if (inColNum == 0) return COLUMN_HEADING_DATE;
else if (inColNum == 1) return COLUMN_HEADING_NUMPOINTS;
else if (inColNum == 2) return COLUMN_HEADING_KEEP;
else if (inColNum == 3) return COLUMN_HEADING_DELETE;
return "unknown column!";
}
/**
* Get the class of objects in the given column
* @see javax.swing.table.AbstractTableModel#getColumnClass(int)
*/
public Class<?> getColumnClass(int inColumnIndex)
{
if (inColumnIndex == 1) {return Integer.class;}
if (inColumnIndex > 1) {return Boolean.class;}
return super.getColumnClass(inColumnIndex);
}
/**
* Get whether the given cell is editable
* @see javax.swing.table.AbstractTableModel#isCellEditable(int, int)
*/
public boolean isCellEditable(int inRowIndex, int inColumnIndex)
{
return (inColumnIndex > 1);
}
/**
* Set the value at the given table cell
* @see javax.swing.table.AbstractTableModel#setValueAt(java.lang.Object, int, int)
*/
public void setValueAt(Object inValue, int inRowIndex, int inColumnIndex)
{
// can only edit the keep and delete columns
final boolean isKeep = (inColumnIndex == 2);
final boolean isDelete = (inColumnIndex == 3);
// ignore all events for other columns
if (isKeep || isDelete)
{
try {
boolean setFlag = ((Boolean) inValue).booleanValue();
if (setFlag)
{
_infoList.getDateInfo(inRowIndex).setDeleteFlag(isDelete);
// make sure the other cell (keep or delete) on the same row is updated too
fireTableCellUpdated(inRowIndex, 5 - inColumnIndex);
}
}
catch (ClassCastException cce) {}
}
}
/**
* @return cell contents at the given row, column inded
*/
public Object getValueAt(int inRowIndex, int inColIndex)
{
try {
DateInfo info = _infoList.getDateInfo(inRowIndex);
if (info != null)
{
switch (inColIndex)
{
case 0: // date
if (info.isDateless()) {
return I18nManager.getText("dialog.deletebydate.nodate");
}
return DEFAULT_DATE_FORMAT.format(info.getDate());
case 1: // number of points
return info.getPointCount();
case 2: // keep
return !info.getDeleteFlag();
case 3: // delete
return info.getDeleteFlag();
}
}
}
catch (IndexOutOfBoundsException obe) {} // ignore, fallthrough
return null;
}
}