/* ViewerTaskTable.java created 2007-09-11 * */ package org.signalml.app.view.workspace; import static org.signalml.app.util.i18n.SvarogI18n._; import java.awt.event.ActionEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JMenu; import javax.swing.JPopupMenu; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; import javax.swing.table.DefaultTableColumnModel; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; import org.signalml.app.action.selector.ActionFocusListener; import org.signalml.app.action.selector.ActionFocusManager; import org.signalml.app.action.selector.ActionFocusSupport; import org.signalml.app.action.selector.TaskFocusSelector; import org.signalml.app.action.workspace.tasks.AbortAllTasksAction; import org.signalml.app.action.workspace.tasks.AbortTaskAction; import org.signalml.app.action.workspace.tasks.GetTaskErrorAction; import org.signalml.app.action.workspace.tasks.GetTaskResultAction; import org.signalml.app.action.workspace.tasks.RemoveAllAbortedTasksAction; import org.signalml.app.action.workspace.tasks.RemoveAllFailedTasksAction; import org.signalml.app.action.workspace.tasks.RemoveAllFinishedTasksAction; import org.signalml.app.action.workspace.tasks.RemoveAllTasksAction; import org.signalml.app.action.workspace.tasks.RemoveTaskAction; import org.signalml.app.action.workspace.tasks.ResumeAllTasksAction; import org.signalml.app.action.workspace.tasks.ResumeTaskAction; import org.signalml.app.action.workspace.tasks.ShowTaskDialogAction; import org.signalml.app.action.workspace.tasks.SuspendAllTasksAction; import org.signalml.app.action.workspace.tasks.SuspendTaskAction; import org.signalml.app.method.ApplicationMethodManager; import org.signalml.app.model.components.TaskTableModel; import org.signalml.app.task.ApplicationTaskManager; import org.signalml.app.view.common.components.cellrenderers.DateTableCellRenderer; import org.signalml.app.view.common.components.cellrenderers.ProgressTableCellRenderer; import org.signalml.app.view.common.components.cellrenderers.TaskStatusCellRenderer; import org.signalml.app.view.common.dialogs.errors.ExceptionDialog; import org.signalml.method.SuspendableMethod; import org.signalml.task.Task; import org.signalml.task.TaskStatus; /** ViewerTaskTable * * * @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o. */ public class ViewerTaskTable extends JTable implements TaskFocusSelector { private static final long serialVersionUID = 1L; private ActionFocusSupport afSupport = new ActionFocusSupport(this); private JPopupMenu taskPopupMenu; private JPopupMenu suspendableTaskPopupMenu; private JPopupMenu finishedTaskPopupMenu; private JPopupMenu errorTaskPopupMenu; private JPopupMenu abortedTaskPopupMenu; private ActionFocusManager actionFocusManager; private ApplicationTaskManager taskManager; private ApplicationMethodManager methodManager; private ShowTaskDialogAction showTaskDialogAction; private AbortTaskAction abortTaskAction; private SuspendTaskAction suspendTaskAction; private ResumeTaskAction resumeTaskAction; private GetTaskResultAction getTaskResultAction; private GetTaskErrorAction getTaskErrorAction; private RemoveTaskAction removeTaskAction; private AbortAllTasksAction abortAllTasksAction; private SuspendAllTasksAction suspendAllTasksAction; private ResumeAllTasksAction resumeAllTasksAction; private RemoveAllTasksAction removeAllTasksAction; private RemoveAllFinishedTasksAction removeAllFinishedTasksAction; private RemoveAllAbortedTasksAction removeAllAbortedTasksAction; private RemoveAllFailedTasksAction removeAllFailedTasksAction; private Task activeTask; public ViewerTaskTable(TaskTableModel model) { super(model, (TableColumnModel) null); DefaultTableColumnModel columnModel = new DefaultTableColumnModel(); columnModel.setColumnSelectionAllowed(false); TableColumn tc; tc = new TableColumn(TaskTableModel.STATUS_COLUMN, 100); tc.setHeaderValue(model.getColumnName(tc.getModelIndex())); TaskStatusCellRenderer taskStatusCellRenderer = new TaskStatusCellRenderer(); tc.setCellRenderer(taskStatusCellRenderer); columnModel.addColumn(tc); tc = new TableColumn(TaskTableModel.METHOD_NAME_COLUMN, 100); tc.setHeaderValue(model.getColumnName(tc.getModelIndex())); columnModel.addColumn(tc); tc = new TableColumn(TaskTableModel.CREATE_TIME_COLUMN, 100); tc.setHeaderValue(model.getColumnName(tc.getModelIndex())); DateTableCellRenderer dateTableCellRenderer = new DateTableCellRenderer(); tc.setCellRenderer(dateTableCellRenderer); columnModel.addColumn(tc); tc = new TableColumn(TaskTableModel.PROGRESS_COLUMN, 100); tc.setHeaderValue(model.getColumnName(tc.getModelIndex())); tc.setResizable(false); tc.setCellRenderer(new ProgressTableCellRenderer()); columnModel.addColumn(tc); tc = new TableColumn(TaskTableModel.MESSAGE_COLUMN, 200); tc.setHeaderValue(model.getColumnName(tc.getModelIndex())); columnModel.addColumn(tc); setColumnModel(columnModel); setColumnSelectionAllowed(false); setSelectionMode(ListSelectionModel.SINGLE_SELECTION); setRowHeight(20); setRowSorter(model.getSorter()); getTableHeader().setReorderingAllowed(false); addMouseListener(new MouseEventHandler()); } @Override public TaskTableModel getModel() { return (TaskTableModel) super.getModel(); } @Override public JPopupMenu getComponentPopupMenu() { int row = getSelectedRow(); Task task = null; if (row >= 0) { task = taskManager.getTaskAt(convertRowIndexToModel(row)); } return focus(task); } @Override public Task getActiveTask() { return activeTask; } @Override public void addActionFocusListener(ActionFocusListener listener) { afSupport.addActionFocusListener(listener); } @Override public void removeActionFocusListener(ActionFocusListener listener) { afSupport.removeActionFocusListener(listener); } private JPopupMenu focus(Task task) { JPopupMenu popupMenu = null; activeTask = task; if (task != null) { TaskStatus status = task.getStatus(); if (status.isAborted()) { popupMenu = getAbortedTaskPopupMenu(); } else if (status.isFinished()) { popupMenu = getFinishedTaskPopupMenu(); } else if (status.isError()) { popupMenu = getErrorTaskPopupMenu(); } else { if (task.getMethod() instanceof SuspendableMethod) { popupMenu = getSuspendableTaskPopupMenu(); } else { popupMenu = getTaskPopupMenu(); } } } afSupport.fireActionFocusChanged(); return popupMenu; } private JPopupMenu getTaskPopupMenu() { if (taskPopupMenu == null) { taskPopupMenu = new JPopupMenu(); taskPopupMenu.add(getShowTaskDialogAction()); taskPopupMenu.addSeparator(); taskPopupMenu.add(getAbortTaskAction()); taskPopupMenu.addSeparator(); taskPopupMenu.add(createAllTasksSubmenu()); } return taskPopupMenu; } private JPopupMenu getFinishedTaskPopupMenu() { if (finishedTaskPopupMenu == null) { finishedTaskPopupMenu = new JPopupMenu(); finishedTaskPopupMenu.add(getShowTaskDialogAction()); finishedTaskPopupMenu.addSeparator(); finishedTaskPopupMenu.add(getGetTaskResultAction()); finishedTaskPopupMenu.addSeparator(); finishedTaskPopupMenu.add(getRemoveTaskAction()); finishedTaskPopupMenu.addSeparator(); finishedTaskPopupMenu.add(createAllTasksSubmenu()); } return finishedTaskPopupMenu; } private JPopupMenu getErrorTaskPopupMenu() { if (errorTaskPopupMenu == null) { errorTaskPopupMenu = new JPopupMenu(); errorTaskPopupMenu.add(getShowTaskDialogAction()); errorTaskPopupMenu.addSeparator(); errorTaskPopupMenu.add(getGetTaskErrorAction()); errorTaskPopupMenu.addSeparator(); errorTaskPopupMenu.add(getRemoveTaskAction()); errorTaskPopupMenu.addSeparator(); errorTaskPopupMenu.add(createAllTasksSubmenu()); } return errorTaskPopupMenu; } private JPopupMenu getAbortedTaskPopupMenu() { if (abortedTaskPopupMenu == null) { abortedTaskPopupMenu = new JPopupMenu(); abortedTaskPopupMenu.add(getShowTaskDialogAction()); abortedTaskPopupMenu.addSeparator(); abortedTaskPopupMenu.add(getRemoveTaskAction()); abortedTaskPopupMenu.addSeparator(); abortedTaskPopupMenu.add(createAllTasksSubmenu()); } return abortedTaskPopupMenu; } private JPopupMenu getSuspendableTaskPopupMenu() { if (suspendableTaskPopupMenu == null) { suspendableTaskPopupMenu = new JPopupMenu(); suspendableTaskPopupMenu.add(getShowTaskDialogAction()); suspendableTaskPopupMenu.addSeparator(); suspendableTaskPopupMenu.add(getSuspendTaskAction()); suspendableTaskPopupMenu.add(getResumeTaskAction()); suspendableTaskPopupMenu.addSeparator(); suspendableTaskPopupMenu.add(getAbortTaskAction()); suspendableTaskPopupMenu.addSeparator(); suspendableTaskPopupMenu.add(createAllTasksSubmenu()); } return suspendableTaskPopupMenu; } private JMenu createAllTasksSubmenu() { JMenu allTasksSubmenu = new JMenu(_("All tasks")); allTasksSubmenu.add(getSuspendAllTasksAction()); allTasksSubmenu.add(getResumeAllTasksAction()); allTasksSubmenu.add(getAbortAllTasksAction()); allTasksSubmenu.addSeparator(); allTasksSubmenu.add(getRemoveAllFinishedTasksAction()); allTasksSubmenu.add(getRemoveAllAbortedTasksAction()); allTasksSubmenu.add(getRemoveAllFailedTasksAction()); allTasksSubmenu.addSeparator(); allTasksSubmenu.add(getRemoveAllTasksAction()); return allTasksSubmenu; } public ActionFocusManager getActionFocusManager() { return actionFocusManager; } public void setActionFocusManager(ActionFocusManager actionFocusManager) { this.actionFocusManager = actionFocusManager; } public ApplicationTaskManager getTaskManager() { return taskManager; } public void setTaskManager(ApplicationTaskManager taskManager) { this.taskManager = taskManager; } public ApplicationMethodManager getMethodManager() { return methodManager; } public void setMethodManager(ApplicationMethodManager methodManager) { this.methodManager = methodManager; } public ShowTaskDialogAction getShowTaskDialogAction() { if (showTaskDialogAction == null) { showTaskDialogAction = new ShowTaskDialogAction(this); showTaskDialogAction.setTaskManager(taskManager); } return showTaskDialogAction; } public AbortTaskAction getAbortTaskAction() { if (abortTaskAction == null) { abortTaskAction = new AbortTaskAction(this); } return abortTaskAction; } public SuspendTaskAction getSuspendTaskAction() { if (suspendTaskAction == null) { suspendTaskAction = new SuspendTaskAction(this); } return suspendTaskAction; } public ResumeTaskAction getResumeTaskAction() { if (resumeTaskAction == null) { resumeTaskAction = new ResumeTaskAction(this); resumeTaskAction.setTaskManager(taskManager); } return resumeTaskAction; } public GetTaskResultAction getGetTaskResultAction() { if (getTaskResultAction == null) { getTaskResultAction = new GetTaskResultAction(this); getTaskResultAction.setMethodManager(methodManager); } return getTaskResultAction; } public GetTaskErrorAction getGetTaskErrorAction() { if (getTaskErrorAction == null) { getTaskErrorAction = new GetTaskErrorAction(this); } return getTaskErrorAction; } public RemoveTaskAction getRemoveTaskAction() { if (removeTaskAction == null) { removeTaskAction = new RemoveTaskAction(this); removeTaskAction.setTaskManager(taskManager); } return removeTaskAction; } public AbortAllTasksAction getAbortAllTasksAction() { return abortAllTasksAction; } public void setAbortAllTasksAction(AbortAllTasksAction abortAllTasksAction) { this.abortAllTasksAction = abortAllTasksAction; } public SuspendAllTasksAction getSuspendAllTasksAction() { return suspendAllTasksAction; } public void setSuspendAllTasksAction(SuspendAllTasksAction suspendAllTasksAction) { this.suspendAllTasksAction = suspendAllTasksAction; } public ResumeAllTasksAction getResumeAllTasksAction() { return resumeAllTasksAction; } public void setResumeAllTasksAction(ResumeAllTasksAction resumeAllTasksAction) { this.resumeAllTasksAction = resumeAllTasksAction; } public RemoveAllTasksAction getRemoveAllTasksAction() { return removeAllTasksAction; } public void setRemoveAllTasksAction(RemoveAllTasksAction removeAllTasksAction) { this.removeAllTasksAction = removeAllTasksAction; } public RemoveAllFinishedTasksAction getRemoveAllFinishedTasksAction() { return removeAllFinishedTasksAction; } public void setRemoveAllFinishedTasksAction(RemoveAllFinishedTasksAction removeAllFinishedTasksAction) { this.removeAllFinishedTasksAction = removeAllFinishedTasksAction; } public RemoveAllAbortedTasksAction getRemoveAllAbortedTasksAction() { return removeAllAbortedTasksAction; } public void setRemoveAllAbortedTasksAction(RemoveAllAbortedTasksAction removeAllAbortedTasksAction) { this.removeAllAbortedTasksAction = removeAllAbortedTasksAction; } public RemoveAllFailedTasksAction getRemoveAllFailedTasksAction() { return removeAllFailedTasksAction; } public void setRemoveAllFailedTasksAction(RemoveAllFailedTasksAction removeAllFailedTasksAction) { this.removeAllFailedTasksAction = removeAllFailedTasksAction; } protected class MouseEventHandler extends MouseAdapter { @Override public void mousePressed(MouseEvent e) { ViewerTaskTable table = (ViewerTaskTable) e.getSource(); if (SwingUtilities.isRightMouseButton(e) && (e.getClickCount() == 1)) { int index = table.rowAtPoint(e.getPoint()); table.getSelectionModel().setSelectionInterval(index, index); } } @Override public void mouseClicked(MouseEvent e) { ViewerTaskTable table = (ViewerTaskTable) e.getSource(); if (SwingUtilities.isLeftMouseButton(e) && (e.getClickCount() % 2) == 0) { int selRow = table.convertRowIndexToModel(table.getSelectedRow()); if (selRow >= 0) { focus(taskManager.getTaskAt(selRow)); getShowTaskDialogAction().actionPerformed(new ActionEvent(table,0,"show")); } } } } }