public class ExpenseTableModel extends AbstractTableModel {
private static ResourceMap rm = Application.getInstance().getContext().getResourceManager().getResourceMap(ExpenseTable.class);
public static enum ExpenseColumns {
COLUMN_CATEGORY_ID,
COLUMN_CATEGORY_DESCRIPTION,
COLUMN_RESOURCE_ID,
COLUMN_RESOURCE_NAME,
COLUMN_AMOUNT,
COLUMN_DESCRIPTION
}
protected String[] columnsNames;
protected List<ActivityExpense> rows;
public ExpenseTableModel() {
rows = Lists.newArrayList();
loadStrings();
fireTableChanged(null);
}
public void setData(List<ActivityExpense> pages) {
clear();
this.rows.addAll(pages);
if (!pages.isEmpty()) {
fireTableRowsInserted(0, pages.size() - 1);
}
}
public void addData(ActivityExpense e) {
this.rows.add(e);
int row = getRowCount() - 1;
fireTableRowsInserted(row, row);
}
public void removeData(ActivityExpense e) {
}
public ActivityExpense getActivityExpense(int row) {
return rows.get(row);
}
public int getNextAvailableId() {
int max = 0;
for (ActivityExpense e : rows) {
max = Math.max(max, e.getLineId());
}
return max + 1;
}
public void clear() {
int old = rows.size();
rows.clear();
if (old > 0) {
fireTableRowsDeleted(0, 0 == old ? 0 : old -1);
}
}
@Override
public String getColumnName(int column) {
return columnsNames[column];
}
@Override
public Class<?> getColumnClass(int column) {
ExpenseColumns c = ExpenseColumns.values()[column];
switch (c) {
case COLUMN_CATEGORY_ID:
return String.class;
case COLUMN_CATEGORY_DESCRIPTION:
return String.class;
case COLUMN_RESOURCE_ID:
return String.class;
case COLUMN_RESOURCE_NAME:
return String.class;
case COLUMN_AMOUNT:
return Double.class;
case COLUMN_DESCRIPTION:
return String.class;
}
return String.class;
}
@Override
public int getColumnCount() {
return columnsNames.length;
}
@Override
public int getRowCount() {
return rows == null ? 0 : rows.size();
}
@Override
public Object getValueAt(int row, int column) {
ExpenseColumns c = ExpenseColumns.values()[column];
ActivityExpense e = rows.get(row);
switch (c) {
case COLUMN_CATEGORY_ID:
return e.getCategory().getId();
case COLUMN_CATEGORY_DESCRIPTION:
return e.getCategory().getDescription();
case COLUMN_RESOURCE_ID:
return e.getResource().getId();
case COLUMN_RESOURCE_NAME:
return e.getResource().getDescription();
case COLUMN_AMOUNT:
return e.getAmount();
case COLUMN_DESCRIPTION:
return e.getDescription();
}
return null;
}
@Override
public boolean isCellEditable(int row, int column) {
ExpenseColumns c = ExpenseColumns.values()[column];
switch (c) {
case COLUMN_CATEGORY_ID:
return false; // for now
case COLUMN_CATEGORY_DESCRIPTION:
return false;
case COLUMN_RESOURCE_ID:
return false; // for now
case COLUMN_RESOURCE_NAME:
return false;
case COLUMN_AMOUNT:
return true;
case COLUMN_DESCRIPTION:
return true;
}
return false;
}
@Override
public void setValueAt(Object value, int row, int column) {
ExpenseColumns c = ExpenseColumns.values()[column];
ActivityExpense e = rows.get(row);
switch (c) {
case COLUMN_CATEGORY_ID:
// todo
break;
case COLUMN_CATEGORY_DESCRIPTION:
break;
case COLUMN_RESOURCE_ID:
break;
case COLUMN_RESOURCE_NAME:
break;
case COLUMN_AMOUNT:
e.setAmount((Double)value);
UnitOfWork.getInstance().registerDirty(e);
break;
case COLUMN_DESCRIPTION:
e.setDescription(value.toString());
UnitOfWork.getInstance().registerDirty(e);
break;
}
}
private void loadStrings() {
int i = 0;
columnsNames = new String[ExpenseColumns.COLUMN_DESCRIPTION.ordinal() + 1];
columnsNames[i++] = rm.getString("column.category.id");
columnsNames[i++] = rm.getString("column.category.desc");
columnsNames[i++] = rm.getString("column.res.id");
columnsNames[i++] = rm.getString("column.res.desc");
columnsNames[i++] = rm.getString("column.amount.text");
columnsNames[i++] = rm.getString("column.description.text");
}
}