0fba3fe1c6b432dc3a883d139ea208eae9d2cf63
[deliverable/tracecompass.git] / org.eclipse.linuxtools.lttng.ui / src / org / eclipse / linuxtools / internal / 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.internal.lttng.ui.views.controlflow;
15
16 import java.util.Arrays;
17 import java.util.Vector;
18
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;
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 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;
140
141 private ViewProcessFilter tableFilter = null;
142
143 private TmfTimeRange initTimeRange = TmfTimeRange.NULL_RANGE;
144
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");
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 static 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 // 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;
199 }
200 return oElements;
201 }
202 }
203
204 static class ViewLabelProvider extends LabelProvider implements ITableLabelProvider {
205 @Override
206 public String getColumnText(Object obj, int index) {
207 String strRes = ""; //$NON-NLS-1$
208 LttngTimestamp time;
209 if (obj instanceof TimeRangeEventProcess) {
210 TimeRangeEventProcess process = (TimeRangeEventProcess) obj;
211 switch (index) {
212 case 0:
213 strRes = process.getName();
214 break;
215 case 1:
216 strRes = process.getBrand();
217 break;
218 case 2:
219 strRes = process.getPid().toString();
220 break;
221 case 3:
222 strRes = process.getTgid().toString();
223 break;
224 case 4:
225 strRes = process.getPpid().toString();
226 break;
227 case 5:
228 strRes = process.getCpu().toString();
229 break;
230 case 6:
231 time = new LttngTimestamp(process.getCreationTime()
232 .longValue());
233 strRes = time.getSeconds();
234 break;
235 case 7:
236 time = new LttngTimestamp(process.getCreationTime()
237 .longValue());
238 strRes = time.getNanoSeconds();
239 break;
240 case 8:
241 strRes = process.getTraceID();
242 break;
243 default:
244 break;
245 }
246 } else if (obj == FILLER) {
247 return ""; //$NON-NLS-1$
248 } else {
249 return getText(obj);
250 }
251
252 return strRes;
253 }
254
255 @Override
256 public Image getColumnImage(Object obj, int index) {
257 return getImage(obj);
258 }
259
260 @Override
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);
265 return null;
266 }
267 }
268
269 static class ViewProcessFilter extends ViewerFilter {
270
271 private Vector<ITmfTimeAnalysisEntry> filteredSet = new Vector<ITmfTimeAnalysisEntry>();
272 StructuredViewer viewer;
273
274 public ViewProcessFilter(StructuredViewer rviewer) {
275 this.viewer = rviewer;
276 }
277
278 public void setFilter(Vector<ITmfTimeAnalysisEntry> filtered) {
279 if (filtered != null) {
280 this.filteredSet = filtered;
281 viewer.refresh();
282 }
283 }
284
285 @Override
286 public boolean select(Viewer viewer, Object parentElement,
287 Object element) {
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
293 return false;
294 }
295 } else if (element == FILLER) {
296 return true; // never filter the filler element
297 } else {
298 TraceDebug.debug("Unexpected type of filter element received: " //$NON-NLS-1$
299 + element.toString());
300 }
301 // Compare element versus a list of filtered out
302 return filteredIn;
303 }
304 }
305
306 /**
307 * The constructor.
308 */
309 public ControlFlowView() {
310 super(ID);
311 }
312
313 /**
314 * This is a callback that will allow us to create the viewer and initialize
315 * it.
316 */
317 /*
318 * (non-Javadoc)
319 *
320 * @see
321 * org.eclipse.linuxtools.tmf.ui.views.TmfView#createPartControl(org.eclipse
322 * .swt.widgets.Composite)
323 */
324 @Override
325 public void createPartControl(Composite parent) {
326
327 SashForm sash = new SashForm(parent, SWT.NONE);
328
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() {
334 @Override
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();
341
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);
356 }
357 }
358 }
359 }
360 }
361 });
362
363 table.addMouseWheelListener(new MouseWheelListener() {
364 @Override
365 public void mouseScrolled(MouseEvent e) {
366 ScrollBar scrollBar = tsfviewer.getVerticalBar();
367 tsfviewer.setTopIndex(scrollBar.getSelection() - e.count);
368 tableViewer.getTable().setTopIndex(scrollBar.getSelection());
369 }});
370
371 // Describe table
372 applyTableLayout(table);
373
374 int borderWidth = table.getBorderWidth();
375
376 int itemHeight = table.getItemHeight() + getTableItemHeightAdjustement();
377 int headerHeight = table.getHeaderHeight();
378 table.getVerticalBar().setVisible(false);
379
380 numFillerRows = Display.getDefault().getBounds().height / itemHeight;
381
382 tsfviewer = TmfViewerFactory.createViewer(sash, new FlowTimeRangeViewerProvider(getParamsUpdater()));
383
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);
392
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);
398
399 tsfviewer.getVerticalBar().addSelectionListener(new SelectionAdapter() {
400 @Override
401 public void widgetSelected(SelectionEvent e) {
402 ScrollBar scrollBar = (ScrollBar) e.widget;
403 int selection = scrollBar.getSelection();
404 tableViewer.getTable().setTopIndex(selection);
405 }});
406
407 tsfviewer.getControl().addControlListener(new ControlAdapter(){
408 @Override
409 public void controlResized(ControlEvent e) {
410 // ensure the viewers are aligned
411 int selection = tsfviewer.getVerticalBar().getSelection();
412 tableViewer.getTable().setTopIndex(selection);
413 }});
414
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$
421
422 makeActions();
423 hookContextMenu();
424 contributeToActionBars();
425
426 TmfExperiment<?> experiment = TmfExperiment.getCurrentExperiment();
427 if (experiment != null) {
428 TmfTimeRange experimentTRange = experiment.getTimeRange();
429
430 if (experimentTRange != TmfTimeRange.NULL_RANGE) {
431 // send request and received the adjusted time used
432 TmfTimeRange adjustedTimeRange = initialExperimentDataRequest(this,
433 experimentTRange);
434
435 // initialize widget time boundaries and filtering parameters
436 modelUpdateInit(experimentTRange, adjustedTimeRange, this);
437 }
438 } else {
439 TraceDebug.debug("No selected experiment information available"); //$NON-NLS-1$
440 }
441 }
442
443 private void hookContextMenu() {
444 MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
445 menuMgr.setRemoveAllWhenShown(true);
446 menuMgr.addMenuListener(new IMenuListener() {
447 @Override
448 public void menuAboutToShow(IMenuManager manager) {
449 ControlFlowView.this.fillContextMenu(manager);
450 }
451 });
452 Menu menu = menuMgr.createContextMenu(tableViewer.getControl());
453 tableViewer.getControl().setMenu(menu);
454 getSite().registerContextMenu(menuMgr, tableViewer);
455 }
456
457 private void contributeToActionBars() {
458 IActionBars bars = getViewSite().getActionBars();
459 fillLocalPullDown(bars.getMenuManager());
460 fillLocalToolBar(bars.getToolBarManager());
461 }
462
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);
473 manager.add(zoomIn);
474 manager.add(zoomOut);
475 manager.add(zoomFilter);
476 manager.add(new Separator());
477 }
478
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);
489 manager.add(zoomIn);
490 manager.add(zoomOut);
491 manager.add(zoomFilter);
492 manager.add(new Separator());
493 manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
494 }
495
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);
505 manager.add(zoomIn);
506 manager.add(zoomOut);
507 manager.add(zoomFilter);
508 manager.add(new Separator());
509 }
510
511 private void makeActions() {
512 // resetScale
513 resetScale = new Action() {
514 @Override
515 public void run() {
516 if (tsfviewer != null) {
517 tsfviewer.resetStartFinishTime();
518 }
519
520 }
521 };
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$
529
530 // nextEvent
531 nextEvent = new Action() {
532 @Override
533 public void run() {
534 if (tsfviewer != null) {
535 tsfviewer.selectNextEvent();
536 }
537 }
538 };
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$
547
548 // prevEvent
549 prevEvent = new Action() {
550 @Override
551 public void run() {
552 if (tsfviewer != null) {
553 tsfviewer.selectPrevEvent();
554 }
555 }
556 };
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$
565
566 // nextTrace
567 nextTrace = new Action() {
568 @Override
569 public void run() {
570 if (tsfviewer != null) {
571 tsfviewer.selectNextTrace();
572 }
573 }
574 };
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$
583
584 // prevTrace
585 prevTrace = new Action() {
586 @Override
587 public void run() {
588 if (tsfviewer != null) {
589 tsfviewer.selectPrevTrace();
590 }
591 }
592 };
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$
601
602 // showLegend
603 showLegend = new Action() {
604 @Override
605 public void run() {
606 if (tsfviewer != null) {
607 tsfviewer.showLegend();
608 }
609 }
610 };
611 showLegend.setText(Messages.getString("ControlFlowView.Action.Legend")); //$NON-NLS-1$
612 showLegend.setToolTipText(Messages
613 .getString("ControlFlowView.Action.Legend.ToolTip")); //$NON-NLS-1$
614
615 // filterTraces
616 filterTraces = new Action() {
617 @Override
618 public void run() {
619 if (tsfviewer != null) {
620 tsfviewer.filterTraces();
621 }
622 }
623 };
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$
632
633 // zoomIn
634 zoomIn = new Action() {
635 @Override
636 public void run() {
637 if (tsfviewer != null) {
638 tsfviewer.zoomIn();
639 }
640 }
641 };
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$
648
649 // zoomOut
650 zoomOut = new Action() {
651 @Override
652 public void run() {
653 if (tsfviewer != null) {
654 tsfviewer.zoomOut();
655 }
656 }
657 };
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$
664
665 // zoomFilter
666 zoomFilter = new Action() {
667 @Override
668 public void run() {
669 // Nothing to do, however the selection status is needed by the
670 // application
671 }
672 };
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);
682
683 }
684
685 /**
686 * Passing the focus request to the viewer's control.
687 */
688 @Override
689 public void setFocus() {
690 tableViewer.getControl().setFocus();
691 }
692
693 /*
694 * (non-Javadoc)
695 *
696 * @see org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView#
697 * tsfTmProcessSelEvent
698 * (org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.TmfTimeSelectionEvent
699 * )
700 */
701 @Override
702 public void tsfTmProcessSelEvent(TmfTimeSelectionEvent event) {
703 // common implementation
704 super.tsfTmProcessSelEvent(event);
705
706 // Reselect the table viewer to widget selection
707 ISelection sel = tsfviewer.getSelectionTrace();
708 if (sel != null && !sel.isEmpty()) {
709 tableViewer.setSelection(sel);
710 }
711 }
712
713 /*
714 * (non-Javadoc)
715 *
716 * @see org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.
717 * ITmfTimeScaleSelectionListener
718 * #tsfTmProcessTimeScaleEvent(org.eclipse.linuxtools
719 * .tmf.ui.viewers.timeAnalysis.TmfTimeScaleSelectionEvent)
720 */
721 @Override
722 public void tsfTmProcessTimeScaleEvent(TmfTimeScaleSelectionEvent event) {
723 super.tsfTmProcessTimeScaleEvent(event);
724 }
725
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]);
730 tableColumn.pack();
731 }
732 table.setHeaderVisible(true);
733 table.setLinesVisible(true);
734 }
735
736 /*
737 * (non-Javadoc)
738 *
739 * @see
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,
743 * java.lang.Object)
744 */
745 @Override
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) {
750
751 if(tableViewer != null) {
752 final Table table = tableViewer.getTable();
753
754 // Ignore update if widget is disposed
755 if (table.isDisposed()) return;
756
757 Display display = table.getDisplay();
758
759 // Perform the updates on the UI thread)
760 display.asyncExec(new Runnable() {
761 @Override
762 public void run() {
763 if (!table.isDisposed()) {
764 tableViewer.setInput(items); // This shall be the minimal
765 // initial
766 tableFilter = new ViewProcessFilter(tableViewer);
767 tableViewer.setFilters(new ViewerFilter[] { tableFilter });
768
769 resizeTableColumns(table);
770 table.update();
771 tableViewer.refresh();
772
773 tsfviewer.display(items, startBoundTime, endBoundTime,
774 updateTimeBounds);
775
776 // validate visible boundaries
777 if (startVisibleWindow > -1 && endVisibleWindow > -1) {
778 tsfviewer.setSelectVisTimeWindow(startVisibleWindow,
779 endVisibleWindow, source);
780 }
781
782 tsfviewer.resizeControls();
783
784 }
785 }
786 });
787 }
788 }
789
790 @Override
791 public void dispose() {
792 // dispose parent resources
793 super.dispose();
794
795 tsfviewer.removeFilterSelectionListner(this);
796 tsfviewer.removeWidgetSelectionListner(this);
797 tsfviewer.removeWidgetTimeScaleSelectionListner(this);
798 tableViewer = null;
799 tsfviewer = null;
800 }
801
802 /**
803 * @param tableComposite
804 * @param table
805 */
806 private synchronized void resizeTableColumns(Table table) {
807 if (table != null) {
808 TableColumn[] columns = table.getColumns();
809 for (TableColumn column : columns) {
810 column.pack();
811 }
812 }
813 }
814
815 @Override
816 public void tmfTaProcessFilterSelection(TmfTimeFilterSelectionEvent event) {
817 if (tableFilter != null) {
818 Vector<ITmfTimeAnalysisEntry> filteredout = event.getFilteredOut();
819 if (filteredout != null) {
820 tableFilter.setFilter(filteredout);
821 } else {
822 tableFilter.setFilter(new Vector<ITmfTimeAnalysisEntry>());
823 }
824 tableViewer.refresh();
825 }
826 }
827
828 /**
829 * Registers as listener of time selection from other views
830 *
831 * @param signal
832 */
833 @Override
834 @TmfSignalHandler
835 public void synchToTime(TmfTimeSynchSignal signal) {
836 super.synchToTime(signal);
837 }
838
839 /**
840 * Annotation Registers as listener of time range selection from other views
841 * The implementation handles the entry of the signal.
842 *
843 * @param signal
844 */
845 @TmfSignalHandler
846 public void synchToTimeRange(TmfRangeSynchSignal signal) {
847 if (zoomFilter != null) {
848 synchToTimeRange(signal, zoomFilter.isChecked());
849 }
850 }
851
852 @Override
853 public void modelIncomplete(ILttngSyntEventRequest request) {
854 // Nothing to do
855 // The data will be refreshed on the next request
856 }
857
858 /*
859 * (non-Javadoc)
860 *
861 * @see org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView#
862 * getEventProcessor()
863 */
864 @Override
865 public ITransEventProcessor getEventProcessor() {
866 return FlowEventToHandlerFactory.getInstance();
867 }
868
869 /**
870 * @param signal
871 */
872 @TmfSignalHandler
873 public void experimentSelected(
874 TmfExperimentSelectedSignal<? extends TmfEvent> signal) {
875 if (signal != null) {
876 TmfTimeRange experimentTRange = signal.getExperiment()
877 .getTimeRange();
878
879 initTimeRange = TmfTimeRange.NULL_RANGE;
880 if (experimentTRange != TmfTimeRange.NULL_RANGE) {
881 // prepare time intervals in widget
882 modelUpdateInit(experimentTRange, experimentTRange, signal
883 .getSource());
884
885 // request initial data
886 initialExperimentDataRequest(signal
887 .getSource(), experimentTRange);
888 }
889 }
890 }
891
892 @TmfSignalHandler
893 public void experimentRangeUpdated(TmfExperimentRangeUpdatedSignal signal) {
894 if (initTimeRange == TmfTimeRange.NULL_RANGE && signal.getExperiment().equals(TmfExperiment.getCurrentExperiment())) {
895 TmfTimeRange experimentTRange = signal.getRange();
896
897 if (experimentTRange != TmfTimeRange.NULL_RANGE) {
898 // prepare time intervals in widget
899 modelUpdateInit(experimentTRange, experimentTRange, signal.getSource());
900
901 // request initial data
902 initialExperimentDataRequest(signal.getSource(), experimentTRange);
903 }
904 }
905 }
906
907 @TmfSignalHandler
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() {
913 @Override
914 public void run() {
915 if ((tsfviewer != null) && (!tsfviewer.getControl().isDisposed())) {
916 tsfviewer.setTimeBounds(range.getStartTime().getValue(), range.getEndTime().getValue());
917 }
918 }});
919 }
920 }
921 }
922
923 /**
924 * @param source
925 * @param experimentTRange
926 * @return Adjusted time window used for the request (smaller window to
927 * initialize view)
928 */
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);
934
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());
940 }
941
942 initTimeRange = initTimeWindow;
943 return initTimeWindow;
944 }
945
946 /*
947 * SWT doesn't seem to report correctly the table item height, at least in
948 * the case of KDE.
949 *
950 * This method provides an adjustment term according to the desktop session.
951 *
952 * @return Height adjustment
953 */
954 private int getTableItemHeightAdjustement() {
955 int ajustement = 0;
956 String desktopSession = System.getenv("DESKTOP_SESSION"); //$NON-NLS-1$
957
958 if (desktopSession != null) {
959 if (desktopSession.equals("kde")) { //$NON-NLS-1$
960 ajustement = 2;
961 }
962 }
963
964 return ajustement;
965 }
966
967 /*
968 * (non-Javadoc)
969 *
970 * @see org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView#
971 * getParamsUpdater()
972 */
973 @Override
974 protected ParamsUpdater getParamsUpdater() {
975 return FlowModelFactory.getParamsUpdater();
976 }
977
978 /*
979 * (non-Javadoc)
980 *
981 * @see org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView#
982 * getItemContainer()
983 */
984 @Override
985 protected ItemContainer<?> getItemContainer() {
986 return FlowModelFactory.getProcContainer();
987 }
988
989 /*
990 * (non-Javadoc)
991 * @see org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView#getProviderId()
992 */
993 @Override
994 protected int getProviderId() {
995 return LttngCoreProviderFactory.CONTROL_FLOW_LTTNG_SYTH_EVENT_PROVIDER;
996 }
997 }
This page took 0.062669 seconds and 4 git commands to generate.