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
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
96
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
121
122
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
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
158 renderer = new DefaultCellRenderer(converter, converters);
159 }
160 } else {
161
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 }