PageRenderTime 46ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/jEdit/tags/jedit-4-5-pre1/org/gjt/sp/jedit/gui/TaskMonitor.java

#
Java | 282 lines | 224 code | 34 blank | 24 comment | 11 complexity | f4b2415d02bc6200d71c1fb7284a74c5 MD5 | raw file
Possible License(s): BSD-3-Clause, AGPL-1.0, Apache-2.0, LGPL-2.0, LGPL-3.0, GPL-2.0, CC-BY-SA-3.0, LGPL-2.1, GPL-3.0, MPL-2.0-no-copyleft-exception, IPL-1.0
  1. /*
  2. * TaskMonitor
  3. * :tabSize=8:indentSize=8:noTabs=false:
  4. * :folding=explicit:collapseFolds=1:
  5. *
  6. * Copyright Š 2010 Matthieu Casanova
  7. *
  8. * This program is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU General Public License
  10. * as published by the Free Software Foundation; either version 2
  11. * of the License, or any later version.
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  20. */
  21. package org.gjt.sp.jedit.gui;
  22. import org.gjt.sp.jedit.GUIUtilities;
  23. import org.gjt.sp.jedit.jEdit;
  24. import org.gjt.sp.util.Task;
  25. import org.gjt.sp.util.TaskListener;
  26. import org.gjt.sp.util.TaskManager;
  27. import org.gjt.sp.util.ThreadUtilities;
  28. import javax.swing.*;
  29. import javax.swing.event.TableModelEvent;
  30. import javax.swing.event.TableModelListener;
  31. import javax.swing.table.AbstractTableModel;
  32. import javax.swing.table.TableCellEditor;
  33. import javax.swing.table.TableCellRenderer;
  34. import java.awt.*;
  35. import java.awt.event.ActionEvent;
  36. import java.awt.event.ActionListener;
  37. import java.util.ArrayList;
  38. /**
  39. * @author Matthieu Casanova
  40. */
  41. public class TaskMonitor extends JPanel implements TaskListener
  42. {
  43. private final TaskTableModel model;
  44. private final JTable table;
  45. private final JLabel remainingCount;
  46. public TaskMonitor()
  47. {
  48. super(new BorderLayout());
  49. JPanel panel = new JPanel(new BorderLayout());
  50. remainingCount = new JLabel();
  51. panel.add(remainingCount, BorderLayout.NORTH);
  52. model = new TaskTableModel();
  53. model.addTableModelListener(new TableModelListener()
  54. {
  55. public void tableChanged(TableModelEvent e)
  56. {
  57. if (e.getType() == TableModelEvent.INSERT ||
  58. e.getType() == TableModelEvent.DELETE)
  59. {
  60. updateTasksCount();
  61. }
  62. }
  63. });
  64. table = new JTable(model);
  65. table.setDefaultRenderer(Object.class, new TaskCellRenderer());
  66. table.getTableHeader().setVisible(false);
  67. table.setDefaultEditor(Object.class, new TaskTableEditor());
  68. table.getColumnModel().getColumn(1).setMaxWidth(16);
  69. table.getColumnModel().getColumn(1).setMinWidth(16);
  70. JScrollPane scroll = new JScrollPane(table);
  71. panel.add(scroll);
  72. updateTasksCount();
  73. add(new IOProgressMonitor(), BorderLayout.NORTH);
  74. add(panel);
  75. }
  76. @Override
  77. public void addNotify()
  78. {
  79. TaskManager.instance.visit(new TaskManager.TaskVisitor()
  80. {
  81. public void visit(Task task)
  82. {
  83. model.addTask(task);
  84. }
  85. });
  86. TaskManager.instance.addTaskListener(this);
  87. super.addNotify();
  88. }
  89. @Override
  90. public void removeNotify()
  91. {
  92. TaskManager.instance.removeTaskListener(this);
  93. super.removeNotify();
  94. model.removeAll();
  95. }
  96. public void waiting(Task task)
  97. {
  98. model.addTask(task);
  99. }
  100. public void running(Task task)
  101. {
  102. repaint();
  103. }
  104. public void done(Task task)
  105. {
  106. model.removeTask(task);
  107. }
  108. public void statusUpdated(Task task)
  109. {
  110. repaint();
  111. }
  112. public void maximumUpdated(Task task)
  113. {
  114. repaint();
  115. }
  116. public void valueUpdated(Task task)
  117. {
  118. repaint();
  119. }
  120. private void updateTasksCount()
  121. {
  122. remainingCount.setText(jEdit.getProperty("taskmanager.remainingtasks.label",
  123. new Object[]{model.getRowCount()}));
  124. }
  125. private static class TaskCellRenderer implements TableCellRenderer
  126. {
  127. private final JProgressBar progress;
  128. private final JButton button;
  129. private TaskCellRenderer()
  130. {
  131. progress = new JProgressBar();
  132. button = new JButton(GUIUtilities.loadIcon(jEdit.getProperty("close-buffer.icon")));
  133. progress.setStringPainted(true);
  134. }
  135. public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
  136. boolean hasFocus, int row, int column)
  137. {
  138. Task task = (Task) value;
  139. if (column == 0)
  140. {
  141. if (task.getMaximum() == 0L)
  142. {
  143. progress.setIndeterminate(true);
  144. }
  145. else
  146. {
  147. progress.setIndeterminate(false);
  148. long max = task.getMaximum();
  149. long val = task.getValue();
  150. if (max > Integer.MAX_VALUE)
  151. {
  152. max >>= 10L;
  153. val >>= 10L;
  154. }
  155. progress.setMaximum((int) max);
  156. progress.setValue((int) val);
  157. }
  158. progress.setToolTipText(task.getLabel());
  159. progress.setString(task.getStatus());
  160. return progress;
  161. }
  162. return button;
  163. }
  164. }
  165. private class TaskTableEditor extends AbstractCellEditor implements TableCellEditor
  166. {
  167. private final JButton button;
  168. private Task task;
  169. private TaskTableEditor()
  170. {
  171. button = new JButton(GUIUtilities.loadIcon(jEdit.getProperty("close-buffer.icon")));
  172. button.addActionListener(new ActionListener()
  173. {
  174. public void actionPerformed(ActionEvent e)
  175. {
  176. task.cancel();
  177. stopCellEditing();
  178. }
  179. });
  180. }
  181. public Object getCellEditorValue()
  182. {
  183. return null;
  184. }
  185. //{{{ getTableCellEditorComponent() method
  186. public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
  187. {
  188. task = (Task) value;
  189. return button;
  190. } //}}}
  191. }
  192. private static class TaskTableModel extends AbstractTableModel
  193. {
  194. private final java.util.List<Task> tasks;
  195. private TaskTableModel()
  196. {
  197. tasks = new ArrayList<Task>();
  198. }
  199. public int getRowCount()
  200. {
  201. return tasks.size();
  202. }
  203. public int getColumnCount()
  204. {
  205. return 2;
  206. }
  207. @Override
  208. public boolean isCellEditable(int rowIndex, int columnIndex)
  209. {
  210. return columnIndex == 1;
  211. }
  212. public Object getValueAt(int rowIndex, int columnIndex)
  213. {
  214. return tasks.get(rowIndex);
  215. }
  216. void addTask(final Task task)
  217. {
  218. ThreadUtilities.runInDispatchThread(new Runnable()
  219. {
  220. public void run()
  221. {
  222. tasks.add(task);
  223. fireTableRowsInserted(tasks.size()-1, tasks.size()-1);
  224. }
  225. });
  226. }
  227. void removeTask(final Task task)
  228. {
  229. ThreadUtilities.runInDispatchThread(new Runnable()
  230. {
  231. public void run()
  232. {
  233. int index = tasks.indexOf(task);
  234. if (index != -1)
  235. {
  236. tasks.remove(index);
  237. fireTableRowsDeleted(index,index);
  238. }
  239. }
  240. });
  241. }
  242. public void removeAll()
  243. {
  244. tasks.clear();
  245. fireTableDataChanged();
  246. }
  247. }
  248. }