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 }