View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    * 
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   * 
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.log4j.lf5.viewer;
18  
19  import java.awt.Font;
20  import java.awt.FontMetrics;
21  import java.awt.Graphics;
22  import java.util.Enumeration;
23  import java.util.Iterator;
24  import java.util.List;
25  import java.util.Vector;
26  
27  import javax.swing.JTable;
28  import javax.swing.JTextArea;
29  import javax.swing.ListSelectionModel;
30  import javax.swing.event.ListSelectionEvent;
31  import javax.swing.event.ListSelectionListener;
32  import javax.swing.table.TableColumn;
33  import javax.swing.table.TableColumnModel;
34  
35  import org.apache.log4j.lf5.util.DateFormatManager;
36  
37  /**
38   * LogTable.
39   *
40   * @author Michael J. Sikorsky
41   * @author Robert Shaw
42   * @author Brad Marlborough
43   * @author Brent Sprecher
44   */
45  
46  // Contributed by ThoughtWorks Inc.
47  
48  public class LogTable extends JTable {
49    private static final long serialVersionUID = 4867085140195148458L;
50    //--------------------------------------------------------------------------
51    //   Constants:
52    //--------------------------------------------------------------------------
53  
54    //--------------------------------------------------------------------------
55    //   Protected Variables:
56    //--------------------------------------------------------------------------
57    protected int _rowHeight = 30;
58    protected JTextArea _detailTextArea;
59  
60    // For the columns:
61    protected int _numCols = 9;
62    protected TableColumn[] _tableColumns = new TableColumn[_numCols];
63    protected int[] _colWidths = {40, 40, 40, 70, 70, 360, 440, 200, 60};
64    protected LogTableColumn[] _colNames = LogTableColumn.getLogTableColumnArray();
65    protected int _colDate = 0;
66    protected int _colThread = 1;
67    protected int _colMessageNum = 2;
68    protected int _colLevel = 3;
69    protected int _colNDC = 4;
70    protected int _colCategory = 5;
71    protected int _colMessage = 6;
72    protected int _colLocation = 7;
73    protected int _colThrown = 8;
74  
75    protected DateFormatManager _dateFormatManager = null;
76  
77    //--------------------------------------------------------------------------
78    //   Private Variables:
79    //--------------------------------------------------------------------------
80  
81    //--------------------------------------------------------------------------
82    //   Constructors:
83    //--------------------------------------------------------------------------
84  
85    public LogTable(JTextArea detailTextArea) {
86      super();
87  
88      init();
89  
90      _detailTextArea = detailTextArea;
91  
92      setModel(new FilteredLogTableModel());
93  
94      Enumeration columns = getColumnModel().getColumns();
95      int i = 0;
96      while (columns.hasMoreElements()) {
97        TableColumn col = (TableColumn) columns.nextElement();
98        col.setCellRenderer(new LogTableRowRenderer());
99        col.setPreferredWidth(_colWidths[i]);
100 
101       _tableColumns[i] = col;
102       i++;
103     }
104 
105     ListSelectionModel rowSM = getSelectionModel();
106     rowSM.addListSelectionListener(new LogTableListSelectionListener(this));
107 
108     //setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
109   }
110 
111   //--------------------------------------------------------------------------
112   //   Public Methods:
113   //--------------------------------------------------------------------------
114 
115   /**
116    * Get the DateFormatManager for formatting dates.
117    */
118   public DateFormatManager getDateFormatManager() {
119     return _dateFormatManager;
120   }
121 
122   /**
123    * Set the date format manager for formatting dates.
124    */
125   public void setDateFormatManager(DateFormatManager dfm) {
126     _dateFormatManager = dfm;
127   }
128 
129   public synchronized void clearLogRecords() {
130     //For JDK1.3
131     //((DefaultTableModel)getModel()).setRowCount(0);
132 
133     // For JDK1.2.x
134     getFilteredLogTableModel().clear();
135   }
136 
137   public FilteredLogTableModel getFilteredLogTableModel() {
138     return (FilteredLogTableModel) getModel();
139   }
140 
141   // default view if a view is not set and saved
142   public void setDetailedView() {
143     //TODO: Defineable Views.
144     TableColumnModel model = getColumnModel();
145     // Remove all the columns:
146     for (int f = 0; f < _numCols; f++) {
147       model.removeColumn(_tableColumns[f]);
148     }
149     // Add them back in the correct order:
150     for (int i = 0; i < _numCols; i++) {
151       model.addColumn(_tableColumns[i]);
152     }
153     //SWING BUG:
154     sizeColumnsToFit(-1);
155   }
156 
157   public void setView(List columns) {
158     TableColumnModel model = getColumnModel();
159 
160     // Remove all the columns:
161     for (int f = 0; f < _numCols; f++) {
162       model.removeColumn(_tableColumns[f]);
163     }
164     Iterator selectedColumns = columns.iterator();
165     Vector columnNameAndNumber = getColumnNameAndNumber();
166     while (selectedColumns.hasNext()) {
167       // add the column to the view
168       model.addColumn(_tableColumns[columnNameAndNumber.indexOf(selectedColumns.next())]);
169     }
170 
171     //SWING BUG:
172     sizeColumnsToFit(-1);
173   }
174 
175   public void setFont(Font font) {
176     super.setFont(font);
177     Graphics g = this.getGraphics();
178     if (g != null) {
179       FontMetrics fm = g.getFontMetrics(font);
180       int height = fm.getHeight();
181       _rowHeight = height + height / 3;
182       setRowHeight(_rowHeight);
183     }
184 
185 
186   }
187 
188 
189   //--------------------------------------------------------------------------
190   //   Protected Methods:
191   //--------------------------------------------------------------------------
192 
193   protected void init() {
194     setRowHeight(_rowHeight);
195     setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
196   }
197 
198   // assign a column number to a column name
199   protected Vector getColumnNameAndNumber() {
200     Vector columnNameAndNumber = new Vector();
201     for (int i = 0; i < _colNames.length; i++) {
202       columnNameAndNumber.add(i, _colNames[i]);
203     }
204     return columnNameAndNumber;
205   }
206 
207   //--------------------------------------------------------------------------
208   //   Private Methods:
209   //--------------------------------------------------------------------------
210 
211   //--------------------------------------------------------------------------
212   //   Nested Top-Level Classes or Interfaces:
213   //--------------------------------------------------------------------------
214 
215   class LogTableListSelectionListener implements ListSelectionListener {
216     protected JTable _table;
217 
218     public LogTableListSelectionListener(JTable table) {
219       _table = table;
220     }
221 
222     public void valueChanged(ListSelectionEvent e) {
223       //Ignore extra messages.
224       if (e.getValueIsAdjusting()) {
225         return;
226       }
227 
228       ListSelectionModel lsm = (ListSelectionModel) e.getSource();
229       if (lsm.isSelectionEmpty()) {
230         //no rows are selected
231       } else {
232         StringBuffer buf = new StringBuffer();
233         int selectedRow = lsm.getMinSelectionIndex();
234 
235         for (int i = 0; i < _numCols - 1; i++) {
236           String value = "";
237           Object obj = _table.getModel().getValueAt(selectedRow, i);
238           if (obj != null) {
239             value = obj.toString();
240           }
241 
242           buf.append(_colNames[i] + ":");
243           buf.append("\t");
244 
245           if (i == _colThread || i == _colMessage || i == _colLevel) {
246             buf.append("\t"); // pad out the date.
247           }
248 
249           if (i == _colDate || i == _colNDC) {
250             buf.append("\t\t"); // pad out the date.
251           }
252 
253 //               if( i == _colSequence)
254 //               {
255 //                  buf.append("\t\t\t"); // pad out the Sequnce.
256 //               }
257 
258           buf.append(value);
259           buf.append("\n");
260         }
261         buf.append(_colNames[_numCols - 1] + ":\n");
262         Object obj = _table.getModel().getValueAt(selectedRow, _numCols - 1);
263         if (obj != null) {
264           buf.append(obj.toString());
265         }
266 
267         _detailTextArea.setText(buf.toString());
268       }
269     }
270   }
271 }
272 
273 
274 
275 
276 
277