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