1 /*******************************************************************************
2 * Copyright (c) 2009, 2010 Ericsson
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * Alvaro Sanchez-Leon (alvsan09@gmail.com) - Initial API and implementation
11 *******************************************************************************/
12 package org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timeAnalysis
.test
.stub
.views
;
14 import java
.text
.SimpleDateFormat
;
15 import java
.util
.ArrayList
;
16 import java
.util
.Date
;
18 import org
.eclipse
.core
.runtime
.IAdaptable
;
19 import org
.eclipse
.jface
.action
.Action
;
20 import org
.eclipse
.jface
.action
.IMenuListener
;
21 import org
.eclipse
.jface
.action
.IMenuManager
;
22 import org
.eclipse
.jface
.action
.IToolBarManager
;
23 import org
.eclipse
.jface
.action
.MenuManager
;
24 import org
.eclipse
.jface
.action
.Separator
;
25 import org
.eclipse
.jface
.dialogs
.MessageDialog
;
26 import org
.eclipse
.jface
.viewers
.DoubleClickEvent
;
27 import org
.eclipse
.jface
.viewers
.IDoubleClickListener
;
28 import org
.eclipse
.jface
.viewers
.ISelection
;
29 import org
.eclipse
.jface
.viewers
.IStructuredContentProvider
;
30 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
31 import org
.eclipse
.jface
.viewers
.ITreeContentProvider
;
32 import org
.eclipse
.jface
.viewers
.LabelProvider
;
33 import org
.eclipse
.jface
.viewers
.TreeViewer
;
34 import org
.eclipse
.jface
.viewers
.Viewer
;
35 import org
.eclipse
.jface
.viewers
.ViewerSorter
;
36 import org
.eclipse
.linuxtools
.tmf
.ui
.viewers
.TmfViewerFactory
;
37 import org
.eclipse
.linuxtools
.tmf
.ui
.viewers
.timeAnalysis
.ITimeAnalysisViewer
;
38 import org
.eclipse
.linuxtools
.tmf
.ui
.viewers
.timeAnalysis
.ITmfTimeSelectionListener
;
39 import org
.eclipse
.linuxtools
.tmf
.ui
.viewers
.timeAnalysis
.TmfTimeScaleSelectionEvent
;
40 import org
.eclipse
.linuxtools
.tmf
.ui
.viewers
.timeAnalysis
.TmfTimeSelectionEvent
;
41 import org
.eclipse
.linuxtools
.tmf
.ui
.viewers
.timeAnalysis
.ITmfTimeScaleSelectionListener
;
42 import org
.eclipse
.linuxtools
.tmf
.ui
.viewers
.timeAnalysis
.model
.ITmfTimeAnalysisEntry
;
43 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timeAnalysis
.test
.stub
.adaption
.TsfImplProvider
;
44 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timeAnalysis
.test
.stub
.model
.EventImpl
;
45 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timeAnalysis
.test
.stub
.model
.TraceImpl
;
46 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timeAnalysis
.test
.stub
.model
.TraceModelImplFactory
;
47 import org
.eclipse
.swt
.SWT
;
48 import org
.eclipse
.swt
.custom
.SashForm
;
49 import org
.eclipse
.swt
.graphics
.Image
;
50 import org
.eclipse
.swt
.widgets
.Composite
;
51 import org
.eclipse
.swt
.widgets
.Menu
;
52 import org
.eclipse
.ui
.IActionBars
;
53 import org
.eclipse
.ui
.ISharedImages
;
54 import org
.eclipse
.ui
.IWorkbenchActionConstants
;
55 import org
.eclipse
.ui
.PlatformUI
;
56 import org
.eclipse
.ui
.part
.DrillDownAdapter
;
57 import org
.eclipse
.ui
.part
.ViewPart
;
59 public class TsfTraceAnalysisView
extends ViewPart
implements
60 ITmfTimeSelectionListener
, ITmfTimeScaleSelectionListener
{
62 // ========================================================================
64 // ========================================================================
65 private TreeViewer viewer
;
66 private DrillDownAdapter drillDownAdapter
;
67 private Action action1
;
68 private Action action2
;
69 private Action actGroup
;
70 private Action resetScale
;
71 private Action nextEvent
;
72 private Action prevEvent
;
73 private Action nextTrace
;
74 private Action prevTrace
;
75 private Action showLegent
;
76 private Action filterTraces
;
77 private Action zoomIn
;
78 private Action zoomOut
;
80 private Action events300K
;
82 private Action doubleClickAction
;
83 private ITimeAnalysisViewer tsfviewer
;
84 private ITimeAnalysisViewer tsfviewer2
;
86 private static SimpleDateFormat stimeformat
= new SimpleDateFormat(
88 private TraceModelImplFactory fact
;
90 // ========================================================================
92 // ========================================================================
94 * The content provider class is responsible for providing objects to the
95 * view. It can wrap existing objects in adapters or simply return objects
96 * as-is. These objects may be sensitive to the current input of the view,
97 * or ignore it and always show the same content (like Task List, for
101 class TreeObject
implements IAdaptable
{
103 private TreeParent parent
;
105 public TreeObject(String name
) {
109 public String
getName() {
113 public void setParent(TreeParent parent
) {
114 this.parent
= parent
;
117 public TreeParent
getParent() {
122 public String
toString() {
126 @SuppressWarnings("rawtypes")
127 public Object
getAdapter(Class key
) {
132 class TreeParent
extends TreeObject
{
133 private ArrayList
<TreeObject
> children
;
135 public TreeParent(String name
) {
137 children
= new ArrayList
<TreeObject
>();
140 public void addChild(TreeObject child
) {
142 child
.setParent(this);
145 public void removeChild(TreeObject child
) {
146 children
.remove(child
);
147 child
.setParent(null);
150 public TreeObject
[] getChildren() {
151 return children
.toArray(new TreeObject
[children
155 public boolean hasChildren() {
156 return children
.size() > 0;
160 class ViewContentProvider
implements IStructuredContentProvider
,
161 ITreeContentProvider
{
162 private TreeParent invisibleRoot
;
164 public void inputChanged(Viewer v
, Object oldInput
, Object newInput
) {
167 public void dispose() {
170 public Object
[] getElements(Object parent
) {
171 if (parent
.equals(getViewSite())) {
172 if (invisibleRoot
== null)
174 return getChildren(invisibleRoot
);
176 return getChildren(parent
);
179 public Object
getParent(Object child
) {
180 if (child
instanceof TreeObject
) {
181 return ((TreeObject
) child
).getParent();
186 public Object
[] getChildren(Object parent
) {
187 if (parent
instanceof TreeParent
) {
188 return ((TreeParent
) parent
).getChildren();
190 return new Object
[0];
193 public boolean hasChildren(Object parent
) {
194 if (parent
instanceof TreeParent
)
195 return ((TreeParent
) parent
).hasChildren();
200 * We will set up a dummy model to initialize tree heararchy. In a real
201 * code, you will connect to a real model and expose its hierarchy.
203 private void initialize() {
204 TreeObject to1
= new TreeObject("Leaf 1");
205 TreeObject to2
= new TreeObject("Leaf 2");
206 TreeObject to3
= new TreeObject("Leaf 3");
207 TreeParent p1
= new TreeParent("Parent 1");
212 TreeObject to4
= new TreeObject("Leaf 4");
213 TreeParent p2
= new TreeParent("Parent 2");
216 TreeParent root
= new TreeParent("Root");
220 invisibleRoot
= new TreeParent("");
221 invisibleRoot
.addChild(root
);
225 class ViewLabelProvider
extends LabelProvider
{
228 public String
getText(Object obj
) {
229 return obj
.toString();
233 public Image
getImage(Object obj
) {
234 String imageKey
= ISharedImages
.IMG_OBJ_ELEMENT
;
235 if (obj
instanceof TreeParent
)
236 imageKey
= ISharedImages
.IMG_OBJ_FOLDER
;
237 return PlatformUI
.getWorkbench().getSharedImages().getImage(
242 class NameSorter
extends ViewerSorter
{
245 // ========================================================================
247 // ========================================================================
249 * This is a callback that will allow us to create the viewer and initialize
253 public void createPartControl(Composite parent
) {
254 final SashForm sashForm
= new SashForm(parent
, SWT
.NONE
);
255 final SashForm sashForm2
= new SashForm(sashForm
, SWT
.NONE
);
257 tsfviewer
= TmfViewerFactory
.createViewer(sashForm2
,
258 new TsfImplProvider());
259 tsfviewer2
= TmfViewerFactory
.createViewer(sashForm2
,
260 new TsfImplProvider());
262 viewer
= new TreeViewer(sashForm
, SWT
.MULTI
| SWT
.H_SCROLL
264 drillDownAdapter
= new DrillDownAdapter(viewer
);
265 viewer
.setContentProvider(new ViewContentProvider());
266 viewer
.setLabelProvider(new ViewLabelProvider());
267 viewer
.setSorter(new NameSorter());
268 viewer
.setInput(getViewSite());
270 sashForm
.setWeights(new int[] { 5, 1 });
271 sashForm2
.setWeights(new int[] { 1, 1 });
273 fact
= new TraceModelImplFactory();
274 ITmfTimeAnalysisEntry
[] traceArr
= fact
.createTraces();
275 tsfviewer
.display(traceArr
);
276 tsfviewer
.addWidgetSelectionListner(this);
277 tsfviewer
.addWidgetTimeScaleSelectionListner(this);
278 tsfviewer
.setTimeCalendarFormat(true);
280 tsfviewer2
.display(traceArr
);
281 tsfviewer2
.addWidgetSelectionListner(this);
282 tsfviewer2
.addWidgetTimeScaleSelectionListner(this);
283 // tsfviewer2.setTimeFormat(ITimeAnalysisViewer.timeFormat.epoch);
287 hookDoubleClickAction();
288 contributeToActionBars();
291 private void hookContextMenu() {
292 MenuManager menuMgr
= new MenuManager("#PopupMenu");
293 menuMgr
.setRemoveAllWhenShown(true);
294 menuMgr
.addMenuListener(new IMenuListener() {
295 public void menuAboutToShow(IMenuManager manager
) {
296 TsfTraceAnalysisView
.this.fillContextMenu(manager
);
299 Menu menu
= menuMgr
.createContextMenu(viewer
.getControl());
300 viewer
.getControl().setMenu(menu
);
301 getSite().registerContextMenu(menuMgr
, viewer
);
304 private void contributeToActionBars() {
305 IActionBars bars
= getViewSite().getActionBars();
306 fillLocalPullDown(bars
.getMenuManager());
307 fillLocalToolBar(bars
.getToolBarManager());
310 private void fillLocalPullDown(IMenuManager manager
) {
311 manager
.add(action1
);
312 manager
.add(new Separator());
313 manager
.add(action2
);
316 private void fillContextMenu(IMenuManager manager
) {
317 manager
.add(action1
);
318 manager
.add(action2
);
319 manager
.add(new Separator());
320 drillDownAdapter
.addNavigationActions(manager
);
321 // Other plug-ins can contribute there actions here
322 manager
.add(new Separator(IWorkbenchActionConstants
.MB_ADDITIONS
));
325 private void fillLocalToolBar(IToolBarManager manager
) {
326 manager
.add(new Separator());
327 manager
.add(actGroup
);
328 manager
.add(resetScale
);
329 manager
.add(nextEvent
);
330 manager
.add(prevEvent
);
331 manager
.add(nextTrace
);
332 manager
.add(prevTrace
);
333 manager
.add(showLegent
);
334 manager
.add(filterTraces
);
336 manager
.add(zoomOut
);
338 manager
.add(events300K
);
339 manager
.add(new Separator());
341 drillDownAdapter
.addNavigationActions(manager
);
344 private ITimeAnalysisViewer
getActiveTsfCtrl() {
345 ITimeAnalysisViewer inFocusViewer
= null;
346 if (tsfviewer
.isInFocus())
347 inFocusViewer
= tsfviewer
;
348 else if (tsfviewer2
.isInFocus())
349 inFocusViewer
= tsfviewer2
;
350 return inFocusViewer
;
353 private void makeActions() {
355 action1
= new Action() {
358 showMessage("Action 1 executed");
361 action1
.setText("Action 1");
362 action1
.setToolTipText("Action 1 tooltip");
363 action1
.setImageDescriptor(PlatformUI
.getWorkbench().getSharedImages()
364 .getImageDescriptor(ISharedImages
.IMG_OBJS_INFO_TSK
));
367 action2
= new Action() {
370 showMessage("Action 2 executed");
373 action2
.setText("Action 2");
374 action2
.setToolTipText("Action 2 tooltip");
375 action2
.setImageDescriptor(PlatformUI
.getWorkbench().getSharedImages()
376 .getImageDescriptor(ISharedImages
.IMG_OBJS_INFO_TSK
));
379 actGroup
= new Action() {
382 ITimeAnalysisViewer inFocusViewer
= getActiveTsfCtrl();
383 if (inFocusViewer
!= null) {
384 if (actGroup
.isChecked()) {
385 inFocusViewer
.groupTraces(false);
387 inFocusViewer
.groupTraces(true);
392 actGroup
.setText("Group");
393 actGroup
.setToolTipText("Groupped or flat list");
394 actGroup
.setChecked(true);
397 resetScale
= new Action() {
400 ITimeAnalysisViewer inFocusViewer
= getActiveTsfCtrl();
401 if (inFocusViewer
!= null) {
402 inFocusViewer
.resetStartFinishTime();
407 resetScale
.setText("Reset");
408 resetScale
.setToolTipText("Reset the Time Scale to Default");
411 nextEvent
= new Action() {
414 ITimeAnalysisViewer inFocusViewer
= getActiveTsfCtrl();
415 if (inFocusViewer
!= null) {
416 inFocusViewer
.selectNextEvent();
420 nextEvent
.setText("NextEv");
421 nextEvent
.setToolTipText("Next Event");
424 prevEvent
= new Action() {
427 ITimeAnalysisViewer inFocusViewer
= getActiveTsfCtrl();
428 if (inFocusViewer
!= null) {
429 inFocusViewer
.selectPrevEvent();
433 prevEvent
.setText("PrevEv");
434 prevEvent
.setToolTipText("Previous Event");
437 nextTrace
= new Action() {
440 ITimeAnalysisViewer inFocusViewer
= getActiveTsfCtrl();
441 if (inFocusViewer
!= null) {
442 inFocusViewer
.selectNextTrace();
446 nextTrace
.setText("NextTrace");
447 nextTrace
.setToolTipText("Select Next Event");
450 prevTrace
= new Action() {
453 ITimeAnalysisViewer inFocusViewer
= getActiveTsfCtrl();
454 if (inFocusViewer
!= null) {
455 inFocusViewer
.selectPrevTrace();
459 prevTrace
.setText("PrevTrace");
460 prevTrace
.setToolTipText("Select Previous Trace");
463 showLegent
= new Action() {
466 ITimeAnalysisViewer inFocusViewer
= getActiveTsfCtrl();
467 if (inFocusViewer
!= null) {
468 inFocusViewer
.showLegend();
472 showLegent
.setText("Legend");
473 showLegent
.setToolTipText("Show Legend");
476 filterTraces
= new Action() {
479 ITimeAnalysisViewer inFocusViewer
= getActiveTsfCtrl();
480 if (inFocusViewer
!= null) {
481 inFocusViewer
.filterTraces();
485 filterTraces
.setText("Filter");
486 filterTraces
.setToolTipText("Trace Filter options");
489 zoomIn
= new Action() {
492 ITimeAnalysisViewer inFocusViewer
= getActiveTsfCtrl();
493 if (inFocusViewer
!= null) {
494 inFocusViewer
.zoomIn();
498 zoomIn
.setText("Zoom In");
499 zoomIn
.setToolTipText("Zoom In");
502 zoomOut
= new Action() {
505 ITimeAnalysisViewer inFocusViewer
= getActiveTsfCtrl();
506 if (inFocusViewer
!= null) {
507 inFocusViewer
.zoomOut();
509 // ISelection selection = inFocusViewer.getSelection();
510 // Object sel = null;
511 // if (selection != null && !selection.isEmpty()) {
512 // sel = ((IStructuredSelection) selection)
513 // .getFirstElement();
514 // if (sel instanceof EventImpl) {
515 // EventImpl event = (EventImpl) sel;
516 // inFocusViewer.selectNextEvent();
521 zoomOut
.setText("Zoom Out");
522 zoomOut
.setToolTipText("Zoom Out");
525 synch
= new Action() {
528 if (synch
.isChecked()) {
529 tsfviewer
.setAcceptSelectionAPIcalls(true);
530 tsfviewer2
.setAcceptSelectionAPIcalls(true);
532 tsfviewer
.setAcceptSelectionAPIcalls(false);
533 tsfviewer2
.setAcceptSelectionAPIcalls(false);
537 synch
.setText("Synchronize");
539 .setToolTipText("Synchronize by listening to external API selection calls");
540 synch
.setChecked(false);
543 events300K
= new Action() {
546 ITimeAnalysisViewer inFocusViewer
= getActiveTsfCtrl();
547 if (inFocusViewer
!= null) {
548 ITmfTimeAnalysisEntry
[] traceArr
= fact
549 .createLargeTraces(60);
550 inFocusViewer
.display(traceArr
);
554 events300K
.setText("300K Events");
555 events300K
.setToolTipText("Add 300K Events");
557 doubleClickAction
= new Action() {
560 ISelection selection
= viewer
.getSelection();
561 Object obj
= ((IStructuredSelection
) selection
)
563 showMessage("Double-click detected on " + obj
.toString());
568 private void hookDoubleClickAction() {
569 viewer
.addDoubleClickListener(new IDoubleClickListener() {
570 public void doubleClick(DoubleClickEvent event
) {
571 doubleClickAction
.run();
576 private void showMessage(String message
) {
577 MessageDialog
.openInformation(viewer
.getControl().getShell(),
578 "TsfTrace Analysis View", message
);
582 * Passing the focus request to the viewer's control.
585 public void setFocus() {
586 viewer
.getControl().setFocus();
589 public void tsfTmProcessSelEvent(TmfTimeSelectionEvent event
) {
590 Object source
= event
.getSource();
591 if (source
== null || !(source
instanceof ITimeAnalysisViewer
)) {
595 ITimeAnalysisViewer rViewer
= (ITimeAnalysisViewer
) event
.getSource();
596 ITimeAnalysisViewer synchViewer
= null;
597 // Synchronize viewer selections if Enabled,
598 // make sure the selection does not go in loops
599 if (tsfviewer
== rViewer
) {
600 synchViewer
= tsfviewer2
;
602 synchViewer
= tsfviewer
;
604 Object selection
= event
.getSelection();
606 long selTimens
= event
.getSelectedTime();
607 long tms
= (long) (selTimens
* 1E-6);
608 Date date
= new Date(tms
);
609 String fDate
= stimeformat
.format(date
);
610 String ns
= formatNs(selTimens
);
612 if (selection
instanceof EventImpl
) {
613 EventImpl selEvent
= (EventImpl
) selection
;
614 date
= new Date((long) (selTimens
/ 1E-6));
616 .println("TsfTmIncubatorListener.tsfTmProcessEvent() Selected Event: \nType: "
617 + selEvent
.getType().toString()
621 + selEvent
.getEntry().getName()
622 + "\nSelection Type: "
623 + event
.getDType().toString()
624 + "\nSelected Time: "
625 + selTimens
+ " " + fDate
+ " " + ns
);
627 synchViewer
.setSelectedEvent(selEvent
, source
);
629 } else if (selection
instanceof TraceImpl
) {
630 TraceImpl selTrace
= (TraceImpl
) selection
;
632 .println("TsfTmIncubatorListener.tsfTmProcessEvent() Selected Trace: \nName: "
633 + selTrace
.getName().toString()
635 + selTrace
.getClassName()
636 + "\nNumber of Events: "
637 + selTrace
.getTraceEvents().size()
638 + "\nSelection Type: "
639 + event
.getDType().toString()
640 + "\nSelected Time: "
641 + selTimens
+ " " + fDate
+ " " + ns
);
643 synchViewer
.setSelectedTraceTime(selTrace
, event
.getSelectedTime(),
647 .println("TsfTmIncubatorListener.tsfTmProcessEvent() Unexpected event source received: "
648 + selection
.getClass().getName());
653 public void tsfTmProcessTimeScaleEvent(TmfTimeScaleSelectionEvent event
) {
654 Object source
= event
.getSource();
655 if (source
== null || !(source
instanceof ITimeAnalysisViewer
)) {
659 if (event
!= null && event
instanceof TmfTimeScaleSelectionEvent
) {
660 TmfTimeScaleSelectionEvent rEvent
= (TmfTimeScaleSelectionEvent
) event
;
661 ITimeAnalysisViewer rViewer
= (ITimeAnalysisViewer
) event
663 ITimeAnalysisViewer synchViewer
= null;
664 // Synchronize viewer selections if Enabled,
665 // make sure the selection does not go in loops
666 if (tsfviewer
== rViewer
) {
667 synchViewer
= tsfviewer2
;
669 synchViewer
= tsfviewer
;
673 synchViewer
.setSelectVisTimeWindow(rEvent
.getTime0(), rEvent
674 .getTime1(), source
);
679 * Obtains the remainder fraction on unit Seconds of the entered value in
680 * nanoseconds. e.g. input: 1241207054171080214 ns The number of seconds can
681 * be obtain by removing the last 9 digits: 1241207054 the fractional
682 * portion of seconds, expressed in ns is: 171080214
687 public String
formatNs(long v
) {
688 StringBuffer str
= new StringBuffer();
695 String strVal
= String
.valueOf(v
);
696 if (v
< 1000000000) {
700 // Extract the last nine digits (e.g. fraction of a S expressed in ns
701 return strVal
.substring(strVal
.length() - 9);