/* * TaskManagerPanel.java * Copyright (C) 2007 University of Waikato, Hamilton, New Zealand * @author Richard Kirkby (rkirkby@cs.waikato.ac.nz) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package tr.gov.ulakbim.jDenetX.gui; import tr.gov.ulakbim.jDenetX.core.StringUtils; import tr.gov.ulakbim.jDenetX.options.ClassOption; import tr.gov.ulakbim.jDenetX.options.OptionHandler; import tr.gov.ulakbim.jDenetX.tasks.LearnModel; import tr.gov.ulakbim.jDenetX.tasks.MainTask; import tr.gov.ulakbim.jDenetX.tasks.Task; import tr.gov.ulakbim.jDenetX.tasks.TaskThread; import javax.swing.*; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableCellRenderer; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; public class TaskManagerPanel extends JPanel { private static final long serialVersionUID = 1L; public static final int MILLISECS_BETWEEN_REFRESH = 600; public class ProgressCellRenderer extends JProgressBar implements TableCellRenderer { private static final long serialVersionUID = 1L; public ProgressCellRenderer() { super(SwingConstants.HORIZONTAL, 0, 10000); setBorderPainted(false); setStringPainted(true); } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (value instanceof Double) { double frac = ((Double) value).doubleValue(); if (frac >= 0.0) { setIndeterminate(false); setValue((int) (frac * 10000.0)); setString(StringUtils.doubleToString(frac * 100.0, 2, 2)); } else { setValue(0); setIndeterminate(true); setString("?"); } } return this; } @Override public void validate() { } @Override public void revalidate() { } @Override protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) { } @Override public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) { } } protected class TaskTableModel extends AbstractTableModel { private static final long serialVersionUID = 1L; @Override public String getColumnName(int col) { switch (col) { case 0: return "command"; case 1: return "status"; case 2: return "time elapsed"; case 3: return "current activity"; case 4: return "% complete"; } return null; } public int getColumnCount() { return 5; } public int getRowCount() { return TaskManagerPanel.this.taskList.size(); } public Object getValueAt(int row, int col) { TaskThread thread = TaskManagerPanel.this.taskList.get(row); switch (col) { case 0: return ((OptionHandler) thread.getTask()) .getCLICreationString(MainTask.class); case 1: return thread.getCurrentStatusString(); case 2: return StringUtils.secondsToDHMSString(thread .getCPUSecondsElapsed()); case 3: return thread.getCurrentActivityString(); case 4: return new Double(thread.getCurrentActivityFracComplete()); } return null; } @Override public boolean isCellEditable(int row, int col) { return false; } } protected MainTask currentTask = new LearnModel(); protected List<TaskThread> taskList = new ArrayList<TaskThread>(); protected JButton configureTaskButton = new JButton("Configure"); protected JTextField taskDescField = new JTextField(); protected JButton runTaskButton = new JButton("Run"); protected TaskTableModel taskTableModel; protected JTable taskTable; protected JButton pauseTaskButton = new JButton("Pause"); protected JButton resumeTaskButton = new JButton("Resume"); protected JButton cancelTaskButton = new JButton("Cancel"); protected JButton deleteTaskButton = new JButton("Delete"); protected PreviewPanel previewPanel; public TaskManagerPanel() { this.taskDescField.setText(this.currentTask .getCLICreationString(MainTask.class)); this.taskDescField.setEditable(false); JPanel configPanel = new JPanel(); configPanel.setLayout(new BorderLayout()); configPanel.add(this.configureTaskButton, BorderLayout.WEST); configPanel.add(this.taskDescField, BorderLayout.CENTER); configPanel.add(this.runTaskButton, BorderLayout.EAST); this.taskTableModel = new TaskTableModel(); this.taskTable = new JTable(this.taskTableModel); DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer(); centerRenderer.setHorizontalAlignment(SwingConstants.CENTER); this.taskTable.getColumnModel().getColumn(1).setCellRenderer( centerRenderer); this.taskTable.getColumnModel().getColumn(2).setCellRenderer( centerRenderer); this.taskTable.getColumnModel().getColumn(4).setCellRenderer( new ProgressCellRenderer()); JPanel controlPanel = new JPanel(); controlPanel.add(this.pauseTaskButton); controlPanel.add(this.resumeTaskButton); controlPanel.add(this.cancelTaskButton); controlPanel.add(this.deleteTaskButton); setLayout(new BorderLayout()); add(configPanel, BorderLayout.NORTH); add(new JScrollPane(this.taskTable), BorderLayout.CENTER); add(controlPanel, BorderLayout.SOUTH); this.taskTable.getSelectionModel().addListSelectionListener( new ListSelectionListener() { public void valueChanged(ListSelectionEvent arg0) { taskSelectionChanged(); } }); this.configureTaskButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { String newTaskString = ClassOptionSelectionPanel .showSelectClassDialog(TaskManagerPanel.this, "Configure task", MainTask.class, TaskManagerPanel.this.currentTask .getCLICreationString(MainTask.class), null); setTaskString(newTaskString); } }); this.runTaskButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { runTask((Task) TaskManagerPanel.this.currentTask.copy()); } }); this.pauseTaskButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { pauseSelectedTasks(); } }); this.resumeTaskButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { resumeSelectedTasks(); } }); this.cancelTaskButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { cancelSelectedTasks(); } }); this.deleteTaskButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { deleteSelectedTasks(); } }); javax.swing.Timer updateListTimer = new javax.swing.Timer( MILLISECS_BETWEEN_REFRESH, new ActionListener() { public void actionPerformed(ActionEvent e) { TaskManagerPanel.this.taskTable.repaint(); } }); updateListTimer.start(); setPreferredSize(new Dimension(0, 200)); } public void setPreviewPanel(PreviewPanel previewPanel) { this.previewPanel = previewPanel; } public void setTaskString(String cliString) { try { this.currentTask = (MainTask) ClassOption.cliStringToObject( cliString, MainTask.class, null); this.taskDescField.setText(this.currentTask .getCLICreationString(MainTask.class)); } catch (Exception ex) { GUIUtils.showExceptionDialog(this, "Problem with task", ex); } } public void runTask(Task task) { TaskThread thread = new TaskThread(task); this.taskList.add(0, thread); this.taskTableModel.fireTableDataChanged(); this.taskTable.setRowSelectionInterval(0, 0); thread.start(); } public void taskSelectionChanged() { TaskThread[] selectedTasks = getSelectedTasks(); if (selectedTasks.length == 1) { setTaskString(((OptionHandler) selectedTasks[0].getTask()) .getCLICreationString(MainTask.class)); if (this.previewPanel != null) { this.previewPanel.setTaskThreadToPreview(selectedTasks[0]); } } else { this.previewPanel.setTaskThreadToPreview(null); } } public TaskThread[] getSelectedTasks() { int[] selectedRows = this.taskTable.getSelectedRows(); TaskThread[] selectedTasks = new TaskThread[selectedRows.length]; for (int i = 0; i < selectedRows.length; i++) { selectedTasks[i] = this.taskList.get(selectedRows[i]); } return selectedTasks; } public void pauseSelectedTasks() { TaskThread[] selectedTasks = getSelectedTasks(); for (TaskThread thread : selectedTasks) { thread.pauseTask(); } } public void resumeSelectedTasks() { TaskThread[] selectedTasks = getSelectedTasks(); for (TaskThread thread : selectedTasks) { thread.resumeTask(); } } public void cancelSelectedTasks() { TaskThread[] selectedTasks = getSelectedTasks(); for (TaskThread thread : selectedTasks) { thread.cancelTask(); } } public void deleteSelectedTasks() { TaskThread[] selectedTasks = getSelectedTasks(); for (TaskThread thread : selectedTasks) { thread.cancelTask(); this.taskList.remove(thread); } this.taskTableModel.fireTableDataChanged(); } private static void createAndShowGUI() { // Create and set up the window. JFrame frame = new JFrame("Test"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Create and set up the content pane. JPanel panel = new TaskManagerPanel(); panel.setOpaque(true); // content panes must be opaque frame.setContentPane(panel); // Display the window. frame.pack(); // frame.setSize(400, 400); frame.setVisible(true); } public static void main(String[] args) { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } catch (Exception e) { e.printStackTrace(); } } }