/* * TaskMonitor * :tabSize=4:indentSize=4:noTabs=false: * :folding=explicit:collapseFolds=1: * * Copyright © 2010-2012 Matthieu Casanova * * 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 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package org.gjt.sp.jedit.gui; //{{{ Imports import org.gjt.sp.jedit.GUIUtilities; import org.gjt.sp.jedit.jEdit; import org.gjt.sp.util.GenericGUIUtilities; import org.gjt.sp.util.Task; import org.gjt.sp.util.TaskListener; import org.gjt.sp.util.TaskManager; import org.gjt.sp.util.ThreadUtilities; import javax.swing.*; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; //}}} /** Task Monitor dockable panel, for showing progress on active tasks. * @author Matthieu Casanova * @since jEdit 4.4 */ public class TaskMonitor extends JPanel implements TaskListener { private final TaskTableModel model; private final JTable table; private final JLabel remainingCount; //{{{ TaskMonitor constructor public TaskMonitor() { super(new BorderLayout()); JPanel panel = new JPanel(new BorderLayout()); remainingCount = new JLabel(); panel.add(remainingCount, BorderLayout.NORTH); model = new TaskTableModel(); model.addTableModelListener(new TableModelListener() { public void tableChanged(TableModelEvent e) { if (e.getType() == TableModelEvent.INSERT || e.getType() == TableModelEvent.DELETE) { updateTasksCount(); } } }); table = new JTable(model); table.setRowHeight(GenericGUIUtilities.defaultRowHeight()); table.setDefaultRenderer(Object.class, new TaskCellRenderer()); table.getTableHeader().setVisible(false); table.setDefaultEditor(Object.class, new TaskTableEditor()); table.getColumnModel().getColumn(1).setMaxWidth(16); table.getColumnModel().getColumn(1).setMinWidth(16); JScrollPane scroll = new JScrollPane(table); panel.add(scroll); updateTasksCount(); add(panel); } //}}} //{{{ addNotify() method @Override public void addNotify() { TaskManager.instance.visit(new TaskManager.TaskVisitor() { public void visit(Task task) { model.addTask(task); } }); TaskManager.instance.addTaskListener(this); super.addNotify(); } //}}} //{{{ removeNotify() method @Override public void removeNotify() { TaskManager.instance.removeTaskListener(this); super.removeNotify(); model.removeAll(); } //}}} //{{{ waiting() method public void waiting(Task task) { model.addTask(task); } //}}} //{{{ running() method public void running(Task task) { repaint(); } //}}} //{{{ done() method public void done(Task task) { model.removeTask(task); } //}}} //{{{ statusUpdated() method public void statusUpdated(Task task) { repaint(); } //}}} //{{{ maximumUpdated() method public void maximumUpdated(Task task) { repaint(); } //}}} //{{{ valueUpdated() method public void valueUpdated(Task task) { repaint(); } //}}} //{{{ updateTasksCount() method private void updateTasksCount() { remainingCount.setText(jEdit.getProperty("taskmanager.remainingtasks.label", new Object[]{model.getRowCount()})); } //}}} //{{{ TaskCellRenderer class private static class TaskCellRenderer implements TableCellRenderer { private final JProgressBar progress; private final JButton button; //{{{ TaskCellRenderer constructor private TaskCellRenderer() { progress = new JProgressBar(); button = new JButton(GUIUtilities.loadIcon(jEdit.getProperty("close-buffer.icon"))); progress.setStringPainted(true); } //}}} //{{{ getTableCellRendererComponent public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Task task = (Task) value; if (column == 0) { if (task.getMaximum() == 0L) { progress.setIndeterminate(true); } else { progress.setIndeterminate(false); long max = task.getMaximum(); long val = task.getValue(); if (max > Integer.MAX_VALUE) { max >>= 10L; val >>= 10L; } progress.setMaximum((int) max); progress.setValue((int) val); } progress.setToolTipText(task.getLabel()); progress.setString(task.getStatus()); return progress; } button.setEnabled(task.isCancellable()); return button; } //}}} } //}}} //{{{ TaskTableEditor class private class TaskTableEditor extends AbstractCellEditor implements TableCellEditor { private final JButton button; private Task task; //{{{ TaskTableEditor constructor private TaskTableEditor() { button = new JButton(GUIUtilities.loadIcon(jEdit.getProperty("close-buffer.icon"))); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { task.cancel(); stopCellEditing(); } }); } //}}} //{{{ getCellEditorValue() method public Object getCellEditorValue() { return null; } //}}} //{{{ getTableCellEditorComponent() method public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { task = (Task) value; return button; } //}}} } //}}} //{{{ TaskTableModel class private static class TaskTableModel extends AbstractTableModel { private final java.util.List<Task> tasks; //{{{ TaskTableModel constructor private TaskTableModel() { tasks = new ArrayList<Task>(); } //}}} //{{{ getRowCount() method public int getRowCount() { return tasks.size(); } //}}} //{{{ getColumnCount() method public int getColumnCount() { return 2; } //}}} //{{{ isCellEditable() method @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return columnIndex == 1; } //}}} //{{{ getValueAt() method public Object getValueAt(int rowIndex, int columnIndex) { return tasks.get(rowIndex); } //}}} //{{{ addTask() method void addTask(final Task task) { ThreadUtilities.runInDispatchThread(new Runnable() { public void run() { tasks.add(task); fireTableRowsInserted(tasks.size()-1, tasks.size()-1); } }); } //}}} //{{{ removeTask() method void removeTask(final Task task) { ThreadUtilities.runInDispatchThread(new Runnable() { public void run() { int index = tasks.indexOf(task); if (index != -1) { tasks.remove(index); fireTableRowsDeleted(index,index); } } }); } //}}} //{{{ removeAll() method public void removeAll() { tasks.clear(); fireTableDataChanged(); } //}}} } //}}} }