View Javadoc

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         //this.processTable = (org.jcreme.swing.table.JColoredTable) this.memento
116         //        .getJTable(model);
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             //this.memento
142             //        .setTableColumnModelMemento(new EditableTableColumnModelMemento());
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         //((ReportTableModel)
156         // processTable.getModel()).sort((SortableTableColumn[])
157         // sortedColumns.toArray(new SortableTableColumn[0]));
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             //this.memento.setJTable(this.processTable);
233 //            this.memento.load(Preferences.userRoot().node(
234 //                    PROCESS_VIEWER_PREFERENCE));
235         } catch (IllegalArgumentException e) {
236             e.printStackTrace();
237         }
238 //        this.processTable = (JColoredTable) this.memento
239 //                .getJTable(new javax.swing.table.DefaultTableModel(
240 //                        new Object[][] { { null, null, null, null },
241 //                                { null, null, null, null },
242 //                                { null, null, null, null },
243 //                                { null, null, null, null } }, new String[] {
244 //                                "Process Name", "Id", "Memory", "CPU" }));
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             //this.chooser.setDataToColor(this.processTable.getModel());
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 //            this.memento.store(Preferences.userRoot().node(
323 //                    PROCESS_VIEWER_PREFERENCE));
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     // Variables declaration - do not modify
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 }