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