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