View Javadoc
1   package net.logAnalyzer.gui.messages;
2   
3   import java.awt.Rectangle;
4   import java.lang.reflect.Constructor;
5   import java.util.Hashtable;
6   
7   import javax.swing.JScrollPane;
8   import javax.swing.JTable;
9   import javax.swing.ListSelectionModel;
10  import javax.swing.event.ListSelectionEvent;
11  import javax.swing.event.TableModelEvent;
12  import javax.swing.table.TableCellRenderer;
13  import javax.swing.table.TableColumn;
14  import javax.swing.table.TableModel;
15  
16  import net.logAnalyzer.converters.LAConverter;
17  import net.logAnalyzer.gui.messages.cellrenderers.DefaultCellRenderer;
18  import net.logAnalyzer.utils.gui.ResizableTableHeader;
19  
20  public class MessagesTable extends JTable {
21      private static final long serialVersionUID = 1L;
22  
23      /***
24       * View displaying the table.
25       */
26      private MessagesView view;
27  
28      /***
29       * View attributes.
30       */
31      private Hashtable attributes;
32  
33      /***
34       * Scroll pane used to sroll table.
35       */
36      private JScrollPane scrollPane;
37  
38      private ResizableTableHeader theader;
39  
40      /***
41       * Constructs a new table with the specified attributes.
42       * 
43       * @param view
44       *            View displaying the table.
45       * @param attributes
46       *            Table attributes.
47       */
48      public MessagesTable(MessagesView view, Hashtable attributes) {
49          super();
50          this.view = view;
51          if (attributes == null) {
52              this.attributes = new Hashtable();
53          } else {
54              this.attributes = attributes;
55          }
56          setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
57          setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
58          theader = new ResizableTableHeader(getColumnModel());
59          theader.setResizingAllowed(true);
60          setTableHeader(theader);
61      }
62  
63      /***
64       * Sets current messageLabel.
65       * 
66       * @param newFirstIndex
67       *            New first selected messageLabel index.
68       * @param newLastIndex
69       *            New last selected messageLabel index.
70       */
71      protected void setCurrentMessage(int newFirstIndex, int newLastIndex) {
72          clearSelection();
73          // changeSelection(newFirstIndex, getSelectedColumn(), false, false);
74          setRowSelectionInterval(newFirstIndex, newLastIndex);
75          if (scrollPane != null) {
76              Rectangle rect = getCellRect(newFirstIndex, getSelectedColumn(),
77                      true);
78              scrollPane.getViewport().setViewPosition(rect.getLocation());
79          }
80      }
81  
82      /***
83       * Sets the data model and renderers for each column according to the
84       * attributes <tt>CellRendererForConverter(x)</tt> where "x" is the
85       * converter <tt>letter</tt> or <tt>letter{option}</tt>.
86       * 
87       * @see javax.swing.JTable#setModel(javax.swing.table.TableModel)
88       */
89      public void setModel(TableModel dataModel) {
90          super.setModel(dataModel);
91          if (dataModel instanceof MessagesModel && attributes != null) {
92              MessagesModel model = (MessagesModel) dataModel;
93              for (int i = 0; i < model.getColumnCount(); i++) {
94                  TableColumn column = getColumnModel().getColumn(i);
95                  // Sets the cell renderer according to the column converter
96                  // class
97                  column.setCellRenderer(createTableCellRenderer(model
98                          .getConverter(i), model.getConverters()));
99              }
100         }
101         if (theader == null) {
102             theader = new ResizableTableHeader(getColumnModel());
103         } else {
104             theader.setColumnModel(getColumnModel());
105         }
106         setTableHeader(theader);
107     }
108 
109     /***
110      * Sets the scroll pane component to scroll the table.
111      * 
112      * @param scrollPane
113      *            Scroll pane.
114      */
115     public void setScrollPane(JScrollPane scrollPane) {
116         this.scrollPane = scrollPane;
117     }
118 
119     /*
120      * (non-Javadoc)
121      * 
122      * @see javax.swing.event.TableModelListener#tableChanged(javax.swing.event.TableModelEvent)
123      */
124     public void tableChanged(TableModelEvent e) {
125         super.tableChanged(e);
126     }
127 
128     /***
129      * Creates a new table cell renderer for the specified converter.
130      * 
131      * @param converter
132      *            Converter to render.
133      * @param converters
134      *            All converters of the log handler.
135      * @return Specific table cell renderer for converter if known;
136      *         {@link javax.swing.table.DefaultTableCellRenderer} otherwise.
137      */
138     private TableCellRenderer createTableCellRenderer(LAConverter converter,
139             LAConverter[] converters) {
140         TableCellRenderer renderer = null;
141         String attributeName = "CellRenderForConverter("
142                 + converter.getLiteral() + ")";
143         String classname = (String) attributes.get(attributeName);
144         if (classname != null) {
145             // Tries to creates the specified table celle renderer
146             try {
147                 Class[] classes = new Class[] { LAConverter.class,
148                         converters.getClass() };
149                 Object[] parameters = new Object[] { converter, converters };
150                 Class rendererClass = ClassLoader.getSystemClassLoader()
151                         .loadClass(classname);
152 
153                 Constructor constructor = rendererClass.getConstructor(classes);
154                 renderer = (TableCellRenderer) constructor
155                         .newInstance(parameters);
156             } catch (Exception e) {
157                 // Create a default cell renderer
158                 renderer = new DefaultCellRenderer(converter, converters);
159             }
160         } else {
161             // Create a default cell renderer
162             renderer = new DefaultCellRenderer(converter, converters);
163         }
164         return renderer;
165     }
166 
167     /***
168      * 
169      */
170     public void valueChanged(ListSelectionEvent e) {
171         super.valueChanged(e);
172         int[] selectedRows = getSelectedRows();
173         if (view != null && selectedRows != null && selectedRows.length > 0) {
174             view.messageChangedNotify(selectedRows[0],
175                     selectedRows[selectedRows.length - 1]);
176         }
177     }
178 }