[219097] LTTng updates
[deliverable/tracecompass.git] / org.eclipse.linuxtools.lttng.ui / src / org / eclipse / linuxtools / lttng / ui / views / controlflow / ControlFlowView.java
CommitLineData
6e512b93 1/*******************************************************************************
8035003b 2 * Copyright (c) 2009 Ericsson
6e512b93 3 *
dfaf8391
FC
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
6e512b93
ASL
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
8 *
dfaf8391 9 * Contributors: Alvaro Sanchez-Leon - Initial implementation
6e512b93 10 *******************************************************************************/
8b29a712 11package org.eclipse.linuxtools.lttng.ui.views.controlflow;
6e512b93 12
dfaf8391
FC
13import java.util.Arrays;
14import java.util.Vector;
15
16import org.eclipse.jface.action.Action;
17import org.eclipse.jface.action.IMenuListener;
18import org.eclipse.jface.action.IMenuManager;
19import org.eclipse.jface.action.IToolBarManager;
20import org.eclipse.jface.action.MenuManager;
21import org.eclipse.jface.action.Separator;
22import org.eclipse.jface.dialogs.MessageDialog;
23import org.eclipse.jface.viewers.DoubleClickEvent;
24import org.eclipse.jface.viewers.IDoubleClickListener;
25import org.eclipse.jface.viewers.ISelection;
26import org.eclipse.jface.viewers.ISelectionChangedListener;
27import org.eclipse.jface.viewers.IStructuredContentProvider;
28import org.eclipse.jface.viewers.IStructuredSelection;
29import org.eclipse.jface.viewers.ITableLabelProvider;
30import org.eclipse.jface.viewers.LabelProvider;
31import org.eclipse.jface.viewers.SelectionChangedEvent;
32import org.eclipse.jface.viewers.StructuredViewer;
33import org.eclipse.jface.viewers.TableViewer;
34import org.eclipse.jface.viewers.Viewer;
35import org.eclipse.jface.viewers.ViewerFilter;
36import org.eclipse.linuxtools.lttng.event.LttngTimestamp;
dfaf8391
FC
37import org.eclipse.linuxtools.lttng.state.StateDataRequest;
38import org.eclipse.linuxtools.lttng.state.StateManager;
39import org.eclipse.linuxtools.lttng.state.evProcessor.EventProcessorProxy;
40import org.eclipse.linuxtools.lttng.state.experiment.StateExperimentManager;
41import org.eclipse.linuxtools.lttng.state.experiment.StateManagerFactory;
42import org.eclipse.linuxtools.lttng.ui.TraceDebug;
43import org.eclipse.linuxtools.lttng.ui.model.trange.TimeRangeEventProcess;
44import org.eclipse.linuxtools.lttng.ui.model.trange.TimeRangeViewerProvider;
41dc35d0 45import org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView;
dfaf8391
FC
46import org.eclipse.linuxtools.lttng.ui.views.common.ParamsUpdater;
47import org.eclipse.linuxtools.lttng.ui.views.controlflow.evProcessor.FlowTRangeUpdateFactory;
48import org.eclipse.linuxtools.lttng.ui.views.controlflow.model.FlowModelFactory;
dfaf8391
FC
49import org.eclipse.linuxtools.tmf.event.TmfTimeRange;
50import org.eclipse.linuxtools.tmf.signal.TmfSignalHandler;
51import org.eclipse.linuxtools.tmf.signal.TmfSignalManager;
52import org.eclipse.linuxtools.tmf.signal.TmfTimeSynchSignal;
53import org.eclipse.linuxtools.tmf.ui.viewers.TmfViewerFactory;
54import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.ITimeAnalysisViewer;
55import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.ITmfTimeFilterSelectionListener;
56import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.ITmfTimeScaleSelectionListener;
57import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.ITmfTimeSelectionListener;
58import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.TmfTimeFilterSelectionEvent;
59import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.TmfTimeScaleSelectionEvent;
60import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.TmfTimeSelectionEvent;
61import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.ITmfTimeAnalysisEntry;
dfaf8391
FC
62import org.eclipse.swt.SWT;
63import org.eclipse.swt.custom.SashForm;
64import org.eclipse.swt.custom.ScrolledComposite;
65import org.eclipse.swt.events.ControlAdapter;
66import org.eclipse.swt.events.ControlEvent;
67import org.eclipse.swt.events.ControlListener;
68import org.eclipse.swt.events.KeyEvent;
69import org.eclipse.swt.events.KeyListener;
70import org.eclipse.swt.graphics.Image;
71import org.eclipse.swt.graphics.Point;
72import org.eclipse.swt.graphics.Rectangle;
73import org.eclipse.swt.layout.FillLayout;
6e512b93 74import org.eclipse.swt.widgets.Composite;
dfaf8391
FC
75import org.eclipse.swt.widgets.Display;
76import org.eclipse.swt.widgets.Menu;
77import org.eclipse.swt.widgets.ScrollBar;
78import org.eclipse.swt.widgets.Table;
79import org.eclipse.swt.widgets.TableColumn;
80import org.eclipse.swt.widgets.TableItem;
81import org.eclipse.ui.IActionBars;
82import org.eclipse.ui.IWorkbenchActionConstants;
83import org.eclipse.ui.PlatformUI;
84import org.eclipse.ui.plugin.AbstractUIPlugin;
6e512b93
ASL
85
86/**
87 * <b><u>ControlFlowView</u></b>
8035003b
ASL
88 * <p>
89 * TODO: Implement me. Please.
6e512b93 90 */
41dc35d0
FC
91/**
92 * @author alvaro
93 *
94 */
95public class ControlFlowView extends AbsTimeUpdateView implements
dfaf8391 96 ITmfTimeSelectionListener, ITmfTimeScaleSelectionListener,
41dc35d0 97 ITmfTimeFilterSelectionListener {
6e512b93 98
62d1696a 99 public static final String ID = "org.eclipse.linuxtools.lttng.ui.views.controlflow";
41dc35d0 100
dfaf8391
FC
101 // ========================================================================
102 // Table data
103 // ========================================================================
104 private final String PROCESS_COLUMN = "Process";
105 private final String BRAND_COLUMN = "Brand";
106 private final String PID_COLUMN = "PID";
107 private final String TGID_COLUMN = "TGID";
108 private final String PPID_COLUMN = "PPID";
109 private final String CPU_COLUMN = "CPU";
110 private final String BIRTH_SEC_COLUMN = "Birth sec";
111 private final String BIRTH_NSEC_COLUMN = "Birth nsec";
112 private final String TRACE = "TRACE";
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 // ========================================================================
dfaf8391
FC
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 synch;
142
143 private ITimeAnalysisViewer tsfviewer;
144 private ViewProcessFilter tableFilter = null;
145 private ScrolledComposite scrollFrame = null;
146 private Composite wrapper = null;
147 private Composite top;
148
149 // private static SimpleDateFormat stimeformat = new SimpleDateFormat(
150 // "yy/MM/dd HH:mm:ss");
151
152 // private TraceModelImplFactory fact;
153
154 // ========================================================================
155 // Methods
156 // ========================================================================
157 /*
158 * The content provider class is responsible for providing objects to the
159 * view. It can wrap existing objects in adapters or simply return objects
160 * as-is. These objects may be sensitive to the current input of the view,
161 * or ignore it and always show the same content (like Task List, for
162 * example).
163 */
164
165 class ViewContentProvider implements
166 /* ILazyContentProvider, */IStructuredContentProvider {
167 private TableViewer cviewer = null;
168 private ITmfTimeAnalysisEntry[] elements = null;
169
170 public ViewContentProvider(TableViewer v) {
171 cviewer = v;
172 }
173
174 public void inputChanged(Viewer v, Object oldInput, Object newInput) {
175 this.elements = (ITmfTimeAnalysisEntry[]) newInput;
176 if (elements != null) {
177 TraceDebug
178 .debug("Total number of processes provided to Control Flow view: "
179 + elements.length);
180 } else {
181 TraceDebug.debug("New input = null");
182 }
183 }
184
185 public void dispose() {
186
187 }
188
189 // Needed with the use of virtual tables in order to initialize items
190 // which were not initially visible.
191 public void updateElement(int index) {
192 cviewer.replace(elements[index], index);
193 }
194
195 // @Override
196 public Object[] getElements(Object inputElement) {
197 // TODO Auto-generated method stub
198 return elements;
199 }
200 }
201
202 class ViewLabelProvider extends LabelProvider implements
203 ITableLabelProvider {
204 public String getColumnText(Object obj, int index) {
205 String strRes = ""; //$NON-NLS-1$
206 LttngTimestamp time;
207 if (obj instanceof TimeRangeEventProcess) {
208 TimeRangeEventProcess process = (TimeRangeEventProcess) obj;
209 switch (index) {
210 case 0:
211 strRes = process.getName();
212 break;
213 case 1:
214 strRes = process.getBrand();
215 break;
216 case 2:
217 strRes = process.getPid().toString();
218 break;
219 case 3:
220 strRes = process.getTgid().toString();
221 break;
222 case 4:
223 strRes = process.getPpid().toString();
224 break;
225 case 5:
226 strRes = process.getCpu().toString();
227 break;
228 case 6:
229 time = new LttngTimestamp(process.getCreationTime()
230 .longValue());
231 strRes = time.getSeconds();
232 break;
233 case 7:
234 time = new LttngTimestamp(process.getCreationTime()
235 .longValue());
236 strRes = time.getNanoSeconds();
237 break;
238 case 8:
239 strRes = process.getTraceID();
240 break;
241 default:
242 break;
243 }
244 } else {
245 return getText(obj);
246 }
247
248 return strRes;
249 }
250
251 public Image getColumnImage(Object obj, int index) {
252 return getImage(obj);
253 }
254
255 @Override
256 public Image getImage(Object obj) {
257 // No image needed for the time being
258 // return PlatformUI.getWorkbench().getSharedImages().getImage(
259 // ISharedImages.IMG_OBJ_ELEMENT);
260 return null;
261 }
262 }
263
264 class ViewProcessFilter extends ViewerFilter {
265
266 private Vector<ITmfTimeAnalysisEntry> filteredSet = new Vector<ITmfTimeAnalysisEntry>();
267 StructuredViewer viewer;
268
269 public ViewProcessFilter(StructuredViewer rviewer) {
270 this.viewer = rviewer;
271 }
272
273 public void setFilter(Vector<ITmfTimeAnalysisEntry> filtered) {
274 if (filtered != null) {
275 this.filteredSet = filtered;
276 viewer.refresh();
277 }
278 }
279
280 @Override
281 public boolean select(Viewer viewer, Object parentElement,
282 Object element) {
283 boolean filteredIn = true;
284 if (element instanceof ITmfTimeAnalysisEntry) {
285 ITmfTimeAnalysisEntry process = (ITmfTimeAnalysisEntry) element;
286 if (filteredSet.contains(process)) {
287 // The element is marked to be filtered out
288 return false;
289 }
290 } else {
291 TraceDebug.debug("Unexpected type of filter element received: "
292 + element.toString());
293 }
294 // Compare element versus a list of filtered out
295 return filteredIn;
296 }
297 }
298
6e512b93 299 /**
dfaf8391 300 * The constructor.
6e512b93
ASL
301 */
302 public ControlFlowView() {
41dc35d0 303 super(ID);
6e512b93
ASL
304 }
305
dfaf8391
FC
306 /**
307 * This is a callback that will allow us to create the viewer and initialize
308 * it.
6e512b93 309 */
6e512b93
ASL
310 @Override
311 public void createPartControl(Composite parent) {
dfaf8391
FC
312 top = new Composite(parent, SWT.BORDER);
313
314 top.setLayout(new FillLayout());
315
316 scrollFrame = new ScrolledComposite(top, SWT.V_SCROLL | SWT.H_SCROLL);
317 scrollFrame.setBounds(top.getClientArea());
318
319 wrapper = new Composite(scrollFrame, SWT.NONE);
320 scrollFrame.setEnabled(true);
321 scrollFrame.setRedraw(true);
322 scrollFrame.setExpandVertical(true);
323 scrollFrame.setExpandHorizontal(true);
324 scrollFrame.setContent(wrapper);
325 scrollFrame.setAlwaysShowScrollBars(true);
326 wrapper.setLayout(new FillLayout());
327
328 SashForm sash = new SashForm(wrapper, SWT.NONE);
329 final Composite tableComposite = new Composite(sash, SWT.NO_SCROLL);
330 FillLayout layout = new FillLayout();
331 tableComposite.setLayout(layout);
332 tableViewer = new TableViewer(tableComposite, SWT.FULL_SELECTION
333 | SWT.H_SCROLL);
334 tableViewer.setContentProvider(new ViewContentProvider(tableViewer));
335 tableViewer.setLabelProvider(new ViewLabelProvider());
336 Table table = tableViewer.getTable();
337 tableViewer
338 .addSelectionChangedListener(new ISelectionChangedListener() {
339 public void selectionChanged(SelectionChangedEvent event) {
340 ISelection sel = event.getSelection();
341 if (!sel.isEmpty()) {
342 Object firstSel = null;
343 if (sel instanceof IStructuredSelection) {
344 firstSel = ((IStructuredSelection) sel)
345 .getFirstElement();
346
347 // Make sure the selection is visible
348 updateScrollOrigin();
349
350 if (firstSel instanceof ITmfTimeAnalysisEntry) {
351 ITmfTimeAnalysisEntry trace = (ITmfTimeAnalysisEntry) firstSel;
352 tsfviewer.setSelectedTrace(trace);
353 }
354 }
355 }
356 }
357
358 /**
359 * Make sure the selected item is visible
360 */
361 private void updateScrollOrigin() {
362 Table table = tableViewer.getTable();
363 if (table != null && table.getItemCount() > 0) {
364 TableItem item = table.getSelection()[0];
365 if (item == null) {
366 // no selected reference to go up or down
367 return;
368 }
369
370 Rectangle itemRect = item.getBounds();
371 int step = itemRect.height;
372
373 // calculate height of horizontal bar
374 int hscrolly = 0;
375 ScrollBar hbar = scrollFrame.getHorizontalBar();
376 if (hbar != null) {
377 hscrolly = hbar.getSize().y;
378 }
379
380 int visibleHeight = scrollFrame.getSize().y
381 - hscrolly;
382
383 // the current scrollbar offset to adjust i.e. start
384 // of
385 // the visible window
386 Point origin = scrollFrame.getOrigin();
387 // end of visible window
388 int endy = origin.y + visibleHeight;
389
390 int itemStartPos = itemRect.y
391 + table.getHeaderHeight()
392 + table.getBorderWidth()
393 + table.getParent().getBorderWidth();
394
395 // Item End Position
396 int itemEndPos = itemStartPos + step;
397
398 // check if need to go up
399 if (origin.y >= step && itemStartPos < origin.y) {
400 // one step up
401 scrollFrame
402 .setOrigin(origin.x, origin.y - step);
8035003b 403
dfaf8391
FC
404 }
405
406 // check if it needs to go down
407 if (itemEndPos > endy) {
408 // one step down
409 scrollFrame
410 .setOrigin(origin.x, origin.y + step);
411
412 }
413 }
414 }
415 });
416
417 // Listen to page up /down and Home / Enc keys
418 tableViewer.getTable().addKeyListener(new KeyListener() {
419 public void keyPressed(KeyEvent e) {
420 Table table = tableViewer.getTable();
421 Point origin = scrollFrame.getOrigin();
422 if (table == null || table.getItemCount() < 1) {
423 // nothing to page
424 return;
425 }
426
427 TableItem item;
428 int count;
429
430 switch (e.keyCode) {
431 case SWT.PAGE_DOWN:
432 updateScrollPageDown();
433 break;
434 case SWT.PAGE_UP:
435 updateScrollUp();
436 break;
437 case SWT.HOME:
438 // Home
439 count = table.getItemCount();
440 item = table.getItem(0);
441 // Go to the top
442 scrollFrame.setOrigin(origin.x, 0);
443 break;
444 case SWT.END:
445 // End Selected
446 count = table.getItemCount();
447 item = table.getItem(count - 1);
448 int itemStartPos = item.getBounds().y;
449 // Get to the bottom
450 scrollFrame.setOrigin(origin.x, itemStartPos);
451 break;
452 default:
453 break;
454 }
455 }
456
457 public void keyReleased(KeyEvent e) {
458 // Nothing to do
459
460 }
461
462 /**
463 * Scroll one page down
464 */
465 private void updateScrollPageDown() {
466 // null protection before calling private method
467 Table table = tableViewer.getTable();
468 int step = table.getItemHeight();
469
470 int hscrolly = 0;
471 ScrollBar hbar = scrollFrame.getHorizontalBar();
472 if (hbar != null) {
473 hscrolly = hbar.getSize().y;
474 }
475
476 Point origin = scrollFrame.getOrigin();
477 int visibleHeight = scrollFrame.getSize().y - hscrolly;
478 int endy = origin.y + visibleHeight;
479
480 scrollFrame.setOrigin(origin.x, endy - step);
481 }
482
483 /**
484 * Scroll one page up
485 */
486 private void updateScrollUp() {
487 // null protection before calling private method
488 Table table = tableViewer.getTable();
489 int step = table.getItemHeight();
490
491 int hscrolly = 0;
492 ScrollBar hbar = scrollFrame.getHorizontalBar();
493 if (hbar != null) {
494 hscrolly = hbar.getSize().y;
495 }
496
497 Point origin = scrollFrame.getOrigin();
498 int visibleHeight = scrollFrame.getSize().y - hscrolly;
499 int pageUpPos = origin.y - visibleHeight + step;
500 pageUpPos = pageUpPos > 0 ? pageUpPos : 0;
501 scrollFrame.setOrigin(origin.x, pageUpPos);
502 }
503
504 });
505 // Describe table
506 applyTableLayout(table);
507
508 int borderWidth = table.getBorderWidth();
509
510 int itemHeight = table.getItemHeight();
511 int headerHeight = table.getHeaderHeight();
512 table.getVerticalBar().setVisible(false);
513
514 tsfviewer = TmfViewerFactory.createViewer(sash,
515 new TimeRangeViewerProvider());
516
517 tsfviewer.addWidgetSelectionListner(this);
518 tsfviewer.addWidgetTimeScaleSelectionListner(this);
519
41dc35d0 520 // Traces shall not be grouped to allow synchronisation
dfaf8391
FC
521 tsfviewer.groupTraces(false);
522 tsfviewer.setItemHeight(itemHeight);
523 tsfviewer.setBorderWidth(borderWidth);
524 tsfviewer.setHeaderHeight(headerHeight);
525 tsfviewer.setVisibleVerticalScroll(false);
526 // Names provided by the table
527 tsfviewer.setNameWidthPref(0);
528 tsfviewer.setAcceptSelectionAPIcalls(true);
529
530 // Viewer to notify selection to this class
41dc35d0 531 // This class will synchronise selections with table.
dfaf8391
FC
532 tsfviewer.addWidgetSelectionListner(this);
533 tsfviewer.addFilterSelectionListner(this);
534 tsfviewer.addWidgetTimeScaleSelectionListner(this);
535
536 sash.setWeights(new int[] { 1, 1 });
537 // Create the help context id for the viewer's control
538 // TODO: Associate with help system
539 PlatformUI.getWorkbench().getHelpSystem().setHelp(
540 tableViewer.getControl(),
541 "org.eclipse.linuxtools.lttnng.ui.views.flow.viewer"); //$NON-NLS-1$
542
543 makeActions();
544 hookContextMenu();
545 hookDoubleClickAction();
546 contributeToActionBars();
547
548 scrollFrame.addControlListener(new ControlAdapter() {
549 @Override
550 public void controlResized(ControlEvent e) {
551 tsfviewer.resizeControls();
552 updateScrolls(scrollFrame, wrapper);
553 }
554 });
555
556 tableComposite.addControlListener(new ControlListener() {
557 public void controlResized(ControlEvent e) {
558 scrollFrame.getParent().update();
559 }
560
561 public void controlMoved(ControlEvent e) {
562
563 }
564 });
565
566 // Register the updater in charge to refresh elements as we update the
567 // time ranges
568 // FlowParamsUpdater listener = FlowModelFactory.getParamsUpdater();
569 // tsfviewer.addWidgetTimeScaleSelectionListner(listener);
570
571 // Register this view to receive updates when the model is updated with
572 // fresh info
573 // ModelListenFactory.getRegister().addFlowModelUpdatesListener(this);
574
575 // Register the event processor factory in charge of event handling
576 EventProcessorProxy.getInstance().addEventProcessorFactory(
577 FlowTRangeUpdateFactory.getInstance());
578
579 // set the initial view parameter values
580 // Experiment start and end time
581 // as well as time space width in pixels, used by the time analysis
582 // widget
583 ParamsUpdater paramUpdater = FlowModelFactory.getParamsUpdater();
584 StateExperimentManager experimentManger = StateManagerFactory
585 .getExperimentManager();
586 // Read relevant values
587 int timeSpaceWidth = tsfviewer.getTimeSpace();
588 TmfTimeRange timeRange = experimentManger.getExperimentTimeRange();
589 if (timeRange != null) {
590 long time0 = timeRange.getStartTime().getValue();
591 long time1 = timeRange.getEndTime().getValue();
592 paramUpdater.update(time0, time1, timeSpaceWidth);
593 }
594
595 experimentManger.readExperiment("flowView", this);
6e512b93
ASL
596 }
597
dfaf8391
FC
598 private void hookContextMenu() {
599 MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
600 menuMgr.setRemoveAllWhenShown(true);
601 menuMgr.addMenuListener(new IMenuListener() {
602 public void menuAboutToShow(IMenuManager manager) {
603 ControlFlowView.this.fillContextMenu(manager);
604 }
605 });
606 Menu menu = menuMgr.createContextMenu(tableViewer.getControl());
607 tableViewer.getControl().setMenu(menu);
608 getSite().registerContextMenu(menuMgr, tableViewer);
609 }
610
611 private void contributeToActionBars() {
612 IActionBars bars = getViewSite().getActionBars();
613 fillLocalPullDown(bars.getMenuManager());
614 fillLocalToolBar(bars.getToolBarManager());
615 }
616
617 private void fillLocalPullDown(IMenuManager manager) {
618 manager.add(new Separator());
619 // manager.add(showLegend);
620 manager.add(new Separator());
621 manager.add(resetScale);
622 manager.add(nextEvent);
623 manager.add(prevEvent);
624 manager.add(nextTrace);
625 manager.add(prevTrace);
626 // manager.add(filterTraces);
627 manager.add(zoomIn);
628 manager.add(zoomOut);
629 manager.add(synch);
630 manager.add(new Separator());
631 }
632
633 private void fillContextMenu(IMenuManager manager) {
634 // manager.add(showLegend);
635 manager.add(new Separator());
636 manager.add(resetScale);
637 manager.add(nextEvent);
638 manager.add(prevEvent);
639 manager.add(nextTrace);
640 manager.add(prevTrace);
641 // manager.add(showLegend);
642 // manager.add(filterTraces);
643 manager.add(zoomIn);
644 manager.add(zoomOut);
645 manager.add(synch);
646 manager.add(new Separator());
647 manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
648 }
649
650 private void fillLocalToolBar(IToolBarManager manager) {
651 // manager.add(showLegend);
652 manager.add(new Separator());
653 manager.add(resetScale);
654 manager.add(nextEvent);
655 manager.add(prevEvent);
656 manager.add(nextTrace);
657 manager.add(prevTrace);
658 // manager.add(filterTraces);
659 manager.add(zoomIn);
660 manager.add(zoomOut);
661 manager.add(synch);
662 manager.add(new Separator());
663 }
664
665 private void makeActions() {
666 // action4
667 resetScale = new Action() {
668 @Override
669 public void run() {
670 if (tsfviewer != null) {
671 tsfviewer.resetStartFinishTime();
672 }
673
674 }
675 };
676 resetScale.setText(Messages.getString("ControlFlowView.Action.Reset")); //$NON-NLS-1$
677 resetScale.setToolTipText(Messages
678 .getString("ControlFlowView.Action.Reset.ToolTip")); //$NON-NLS-1$
679 resetScale.setImageDescriptor(AbstractUIPlugin
680 .imageDescriptorFromPlugin(Messages
681 .getString("ControlFlowView.tmf.UI"),
682 "icons/home_nav.gif"));
683
684 // action5
685 nextEvent = new Action() {
686 @Override
687 public void run() {
688 if (tsfviewer != null) {
689 tsfviewer.selectNextEvent();
690 }
691 }
692 };
693 nextEvent.setText(Messages
694 .getString("ControlFlowView.Action.NextEvent")); //$NON-NLS-1$
695 nextEvent.setToolTipText(Messages
696 .getString("ControlFlowView.Action.NextEvent.Tooltip")); //$NON-NLS-1$
697 nextEvent.setImageDescriptor(AbstractUIPlugin
698 .imageDescriptorFromPlugin(Messages
699 .getString("ControlFlowView.tmf.UI"),
700 "icons/next_event.gif"));
701
702 // action6
703 prevEvent = new Action() {
41dc35d0
FC
704 @Override
705 public void run() {
dfaf8391
FC
706 if (tsfviewer != null) {
707 tsfviewer.selectPrevEvent();
708 }
709 }
710 };
711 prevEvent.setText(Messages
712 .getString("ControlFlowView.Action.PrevEvent")); //$NON-NLS-1$
713 prevEvent.setToolTipText(Messages
714 .getString("ControlFlowView.Action.PrevEvent.Tooltip")); //$NON-NLS-1$
715 prevEvent.setImageDescriptor(AbstractUIPlugin
716 .imageDescriptorFromPlugin(Messages
717 .getString("ControlFlowView.tmf.UI"),
718 "icons/prev_event.gif"));
719
720 // action7
721 nextTrace = new Action() {
722 @Override
723 public void run() {
724 if (tsfviewer != null) {
725 tsfviewer.selectNextTrace();
726 }
727 }
728 };
729 nextTrace.setText(Messages
730 .getString("ControlFlowView.Action.NextProcess")); //$NON-NLS-1$
731 nextTrace.setToolTipText(Messages
732 .getString("ControlFlowView.Action.NextProcess.ToolTip")); //$NON-NLS-1$
733 nextTrace.setImageDescriptor(AbstractUIPlugin
734 .imageDescriptorFromPlugin(Messages
735 .getString("ControlFlowView.tmf.UI"),
736 "icons/next_item.gif"));
737
738 // action8
739 prevTrace = new Action() {
740 @Override
741 public void run() {
742 if (tsfviewer != null) {
743 tsfviewer.selectPrevTrace();
744 }
745 }
746 };
747 prevTrace.setText(Messages
748 .getString("ControlFlowView.Action.PreviousProcess")); //$NON-NLS-1$
749 prevTrace.setToolTipText(Messages
750 .getString("ControlFlowView.Action.PreviousProcess.Tooltip")); //$NON-NLS-1$
751 prevTrace.setImageDescriptor(AbstractUIPlugin
752 .imageDescriptorFromPlugin(Messages
753 .getString("ControlFlowView.tmf.UI"),
754 "icons/prev_item.gif"));
755
756 // action9
757 showLegend = new Action() {
758 @Override
759 public void run() {
760 if (tsfviewer != null) {
761 tsfviewer.showLegend();
762 }
763 }
764 };
765 showLegend.setText(Messages.getString("ControlFlowView.Action.Legend")); //$NON-NLS-1$
766 showLegend.setToolTipText(Messages
767 .getString("ControlFlowView.Action.Legend.ToolTip")); //$NON-NLS-1$
768
769 // action10
770 filterTraces = new Action() {
771 @Override
772 public void run() {
773 if (tsfviewer != null) {
774 tsfviewer.filterTraces();
775 }
776 }
777 };
778 filterTraces.setText(Messages
779 .getString("ControlFlowView.Action.Filter")); //$NON-NLS-1$
780 filterTraces.setToolTipText(Messages
781 .getString("ControlFlowView.Action.Filter.ToolTip")); //$NON-NLS-1$
782 filterTraces.setImageDescriptor(AbstractUIPlugin
783 .imageDescriptorFromPlugin(Messages
784 .getString("ControlFlowView.tmf.UI"),
785 "icons/filter_items.gif"));
786
787 // action10
788 zoomIn = new Action() {
789 @Override
790 public void run() {
791 if (tsfviewer != null) {
792 tsfviewer.zoomIn();
793 }
794 }
795 };
796 zoomIn.setText(Messages.getString("ControlFlowView.Action.ZoomIn")); //$NON-NLS-1$
797 zoomIn.setToolTipText(Messages
798 .getString("ControlFlowView.Action.ZoomIn.Tooltip")); //$NON-NLS-1$
799 zoomIn.setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(
800 Messages.getString("ControlFlowView.tmf.UI"),
801 "icons/zoomin_nav.gif"));
802
803 // action10
804 zoomOut = new Action() {
805 @Override
806 public void run() {
807 if (tsfviewer != null) {
808 tsfviewer.zoomOut();
809 }
810 }
811 };
812 zoomOut.setText(Messages.getString("ControlFlowView.Action.ZoomOut")); //$NON-NLS-1$
813 zoomOut.setToolTipText(Messages
814 .getString("ControlFlowView.Action.ZoomOut.tooltip")); //$NON-NLS-1$
815 zoomOut.setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(
816 Messages.getString("ControlFlowView.tmf.UI"),
817 "icons/zoomout_nav.gif"));
818
819 // action11
820 synch = new Action() {
821 @Override
822 public void run() {
823 // Note: No action since the synch flag is used by Control flow
824 // view
825 // the actual viewer is set to accept api selections in
826 // createpartcontrol.
827
828 // if (synch.isChecked()) {
829 // tsfviewer.setAcceptSelectionAPIcalls(true);
830 // } else {
831 // tsfviewer.setAcceptSelectionAPIcalls(false);
832 // }
833 }
834 };
835 synch.setText(Messages.getString("ControlFlowView.Action.Synchronize")); //$NON-NLS-1$
836 synch.setToolTipText(Messages
837 .getString("ControlFlowView.Action.Synchronize.ToolTip")); //$NON-NLS-1$
838 synch.setChecked(false);
839 synch.setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(
840 Messages.getString("ControlFlowView.tmf.UI"),
841 "icons/synced.gif"));
842 // PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_ELCL_SYNCED);
843
844 doubleClickAction = new Action() {
845 @Override
846 public void run() {
847 ISelection selection = tableViewer.getSelection();
848 Object obj = ((IStructuredSelection) selection)
849 .getFirstElement();
850 showMessage("Double-click detected on " + obj.toString()); //$NON-NLS-1$
851 }
852 };
853 }
854
855 private void hookDoubleClickAction() {
856 tableViewer.addDoubleClickListener(new IDoubleClickListener() {
857 public void doubleClick(DoubleClickEvent event) {
858 doubleClickAction.run();
859 }
860 });
861 }
862
863 private void showMessage(String message) {
864 MessageDialog.openInformation(tableViewer.getControl().getShell(),
865 Messages.getString("ControlFlowView.msgSlogan"), message); //$NON-NLS-1$
866 }
867
868 /**
869 * Passing the focus request to the viewer's control.
6e512b93
ASL
870 */
871 @Override
872 public void setFocus() {
dfaf8391
FC
873 tableViewer.getControl().setFocus();
874 }
875
876 public void tsfTmProcessSelEvent(TmfTimeSelectionEvent event) {
877 Object source = event.getSource();
878 if (source == null) {
879 return;
880 }
881
882 // Reselect the table viewer to widget selection
883 ISelection sel = tsfviewer.getSelectionTrace();
884 if (sel != null && !sel.isEmpty()) {
885 tableViewer.setSelection(sel);
886 }
887
41dc35d0 888 ParamsUpdater paramUpdater = FlowModelFactory.getParamsUpdater();
dfaf8391
FC
889 Long savedSelTime = paramUpdater.getSelectedTime();
890
891 long selTimens = event.getSelectedTime();
892
893 // make sure the new selected time is different than saved before
894 // executing update
895 if (savedSelTime == null || savedSelTime != selTimens) {
896 // Notify listener views.
897 synchTimeNotification(selTimens);
898
899 // Update the parameter updater to save the selected time
900 paramUpdater.setSelectedTime(selTimens);
901
902 if (TraceDebug.isDEBUG()) {
903 // Object selection = event.getSelection();
904 TraceDebug.debug("Selected Time in control Flow View: "
905 + new LttngTimestamp(selTimens));
906 }
907 }
908 }
909
41dc35d0
FC
910 public synchronized void tsfTmProcessTimeScaleEvent(
911 TmfTimeScaleSelectionEvent event) {
dfaf8391
FC
912 // source needed to keep track of source values
913 Object source = event.getSource();
914
915 if (source != null) {
916 // Update the parameter updater before carrying out a read request
917 ParamsUpdater paramUpdater = FlowModelFactory.getParamsUpdater();
918 boolean newParams = paramUpdater.processTimeScaleEvent(event);
919
920 if (newParams) {
921 // Read the updated time window
922 TmfTimeRange trange = paramUpdater.getTrange();
923 if (trange != null) {
41dc35d0
FC
924 // Request new data for specified time range
925 dataRequest(trange);
dfaf8391
FC
926 }
927 }
928 }
929 }
930
931 /**
932 * Obtains the remainder fraction on unit Seconds of the entered value in
933 * nanoseconds. e.g. input: 1241207054171080214 ns The number of seconds can
934 * be obtain by removing the last 9 digits: 1241207054 the fractional
935 * portion of seconds, expressed in ns is: 171080214
936 *
937 * @param v
938 * @return
939 */
940 public String formatNs(long v) {
941 StringBuffer str = new StringBuffer();
942 boolean neg = v < 0;
943 if (neg) {
944 v = -v;
945 str.append('-');
946 }
947
948 String strVal = String.valueOf(v);
949 if (v < 1000000000) {
950 return strVal;
951 }
952
953 // Extract the last nine digits (e.g. fraction of a S expressed in ns
954 return strVal.substring(strVal.length() - 9);
955 }
8035003b 956
dfaf8391
FC
957 private void applyTableLayout(Table table) {
958 for (int i = 0; i < columnNames.length; i++) {
959 TableColumn tableColumn = new TableColumn(table, SWT.LEFT);
960 tableColumn.setText(columnNames[i]);
961 tableColumn.pack();
962 }
963 table.setHeaderVisible(true);
964 table.setLinesVisible(true);
965 }
966
967 // @Override
968 public void flowModelUpdates(final ITmfTimeAnalysisEntry[] items,
969 final long startTime, final long endTime) {
970 final Table table = tableViewer.getTable();
971 Display display = table.getDisplay();
972
41dc35d0 973 // Perform the updates on the UI thread)
dfaf8391
FC
974 display.asyncExec(new Runnable() {
975 public void run() {
41dc35d0 976
dfaf8391
FC
977 tableViewer.setInput(items); // This shall be the minimal
978 // initial
979 tableFilter = new ViewProcessFilter(tableViewer);
980 tableViewer.setFilters(new ViewerFilter[] { tableFilter });
981
982 resizeTableColumns(table);
983 table.update();
984 tableViewer.refresh();
985
986 tsfviewer.display(items, startTime, endTime);
987 tsfviewer.resizeControls();
988
989 // Adjust the size of the vertical scroll bar to fit the
990 // contents
991 if (scrollFrame != null && wrapper != null) {
992 updateScrolls(scrollFrame, wrapper);
993 // scrollFrame.update();
994 }
995 }
996 });
997 }
998
999 @Override
1000 public void dispose() {
1001 // dispose parent resources
1002 super.dispose();
1003 // Remove the event processor factory
1004 EventProcessorProxy.getInstance().removeEventProcessorFactory(
1005 FlowTRangeUpdateFactory.getInstance());
1006
1007 // Remove listener to model updates
1008 // ModelListenFactory.getRegister().removeFlowModelUpdatesListener(this);
1009 tsfviewer.removeFilterSelectionListner(this);
1010 tsfviewer.removeWidgetSelectionListner(this);
1011 tsfviewer.removeWidgetTimeScaleSelectionListner(this);
1012 tableViewer = null;
1013 tsfviewer = null;
1014 }
1015
1016 /**
1017 * @param tableComposite
1018 * @param table
1019 */
1020 private synchronized void resizeTableColumns(Table table) {
1021 if (table != null) {
1022 Composite parent = table.getParent();
1023 int tableWidthSum = parent.getBorderWidth();
1024
1025 TableColumn[] columns = table.getColumns();
1026 for (TableColumn column : columns) {
1027 column.pack();
1028 tableWidthSum += column.getWidth();
1029 }
1030 }
1031 }
1032
1033 // @Override
1034 public void tmfTaProcessFilterSelection(TmfTimeFilterSelectionEvent event) {
1035 if (tableFilter != null) {
1036 Vector<ITmfTimeAnalysisEntry> filteredout = event.getFilteredOut();
1037 if (filteredout != null) {
1038 tableFilter.setFilter(filteredout);
1039 } else {
1040 tableFilter.setFilter(new Vector<ITmfTimeAnalysisEntry>());
1041 }
1042 tableViewer.refresh();
1043 }
1044 }
1045
dfaf8391
FC
1046 /**
1047 * @param scrollFrame
1048 * @param wrapper
1049 */
1050 private void updateScrolls(final ScrolledComposite scrollFrame,
1051 final Composite wrapper) {
1052
1053 Point ptSize = wrapper.computeSize(SWT.DEFAULT, SWT.DEFAULT);
1054 wrapper.setSize(ptSize);
1055 scrollFrame.setMinSize(ptSize);
1056
1057 // calculate the increment area considering the table header height and
1058 // borders
1059 Rectangle area = top.getBounds();
1060 int marginsHeight = tableViewer.getTable().getHeaderHeight();
1061 marginsHeight -= top.getBorderWidth() + wrapper.getBorderWidth();
1062 area.height -= marginsHeight;
1063
1064 // set page vertical increment area
1065 ScrollBar verBar = scrollFrame.getVerticalBar();
1066 ScrollBar horBar = scrollFrame.getHorizontalBar();
1067 if (verBar != null) {
1068 verBar.setPageIncrement(area.height);
1069 }
1070 if (horBar != null) {
1071 horBar.setPageIncrement(area.width);
1072 }
1073
1074 }
1075
1076 /**
1077 * Trigger time synchronisation to other views this method shall be called
1078 * when a check has been performed to note that an actual change of time has
1079 * been performed vs a pure re-selection of the same time
1080 *
1081 * @param time
1082 */
1083 private void synchTimeNotification(long time) {
1084 // if synchronisation selected
1085 if (synch.isChecked()) {
1086 // Notify other views
1087 TmfSignalManager.dispatchSignal(new TmfTimeSynchSignal(this,
1088 new LttngTimestamp(time)));
1089 }
1090 }
1091
1092 /**
1093 * Registers as listener of time selection from other tmf views
1094 *
1095 * @param signal
1096 */
1097 @TmfSignalHandler
1098 public void synchToTime(TmfTimeSynchSignal signal) {
1099 if (synch.isChecked()) {
1100 Object source = signal.getSource();
1101 if (signal != null && source != null && source != this) {
1102 // Internal value is expected in nano seconds.
1103 long selectedTime = signal.getCurrentTime().getValue();
1104 if (tsfviewer != null) {
1105 tsfviewer.setSelectedTime(selectedTime, true, source);
1106 }
1107 }
1108 }
6e512b93
ASL
1109 }
1110
41dc35d0
FC
1111 /*
1112 * (non-Javadoc)
1113 *
1114 * @see
1115 * org.eclipse.linuxtools.lttng.ui.views.common.LttngTimeUpdateView#waitCursor
1116 * (boolean)
1117 */
39332b5c 1118 @Override
41dc35d0
FC
1119 protected synchronized void waitCursor(final boolean waitInd) {
1120 if (tsfviewer != null) {
1121 Display display = tsfviewer.getControl().getDisplay();
1122
1123 // Perform the updates on the UI thread
1124 display.asyncExec(new Runnable() {
1125 public void run() {
1126 tsfviewer.waitCursor(waitInd);
1127 }
1128 });
1129 }
1130 }
1131
1132 /*
1133 * (non-Javadoc)
1134 *
1135 * @seeorg.eclipse.linuxtools.lttng.ui.views.common.LttngTimeUpdateView#
1136 * ModelUpdatePrep(java.lang.String)
1137 */
39332b5c 1138 @Override
41dc35d0
FC
1139 public void ModelUpdatePrep(String traceId) {
1140 FlowModelFactory.getProcContainer().clearChildren(traceId);
1141 // Start over
1142 FlowModelFactory.getParamsUpdater().setEventsDiscarded(0);
1143 }
1144
1145 /*
1146 * (non-Javadoc)
1147 *
1148 * @seeorg.eclipse.linuxtools.lttng.ui.views.common.LttngTimeUpdateView#
1149 * ModelUpdateComplete(org.eclipse.linuxtools.lttng.state.StateDataRequest)
1150 */
39332b5c 1151 @Override
41dc35d0
FC
1152 public void ModelUpdateComplete(StateDataRequest request) {
1153 long experimentStartTime = -1;
1154 long experimentEndTime = -1;
1155 StateManager smanager = request.getStateManager();
1156 TmfTimeRange experimentTimeRange = smanager.getExperimentTimeWindow();
1157 if (experimentTimeRange != null) {
1158 experimentStartTime = experimentTimeRange.getStartTime().getValue();
1159 experimentEndTime = experimentTimeRange.getEndTime().getValue();
1160 }
1161 // Obtain the current process list
1162 Vector<TimeRangeEventProcess> processList = FlowModelFactory
1163 .getProcContainer().readProcesses();
1164 // convert it to an Array as expected by the widget
1165 TimeRangeEventProcess[] processArr = processList
1166 .toArray(new TimeRangeEventProcess[processList.size()]);
1167 // Sort the array by pid
1168 Arrays.sort(processArr);
1169
1170 // Update the view part
1171 flowModelUpdates(processArr, experimentStartTime, experimentEndTime);
1172
1173 // reselect to original time
1174 ParamsUpdater paramUpdater = FlowModelFactory.getParamsUpdater();
1175 final Long selTime = paramUpdater.getSelectedTime();
1176 if (selTime != null) {
1177 Display display = tsfviewer.getControl().getDisplay();
1178 display.asyncExec(new Runnable() {
1179 public void run() {
1180 tsfviewer.setSelectedTime(selTime, false, this);
1181 }
1182 });
1183 }
1184
1185 if (TraceDebug.isDEBUG()) {
1186 int eventCount = 0;
1187 Long count = smanager.getEventCount();
1188 for (TimeRangeEventProcess process : processList) {
1189 eventCount += process.getTraceEvents().size();
1190 }
1191
1192 int discarded = FlowModelFactory.getParamsUpdater()
1193 .getEventsDiscarded();
1194 int discardedOutofOrder = FlowModelFactory.getParamsUpdater()
1195 .getEventsDiscardedWrongOrder();
1196 TmfTimeRange range = request.getRange();
1197 StringBuilder sb = new StringBuilder(
1198 "Events handled: "
1199 + count
1200 + " Events loaded in Control Flow view: "
1201 + eventCount
1202 + " Number of events discarded: "
1203 + discarded
1204 + "\n\tNumber of events discarded with start time earlier than next good time: "
1205 + discardedOutofOrder);
1206
1207 sb.append("\n\t\tRequested Time Range: " + range.getStartTime()
63eecb47 1208 + "-" + range.getEndTime());
41dc35d0
FC
1209 TraceDebug.debug(sb.toString());
1210 }
1211 }
1212}
This page took 0.0791 seconds and 5 git commands to generate.