1 /*******************************************************************************
2 * Copyright (c) 2009, 2010 Ericsson
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
10 * Alvaro Sanchez-Leon - Initial implementation
11 * Michel Dagenais (michel.dagenais@polymtl.ca) - Reference C implementation, used with permission
12 * Bernd Hufmann - Bug fixes
13 *******************************************************************************/
14 package org
.eclipse
.linuxtools
.internal
.lttng
.ui
.views
.controlflow
;
16 import java
.util
.Arrays
;
17 import java
.util
.Vector
;
19 import org
.eclipse
.jface
.action
.Action
;
20 import org
.eclipse
.jface
.action
.IMenuListener
;
21 import org
.eclipse
.jface
.action
.IMenuManager
;
22 import org
.eclipse
.jface
.action
.IToolBarManager
;
23 import org
.eclipse
.jface
.action
.MenuManager
;
24 import org
.eclipse
.jface
.action
.Separator
;
25 import org
.eclipse
.jface
.viewers
.ISelection
;
26 import org
.eclipse
.jface
.viewers
.ISelectionChangedListener
;
27 import org
.eclipse
.jface
.viewers
.IStructuredContentProvider
;
28 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
29 import org
.eclipse
.jface
.viewers
.ITableLabelProvider
;
30 import org
.eclipse
.jface
.viewers
.LabelProvider
;
31 import org
.eclipse
.jface
.viewers
.SelectionChangedEvent
;
32 import org
.eclipse
.jface
.viewers
.StructuredViewer
;
33 import org
.eclipse
.jface
.viewers
.TableViewer
;
34 import org
.eclipse
.jface
.viewers
.Viewer
;
35 import org
.eclipse
.jface
.viewers
.ViewerFilter
;
36 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.control
.LttngCoreProviderFactory
;
37 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.event
.LttngTimestamp
;
38 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.request
.ILttngSyntEventRequest
;
39 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.state
.evProcessor
.ITransEventProcessor
;
40 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.TraceDebug
;
41 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.model
.trange
.ItemContainer
;
42 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.model
.trange
.TimeRangeEventProcess
;
43 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.views
.common
.AbsTimeUpdateView
;
44 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.views
.common
.ParamsUpdater
;
45 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.views
.controlflow
.evProcessor
.FlowEventToHandlerFactory
;
46 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.views
.controlflow
.model
.FlowModelFactory
;
47 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.views
.controlflow
.model
.FlowTimeRangeViewerProvider
;
48 import org
.eclipse
.linuxtools
.tmf
.core
.event
.TmfEvent
;
49 import org
.eclipse
.linuxtools
.tmf
.core
.event
.TmfTimeRange
;
50 import org
.eclipse
.linuxtools
.tmf
.core
.experiment
.TmfExperiment
;
51 import org
.eclipse
.linuxtools
.tmf
.core
.request
.ITmfDataRequest
.ExecutionType
;
52 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfExperimentRangeUpdatedSignal
;
53 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfExperimentSelectedSignal
;
54 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfExperimentUpdatedSignal
;
55 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfRangeSynchSignal
;
56 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfSignalHandler
;
57 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfTimeSynchSignal
;
58 import org
.eclipse
.linuxtools
.tmf
.ui
.viewers
.TmfViewerFactory
;
59 import org
.eclipse
.linuxtools
.tmf
.ui
.viewers
.timeAnalysis
.ITmfTimeFilterSelectionListener
;
60 import org
.eclipse
.linuxtools
.tmf
.ui
.viewers
.timeAnalysis
.ITmfTimeScaleSelectionListener
;
61 import org
.eclipse
.linuxtools
.tmf
.ui
.viewers
.timeAnalysis
.ITmfTimeSelectionListener
;
62 import org
.eclipse
.linuxtools
.tmf
.ui
.viewers
.timeAnalysis
.TmfTimeFilterSelectionEvent
;
63 import org
.eclipse
.linuxtools
.tmf
.ui
.viewers
.timeAnalysis
.TmfTimeScaleSelectionEvent
;
64 import org
.eclipse
.linuxtools
.tmf
.ui
.viewers
.timeAnalysis
.TmfTimeSelectionEvent
;
65 import org
.eclipse
.linuxtools
.tmf
.ui
.viewers
.timeAnalysis
.model
.ITmfTimeAnalysisEntry
;
66 import org
.eclipse
.swt
.SWT
;
67 import org
.eclipse
.swt
.custom
.SashForm
;
68 import org
.eclipse
.swt
.events
.ControlAdapter
;
69 import org
.eclipse
.swt
.events
.ControlEvent
;
70 import org
.eclipse
.swt
.events
.MouseEvent
;
71 import org
.eclipse
.swt
.events
.MouseWheelListener
;
72 import org
.eclipse
.swt
.events
.SelectionAdapter
;
73 import org
.eclipse
.swt
.events
.SelectionEvent
;
74 import org
.eclipse
.swt
.graphics
.Image
;
75 import org
.eclipse
.swt
.widgets
.Composite
;
76 import org
.eclipse
.swt
.widgets
.Display
;
77 import org
.eclipse
.swt
.widgets
.Menu
;
78 import org
.eclipse
.swt
.widgets
.ScrollBar
;
79 import org
.eclipse
.swt
.widgets
.Table
;
80 import org
.eclipse
.swt
.widgets
.TableColumn
;
81 import org
.eclipse
.ui
.IActionBars
;
82 import org
.eclipse
.ui
.IWorkbenchActionConstants
;
83 import org
.eclipse
.ui
.PlatformUI
;
84 import org
.eclipse
.ui
.plugin
.AbstractUIPlugin
;
87 * <b><u>ControlFlowView</u></b>
93 public class ControlFlowView
extends AbsTimeUpdateView
implements
94 ITmfTimeSelectionListener
, ITmfTimeScaleSelectionListener
,
95 ITmfTimeFilterSelectionListener
{
97 public static final String ID
= "org.eclipse.linuxtools.lttng.ui.views.controlflow"; //$NON-NLS-1$
99 // ========================================================================
101 // ========================================================================
103 private final String PROCESS_COLUMN
= Messages
.getString("ControlFlowView.processColumn"); //$NON-NLS-1$
104 private final String BRAND_COLUMN
= Messages
.getString("ControlFlowView.brandColumn"); //$NON-NLS-1$
105 private final String PID_COLUMN
= Messages
.getString("ControlFlowView.pidColumn"); //$NON-NLS-1$
106 private final String TGID_COLUMN
= Messages
.getString("ControlFlowView.tgidColumn"); //$NON-NLS-1$
107 private final String PPID_COLUMN
= Messages
.getString("ControlFlowView.ppidColumn"); //$NON-NLS-1$
108 private final String CPU_COLUMN
= Messages
.getString("ControlFlowView.cpuColumn"); //$NON-NLS-1$
109 private final String BIRTH_SEC_COLUMN
= Messages
.getString("ControlFlowView.birthSecColumn"); //$NON-NLS-1$
110 private final String BIRTH_NSEC_COLUMN
= Messages
.getString("ControlFlowView.birthNSecColumn"); //$NON-NLS-1$
111 private final String TRACE
= Messages
.getString("ControlFlowView.TraceNameColumn"); //$NON-NLS-1$
113 private final String
[] columnNames
= new String
[] { PROCESS_COLUMN
, /* */
119 BIRTH_SEC_COLUMN
,/* */
120 BIRTH_NSEC_COLUMN
,/* */
124 // ========================================================================
126 // ========================================================================
127 private TableViewer tableViewer
;
128 // private int totalNumItems = 0;
130 private Action resetScale
;
131 private Action nextEvent
;
132 private Action prevEvent
;
133 private Action nextTrace
;
134 private Action prevTrace
;
135 private Action showLegend
;
136 private Action filterTraces
;
137 private Action zoomIn
;
138 private Action zoomOut
;
139 private Action zoomFilter
;
141 private ViewProcessFilter tableFilter
= null;
143 private TmfTimeRange initTimeRange
= TmfTimeRange
.NULL_RANGE
;
145 private static final Object FILLER
= new Object();
146 private static int numFillerRows
;
147 // private static SimpleDateFormat stimeformat = new SimpleDateFormat(
148 // "yy/MM/dd HH:mm:ss");
150 // private TraceModelImplFactory fact;
152 // ========================================================================
154 // ========================================================================
156 * The content provider class is responsible for providing objects to the
157 * view. It can wrap existing objects in adapters or simply return objects
158 * as-is. These objects may be sensitive to the current input of the view,
159 * or ignore it and always show the same content (like Task List, for
163 static class ViewContentProvider
implements
164 /* ILazyContentProvider, */IStructuredContentProvider
{
165 private TableViewer cviewer
= null;
166 private ITmfTimeAnalysisEntry
[] elements
= null;
168 public ViewContentProvider(TableViewer v
) {
173 public void inputChanged(Viewer v
, Object oldInput
, Object newInput
) {
174 this.elements
= (ITmfTimeAnalysisEntry
[]) newInput
;
175 if (elements
!= null) {
176 TraceDebug
.debug("Total number of processes provided to Control Flow view: " + elements
.length
); //$NON-NLS-1$
178 TraceDebug
.debug("New input = null"); //$NON-NLS-1$
183 public void dispose() {
187 // Needed with the use of virtual tables in order to initialize items
188 // which were not initially visible.
189 public void updateElement(int index
) {
190 cviewer
.replace(elements
[index
], index
);
194 public Object
[] getElements(Object inputElement
) {
195 // add filler elements to ensure alignment with time analysis viewer
196 Object
[] oElements
= Arrays
.copyOf(elements
, elements
.length
+ numFillerRows
, new Object
[0].getClass());
197 for (int i
= 0; i
< numFillerRows
; i
++) {
198 oElements
[elements
.length
+ i
] = FILLER
;
204 static class ViewLabelProvider
extends LabelProvider
implements ITableLabelProvider
{
206 public String
getColumnText(Object obj
, int index
) {
207 String strRes
= ""; //$NON-NLS-1$
209 if (obj
instanceof TimeRangeEventProcess
) {
210 TimeRangeEventProcess process
= (TimeRangeEventProcess
) obj
;
213 strRes
= process
.getName();
216 strRes
= process
.getBrand();
219 strRes
= process
.getPid().toString();
222 strRes
= process
.getTgid().toString();
225 strRes
= process
.getPpid().toString();
228 strRes
= process
.getCpu().toString();
231 time
= new LttngTimestamp(process
.getCreationTime()
233 strRes
= time
.getSeconds();
236 time
= new LttngTimestamp(process
.getCreationTime()
238 strRes
= time
.getNanoSeconds();
241 strRes
= process
.getTraceID();
246 } else if (obj
== FILLER
) {
247 return ""; //$NON-NLS-1$
256 public Image
getColumnImage(Object obj
, int index
) {
257 return getImage(obj
);
261 public Image
getImage(Object obj
) {
262 // No image needed for the time being
263 // return PlatformUI.getWorkbench().getSharedImages().getImage(
264 // ISharedImages.IMG_OBJ_ELEMENT);
269 static class ViewProcessFilter
extends ViewerFilter
{
271 private Vector
<ITmfTimeAnalysisEntry
> filteredSet
= new Vector
<ITmfTimeAnalysisEntry
>();
272 StructuredViewer viewer
;
274 public ViewProcessFilter(StructuredViewer rviewer
) {
275 this.viewer
= rviewer
;
278 public void setFilter(Vector
<ITmfTimeAnalysisEntry
> filtered
) {
279 if (filtered
!= null) {
280 this.filteredSet
= filtered
;
286 public boolean select(Viewer viewer
, Object parentElement
,
288 boolean filteredIn
= true;
289 if (element
instanceof ITmfTimeAnalysisEntry
) {
290 ITmfTimeAnalysisEntry process
= (ITmfTimeAnalysisEntry
) element
;
291 if (filteredSet
.contains(process
)) {
292 // The element is marked to be filtered out
295 } else if (element
== FILLER
) {
296 return true; // never filter the filler element
298 TraceDebug
.debug("Unexpected type of filter element received: " //$NON-NLS-1$
299 + element
.toString());
301 // Compare element versus a list of filtered out
309 public ControlFlowView() {
314 * This is a callback that will allow us to create the viewer and initialize
321 * org.eclipse.linuxtools.tmf.ui.views.TmfView#createPartControl(org.eclipse
322 * .swt.widgets.Composite)
325 public void createPartControl(Composite parent
) {
327 SashForm sash
= new SashForm(parent
, SWT
.NONE
);
329 tableViewer
= new TableViewer(sash
, SWT
.FULL_SELECTION
| SWT
.H_SCROLL
);
330 tableViewer
.setContentProvider(new ViewContentProvider(tableViewer
));
331 tableViewer
.setLabelProvider(new ViewLabelProvider());
332 Table table
= tableViewer
.getTable();
333 tableViewer
.addSelectionChangedListener(new ISelectionChangedListener() {
335 public void selectionChanged(SelectionChangedEvent event
) {
336 ISelection sel
= event
.getSelection();
337 if (!sel
.isEmpty()) {
338 Object firstSel
= null;
339 if (sel
instanceof IStructuredSelection
) {
340 firstSel
= ((IStructuredSelection
) sel
).getFirstElement();
342 if (firstSel
instanceof ITmfTimeAnalysisEntry
) {
343 ITmfTimeAnalysisEntry trace
= (ITmfTimeAnalysisEntry
) firstSel
;
344 tsfviewer
.setSelectedTrace(trace
);
345 int selection
= tsfviewer
.getVerticalBar().getSelection();
346 tableViewer
.getTable().setTopIndex(selection
);
347 } else if (firstSel
== FILLER
) {
348 // filler element was selected, select the last item instead
349 Table table
= tableViewer
.getTable();
350 table
.select(table
.getItemCount() - 1 - numFillerRows
); // subtract the filler elements
351 Object selectedItem
= ((IStructuredSelection
) tableViewer
.getSelection()).getFirstElement();
352 if (selectedItem
instanceof ITmfTimeAnalysisEntry
) {
353 tsfviewer
.setSelectedTrace((ITmfTimeAnalysisEntry
) selectedItem
);
354 int selection
= tsfviewer
.getVerticalBar().getSelection();
355 tableViewer
.getTable().setTopIndex(selection
);
363 table
.addMouseWheelListener(new MouseWheelListener() {
365 public void mouseScrolled(MouseEvent e
) {
366 ScrollBar scrollBar
= tsfviewer
.getVerticalBar();
367 tsfviewer
.setTopIndex(scrollBar
.getSelection() - e
.count
);
368 tableViewer
.getTable().setTopIndex(scrollBar
.getSelection());
372 applyTableLayout(table
);
374 int borderWidth
= table
.getBorderWidth();
376 int itemHeight
= table
.getItemHeight() + getTableItemHeightAdjustement();
377 int headerHeight
= table
.getHeaderHeight();
378 table
.getVerticalBar().setVisible(false);
380 numFillerRows
= Display
.getDefault().getBounds().height
/ itemHeight
;
382 tsfviewer
= TmfViewerFactory
.createViewer(sash
, new FlowTimeRangeViewerProvider(getParamsUpdater()));
384 // Traces shall not be grouped to allow synchronisation
385 tsfviewer
.groupTraces(false);
386 tsfviewer
.setItemHeight(itemHeight
);
387 tsfviewer
.setBorderWidth(borderWidth
);
388 tsfviewer
.setHeaderHeight(headerHeight
);
389 // Names provided by the table
390 tsfviewer
.setNameWidthPref(0);
391 tsfviewer
.setAcceptSelectionAPIcalls(true);
393 // Viewer to notify selection to this class
394 // This class will synchronise selections with table.
395 tsfviewer
.addWidgetSelectionListner(this);
396 tsfviewer
.addFilterSelectionListner(this);
397 tsfviewer
.addWidgetTimeScaleSelectionListner(this);
399 tsfviewer
.getVerticalBar().addSelectionListener(new SelectionAdapter() {
401 public void widgetSelected(SelectionEvent e
) {
402 ScrollBar scrollBar
= (ScrollBar
) e
.widget
;
403 int selection
= scrollBar
.getSelection();
404 tableViewer
.getTable().setTopIndex(selection
);
407 tsfviewer
.getControl().addControlListener(new ControlAdapter(){
409 public void controlResized(ControlEvent e
) {
410 // ensure the viewers are aligned
411 int selection
= tsfviewer
.getVerticalBar().getSelection();
412 tableViewer
.getTable().setTopIndex(selection
);
415 sash
.setWeights(new int[] { 1, 1 });
416 // Create the help context id for the viewer's control
417 // TODO: Associate with help system
418 PlatformUI
.getWorkbench().getHelpSystem().setHelp(
419 tableViewer
.getControl(),
420 "org.eclipse.linuxtools.lttnng.ui.views.flow.viewer"); //$NON-NLS-1$
424 contributeToActionBars();
426 TmfExperiment
<?
> experiment
= TmfExperiment
.getCurrentExperiment();
427 if (experiment
!= null) {
428 TmfTimeRange experimentTRange
= experiment
.getTimeRange();
430 if (experimentTRange
!= TmfTimeRange
.NULL_RANGE
) {
431 // send request and received the adjusted time used
432 TmfTimeRange adjustedTimeRange
= initialExperimentDataRequest(this,
435 // initialize widget time boundaries and filtering parameters
436 modelUpdateInit(experimentTRange
, adjustedTimeRange
, this);
439 TraceDebug
.debug("No selected experiment information available"); //$NON-NLS-1$
443 private void hookContextMenu() {
444 MenuManager menuMgr
= new MenuManager("#PopupMenu"); //$NON-NLS-1$
445 menuMgr
.setRemoveAllWhenShown(true);
446 menuMgr
.addMenuListener(new IMenuListener() {
448 public void menuAboutToShow(IMenuManager manager
) {
449 ControlFlowView
.this.fillContextMenu(manager
);
452 Menu menu
= menuMgr
.createContextMenu(tableViewer
.getControl());
453 tableViewer
.getControl().setMenu(menu
);
454 getSite().registerContextMenu(menuMgr
, tableViewer
);
457 private void contributeToActionBars() {
458 IActionBars bars
= getViewSite().getActionBars();
459 fillLocalPullDown(bars
.getMenuManager());
460 fillLocalToolBar(bars
.getToolBarManager());
463 private void fillLocalPullDown(IMenuManager manager
) {
464 manager
.add(new Separator());
465 manager
.add(showLegend
);
466 manager
.add(new Separator());
467 manager
.add(resetScale
);
468 manager
.add(nextEvent
);
469 manager
.add(prevEvent
);
470 manager
.add(nextTrace
);
471 manager
.add(prevTrace
);
472 // manager.add(filterTraces);
474 manager
.add(zoomOut
);
475 manager
.add(zoomFilter
);
476 manager
.add(new Separator());
479 private void fillContextMenu(IMenuManager manager
) {
480 manager
.add(showLegend
);
481 manager
.add(new Separator());
482 manager
.add(resetScale
);
483 manager
.add(nextEvent
);
484 manager
.add(prevEvent
);
485 manager
.add(nextTrace
);
486 manager
.add(prevTrace
);
487 manager
.add(showLegend
);
488 // manager.add(filterTraces);
490 manager
.add(zoomOut
);
491 manager
.add(zoomFilter
);
492 manager
.add(new Separator());
493 manager
.add(new Separator(IWorkbenchActionConstants
.MB_ADDITIONS
));
496 private void fillLocalToolBar(IToolBarManager manager
) {
497 manager
.add(showLegend
);
498 manager
.add(new Separator());
499 manager
.add(resetScale
);
500 manager
.add(nextEvent
);
501 manager
.add(prevEvent
);
502 manager
.add(nextTrace
);
503 manager
.add(prevTrace
);
504 // manager.add(filterTraces);
506 manager
.add(zoomOut
);
507 manager
.add(zoomFilter
);
508 manager
.add(new Separator());
511 private void makeActions() {
513 resetScale
= new Action() {
516 if (tsfviewer
!= null) {
517 tsfviewer
.resetStartFinishTime();
522 resetScale
.setText(Messages
.getString("ControlFlowView.Action.Reset")); //$NON-NLS-1$
523 resetScale
.setToolTipText(Messages
524 .getString("ControlFlowView.Action.Reset.ToolTip")); //$NON-NLS-1$
525 resetScale
.setImageDescriptor(AbstractUIPlugin
526 .imageDescriptorFromPlugin(Messages
527 .getString("ControlFlowView.tmf.UI"), //$NON-NLS-1$
528 "icons/elcl16/home_nav.gif")); //$NON-NLS-1$
531 nextEvent
= new Action() {
534 if (tsfviewer
!= null) {
535 tsfviewer
.selectNextEvent();
539 nextEvent
.setText(Messages
540 .getString("ControlFlowView.Action.NextEvent")); //$NON-NLS-1$
541 nextEvent
.setToolTipText(Messages
542 .getString("ControlFlowView.Action.NextEvent.Tooltip")); //$NON-NLS-1$
543 nextEvent
.setImageDescriptor(AbstractUIPlugin
544 .imageDescriptorFromPlugin(Messages
545 .getString("ControlFlowView.tmf.UI"), //$NON-NLS-1$
546 "icons/elcl16/next_event.gif")); //$NON-NLS-1$
549 prevEvent
= new Action() {
552 if (tsfviewer
!= null) {
553 tsfviewer
.selectPrevEvent();
557 prevEvent
.setText(Messages
558 .getString("ControlFlowView.Action.PrevEvent")); //$NON-NLS-1$
559 prevEvent
.setToolTipText(Messages
560 .getString("ControlFlowView.Action.PrevEvent.Tooltip")); //$NON-NLS-1$
561 prevEvent
.setImageDescriptor(AbstractUIPlugin
562 .imageDescriptorFromPlugin(Messages
563 .getString("ControlFlowView.tmf.UI"), //$NON-NLS-1$
564 "icons/elcl16/prev_event.gif")); //$NON-NLS-1$
567 nextTrace
= new Action() {
570 if (tsfviewer
!= null) {
571 tsfviewer
.selectNextTrace();
575 nextTrace
.setText(Messages
576 .getString("ControlFlowView.Action.NextProcess")); //$NON-NLS-1$
577 nextTrace
.setToolTipText(Messages
578 .getString("ControlFlowView.Action.NextProcess.ToolTip")); //$NON-NLS-1$
579 nextTrace
.setImageDescriptor(AbstractUIPlugin
580 .imageDescriptorFromPlugin(Messages
581 .getString("ControlFlowView.tmf.UI"), //$NON-NLS-1$
582 "icons/elcl16/next_item.gif")); //$NON-NLS-1$
585 prevTrace
= new Action() {
588 if (tsfviewer
!= null) {
589 tsfviewer
.selectPrevTrace();
593 prevTrace
.setText(Messages
594 .getString("ControlFlowView.Action.PreviousProcess")); //$NON-NLS-1$
595 prevTrace
.setToolTipText(Messages
596 .getString("ControlFlowView.Action.PreviousProcess.Tooltip")); //$NON-NLS-1$
597 prevTrace
.setImageDescriptor(AbstractUIPlugin
598 .imageDescriptorFromPlugin(Messages
599 .getString("ControlFlowView.tmf.UI"), //$NON-NLS-1$
600 "icons/elcl16/prev_item.gif")); //$NON-NLS-1$
603 showLegend
= new Action() {
606 if (tsfviewer
!= null) {
607 tsfviewer
.showLegend();
611 showLegend
.setText(Messages
.getString("ControlFlowView.Action.Legend")); //$NON-NLS-1$
612 showLegend
.setToolTipText(Messages
613 .getString("ControlFlowView.Action.Legend.ToolTip")); //$NON-NLS-1$
616 filterTraces
= new Action() {
619 if (tsfviewer
!= null) {
620 tsfviewer
.filterTraces();
624 filterTraces
.setText(Messages
625 .getString("ControlFlowView.Action.Filter")); //$NON-NLS-1$
626 filterTraces
.setToolTipText(Messages
627 .getString("ControlFlowView.Action.Filter.ToolTip")); //$NON-NLS-1$
628 filterTraces
.setImageDescriptor(AbstractUIPlugin
629 .imageDescriptorFromPlugin(Messages
630 .getString("ControlFlowView.tmf.UI"), //$NON-NLS-1$
631 "icons/elcl16/filter_items.gif")); //$NON-NLS-1$
634 zoomIn
= new Action() {
637 if (tsfviewer
!= null) {
642 zoomIn
.setText(Messages
.getString("ControlFlowView.Action.ZoomIn")); //$NON-NLS-1$
643 zoomIn
.setToolTipText(Messages
644 .getString("ControlFlowView.Action.ZoomIn.Tooltip")); //$NON-NLS-1$
645 zoomIn
.setImageDescriptor(AbstractUIPlugin
.imageDescriptorFromPlugin(
646 Messages
.getString("ControlFlowView.tmf.UI"), //$NON-NLS-1$
647 "icons/elcl16/zoomin_nav.gif")); //$NON-NLS-1$
650 zoomOut
= new Action() {
653 if (tsfviewer
!= null) {
658 zoomOut
.setText(Messages
.getString("ControlFlowView.Action.ZoomOut")); //$NON-NLS-1$
659 zoomOut
.setToolTipText(Messages
660 .getString("ControlFlowView.Action.ZoomOut.tooltip")); //$NON-NLS-1$
661 zoomOut
.setImageDescriptor(AbstractUIPlugin
.imageDescriptorFromPlugin(
662 Messages
.getString("ControlFlowView.tmf.UI"), //$NON-NLS-1$
663 "icons/elcl16/zoomout_nav.gif")); //$NON-NLS-1$
666 zoomFilter
= new Action() {
669 // Nothing to do, however the selection status is needed by the
673 zoomFilter
.setText(Messages
674 .getString("ControlFlowView.Action.ZoomFilter")); //$NON-NLS-1$
675 zoomFilter
.setToolTipText(Messages
676 .getString("ControlFlowView.Action.ZoomFilter.tooltip")); //$NON-NLS-1$
677 zoomFilter
.setImageDescriptor(AbstractUIPlugin
678 .imageDescriptorFromPlugin(Messages
679 .getString("ControlFlowView.tmf.UI"), //$NON-NLS-1$
680 "icons/elcl16/filter_items.gif")); //$NON-NLS-1$
681 zoomFilter
.setChecked(false);
686 * Passing the focus request to the viewer's control.
689 public void setFocus() {
690 tableViewer
.getControl().setFocus();
696 * @see org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView#
697 * tsfTmProcessSelEvent
698 * (org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.TmfTimeSelectionEvent
702 public void tsfTmProcessSelEvent(TmfTimeSelectionEvent event
) {
703 // common implementation
704 super.tsfTmProcessSelEvent(event
);
706 // Reselect the table viewer to widget selection
707 ISelection sel
= tsfviewer
.getSelectionTrace();
708 if (sel
!= null && !sel
.isEmpty()) {
709 tableViewer
.setSelection(sel
);
716 * @see org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.
717 * ITmfTimeScaleSelectionListener
718 * #tsfTmProcessTimeScaleEvent(org.eclipse.linuxtools
719 * .tmf.ui.viewers.timeAnalysis.TmfTimeScaleSelectionEvent)
722 public void tsfTmProcessTimeScaleEvent(TmfTimeScaleSelectionEvent event
) {
723 super.tsfTmProcessTimeScaleEvent(event
);
726 private void applyTableLayout(Table table
) {
727 for (int i
= 0; i
< columnNames
.length
; i
++) {
728 TableColumn tableColumn
= new TableColumn(table
, SWT
.LEFT
);
729 tableColumn
.setText(columnNames
[i
]);
732 table
.setHeaderVisible(true);
733 table
.setLinesVisible(true);
740 * org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView#displayModel
741 * (org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.
742 * ITmfTimeAnalysisEntry[], long, long, boolean, long, long,
746 public void displayModel(final ITmfTimeAnalysisEntry
[] items
,
747 final long startBoundTime
, final long endBoundTime
,
748 final boolean updateTimeBounds
, final long startVisibleWindow
,
749 final long endVisibleWindow
, final Object source
) {
751 if(tableViewer
!= null) {
752 final Table table
= tableViewer
.getTable();
754 // Ignore update if widget is disposed
755 if (table
.isDisposed()) return;
757 Display display
= table
.getDisplay();
759 // Perform the updates on the UI thread)
760 display
.asyncExec(new Runnable() {
763 if (!table
.isDisposed()) {
764 tableViewer
.setInput(items
); // This shall be the minimal
766 tableFilter
= new ViewProcessFilter(tableViewer
);
767 tableViewer
.setFilters(new ViewerFilter
[] { tableFilter
});
769 resizeTableColumns(table
);
771 tableViewer
.refresh();
773 tsfviewer
.display(items
, startBoundTime
, endBoundTime
,
776 // validate visible boundaries
777 if (startVisibleWindow
> -1 && endVisibleWindow
> -1) {
778 tsfviewer
.setSelectVisTimeWindow(startVisibleWindow
,
779 endVisibleWindow
, source
);
782 tsfviewer
.resizeControls();
791 public void dispose() {
792 // dispose parent resources
795 tsfviewer
.removeFilterSelectionListner(this);
796 tsfviewer
.removeWidgetSelectionListner(this);
797 tsfviewer
.removeWidgetTimeScaleSelectionListner(this);
803 * @param tableComposite
806 private synchronized void resizeTableColumns(Table table
) {
808 TableColumn
[] columns
= table
.getColumns();
809 for (TableColumn column
: columns
) {
816 public void tmfTaProcessFilterSelection(TmfTimeFilterSelectionEvent event
) {
817 if (tableFilter
!= null) {
818 Vector
<ITmfTimeAnalysisEntry
> filteredout
= event
.getFilteredOut();
819 if (filteredout
!= null) {
820 tableFilter
.setFilter(filteredout
);
822 tableFilter
.setFilter(new Vector
<ITmfTimeAnalysisEntry
>());
824 tableViewer
.refresh();
829 * Registers as listener of time selection from other views
835 public void synchToTime(TmfTimeSynchSignal signal
) {
836 super.synchToTime(signal
);
840 * Annotation Registers as listener of time range selection from other views
841 * The implementation handles the entry of the signal.
846 public void synchToTimeRange(TmfRangeSynchSignal signal
) {
847 if (zoomFilter
!= null) {
848 synchToTimeRange(signal
, zoomFilter
.isChecked());
853 public void modelIncomplete(ILttngSyntEventRequest request
) {
855 // The data will be refreshed on the next request
861 * @see org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView#
862 * getEventProcessor()
865 public ITransEventProcessor
getEventProcessor() {
866 return FlowEventToHandlerFactory
.getInstance();
873 public void experimentSelected(
874 TmfExperimentSelectedSignal
<?
extends TmfEvent
> signal
) {
875 if (signal
!= null) {
876 TmfTimeRange experimentTRange
= signal
.getExperiment()
879 initTimeRange
= TmfTimeRange
.NULL_RANGE
;
880 if (experimentTRange
!= TmfTimeRange
.NULL_RANGE
) {
881 // prepare time intervals in widget
882 modelUpdateInit(experimentTRange
, experimentTRange
, signal
885 // request initial data
886 initialExperimentDataRequest(signal
887 .getSource(), experimentTRange
);
893 public void experimentRangeUpdated(TmfExperimentRangeUpdatedSignal signal
) {
894 if (initTimeRange
== TmfTimeRange
.NULL_RANGE
&& signal
.getExperiment().equals(TmfExperiment
.getCurrentExperiment())) {
895 TmfTimeRange experimentTRange
= signal
.getRange();
897 if (experimentTRange
!= TmfTimeRange
.NULL_RANGE
) {
898 // prepare time intervals in widget
899 modelUpdateInit(experimentTRange
, experimentTRange
, signal
.getSource());
901 // request initial data
902 initialExperimentDataRequest(signal
.getSource(), experimentTRange
);
908 public void experimentUpdated(TmfExperimentUpdatedSignal signal
) {
909 if (signal
.getExperiment().equals(TmfExperiment
.getCurrentExperiment())) {
910 final TmfTimeRange range
= signal
.getExperiment().getTimeRange();
911 if (range
!= TmfTimeRange
.NULL_RANGE
) {
912 Display
.getDefault().asyncExec(new Runnable() {
915 if ((tsfviewer
!= null) && (!tsfviewer
.getControl().isDisposed())) {
916 tsfviewer
.setTimeBounds(range
.getStartTime().getValue(), range
.getEndTime().getValue());
925 * @param experimentTRange
926 * @return Adjusted time window used for the request (smaller window to
929 private TmfTimeRange
initialExperimentDataRequest(Object source
,
930 TmfTimeRange experimentTRange
) {
931 // Adjust the initial time window to a shorter interval to allow
932 // user to select the interesting area based on the perspective
933 TmfTimeRange initTimeWindow
= getInitTRange(experimentTRange
);
935 eventRequest(initTimeWindow
, experimentTRange
, true, ExecutionType
.FOREGROUND
);
936 if (TraceDebug
.isDEBUG()) {
937 TraceDebug
.debug("Initialization request time range is: " //$NON-NLS-1$
938 + initTimeWindow
.getStartTime().toString() + "-" //$NON-NLS-1$
939 + initTimeWindow
.getEndTime().toString());
942 initTimeRange
= initTimeWindow
;
943 return initTimeWindow
;
947 * SWT doesn't seem to report correctly the table item height, at least in
950 * This method provides an adjustment term according to the desktop session.
952 * @return Height adjustment
954 private int getTableItemHeightAdjustement() {
956 String desktopSession
= System
.getenv("DESKTOP_SESSION"); //$NON-NLS-1$
958 if (desktopSession
!= null) {
959 if (desktopSession
.equals("kde")) { //$NON-NLS-1$
970 * @see org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView#
974 protected ParamsUpdater
getParamsUpdater() {
975 return FlowModelFactory
.getParamsUpdater();
981 * @see org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView#
985 protected ItemContainer
<?
> getItemContainer() {
986 return FlowModelFactory
.getProcContainer();
991 * @see org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView#getProviderId()
994 protected int getProviderId() {
995 return LttngCoreProviderFactory
.CONTROL_FLOW_LTTNG_SYTH_EVENT_PROVIDER
;