1 /***
2 * ProcessViewer.java
3 *
4 * This file is part of the creme library.
5 * The creme library intends to ease the development effort of large
6 * applications by providing easy to use support classes.
7 *
8 * Copyright (C) 2003 Denis Bregeon
9 *
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
14 *
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
19 *
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with this library; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 *
24 * contact information: dbregeon@sourceforge.net
25 */
26 package org.jcreme.tutorial;
27
28 import java.awt.Color;
29 import java.beans.PropertyChangeEvent;
30 import java.beans.PropertyChangeListener;
31 import java.util.Enumeration;
32 import java.util.HashSet;
33 import java.util.prefs.BackingStoreException;
34 import java.util.prefs.Preferences;
35
36 import javax.swing.JTable;
37 import javax.swing.SwingConstants;
38 import javax.swing.table.TableColumn;
39
40 import org.jcreme.enumerations.SortOrder;
41 import org.jcreme.swing.JQuadSplitPane;
42 import org.jcreme.swing.reporting.ReportTableModel;
43 import org.jcreme.swing.table.JColoredTable;
44 import org.jcreme.swing.table.SortableTableColumn;
45 import org.jcreme.swing.table.TableColumnOrderEvent;
46 import org.jcreme.swing.table.TableColumnOrderListener;
47 import org.jcreme.swing.table.TransposableTableModel;
48 import org.jcreme.swing.table.ValueDrivenTableCellRenderer;
49 import org.jcreme.swing.table.colormodel.chooser.TableColorModelChooser;
50 import org.jcreme.swing.table.columnmodel.EditableTableColumnModel;
51 import org.jcreme.swing.table.columnmodel.editor.ColumnModelEditor;
52 import org.jcreme.swing.table.columnmodel.state.EditableTableColumnModelMemento;
53 import org.jcreme.swing.table.state.JColoredTableMemento;
54
55 /***
56 * This is the jcreme tutorial. This small application displays process
57 * information based on the system command 'top'.
58 *
59 * @author $Author: dbregeon $
60 * @version $Revision: 1.2 $
61 */
62 public class ProcessViewer extends javax.swing.JFrame {
63 /***
64 *
65 */
66 public static final String PROCESS_VIEWER_PREFERENCE = "processviewer";
67
68 protected ProcessViewerControl control = new ProcessViewerControl();
69
70 protected TableColorModelChooser chooser = null;
71
72 protected ColumnModelEditor editor = null;
73
74 protected JColoredTableMemento memento = new JColoredTableMemento();
75
76 protected JQuadSplitPane splitPane = new JQuadSplitPane();
77
78 protected HashSet sortedColumns = new HashSet();
79
80 protected PropertyChangeListener windowListener = new PropertyChangeListener() {
81 public void propertyChange(PropertyChangeEvent evt) {
82 if (TableColorModelChooser.SELECTED_MODEL_PROPERTY.equals(evt
83 .getPropertyName())) {
84 processTable.setTableColorModel(chooser.getSelectedModel());
85 }
86 }
87
88 };
89
90 protected TableColumnOrderListener orderListener = new TableColumnOrderListener() {
91 public void tableColumnOrderChanged(TableColumnOrderEvent e) {
92 SortableTableColumn column = (SortableTableColumn) e.getSource();
93 if (column.getOrder() != SortOrder.NONE) {
94 sortedColumns.add(column);
95 } else {
96 sortedColumns.remove(column);
97 }
98 ((ReportTableModel) processTable.getModel())
99 .sort((SortableTableColumn[]) sortedColumns
100 .toArray(new SortableTableColumn[0]));
101 }
102 };
103
104 /*** Creates new form ProcessViewer */
105 public ProcessViewer() {
106 initComponents();
107 TransposableTableModel model = new TransposableTableModel();
108 model
109 .setUnderlyingModel(new ReportTableModel(this.control
110 .getReport()));
111 model.setColumnNamesPolicy(TransposableTableModel.IGNORE_COLUMN_NAMES);
112 model
113 .setTransposedColumnNamesPolicy(TransposableTableModel.NUMBERS_COLUMN_NAMES);
114 model.setTranspose(true);
115
116
117 this.processTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
118 this.processTable.setDefaultRenderer(
119 TransposableTableModel.TransposedValue.class,
120 new ValueDrivenTableCellRenderer());
121 if (!(this.processTable.getColumnModel() instanceof EditableTableColumnModel)) {
122 EditableTableColumnModel columnModel = new EditableTableColumnModel();
123 Enumeration columns = this.processTable.getColumnModel()
124 .getColumns();
125 SortableTableColumn newColumn = null;
126 TableColumn current = null;
127 while (columns.hasMoreElements()) {
128 current = (TableColumn) columns.nextElement();
129 newColumn = new SortableTableColumn(current.getModelIndex(),
130 current.getWidth(), current.getCellRenderer(), current
131 .getCellEditor());
132 newColumn.setIdentifier(current.getIdentifier());
133 newColumn.setHeaderValue(current.getHeaderValue());
134 newColumn.setResizable(current.getResizable());
135 newColumn.setColumnClass(this.processTable
136 .getColumnClass(this.processTable.getColumnModel()
137 .getColumnIndex(current.getIdentifier())));
138 columnModel.addColumn(newColumn);
139 }
140 this.processTable.setColumnModel(columnModel);
141
142
143 }
144 TableColumn[] columns = ((EditableTableColumnModel) this.processTable
145 .getColumnModel()).getAllColumns();
146 for (int i = 0; i < columns.length; i++) {
147 if (columns[i] instanceof SortableTableColumn) {
148 if (((SortableTableColumn) columns[i]).getOrder() != SortOrder.NONE) {
149 this.sortedColumns.add(columns[i]);
150 }
151 ((SortableTableColumn) columns[i])
152 .addTableColumnOrderListener(this.orderListener);
153 }
154 }
155
156
157
158 }
159
160 /***
161 * This method is called from within the constructor to initialize the form.
162 * WARNING: Do NOT modify this code. The content of this method is always
163 * regenerated by the Form Editor.
164 */
165 private void initComponents() {
166 this.buttonPanel = new javax.swing.JPanel();
167 this.autoRefreshCheckBox = new javax.swing.JCheckBox();
168 this.autoRefreshFrequencyTextField = new javax.swing.JTextField();
169 this.refreshButton = new javax.swing.JButton();
170 this.closeButton = new javax.swing.JButton();
171 this.processTable = new org.jcreme.swing.table.JColoredTable();
172 this.processViewerMenuBar = new javax.swing.JMenuBar();
173 this.fileMenu = new javax.swing.JMenu();
174 this.closeMenuItem = new javax.swing.JMenuItem();
175 this.customizeMenu = new javax.swing.JMenu();
176 this.colorModelMenuItem = new javax.swing.JMenuItem();
177 this.columnModelMenuItem = new javax.swing.JMenuItem();
178
179 addWindowListener(new java.awt.event.WindowAdapter() {
180 public void windowClosing(java.awt.event.WindowEvent evt) {
181 exit();
182 }
183 });
184
185 this.buttonPanel.setLayout(new java.awt.FlowLayout(
186 java.awt.FlowLayout.RIGHT));
187
188 this.autoRefreshCheckBox.setText("autoRefresh");
189 this.autoRefreshCheckBox
190 .addActionListener(new java.awt.event.ActionListener() {
191 public void actionPerformed(java.awt.event.ActionEvent evt) {
192 changeRefreshTimer();
193 }
194 });
195
196 this.buttonPanel.add(this.autoRefreshCheckBox);
197
198 this.autoRefreshFrequencyTextField.setColumns(5);
199 this.autoRefreshFrequencyTextField
200 .setHorizontalAlignment(SwingConstants.RIGHT);
201 this.autoRefreshFrequencyTextField.setText("500");
202 this.autoRefreshFrequencyTextField
203 .addActionListener(new java.awt.event.ActionListener() {
204 public void actionPerformed(java.awt.event.ActionEvent evt) {
205 changeRefreshTimer();
206 }
207 });
208
209 this.buttonPanel.add(this.autoRefreshFrequencyTextField);
210
211 this.refreshButton.setText("Refresh");
212 this.refreshButton
213 .addActionListener(new java.awt.event.ActionListener() {
214 public void actionPerformed(java.awt.event.ActionEvent evt) {
215 refresh();
216 }
217 });
218
219 this.buttonPanel.add(this.refreshButton);
220
221 this.closeButton.setText("Close");
222 this.closeButton.addActionListener(new java.awt.event.ActionListener() {
223 public void actionPerformed(java.awt.event.ActionEvent evt) {
224 exit();
225 }
226 });
227
228 this.buttonPanel.add(this.closeButton);
229
230 getContentPane().add(this.buttonPanel, java.awt.BorderLayout.SOUTH);
231 try {
232
233
234
235 } catch (IllegalArgumentException e) {
236 e.printStackTrace();
237 }
238
239
240
241
242
243
244
245 this.splitPane.setViewedComponent(this.processTable);
246
247 getContentPane().add(this.splitPane, java.awt.BorderLayout.CENTER);
248
249 this.fileMenu.setText("File");
250 this.closeMenuItem.setMnemonic('c');
251 this.closeMenuItem.setText("Close");
252 this.closeMenuItem
253 .addActionListener(new java.awt.event.ActionListener() {
254 public void actionPerformed(java.awt.event.ActionEvent evt) {
255 exit();
256 }
257 });
258
259 this.fileMenu.add(this.closeMenuItem);
260
261 this.processViewerMenuBar.add(this.fileMenu);
262
263 this.customizeMenu.setText("Customize");
264 this.colorModelMenuItem.setMnemonic('m');
265 this.colorModelMenuItem.setText("Color Model");
266 this.colorModelMenuItem
267 .addActionListener(new java.awt.event.ActionListener() {
268 public void actionPerformed(java.awt.event.ActionEvent evt) {
269 colorModelMenuItemActionPerformed(evt);
270 }
271 });
272
273 this.customizeMenu.add(this.colorModelMenuItem);
274
275 this.columnModelMenuItem.setMnemonic('c');
276 this.columnModelMenuItem.setText("Column Model");
277 this.columnModelMenuItem
278 .addActionListener(new java.awt.event.ActionListener() {
279 public void actionPerformed(java.awt.event.ActionEvent evt) {
280 columnModelMenuItemActionPerformed(evt);
281 }
282 });
283
284 this.customizeMenu.add(this.columnModelMenuItem);
285
286 this.processViewerMenuBar.add(this.customizeMenu);
287
288 setJMenuBar(this.processViewerMenuBar);
289
290 pack();
291 }
292
293 protected final void colorModelMenuItemActionPerformed(
294 java.awt.event.ActionEvent evt) {
295 if (this.chooser == null) {
296 this.chooser = new TableColorModelChooser(this,
297 "Color Model Chooser");
298
299 this.chooser.addPropertyChangeListener(this.windowListener);
300 }
301 this.chooser.show();
302 }
303
304 protected final void columnModelMenuItemActionPerformed(
305 java.awt.event.ActionEvent evt) {
306 if (this.editor == null) {
307 this.editor = new ColumnModelEditor(this, true);
308 }
309 this.editor.setEditedModel((EditableTableColumnModel) this.processTable
310 .getColumnModel());
311 this.editor.setVisible(true);
312 this.processTable.setColumnModel(this.editor.getEditedModel());
313 }
314
315 protected void refresh() {
316 this.control.getSource().updateProcesses();
317 }
318
319 protected void exit() {
320 try {
321 Preferences.userRoot().node(PROCESS_VIEWER_PREFERENCE).removeNode();
322
323
324 Preferences.userRoot().node(PROCESS_VIEWER_PREFERENCE).flush();
325 } catch (BackingStoreException e) {
326 e.printStackTrace();
327 }
328 System.exit(0);
329 }
330
331 protected void changeRefreshTimer() {
332 if (this.autoRefreshCheckBox.isSelected()) {
333 try {
334 long timer = Long.parseLong(this.autoRefreshFrequencyTextField
335 .getText().trim());
336 this.control.getSource().setRefreshTimer(timer);
337 this.autoRefreshFrequencyTextField.setBackground(Color.WHITE);
338 } catch (NumberFormatException e) {
339 e.printStackTrace();
340 this.autoRefreshFrequencyTextField.setBackground(Color.RED);
341 }
342 } else {
343 this.control.getSource().removeRefreshTimer();
344 }
345 }
346
347 /***
348 * @param args
349 * the command line arguments
350 */
351 public static void main(String args[]) {
352 new ProcessViewer().show();
353 }
354
355
356 private javax.swing.JCheckBox autoRefreshCheckBox;
357
358 private javax.swing.JTextField autoRefreshFrequencyTextField;
359
360 private javax.swing.JPanel buttonPanel;
361
362 private javax.swing.JButton closeButton;
363
364 private javax.swing.JMenuItem closeMenuItem;
365
366 private javax.swing.JMenuItem colorModelMenuItem;
367
368 private javax.swing.JMenuItem columnModelMenuItem;
369
370 private javax.swing.JMenu customizeMenu;
371
372 private javax.swing.JMenu fileMenu;
373
374 private org.jcreme.swing.table.JColoredTable processTable;
375
376 private javax.swing.JMenuBar processViewerMenuBar;
377
378 private javax.swing.JButton refreshButton;
379
380 }