2010-11-23 Francois Chouinard <fchouinard@gmail.com> Contribution for Bug325661
[deliverable/tracecompass.git] / org.eclipse.linuxtools.lttng.ui / src / org / eclipse / linuxtools / lttng / ui / views / controlflow / ControlFlowView.java
1 /*******************************************************************************
2 * Copyright (c) 2009, 2010 Ericsson
3 *
4 * All rights reserved. This program and the accompanying materials are made
5 * available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
8 *
9 * Contributors: Alvaro Sanchez-Leon - Initial implementation
10 *******************************************************************************/
11 package org.eclipse.linuxtools.lttng.ui.views.controlflow;
12
13 import java.util.Vector;
14
15 import org.eclipse.jface.action.Action;
16 import org.eclipse.jface.action.IMenuListener;
17 import org.eclipse.jface.action.IMenuManager;
18 import org.eclipse.jface.action.IToolBarManager;
19 import org.eclipse.jface.action.MenuManager;
20 import org.eclipse.jface.action.Separator;
21 import org.eclipse.jface.dialogs.MessageDialog;
22 import org.eclipse.jface.viewers.DoubleClickEvent;
23 import org.eclipse.jface.viewers.IDoubleClickListener;
24 import org.eclipse.jface.viewers.ISelection;
25 import org.eclipse.jface.viewers.ISelectionChangedListener;
26 import org.eclipse.jface.viewers.IStructuredContentProvider;
27 import org.eclipse.jface.viewers.IStructuredSelection;
28 import org.eclipse.jface.viewers.ITableLabelProvider;
29 import org.eclipse.jface.viewers.LabelProvider;
30 import org.eclipse.jface.viewers.SelectionChangedEvent;
31 import org.eclipse.jface.viewers.StructuredViewer;
32 import org.eclipse.jface.viewers.TableViewer;
33 import org.eclipse.jface.viewers.Viewer;
34 import org.eclipse.jface.viewers.ViewerFilter;
35 import org.eclipse.linuxtools.lttng.control.LttngCoreProviderFactory;
36 import org.eclipse.linuxtools.lttng.event.LttngTimestamp;
37 import org.eclipse.linuxtools.lttng.request.ILttngSyntEventRequest;
38 import org.eclipse.linuxtools.lttng.state.evProcessor.ITransEventProcessor;
39 import org.eclipse.linuxtools.lttng.ui.TraceDebug;
40 import org.eclipse.linuxtools.lttng.ui.model.trange.ItemContainer;
41 import org.eclipse.linuxtools.lttng.ui.model.trange.TimeRangeEventProcess;
42 import org.eclipse.linuxtools.lttng.ui.model.trange.TimeRangeViewerProvider;
43 import org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView;
44 import org.eclipse.linuxtools.lttng.ui.views.common.ParamsUpdater;
45 import org.eclipse.linuxtools.lttng.ui.views.controlflow.evProcessor.FlowEventToHandlerFactory;
46 import org.eclipse.linuxtools.lttng.ui.views.controlflow.model.FlowModelFactory;
47 import org.eclipse.linuxtools.tmf.event.TmfEvent;
48 import org.eclipse.linuxtools.tmf.event.TmfTimeRange;
49 import org.eclipse.linuxtools.tmf.experiment.TmfExperiment;
50 import org.eclipse.linuxtools.tmf.request.ITmfDataRequest.ExecutionType;
51 import org.eclipse.linuxtools.tmf.signal.TmfExperimentSelectedSignal;
52 import org.eclipse.linuxtools.tmf.signal.TmfRangeSynchSignal;
53 import org.eclipse.linuxtools.tmf.signal.TmfSignalHandler;
54 import org.eclipse.linuxtools.tmf.signal.TmfTimeSynchSignal;
55 import org.eclipse.linuxtools.tmf.ui.viewers.TmfViewerFactory;
56 import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.ITmfTimeFilterSelectionListener;
57 import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.ITmfTimeScaleSelectionListener;
58 import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.ITmfTimeSelectionListener;
59 import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.TmfTimeFilterSelectionEvent;
60 import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.TmfTimeScaleSelectionEvent;
61 import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.TmfTimeSelectionEvent;
62 import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.ITmfTimeAnalysisEntry;
63 import org.eclipse.swt.SWT;
64 import org.eclipse.swt.custom.SashForm;
65 import org.eclipse.swt.custom.ScrolledComposite;
66 import org.eclipse.swt.events.KeyEvent;
67 import org.eclipse.swt.events.KeyListener;
68 import org.eclipse.swt.graphics.Image;
69 import org.eclipse.swt.graphics.Point;
70 import org.eclipse.swt.graphics.Rectangle;
71 import org.eclipse.swt.widgets.Composite;
72 import org.eclipse.swt.widgets.Display;
73 import org.eclipse.swt.widgets.Menu;
74 import org.eclipse.swt.widgets.ScrollBar;
75 import org.eclipse.swt.widgets.Table;
76 import org.eclipse.swt.widgets.TableColumn;
77 import org.eclipse.swt.widgets.TableItem;
78 import org.eclipse.ui.IActionBars;
79 import org.eclipse.ui.IWorkbenchActionConstants;
80 import org.eclipse.ui.PlatformUI;
81 import org.eclipse.ui.plugin.AbstractUIPlugin;
82
83 /**
84 * <b><u>ControlFlowView</u></b>
85 */
86 /**
87 * @author alvaro
88 *
89 */
90 public class ControlFlowView extends AbsTimeUpdateView implements
91 ITmfTimeSelectionListener, ITmfTimeScaleSelectionListener,
92 ITmfTimeFilterSelectionListener {
93
94 public static final String ID = "org.eclipse.linuxtools.lttng.ui.views.controlflow"; //$NON-NLS-1$
95
96 // ========================================================================
97 // Table data
98 // ========================================================================
99
100 private final String PROCESS_COLUMN = Messages.getString("ControlFlowView.processColumn"); //$NON-NLS-1$
101 private final String BRAND_COLUMN = Messages.getString("ControlFlowView.brandColumn"); //$NON-NLS-1$
102 private final String PID_COLUMN = Messages.getString("ControlFlowView.pidColumn"); //$NON-NLS-1$
103 private final String TGID_COLUMN = Messages.getString("ControlFlowView.tgidColumn"); //$NON-NLS-1$
104 private final String PPID_COLUMN = Messages.getString("ControlFlowView.ppidColumn"); //$NON-NLS-1$
105 private final String CPU_COLUMN = Messages.getString("ControlFlowView.cpuColumn"); //$NON-NLS-1$
106 private final String BIRTH_SEC_COLUMN = Messages.getString("ControlFlowView.birthSecColumn"); //$NON-NLS-1$
107 private final String BIRTH_NSEC_COLUMN = Messages.getString("ControlFlowView.birthNSecColumn"); //$NON-NLS-1$
108 private final String TRACE = Messages.getString("ControlFlowView.TraceNameColumn"); //$NON-NLS-1$
109
110 private final String[] columnNames = new String[] { PROCESS_COLUMN, /* */
111 BRAND_COLUMN,/* */
112 PID_COLUMN,/* */
113 TGID_COLUMN,/* */
114 PPID_COLUMN,/* */
115 CPU_COLUMN, /* */
116 BIRTH_SEC_COLUMN,/* */
117 BIRTH_NSEC_COLUMN,/* */
118 TRACE /* */
119 };
120
121 // ========================================================================
122 // Data
123 // ========================================================================
124 private TableViewer tableViewer;
125 // private int totalNumItems = 0;
126 // Actions
127 private Action doubleClickAction;
128 private Action resetScale;
129 private Action nextEvent;
130 private Action prevEvent;
131 private Action nextTrace;
132 private Action prevTrace;
133 private Action showLegend;
134 private Action filterTraces;
135 private Action zoomIn;
136 private Action zoomOut;
137 private Action zoomFilter;
138
139 private ViewProcessFilter tableFilter = null;
140 private ScrolledComposite scrollFrame = null;
141
142 // private static SimpleDateFormat stimeformat = new SimpleDateFormat(
143 // "yy/MM/dd HH:mm:ss");
144
145 // private TraceModelImplFactory fact;
146
147 // ========================================================================
148 // Methods
149 // ========================================================================
150 /*
151 * The content provider class is responsible for providing objects to the
152 * view. It can wrap existing objects in adapters or simply return objects
153 * as-is. These objects may be sensitive to the current input of the view,
154 * or ignore it and always show the same content (like Task List, for
155 * example).
156 */
157
158 class ViewContentProvider implements
159 /* ILazyContentProvider, */IStructuredContentProvider {
160 private TableViewer cviewer = null;
161 private ITmfTimeAnalysisEntry[] elements = null;
162
163 public ViewContentProvider(TableViewer v) {
164 cviewer = v;
165 }
166
167 @Override
168 public void inputChanged(Viewer v, Object oldInput, Object newInput) {
169 this.elements = (ITmfTimeAnalysisEntry[]) newInput;
170 if (elements != null) {
171 TraceDebug.debug("Total number of processes provided to Control Flow view: " + elements.length); //$NON-NLS-1$
172 } else {
173 TraceDebug.debug("New input = null"); //$NON-NLS-1$
174 }
175 }
176
177 @Override
178 public void dispose() {
179
180 }
181
182 // Needed with the use of virtual tables in order to initialize items
183 // which were not initially visible.
184 public void updateElement(int index) {
185 cviewer.replace(elements[index], index);
186 }
187
188 @Override
189 public Object[] getElements(Object inputElement) {
190 return elements;
191 }
192 }
193
194 class ViewLabelProvider extends LabelProvider implements ITableLabelProvider {
195 @Override
196 public String getColumnText(Object obj, int index) {
197 String strRes = ""; //$NON-NLS-1$
198 LttngTimestamp time;
199 if (obj instanceof TimeRangeEventProcess) {
200 TimeRangeEventProcess process = (TimeRangeEventProcess) obj;
201 switch (index) {
202 case 0:
203 strRes = process.getName();
204 break;
205 case 1:
206 strRes = process.getBrand();
207 break;
208 case 2:
209 strRes = process.getPid().toString();
210 break;
211 case 3:
212 strRes = process.getTgid().toString();
213 break;
214 case 4:
215 strRes = process.getPpid().toString();
216 break;
217 case 5:
218 strRes = process.getCpu().toString();
219 break;
220 case 6:
221 time = new LttngTimestamp(process.getCreationTime()
222 .longValue());
223 strRes = time.getSeconds();
224 break;
225 case 7:
226 time = new LttngTimestamp(process.getCreationTime()
227 .longValue());
228 strRes = time.getNanoSeconds();
229 break;
230 case 8:
231 strRes = process.getTraceID();
232 break;
233 default:
234 break;
235 }
236 } else {
237 return getText(obj);
238 }
239
240 return strRes;
241 }
242
243 @Override
244 public Image getColumnImage(Object obj, int index) {
245 return getImage(obj);
246 }
247
248 @Override
249 public Image getImage(Object obj) {
250 // No image needed for the time being
251 // return PlatformUI.getWorkbench().getSharedImages().getImage(
252 // ISharedImages.IMG_OBJ_ELEMENT);
253 return null;
254 }
255 }
256
257 class ViewProcessFilter extends ViewerFilter {
258
259 private Vector<ITmfTimeAnalysisEntry> filteredSet = new Vector<ITmfTimeAnalysisEntry>();
260 StructuredViewer viewer;
261
262 public ViewProcessFilter(StructuredViewer rviewer) {
263 this.viewer = rviewer;
264 }
265
266 public void setFilter(Vector<ITmfTimeAnalysisEntry> filtered) {
267 if (filtered != null) {
268 this.filteredSet = filtered;
269 viewer.refresh();
270 }
271 }
272
273 @Override
274 public boolean select(Viewer viewer, Object parentElement,
275 Object element) {
276 boolean filteredIn = true;
277 if (element instanceof ITmfTimeAnalysisEntry) {
278 ITmfTimeAnalysisEntry process = (ITmfTimeAnalysisEntry) element;
279 if (filteredSet.contains(process)) {
280 // The element is marked to be filtered out
281 return false;
282 }
283 } else {
284 TraceDebug.debug("Unexpected type of filter element received: " //$NON-NLS-1$
285 + element.toString());
286 }
287 // Compare element versus a list of filtered out
288 return filteredIn;
289 }
290 }
291
292 /**
293 * The constructor.
294 */
295 public ControlFlowView() {
296 super(ID);
297 }
298
299 /**
300 * This is a callback that will allow us to create the viewer and initialize
301 * it.
302 */
303 /*
304 * (non-Javadoc)
305 *
306 * @see
307 * org.eclipse.linuxtools.tmf.ui.views.TmfView#createPartControl(org.eclipse
308 * .swt.widgets.Composite)
309 */
310 @Override
311 public void createPartControl(Composite parent) {
312
313 scrollFrame = new ScrolledComposite(parent, SWT.V_SCROLL);
314
315 scrollFrame.setExpandVertical(true);
316 scrollFrame.setExpandHorizontal(true);
317 scrollFrame.setAlwaysShowScrollBars(true);
318
319 SashForm sash = new SashForm(scrollFrame, SWT.NONE);
320 scrollFrame.setContent(sash);
321
322 tableViewer = new TableViewer(sash, SWT.FULL_SELECTION | SWT.H_SCROLL);
323 tableViewer.setContentProvider(new ViewContentProvider(tableViewer));
324 tableViewer.setLabelProvider(new ViewLabelProvider());
325 Table table = tableViewer.getTable();
326 tableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
327 @Override
328 public void selectionChanged(SelectionChangedEvent event) {
329 ISelection sel = event.getSelection();
330 if (!sel.isEmpty()) {
331 Object firstSel = null;
332 if (sel instanceof IStructuredSelection) {
333 firstSel = ((IStructuredSelection) sel).getFirstElement();
334
335 // Make sure the selection is visible
336 updateScrollOrigin();
337
338 if (firstSel instanceof ITmfTimeAnalysisEntry) {
339 ITmfTimeAnalysisEntry trace = (ITmfTimeAnalysisEntry) firstSel;
340 tsfviewer.setSelectedTrace(trace);
341 }
342 }
343 }
344 }
345
346 /**
347 * Make sure the selected item is visible
348 */
349 private void updateScrollOrigin() {
350 Table table = tableViewer.getTable();
351 if (table != null && table.getItemCount() > 0) {
352 TableItem item = table.getSelection()[0];
353 if (item == null) {
354 // no selected reference to go up or down
355 return;
356 }
357
358 Rectangle itemRect = item.getBounds();
359 int step = itemRect.height;
360
361 // calculate height of horizontal bar
362 int hscrolly = 0;
363 ScrollBar hbar = scrollFrame.getHorizontalBar();
364 if (hbar != null) {
365 hscrolly = hbar.getSize().y;
366 }
367
368 int visibleHeight = scrollFrame.getSize().y - hscrolly;
369
370 // the current scrollbar offset to adjust i.e. start
371 // of
372 // the visible window
373 Point origin = scrollFrame.getOrigin();
374 // end of visible window
375 int endy = origin.y + visibleHeight;
376
377 int itemStartPos = itemRect.y + table.getHeaderHeight() + table.getBorderWidth()
378 + table.getParent().getBorderWidth();
379
380 // Item End Position
381 int itemEndPos = itemStartPos + step;
382
383 // check if need to go up
384 if (origin.y >= step && itemStartPos < origin.y) {
385 // one step up
386 scrollFrame.setOrigin(origin.x, origin.y - step);
387
388 }
389
390 // check if it needs to go down
391 if (itemEndPos > endy) {
392 // one step down
393 scrollFrame.setOrigin(origin.x, origin.y + step);
394
395 }
396 }
397 }
398 });
399
400 // Listen to page up /down and Home / Enc keys
401 tableViewer.getTable().addKeyListener(new KeyListener() {
402 @Override
403 public void keyPressed(KeyEvent e) {
404 Table table = tableViewer.getTable();
405 Point origin = scrollFrame.getOrigin();
406 if (table == null || table.getItemCount() < 1) {
407 // nothing to page
408 return;
409 }
410
411 TableItem item;
412 int count;
413
414 switch (e.keyCode) {
415 case SWT.PAGE_DOWN:
416 updateScrollPageDown();
417 break;
418 case SWT.PAGE_UP:
419 updateScrollUp();
420 break;
421 case SWT.HOME:
422 // Home
423 count = table.getItemCount();
424 item = table.getItem(0);
425 // Go to the top
426 scrollFrame.setOrigin(origin.x, 0);
427 break;
428 case SWT.END:
429 // End Selected
430 count = table.getItemCount();
431 item = table.getItem(count - 1);
432 int itemStartPos = item.getBounds().y;
433 // Get to the bottom
434 scrollFrame.setOrigin(origin.x, itemStartPos);
435 break;
436 default:
437 break;
438 }
439 }
440
441 @Override
442 public void keyReleased(KeyEvent e) {
443 // Nothing to do
444
445 }
446
447 /**
448 * Scroll one page down
449 */
450 private void updateScrollPageDown() {
451 // null protection before calling private method
452 Table table = tableViewer.getTable();
453 int step = table.getItemHeight();
454
455 int hscrolly = 0;
456 ScrollBar hbar = scrollFrame.getHorizontalBar();
457 if (hbar != null) {
458 hscrolly = hbar.getSize().y;
459 }
460
461 Point origin = scrollFrame.getOrigin();
462 int visibleHeight = scrollFrame.getSize().y - hscrolly;
463 int endy = origin.y + visibleHeight;
464
465 scrollFrame.setOrigin(origin.x, endy - step);
466 }
467
468 /**
469 * Scroll one page up
470 */
471 private void updateScrollUp() {
472 // null protection before calling private method
473 Table table = tableViewer.getTable();
474 int step = table.getItemHeight();
475
476 int hscrolly = 0;
477 ScrollBar hbar = scrollFrame.getHorizontalBar();
478 if (hbar != null) {
479 hscrolly = hbar.getSize().y;
480 }
481
482 Point origin = scrollFrame.getOrigin();
483 int visibleHeight = scrollFrame.getSize().y - hscrolly;
484 int pageUpPos = origin.y - visibleHeight + step;
485 pageUpPos = pageUpPos > 0 ? pageUpPos : 0;
486 scrollFrame.setOrigin(origin.x, pageUpPos);
487 }
488
489 });
490 // Describe table
491 applyTableLayout(table);
492
493 int borderWidth = table.getBorderWidth();
494
495 int itemHeight = table.getItemHeight() + checkForSWTBugItemHeightAdjustement();
496 int headerHeight = table.getHeaderHeight();
497 table.getVerticalBar().setVisible(false);
498
499 tsfviewer = TmfViewerFactory.createViewer(sash,
500 new TimeRangeViewerProvider(getParamsUpdater()));
501
502 tsfviewer.addWidgetSelectionListner(this);
503 tsfviewer.addWidgetTimeScaleSelectionListner(this);
504
505 // Traces shall not be grouped to allow synchronisation
506 tsfviewer.groupTraces(false);
507 tsfviewer.setItemHeight(itemHeight);
508 tsfviewer.setBorderWidth(borderWidth);
509 tsfviewer.setHeaderHeight(headerHeight);
510 tsfviewer.setVisibleVerticalScroll(false);
511 // Names provided by the table
512 tsfviewer.setNameWidthPref(0);
513 tsfviewer.setAcceptSelectionAPIcalls(true);
514
515 // Viewer to notify selection to this class
516 // This class will synchronise selections with table.
517 tsfviewer.addWidgetSelectionListner(this);
518 tsfviewer.addFilterSelectionListner(this);
519 tsfviewer.addWidgetTimeScaleSelectionListner(this);
520
521 sash.setWeights(new int[] { 1, 1 });
522 // Create the help context id for the viewer's control
523 // TODO: Associate with help system
524 PlatformUI.getWorkbench().getHelpSystem().setHelp(
525 tableViewer.getControl(),
526 "org.eclipse.linuxtools.lttnng.ui.views.flow.viewer"); //$NON-NLS-1$
527
528 makeActions();
529 hookContextMenu();
530 hookDoubleClickAction();
531 contributeToActionBars();
532
533 // scrollFrame.addControlListener(new ControlAdapter() {
534 //
535 // @Override
536 // public void controlResized(ControlEvent e) {
537 // tsfviewer.resizeControls();
538 // updateScrolls(scrollFrame);
539 // }
540 // });
541
542 // set the initial view parameter values
543 // Experiment start and end time
544 // as well as time space width in pixels, used by the time analysis
545 // widget
546 // Read relevant values
547 int timeSpaceWidth = tsfviewer.getTimeSpace();
548 if (timeSpaceWidth < 0) {
549 timeSpaceWidth = -timeSpaceWidth;
550 }
551
552 TmfExperiment<?> experiment = TmfExperiment.getCurrentExperiment();
553 if (experiment != null) {
554 TmfTimeRange experimentTRange = experiment.getTimeRange();
555
556 // send request and received the adjusted time used
557 TmfTimeRange adjustedTimeRange = initialExperimentDataRequest(this,
558 experimentTRange);
559
560 // initialize widget time boundaries and filtering parameters
561 ModelUpdateInit(experimentTRange, adjustedTimeRange, this);
562 } else {
563 TraceDebug.debug("No selected experiment information available"); //$NON-NLS-1$
564 }
565 }
566
567 private void hookContextMenu() {
568 MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
569 menuMgr.setRemoveAllWhenShown(true);
570 menuMgr.addMenuListener(new IMenuListener() {
571 @Override
572 public void menuAboutToShow(IMenuManager manager) {
573 ControlFlowView.this.fillContextMenu(manager);
574 }
575 });
576 Menu menu = menuMgr.createContextMenu(tableViewer.getControl());
577 tableViewer.getControl().setMenu(menu);
578 getSite().registerContextMenu(menuMgr, tableViewer);
579 }
580
581 private void contributeToActionBars() {
582 IActionBars bars = getViewSite().getActionBars();
583 fillLocalPullDown(bars.getMenuManager());
584 fillLocalToolBar(bars.getToolBarManager());
585 }
586
587 private void fillLocalPullDown(IMenuManager manager) {
588 manager.add(new Separator());
589 // manager.add(showLegend);
590 manager.add(new Separator());
591 manager.add(resetScale);
592 manager.add(nextEvent);
593 manager.add(prevEvent);
594 manager.add(nextTrace);
595 manager.add(prevTrace);
596 // manager.add(filterTraces);
597 manager.add(zoomIn);
598 manager.add(zoomOut);
599 manager.add(zoomFilter);
600 manager.add(new Separator());
601 }
602
603 private void fillContextMenu(IMenuManager manager) {
604 // manager.add(showLegend);
605 manager.add(new Separator());
606 manager.add(resetScale);
607 manager.add(nextEvent);
608 manager.add(prevEvent);
609 manager.add(nextTrace);
610 manager.add(prevTrace);
611 // manager.add(showLegend);
612 // manager.add(filterTraces);
613 manager.add(zoomIn);
614 manager.add(zoomOut);
615 manager.add(zoomFilter);
616 manager.add(new Separator());
617 manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
618 }
619
620 private void fillLocalToolBar(IToolBarManager manager) {
621 // manager.add(showLegend);
622 manager.add(new Separator());
623 manager.add(resetScale);
624 manager.add(nextEvent);
625 manager.add(prevEvent);
626 manager.add(nextTrace);
627 manager.add(prevTrace);
628 // manager.add(filterTraces);
629 manager.add(zoomIn);
630 manager.add(zoomOut);
631 manager.add(zoomFilter);
632 manager.add(new Separator());
633 }
634
635 private void makeActions() {
636 // resetScale
637 resetScale = new Action() {
638 @Override
639 public void run() {
640 if (tsfviewer != null) {
641 tsfviewer.resetStartFinishTime();
642 }
643
644 }
645 };
646 resetScale.setText(Messages.getString("ControlFlowView.Action.Reset")); //$NON-NLS-1$
647 resetScale.setToolTipText(Messages
648 .getString("ControlFlowView.Action.Reset.ToolTip")); //$NON-NLS-1$
649 resetScale.setImageDescriptor(AbstractUIPlugin
650 .imageDescriptorFromPlugin(Messages
651 .getString("ControlFlowView.tmf.UI"), //$NON-NLS-1$
652 "icons/home_nav.gif")); //$NON-NLS-1$
653
654 // nextEvent
655 nextEvent = new Action() {
656 @Override
657 public void run() {
658 if (tsfviewer != null) {
659 tsfviewer.selectNextEvent();
660 }
661 }
662 };
663 nextEvent.setText(Messages
664 .getString("ControlFlowView.Action.NextEvent")); //$NON-NLS-1$
665 nextEvent.setToolTipText(Messages
666 .getString("ControlFlowView.Action.NextEvent.Tooltip")); //$NON-NLS-1$
667 nextEvent.setImageDescriptor(AbstractUIPlugin
668 .imageDescriptorFromPlugin(Messages
669 .getString("ControlFlowView.tmf.UI"), //$NON-NLS-1$
670 "icons/next_event.gif")); //$NON-NLS-1$
671
672 // prevEvent
673 prevEvent = new Action() {
674 @Override
675 public void run() {
676 if (tsfviewer != null) {
677 tsfviewer.selectPrevEvent();
678 }
679 }
680 };
681 prevEvent.setText(Messages
682 .getString("ControlFlowView.Action.PrevEvent")); //$NON-NLS-1$
683 prevEvent.setToolTipText(Messages
684 .getString("ControlFlowView.Action.PrevEvent.Tooltip")); //$NON-NLS-1$
685 prevEvent.setImageDescriptor(AbstractUIPlugin
686 .imageDescriptorFromPlugin(Messages
687 .getString("ControlFlowView.tmf.UI"), //$NON-NLS-1$
688 "icons/prev_event.gif")); //$NON-NLS-1$
689
690 // nextTrace
691 nextTrace = new Action() {
692 @Override
693 public void run() {
694 if (tsfviewer != null) {
695 tsfviewer.selectNextTrace();
696 }
697 }
698 };
699 nextTrace.setText(Messages
700 .getString("ControlFlowView.Action.NextProcess")); //$NON-NLS-1$
701 nextTrace.setToolTipText(Messages
702 .getString("ControlFlowView.Action.NextProcess.ToolTip")); //$NON-NLS-1$
703 nextTrace.setImageDescriptor(AbstractUIPlugin
704 .imageDescriptorFromPlugin(Messages
705 .getString("ControlFlowView.tmf.UI"), //$NON-NLS-1$
706 "icons/next_item.gif")); //$NON-NLS-1$
707
708 // prevTrace
709 prevTrace = new Action() {
710 @Override
711 public void run() {
712 if (tsfviewer != null) {
713 tsfviewer.selectPrevTrace();
714 }
715 }
716 };
717 prevTrace.setText(Messages
718 .getString("ControlFlowView.Action.PreviousProcess")); //$NON-NLS-1$
719 prevTrace.setToolTipText(Messages
720 .getString("ControlFlowView.Action.PreviousProcess.Tooltip")); //$NON-NLS-1$
721 prevTrace.setImageDescriptor(AbstractUIPlugin
722 .imageDescriptorFromPlugin(Messages
723 .getString("ControlFlowView.tmf.UI"), //$NON-NLS-1$
724 "icons/prev_item.gif")); //$NON-NLS-1$
725
726 // showLegend
727 showLegend = new Action() {
728 @Override
729 public void run() {
730 if (tsfviewer != null) {
731 tsfviewer.showLegend();
732 }
733 }
734 };
735 showLegend.setText(Messages.getString("ControlFlowView.Action.Legend")); //$NON-NLS-1$
736 showLegend.setToolTipText(Messages
737 .getString("ControlFlowView.Action.Legend.ToolTip")); //$NON-NLS-1$
738
739 // filterTraces
740 filterTraces = new Action() {
741 @Override
742 public void run() {
743 if (tsfviewer != null) {
744 tsfviewer.filterTraces();
745 }
746 }
747 };
748 filterTraces.setText(Messages
749 .getString("ControlFlowView.Action.Filter")); //$NON-NLS-1$
750 filterTraces.setToolTipText(Messages
751 .getString("ControlFlowView.Action.Filter.ToolTip")); //$NON-NLS-1$
752 filterTraces.setImageDescriptor(AbstractUIPlugin
753 .imageDescriptorFromPlugin(Messages
754 .getString("ControlFlowView.tmf.UI"), //$NON-NLS-1$
755 "icons/filter_items.gif")); //$NON-NLS-1$
756
757 // zoomIn
758 zoomIn = new Action() {
759 @Override
760 public void run() {
761 if (tsfviewer != null) {
762 tsfviewer.zoomIn();
763 }
764 }
765 };
766 zoomIn.setText(Messages.getString("ControlFlowView.Action.ZoomIn")); //$NON-NLS-1$
767 zoomIn.setToolTipText(Messages
768 .getString("ControlFlowView.Action.ZoomIn.Tooltip")); //$NON-NLS-1$
769 zoomIn.setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(
770 Messages.getString("ControlFlowView.tmf.UI"), //$NON-NLS-1$
771 "icons/zoomin_nav.gif")); //$NON-NLS-1$
772
773 // zoomOut
774 zoomOut = new Action() {
775 @Override
776 public void run() {
777 if (tsfviewer != null) {
778 tsfviewer.zoomOut();
779 }
780 }
781 };
782 zoomOut.setText(Messages.getString("ControlFlowView.Action.ZoomOut")); //$NON-NLS-1$
783 zoomOut.setToolTipText(Messages
784 .getString("ControlFlowView.Action.ZoomOut.tooltip")); //$NON-NLS-1$
785 zoomOut.setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(
786 Messages.getString("ControlFlowView.tmf.UI"), //$NON-NLS-1$
787 "icons/zoomout_nav.gif")); //$NON-NLS-1$
788
789 // zoomFilter
790 zoomFilter = new Action() {
791 @Override
792 public void run() {
793 // Nothing to do, however the selection status is needed by the
794 // application
795 }
796 };
797 zoomFilter.setText(Messages
798 .getString("ControlFlowView.Action.ZoomFilter")); //$NON-NLS-1$
799 zoomFilter.setToolTipText(Messages
800 .getString("ControlFlowView.Action.ZoomFilter.tooltip")); //$NON-NLS-1$
801 zoomFilter.setImageDescriptor(AbstractUIPlugin
802 .imageDescriptorFromPlugin(Messages
803 .getString("ControlFlowView.tmf.UI"), //$NON-NLS-1$
804 "icons/filter_items.gif")); //$NON-NLS-1$
805 zoomFilter.setChecked(false);
806
807 // PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_ELCL_SYNCED);
808
809 doubleClickAction = new Action() {
810 @Override
811 public void run() {
812 ISelection selection = tableViewer.getSelection();
813 Object obj = ((IStructuredSelection) selection)
814 .getFirstElement();
815 showMessage("Double-click detected on " + obj.toString()); //$NON-NLS-1$
816 }
817 };
818 }
819
820 private void hookDoubleClickAction() {
821 tableViewer.addDoubleClickListener(new IDoubleClickListener() {
822 @Override
823 public void doubleClick(DoubleClickEvent event) {
824 doubleClickAction.run();
825 }
826 });
827 }
828
829 private void showMessage(String message) {
830 MessageDialog.openInformation(tableViewer.getControl().getShell(),
831 Messages.getString("ControlFlowView.msgSlogan"), message); //$NON-NLS-1$
832 }
833
834 /**
835 * Passing the focus request to the viewer's control.
836 */
837 @Override
838 public void setFocus() {
839 tableViewer.getControl().setFocus();
840 }
841
842 /*
843 * (non-Javadoc)
844 *
845 * @see org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView#
846 * tsfTmProcessSelEvent
847 * (org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.TmfTimeSelectionEvent
848 * )
849 */
850 @Override
851 public void tsfTmProcessSelEvent(TmfTimeSelectionEvent event) {
852 // common implementation
853 super.tsfTmProcessSelEvent(event);
854
855 // Reselect the table viewer to widget selection
856 ISelection sel = tsfviewer.getSelectionTrace();
857 if (sel != null && !sel.isEmpty()) {
858 tableViewer.setSelection(sel);
859 }
860 }
861
862 /*
863 * (non-Javadoc)
864 *
865 * @see org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.
866 * ITmfTimeScaleSelectionListener
867 * #tsfTmProcessTimeScaleEvent(org.eclipse.linuxtools
868 * .tmf.ui.viewers.timeAnalysis.TmfTimeScaleSelectionEvent)
869 */
870 @Override
871 public void tsfTmProcessTimeScaleEvent(TmfTimeScaleSelectionEvent event) {
872 super.tsfTmProcessTimeScaleEvent(event);
873 }
874
875 private void applyTableLayout(Table table) {
876 for (int i = 0; i < columnNames.length; i++) {
877 TableColumn tableColumn = new TableColumn(table, SWT.LEFT);
878 tableColumn.setText(columnNames[i]);
879 tableColumn.pack();
880 }
881 table.setHeaderVisible(true);
882 table.setLinesVisible(true);
883 }
884
885 /*
886 * (non-Javadoc)
887 *
888 * @see
889 * org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView#displayModel
890 * (org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.
891 * ITmfTimeAnalysisEntry[], long, long, boolean, long, long,
892 * java.lang.Object)
893 */
894 @Override
895 public void displayModel(final ITmfTimeAnalysisEntry[] items,
896 final long startBoundTime, final long endBoundTime,
897 final boolean updateTimeBounds, final long startVisibleWindow,
898 final long endVisibleWindow, final Object source) {
899
900 if(tableViewer != null) {
901 final Table table = tableViewer.getTable();
902
903 // Ignore update if widget is disposed
904 if (table.isDisposed()) return;
905
906 Display display = table.getDisplay();
907
908 // Perform the updates on the UI thread)
909 display.asyncExec(new Runnable() {
910 @Override
911 public void run() {
912 if (!table.isDisposed()) {
913 tableViewer.setInput(items); // This shall be the minimal
914 // initial
915 tableFilter = new ViewProcessFilter(tableViewer);
916 tableViewer.setFilters(new ViewerFilter[] { tableFilter });
917
918 resizeTableColumns(table);
919 table.update();
920 tableViewer.refresh();
921
922 tsfviewer.display(items, startBoundTime, endBoundTime,
923 updateTimeBounds);
924
925 // validate visible boundaries
926 if (startVisibleWindow > -1 && endVisibleWindow > -1) {
927 tsfviewer.setSelectVisTimeWindow(startVisibleWindow,
928 endVisibleWindow, source);
929 }
930
931 tsfviewer.resizeControls();
932
933 // Adjust asynchronously the size of the vertical scroll bar to fit the
934 // contents
935 tableViewer.getTable().getDisplay().asyncExec(new Runnable() {
936 @Override
937 public void run() {
938 if ((scrollFrame != null) && (!scrollFrame.isDisposed())) {
939 updateScrolls(scrollFrame);
940 }
941 }
942 });
943 }
944 }
945 });
946 }
947 }
948
949 @Override
950 public void dispose() {
951 // dispose parent resources
952 super.dispose();
953
954 tsfviewer.removeFilterSelectionListner(this);
955 tsfviewer.removeWidgetSelectionListner(this);
956 tsfviewer.removeWidgetTimeScaleSelectionListner(this);
957 tableViewer = null;
958 tsfviewer = null;
959 }
960
961 /**
962 * @param tableComposite
963 * @param table
964 */
965 private synchronized void resizeTableColumns(Table table) {
966 if (table != null) {
967 Composite parent = table.getParent();
968 int tableWidthSum = parent.getBorderWidth();
969
970 TableColumn[] columns = table.getColumns();
971 for (TableColumn column : columns) {
972 column.pack();
973 tableWidthSum += column.getWidth();
974 }
975 }
976 }
977
978 @Override
979 public void tmfTaProcessFilterSelection(TmfTimeFilterSelectionEvent event) {
980 if (tableFilter != null) {
981 Vector<ITmfTimeAnalysisEntry> filteredout = event.getFilteredOut();
982 if (filteredout != null) {
983 tableFilter.setFilter(filteredout);
984 } else {
985 tableFilter.setFilter(new Vector<ITmfTimeAnalysisEntry>());
986 }
987 tableViewer.refresh();
988 }
989 }
990
991 /**
992 * @param scrollFrame
993 * @param wrapper
994 */
995 private void updateScrolls(final ScrolledComposite scrollFrame) {
996 scrollFrame.setMinSize(tableViewer.getTable().computeSize(SWT.DEFAULT, SWT.DEFAULT));
997 }
998
999 /**
1000 * Registers as listener of time selection from other views
1001 *
1002 * @param signal
1003 */
1004 @Override
1005 @TmfSignalHandler
1006 public void synchToTime(TmfTimeSynchSignal signal) {
1007 super.synchToTime(signal);
1008 }
1009
1010 /**
1011 * Annotation Registers as listener of time range selection from other views
1012 * The implementation handles the entry of the signal.
1013 *
1014 * @param signal
1015 */
1016 @TmfSignalHandler
1017 public void synchToTimeRange(TmfRangeSynchSignal signal) {
1018 if (zoomFilter != null) {
1019 synchToTimeRange(signal, zoomFilter.isChecked());
1020 }
1021 }
1022
1023 @Override
1024 public void modelIncomplete(ILttngSyntEventRequest request) {
1025 // Nothing to do
1026 // The data will be refreshed on the next request
1027 }
1028
1029 /*
1030 * (non-Javadoc)
1031 *
1032 * @see org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView#
1033 * getEventProcessor()
1034 */
1035 @Override
1036 public ITransEventProcessor getEventProcessor() {
1037 return FlowEventToHandlerFactory.getInstance();
1038 }
1039
1040 /**
1041 * @param signal
1042 */
1043 @TmfSignalHandler
1044 public void experimentSelected(
1045 TmfExperimentSelectedSignal<? extends TmfEvent> signal) {
1046 if (signal != null) {
1047 TmfTimeRange experimentTRange = signal.getExperiment()
1048 .getTimeRange();
1049
1050 // prepare time intervals in widget
1051 ModelUpdateInit(experimentTRange, experimentTRange, signal
1052 .getSource());
1053
1054 // request initial data
1055 initialExperimentDataRequest(signal
1056 .getSource(), experimentTRange);
1057 }
1058 }
1059
1060 /**
1061 * @param source
1062 * @param experimentTRange
1063 * @return Adjusted time window used for the request (smaller window to
1064 * initialize view)
1065 */
1066 private TmfTimeRange initialExperimentDataRequest(Object source,
1067 TmfTimeRange experimentTRange) {
1068 // Adjust the initial time window to a shorter interval to allow
1069 // user to select the interesting area based on the perspective
1070 TmfTimeRange initTimeWindow = getInitTRange(experimentTRange);
1071
1072 dataRequest(initTimeWindow, experimentTRange, true, ExecutionType.FOREGROUND);
1073 if (TraceDebug.isDEBUG()) {
1074 TraceDebug.debug("Initialization request time range is: " //$NON-NLS-1$
1075 + initTimeWindow.getStartTime().toString() + "-" //$NON-NLS-1$
1076 + initTimeWindow.getEndTime().toString());
1077 }
1078
1079 return initTimeWindow;
1080 }
1081
1082 // *** HACK ***
1083 //
1084 //
1085 //
1086 public int checkForSWTBugItemHeightAdjustement() {
1087 int returnedAjustement = 0;
1088 String desktopSessionName = System.getenv("DESKTOP_SESSION"); //$NON-NLS-1$
1089
1090 // Gnome : most common case, no adjustement
1091 if ( desktopSessionName.equals("gnome") ) { //$NON-NLS-1$
1092 returnedAjustement = 0;
1093 }
1094 // Kde : ajustement of 2 is needed
1095 else if ( desktopSessionName.equals("kde") ) { //$NON-NLS-1$
1096 returnedAjustement = 2;
1097 }
1098
1099 return returnedAjustement;
1100 }
1101
1102 /*
1103 * (non-Javadoc)
1104 *
1105 * @see org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView#
1106 * getParamsUpdater()
1107 */
1108 @Override
1109 protected ParamsUpdater getParamsUpdater() {
1110 return FlowModelFactory.getParamsUpdater();
1111 }
1112
1113 /*
1114 * (non-Javadoc)
1115 *
1116 * @see org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView#
1117 * getItemContainer()
1118 */
1119 @Override
1120 protected ItemContainer<?> getItemContainer() {
1121 return FlowModelFactory.getProcContainer();
1122 }
1123
1124 /*
1125 * (non-Javadoc)
1126 * @see org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView#getProviderId()
1127 */
1128 @Override
1129 protected int getProviderId() {
1130 return LttngCoreProviderFactory.CONTROL_FLOW_LTTNG_SYTH_EVENT_PROVIDER;
1131 }
1132 }
This page took 0.056903 seconds and 5 git commands to generate.