/* TaskTableModel.java created 2007-09-11 * */ package org.signalml.app.model.components; import static org.signalml.app.util.i18n.SvarogI18n._; import java.util.Date; import java.util.HashMap; import java.util.Map; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableRowSorter; import org.signalml.app.task.ApplicationTaskManager; import org.signalml.task.AggregateTaskProgressComparator; import org.signalml.task.AggregateTaskProgressInfo; import org.signalml.task.Task; import org.signalml.task.TaskEvent; import org.signalml.task.TaskEventListener; import org.signalml.task.TaskManagerEvent; import org.signalml.task.TaskManagerListener; import org.signalml.task.TaskStatus; import org.signalml.task.TaskStatusImportanceComparator; /** * TaskTableModel * * * @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe * Sp. z o.o. */ public class TaskTableModel extends AbstractTableModel implements TaskManagerListener, TaskEventListener { private static final long serialVersionUID = 1L; public static final int STATUS_COLUMN = 0; public static final int METHOD_NAME_COLUMN = 1; public static final int CREATE_TIME_COLUMN = 2; public static final int PROGRESS_COLUMN = 3; public static final int MESSAGE_COLUMN = 4; private ApplicationTaskManager taskManager; private TableRowSorter<TaskTableModel> sorter = null; private Map<Task, AggregateTaskProgressInfo> taskToProgressMap = new HashMap<Task, AggregateTaskProgressInfo>(); public TableRowSorter<TaskTableModel> getSorter() { if (sorter == null) { sorter = new TableRowSorter<TaskTableModel>(this); sorter.setComparator(TaskTableModel.STATUS_COLUMN, new TaskStatusImportanceComparator()); sorter.setComparator(TaskTableModel.PROGRESS_COLUMN, new AggregateTaskProgressComparator()); sorter.setSortsOnUpdates(true); } return sorter; } @Override public Class<?> getColumnClass(int col) { switch (col) { case STATUS_COLUMN: return TaskStatus.class; case METHOD_NAME_COLUMN: return String.class; case CREATE_TIME_COLUMN: return Date.class; case PROGRESS_COLUMN: return AggregateTaskProgressInfo.class; case MESSAGE_COLUMN: return String.class; default: return Object.class; } } @Override public String getColumnName(int col) { switch (col) { case STATUS_COLUMN: return _("Status"); case METHOD_NAME_COLUMN: return _("Method"); case CREATE_TIME_COLUMN: return _("Created"); case PROGRESS_COLUMN: return _("Progress"); case MESSAGE_COLUMN: return _("Message"); default: return "???"; } } @Override public int getColumnCount() { return 5; } @Override public int getRowCount() { return taskManager.getTaskCount(); } @Override public Object getValueAt(int row, int col) { Task task = taskManager.getTaskAt(row); if (task == null) { return "???"; } switch (col) { case STATUS_COLUMN: return task.getStatus(); case METHOD_NAME_COLUMN: return task.getMethod().getName(); case CREATE_TIME_COLUMN: return task.getTaskInfo().getCreateTime(); case PROGRESS_COLUMN: AggregateTaskProgressInfo atpi = taskToProgressMap.get(task); if (atpi == null) { atpi = new AggregateTaskProgressInfo(task); taskToProgressMap.put(task, atpi); } else { atpi.update(); } return atpi; case MESSAGE_COLUMN: String message = task.getMessage(); if (message != null) { return message; } else { return ""; } default: return "???"; } } public ApplicationTaskManager getTaskManager() { return taskManager; } public void setTaskManager(ApplicationTaskManager taskManager) { if (this.taskManager != null) { this.taskManager.removeTaskManagerListener(this); } this.taskManager = taskManager; if (taskManager != null) { taskManager.addTaskManagerListener(this); } } @Override public void taskAdded(TaskManagerEvent e) { taskManager.getEventProxyForTask(e.getTask()) .addTaskEventListener(this); int index = e.getIndex(); fireTableRowsInserted(index, index); } @Override public void taskRemoved(TaskManagerEvent e) { Task task = e.getTask(); taskManager.getEventProxyForTask(task).removeTaskEventListener(this); taskToProgressMap.remove(task); int index = e.getIndex(); fireTableRowsDeleted(index, index); } @Override public void taskAborted(TaskEvent ev) { int index = taskManager.getIndexOfTask(ev.getTask()); if (index >= 0) { fireTableCellUpdated(index, STATUS_COLUMN); } } @Override public void taskFinished(TaskEvent ev) { int index = taskManager.getIndexOfTask(ev.getTask()); if (index >= 0) { fireTableCellUpdated(index, STATUS_COLUMN); } } @Override public void taskResumed(TaskEvent ev) { int index = taskManager.getIndexOfTask(ev.getTask()); if (index >= 0) { fireTableCellUpdated(index, STATUS_COLUMN); } } @Override public void taskStarted(TaskEvent ev) { int index = taskManager.getIndexOfTask(ev.getTask()); if (index >= 0) { fireTableCellUpdated(index, STATUS_COLUMN); } } @Override public void taskSuspended(TaskEvent ev) { int index = taskManager.getIndexOfTask(ev.getTask()); if (index >= 0) { fireTableCellUpdated(index, STATUS_COLUMN); } } @Override public void taskRequestChanged(TaskEvent ev) { int index = taskManager.getIndexOfTask(ev.getTask()); if (index >= 0) { fireTableCellUpdated(index, STATUS_COLUMN); } } @Override public void taskMessageSet(TaskEvent ev) { int index = taskManager.getIndexOfTask(ev.getTask()); if (index >= 0) { fireTableCellUpdated(index, MESSAGE_COLUMN); } } @Override public void taskTickerUpdated(TaskEvent ev) { int index = taskManager.getIndexOfTask(ev.getTask()); if (index >= 0) { // fireTableCellUpdated( index, PROGRESS_COLUMN ); // XXX for unknown reason firing the event for just one column // causes the sorter // to mix rows (only the progres column gets sorted in the view). // Cause of // problem unknown, changes to other rows seem to sort whole rows as // expected fireTableRowsUpdated(index, index); } } }