1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 package com.mindtree.techworks.insight.gui;
26
27 import java.awt.Dimension;
28 import java.awt.EventQueue;
29 import java.awt.Toolkit;
30 import java.awt.event.MouseAdapter;
31 import java.awt.event.MouseEvent;
32 import java.util.Enumeration;
33
34 import javax.swing.BorderFactory;
35 import javax.swing.JComponent;
36 import javax.swing.JScrollBar;
37 import javax.swing.JScrollPane;
38 import javax.swing.JTable;
39 import javax.swing.ListSelectionModel;
40 import javax.swing.event.ListSelectionEvent;
41 import javax.swing.event.ListSelectionListener;
42 import javax.swing.table.JTableHeader;
43 import javax.swing.table.TableColumn;
44 import javax.swing.table.TableColumnModel;
45
46 import com.mindtree.techworks.insight.Controller;
47 import com.mindtree.techworks.insight.InsightConstants;
48 import com.mindtree.techworks.insight.gui.action.IAction;
49 import com.mindtree.techworks.insight.gui.renderers.LogEventTableCellRenderer;
50 import com.mindtree.techworks.insight.gui.renderers.SortableHeaderRenderer;
51 import com.mindtree.techworks.insight.model.ILogEventModelMutator;
52 import com.mindtree.techworks.insight.model.LogEventTableModel;
53 import com.mindtree.techworks.insight.pagination.IPage;
54 import com.mindtree.techworks.insight.preferences.PreferenceChangeListener;
55 import com.mindtree.techworks.insight.preferences.PreferenceManager;
56 import com.mindtree.techworks.insight.preferences.util.PreferenceInterpreter;
57 import com.mindtree.techworks.insight.spi.LogEvent;
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72 public class EventListPresentation implements Presentation, ListSelectionListener, IAction, PreferenceChangeListener {
73
74
75
76
77 private static final int TABLE_WIDGET = 1;
78
79
80
81
82 private static final int WIDTH = 900;
83 private static final int HEIGHT = 300;
84
85
86
87
88 private static final int SCROLL_LOCK = 10;
89 private static final int SCROLL_UNLOCK = 20;
90 private static final int SCROLL_JUST_UNLOCKED = 30;
91
92
93
94
95 private static final String EVENT_COLUMN_PREFERENCE_ID = "eventcolumnpreference";
96
97
98
99
100 private Controller controller;
101
102
103
104
105
106 private LogEventTableModel tableModel;
107
108
109
110
111 private JTable table;
112
113
114
115
116 private JScrollPane scrollPane;
117
118
119
120
121 private LogEventTableCellRenderer cellRenderer;
122
123
124
125
126 private boolean enableSort;
127
128
129
130
131 private volatile int scrollLockState = SCROLL_UNLOCK;
132
133
134
135
136
137 public EventListPresentation(Controller controller) {
138 int[] displayColumns = PreferenceInterpreter.getConfiguredColumnsForDisplay();
139 tableModel = new LogEventTableModel(displayColumns);
140 table = new JTable(tableModel);
141 initTable(displayColumns, false);
142
143 table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
144 table.getTableHeader().addMouseListener(new MouseHandler(this.tableModel));
145
146 scrollPane = new JScrollPane(table);
147 scrollPane.setBorder(BorderFactory.createTitledBorder(InsightConstants.getLiteral("EVENTS")));
148 scrollPane.setPreferredSize(getIdealPreferredSize());
149
150 ListSelectionModel rowSM = table.getSelectionModel();
151 rowSM.addListSelectionListener(this);
152
153 this.controller = controller;
154 controller.registerPresentation(this);
155 controller.registerAction(this);
156
157
158 PreferenceManager.getInstance().registerListener(EVENT_COLUMN_PREFERENCE_ID, this);
159
160 }
161
162
163
164
165
166
167 public String getUID() {
168 return this.getClass().getName();
169 }
170
171
172
173
174
175 public void notifyWidgetStateChange(Presentation presentation, int identifier, Object data) {
176 }
177
178
179
180
181
182 public JComponent getViewComponent() {
183 return scrollPane;
184 }
185
186
187
188
189
190 public boolean doesProcessRealTimeUpdates() {
191 return true;
192 }
193
194
195
196
197
198
199 public void processRealTimeUpdate(LogEvent event) {
200 if (this.scrollLockState == SCROLL_JUST_UNLOCKED) {
201 synchronized(this) {
202 try {
203
204
205
206 wait();
207 return;
208 } catch(InterruptedException ie) {
209
210 }
211 }
212 }
213 int size = tableModel.getRowCount();
214 if (size >= PreferenceInterpreter.getCachePageSize()) {
215 if (!this.controller.isScrollLock() && this.controller.getMutatorType() == ILogEventModelMutator.TAILING_MUTATOR) {
216
217
218 tableModel.clearModel();
219 tableModel.addLogEvent(event);
220 }
221 } else {
222 tableModel.addLogEvent(event);
223 }
224
225 if (!this.controller.isScrollLock() && this.controller.getMutatorType() == ILogEventModelMutator.TAILING_MUTATOR) {
226 JScrollBar scrollBar = scrollPane.getVerticalScrollBar();
227 scrollBar.setValue(scrollBar.getMaximum());
228 }
229 }
230
231
232
233
234
235 public void resetWidgets() {
236 tableModel.clearModel();
237 }
238
239
240
241
242
243
244
245
246 public void valueChanged(ListSelectionEvent event) {
247 if (event.getValueIsAdjusting()) {
248 return;
249 }
250 ListSelectionModel lsm = (ListSelectionModel) event.getSource();
251 if (!lsm.isSelectionEmpty()) {
252 Object data = tableModel.getLoggingEvent(lsm.getMinSelectionIndex());
253 controller.getCurrentLogEventModel().setLogEventIndex(tableModel.getLoggingEvent(lsm.getMinSelectionIndex()).getSequenceNumber());
254
255
256 if (data != null) {
257 controller.fireWidgetChanged(this,TABLE_WIDGET, data);
258 }
259 }
260 }
261
262
263
264
265
266 public void displayPage(IPage page, long eventSequenceNumber) {
267 this.tableModel.updateDataModel(page.getLogEventList());
268 initTable(tableModel.getColumnList(), true);
269 if (eventSequenceNumber >= 0) {
270
271 int selectedIndex = ((int)((eventSequenceNumber-1) % PreferenceInterpreter.getCachePageSize()));
272 this.table.setRowSelectionInterval(selectedIndex,selectedIndex);
273 this.table.setColumnSelectionInterval(0, 0);
274
275
276 EventQueue.invokeLater(new ScrollBarPositionLocator(page,selectedIndex));
277 } else {
278
279 scrollPane.getVerticalScrollBar().setValue(0);
280 }
281 }
282
283
284
285
286
287 public int getType() {
288 return IAction.MUTATION;
289 }
290
291
292
293
294
295 public void setEnabled(boolean enable) {
296 this.enableSort = enable;
297 }
298
299
300
301
302
303 public void preferenceChanged(String preferenceId) {
304 if (preferenceId.equals(EVENT_COLUMN_PREFERENCE_ID)) {
305 initTable(PreferenceInterpreter.getConfiguredColumnsForDisplay(), true);
306 }
307 }
308
309
310
311
312
313 public void setScrollLock(boolean scrollLock) {
314 this.scrollLockState = scrollLock ? SCROLL_LOCK : SCROLL_JUST_UNLOCKED;
315 if (this.scrollLockState == SCROLL_JUST_UNLOCKED) {
316
317
318 if (this.controller.getMutatorType() == ILogEventModelMutator.TAILING_MUTATOR) {
319 IPage page = this.controller.
320 getCurrentLogEventModel().getPageSet().getLastPage();
321 this.tableModel.updateDataModelAndDisplay(page.getLogEventList());
322 synchronized(this) {
323 this.scrollLockState = SCROLL_UNLOCK;
324
325
326 notifyAll();
327 }
328 } else {
329
330 this.scrollLockState = SCROLL_UNLOCK;
331 }
332 }
333 }
334
335
336
337
338
339
340 private void initTable(int[] displayColumns, boolean hasStructureChanged) {
341 this.tableModel.setColumnList(displayColumns);
342 if (hasStructureChanged) {
343 this.tableModel.fireTableStructureChanged();
344 }
345 Enumeration columns = table.getColumnModel().getColumns();
346 cellRenderer = new LogEventTableCellRenderer();
347 int index = 0;
348 while(columns.hasMoreElements()) {
349 TableColumn tableColumn = (TableColumn)columns.nextElement();
350
351 tableColumn.setIdentifier(new Integer(displayColumns[index]));
352 tableColumn.setCellRenderer(cellRenderer);
353 index += 1;
354 }
355 JTableHeader tableHeader = table.getTableHeader();
356 tableHeader.setDefaultRenderer(
357 new SortableHeaderRenderer(tableHeader.getDefaultRenderer()));
358 }
359
360
361
362
363
364
365 private Dimension getIdealPreferredSize() {
366 Dimension dimension = null;
367 Dimension screenDim = Toolkit.getDefaultToolkit().getScreenSize();
368 dimension = new Dimension((int)Math.min(screenDim.getWidth() - 50, WIDTH),
369 (int)Math.min(screenDim.getHeight()/3, HEIGHT));
370 return dimension;
371 }
372
373
374
375
376
377
378 private class ScrollBarPositionLocator extends Thread {
379
380 private IPage page;
381 private int selectedIndex;
382 public ScrollBarPositionLocator(IPage page, int selectedIndex) {
383 this.page = page;
384 this.selectedIndex = selectedIndex;
385
386
387
388 this.setPriority(Thread.NORM_PRIORITY);
389 }
390 public void run() {
391 JScrollBar scrollBar = scrollPane.getVerticalScrollBar();
392 int widthPerRow = scrollBar.getMaximum()/page.getLogEventList().size();
393 scrollBar.setValue(selectedIndex * widthPerRow);
394 }
395 }
396
397
398
399
400
401 private class MouseHandler extends MouseAdapter {
402
403
404
405
406 private LogEventTableModel tableModel;
407
408
409
410
411
412 public MouseHandler(LogEventTableModel tableModel){
413 this.tableModel = tableModel;
414 }
415
416
417
418
419
420 public void mouseClicked(MouseEvent e) {
421 if (table.getModel().getRowCount() < PreferenceInterpreter.getCachePageSize()) {
422 if (!enableSort) {
423
424 return;
425 }
426 }
427 JTableHeader h = (JTableHeader) e.getSource();
428 TableColumnModel columnModel = h.getColumnModel();
429 int viewColumn = columnModel.getColumnIndexAtX(e.getX());
430 int column = columnModel.getColumn(viewColumn).getModelIndex();
431 this.tableModel.sortColumn(this.tableModel.getColumnList()[column]);
432 }
433 }
434
435 }