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 rows; public ExpenseTableModel() { rows = Lists.newArrayList(); loadStrings(); fireTableChanged(null); } public void setData(List 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"); } }