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