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
.timegraph
.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
.widgets
.timegraph
.ITimeGraphRangeListener
;
37 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.ITimeGraphSelectionListener
;
38 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.ITimeGraphTimeListener
;
39 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.TimeGraphRangeUpdateEvent
;
40 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.TimeGraphSelectionEvent
;
41 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.TimeGraphTimeEvent
;
42 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.TimeGraphViewer
;
43 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.model
.ITimeGraphEntry
;
44 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.test
.stub
.adaption
.TsfImplProvider
;
45 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.test
.stub
.model
.EventImpl
;
46 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.test
.stub
.model
.TraceImpl
;
47 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.test
.stub
.model
.TraceModelImplFactory
;
48 import org
.eclipse
.swt
.SWT
;
49 import org
.eclipse
.swt
.custom
.SashForm
;
50 import org
.eclipse
.swt
.graphics
.Image
;
51 import org
.eclipse
.swt
.widgets
.Composite
;
52 import org
.eclipse
.swt
.widgets
.Menu
;
53 import org
.eclipse
.ui
.IActionBars
;
54 import org
.eclipse
.ui
.ISharedImages
;
55 import org
.eclipse
.ui
.IWorkbenchActionConstants
;
56 import org
.eclipse
.ui
.PlatformUI
;
57 import org
.eclipse
.ui
.part
.DrillDownAdapter
;
58 import org
.eclipse
.ui
.part
.ViewPart
;
60 @SuppressWarnings("nls")
61 public class TsfTraceAnalysisView
extends ViewPart
implements
62 ITimeGraphSelectionListener
, ITimeGraphTimeListener
, ITimeGraphRangeListener
{
64 // ========================================================================
66 // ========================================================================
67 private TreeViewer viewer
;
68 private DrillDownAdapter drillDownAdapter
;
69 private Action action1
;
70 private Action action2
;
71 private Action resetScale
;
72 private Action nextEvent
;
73 private Action prevEvent
;
74 private Action nextTrace
;
75 private Action prevTrace
;
76 private Action showLegent
;
77 private Action zoomIn
;
78 private Action zoomOut
;
79 private Action events300K
;
81 private Action doubleClickAction
;
82 private TimeGraphViewer tsfviewer
;
83 private TimeGraphViewer tsfviewer2
;
85 private static SimpleDateFormat stimeformat
= new SimpleDateFormat(
87 private TraceModelImplFactory fact
;
89 // ========================================================================
91 // ========================================================================
93 * The content provider class is responsible for providing objects to the
94 * view. It can wrap existing objects in adapters or simply return objects
95 * as-is. These objects may be sensitive to the current input of the view,
96 * or ignore it and always show the same content (like Task List, for
100 class TreeObject
implements IAdaptable
{
102 private TreeParent parent
;
104 public TreeObject(String name
) {
108 public String
getName() {
112 public void setParent(TreeParent parent
) {
113 this.parent
= parent
;
116 public TreeParent
getParent() {
121 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
;
165 public void inputChanged(Viewer v
, Object oldInput
, Object newInput
) {
169 public void dispose() {
173 public Object
[] getElements(Object parent
) {
174 if (parent
.equals(getViewSite())) {
175 if (invisibleRoot
== null)
177 return getChildren(invisibleRoot
);
179 return getChildren(parent
);
183 public Object
getParent(Object child
) {
184 if (child
instanceof TreeObject
) {
185 return ((TreeObject
) child
).getParent();
191 public Object
[] getChildren(Object parent
) {
192 if (parent
instanceof TreeParent
) {
193 return ((TreeParent
) parent
).getChildren();
195 return new Object
[0];
199 public boolean hasChildren(Object parent
) {
200 if (parent
instanceof TreeParent
)
201 return ((TreeParent
) parent
).hasChildren();
206 * We will set up a dummy model to initialize tree heararchy. In a real
207 * code, you will connect to a real model and expose its hierarchy.
209 private void initialize() {
210 TreeObject to1
= new TreeObject("Leaf 1");
211 TreeObject to2
= new TreeObject("Leaf 2");
212 TreeObject to3
= new TreeObject("Leaf 3");
213 TreeParent p1
= new TreeParent("Parent 1");
218 TreeObject to4
= new TreeObject("Leaf 4");
219 TreeParent p2
= new TreeParent("Parent 2");
222 TreeParent root
= new TreeParent("Root");
226 invisibleRoot
= new TreeParent("");
227 invisibleRoot
.addChild(root
);
231 static class ViewLabelProvider
extends LabelProvider
{
234 public String
getText(Object obj
) {
235 return obj
.toString();
239 public Image
getImage(Object obj
) {
240 String imageKey
= ISharedImages
.IMG_OBJ_ELEMENT
;
241 if (obj
instanceof TreeParent
)
242 imageKey
= ISharedImages
.IMG_OBJ_FOLDER
;
243 return PlatformUI
.getWorkbench().getSharedImages().getImage(
248 static class NameSorter
extends ViewerSorter
{
251 // ========================================================================
253 // ========================================================================
255 * This is a callback that will allow us to create the viewer and initialize
259 public void createPartControl(Composite parent
) {
260 final SashForm sashForm
= new SashForm(parent
, SWT
.NONE
);
261 final SashForm sashForm2
= new SashForm(sashForm
, SWT
.NONE
);
263 tsfviewer
= new TimeGraphViewer(sashForm2
, SWT
.NONE
);
264 tsfviewer
.setTimeGraphProvider(new TsfImplProvider());
265 tsfviewer2
= new TimeGraphViewer(sashForm2
, SWT
.NONE
);
266 tsfviewer2
.setTimeGraphProvider(new TsfImplProvider());
268 viewer
= new TreeViewer(sashForm
, SWT
.MULTI
| SWT
.H_SCROLL
270 drillDownAdapter
= new DrillDownAdapter(viewer
);
271 viewer
.setContentProvider(new ViewContentProvider());
272 viewer
.setLabelProvider(new ViewLabelProvider());
273 viewer
.setSorter(new NameSorter());
274 viewer
.setInput(getViewSite());
276 sashForm
.setWeights(new int[] { 5, 1 });
277 sashForm2
.setWeights(new int[] { 1, 1 });
279 fact
= new TraceModelImplFactory();
280 ITimeGraphEntry
[] traceArr
= fact
.createTraces();
281 tsfviewer
.setInput(traceArr
);
282 tsfviewer
.addSelectionListener(this);
283 tsfviewer
.addRangeListener(this);
284 tsfviewer
.setTimeCalendarFormat(true);
286 tsfviewer2
.setInput(traceArr
);
287 tsfviewer2
.addSelectionListener(this);
288 tsfviewer2
.addRangeListener(this);
289 // tsfviewer2.setTimeFormat(TimeGraphViewer.timeFormat.epoch);
293 hookDoubleClickAction();
294 contributeToActionBars();
297 private void hookContextMenu() {
298 MenuManager menuMgr
= new MenuManager("#PopupMenu");
299 menuMgr
.setRemoveAllWhenShown(true);
300 menuMgr
.addMenuListener(new IMenuListener() {
302 public void menuAboutToShow(IMenuManager manager
) {
303 TsfTraceAnalysisView
.this.fillContextMenu(manager
);
306 Menu menu
= menuMgr
.createContextMenu(viewer
.getControl());
307 viewer
.getControl().setMenu(menu
);
308 getSite().registerContextMenu(menuMgr
, viewer
);
311 private void contributeToActionBars() {
312 IActionBars bars
= getViewSite().getActionBars();
313 fillLocalPullDown(bars
.getMenuManager());
314 fillLocalToolBar(bars
.getToolBarManager());
317 private void fillLocalPullDown(IMenuManager manager
) {
318 manager
.add(action1
);
319 manager
.add(new Separator());
320 manager
.add(action2
);
323 private void fillContextMenu(IMenuManager manager
) {
324 manager
.add(action1
);
325 manager
.add(action2
);
326 manager
.add(new Separator());
327 drillDownAdapter
.addNavigationActions(manager
);
328 // Other plug-ins can contribute there actions here
329 manager
.add(new Separator(IWorkbenchActionConstants
.MB_ADDITIONS
));
332 private void fillLocalToolBar(IToolBarManager manager
) {
333 manager
.add(new Separator());
334 manager
.add(resetScale
);
335 manager
.add(nextEvent
);
336 manager
.add(prevEvent
);
337 manager
.add(nextTrace
);
338 manager
.add(prevTrace
);
339 manager
.add(showLegent
);
341 manager
.add(zoomOut
);
342 manager
.add(events300K
);
343 manager
.add(new Separator());
345 drillDownAdapter
.addNavigationActions(manager
);
348 private TimeGraphViewer
getActiveTsfCtrl() {
349 TimeGraphViewer inFocusViewer
= null;
350 if (tsfviewer
.isInFocus())
351 inFocusViewer
= tsfviewer
;
352 else if (tsfviewer2
.isInFocus())
353 inFocusViewer
= tsfviewer2
;
354 return inFocusViewer
;
357 private void makeActions() {
359 action1
= new Action() {
362 showMessage("Action 1 executed");
365 action1
.setText("Action 1");
366 action1
.setToolTipText("Action 1 tooltip");
367 action1
.setImageDescriptor(PlatformUI
.getWorkbench().getSharedImages()
368 .getImageDescriptor(ISharedImages
.IMG_OBJS_INFO_TSK
));
371 action2
= new Action() {
374 showMessage("Action 2 executed");
377 action2
.setText("Action 2");
378 action2
.setToolTipText("Action 2 tooltip");
379 action2
.setImageDescriptor(PlatformUI
.getWorkbench().getSharedImages()
380 .getImageDescriptor(ISharedImages
.IMG_OBJS_INFO_TSK
));
383 resetScale
= new Action() {
386 TimeGraphViewer inFocusViewer
= getActiveTsfCtrl();
387 if (inFocusViewer
!= null) {
388 inFocusViewer
.resetStartFinishTime();
393 resetScale
.setText("Reset");
394 resetScale
.setToolTipText("Reset the Time Scale to Default");
397 nextEvent
= new Action() {
400 TimeGraphViewer inFocusViewer
= getActiveTsfCtrl();
401 if (inFocusViewer
!= null) {
402 inFocusViewer
.selectNextEvent();
406 nextEvent
.setText("NextEv");
407 nextEvent
.setToolTipText("Next Event");
410 prevEvent
= new Action() {
413 TimeGraphViewer inFocusViewer
= getActiveTsfCtrl();
414 if (inFocusViewer
!= null) {
415 inFocusViewer
.selectPrevEvent();
419 prevEvent
.setText("PrevEv");
420 prevEvent
.setToolTipText("Previous Event");
423 nextTrace
= new Action() {
426 TimeGraphViewer inFocusViewer
= getActiveTsfCtrl();
427 if (inFocusViewer
!= null) {
428 inFocusViewer
.selectNextItem();
432 nextTrace
.setText("NextTrace");
433 nextTrace
.setToolTipText("Select Next Event");
436 prevTrace
= new Action() {
439 TimeGraphViewer inFocusViewer
= getActiveTsfCtrl();
440 if (inFocusViewer
!= null) {
441 inFocusViewer
.selectPrevItem();
445 prevTrace
.setText("PrevTrace");
446 prevTrace
.setToolTipText("Select Previous Trace");
449 showLegent
= new Action() {
452 TimeGraphViewer inFocusViewer
= getActiveTsfCtrl();
453 if (inFocusViewer
!= null) {
454 inFocusViewer
.showLegend();
458 showLegent
.setText("Legend");
459 showLegent
.setToolTipText("Show Legend");
462 zoomIn
= new Action() {
465 TimeGraphViewer inFocusViewer
= getActiveTsfCtrl();
466 if (inFocusViewer
!= null) {
467 inFocusViewer
.zoomIn();
471 zoomIn
.setText("Zoom In");
472 zoomIn
.setToolTipText("Zoom In");
475 zoomOut
= new Action() {
478 TimeGraphViewer inFocusViewer
= getActiveTsfCtrl();
479 if (inFocusViewer
!= null) {
480 inFocusViewer
.zoomOut();
482 // ISelection selection = inFocusViewer.getSelection();
483 // Object sel = null;
484 // if (selection != null && !selection.isEmpty()) {
485 // sel = ((IStructuredSelection) selection)
486 // .getFirstElement();
487 // if (sel instanceof EventImpl) {
488 // EventImpl event = (EventImpl) sel;
489 // inFocusViewer.selectNextEvent();
494 zoomOut
.setText("Zoom Out");
495 zoomOut
.setToolTipText("Zoom Out");
498 events300K
= new Action() {
501 TimeGraphViewer inFocusViewer
= getActiveTsfCtrl();
502 if (inFocusViewer
!= null) {
503 ITimeGraphEntry
[] traceArr
= fact
504 .createLargeTraces(60);
505 inFocusViewer
.setInput(traceArr
);
509 events300K
.setText("300K Events");
510 events300K
.setToolTipText("Add 300K Events");
512 doubleClickAction
= new Action() {
515 ISelection selection
= viewer
.getSelection();
516 Object obj
= ((IStructuredSelection
) selection
)
518 showMessage("Double-click detected on " + obj
.toString());
523 private void hookDoubleClickAction() {
524 viewer
.addDoubleClickListener(new IDoubleClickListener() {
526 public void doubleClick(DoubleClickEvent event
) {
527 doubleClickAction
.run();
532 private void showMessage(String message
) {
533 MessageDialog
.openInformation(viewer
.getControl().getShell(),
534 "TsfTrace Analysis View", message
);
538 * Passing the focus request to the viewer's control.
541 public void setFocus() {
542 viewer
.getControl().setFocus();
546 public void selectionChanged(TimeGraphSelectionEvent event
) {
547 Object source
= event
.getSource();
548 if (source
== null || !(source
instanceof TimeGraphViewer
)) {
552 TimeGraphViewer rViewer
= (TimeGraphViewer
) event
.getSource();
553 TimeGraphViewer synchViewer
= null;
554 // Synchronize viewer selections if Enabled,
555 // make sure the selection does not go in loops
556 if (tsfviewer
== rViewer
) {
557 synchViewer
= tsfviewer2
;
559 synchViewer
= tsfviewer
;
561 Object selection
= event
.getSelection();
563 if (selection
instanceof EventImpl
) {
564 EventImpl selEvent
= (EventImpl
) selection
;
566 .println("TsfTraceAnalysisView.selectionChanged() Selected Event: \nType: "
567 + selEvent
.getType().toString()
571 + selEvent
.getEntry().getName());
573 synchViewer
.setSelectedEvent(selEvent
, source
);
575 } else if (selection
instanceof TraceImpl
) {
576 TraceImpl selTrace
= (TraceImpl
) selection
;
578 .println("TsfTraceAnalysisView.selectionChanged() Selected Trace: \nName: "
579 + selTrace
.getName().toString()
581 + selTrace
.getClassName());
583 synchViewer
.setSelection(selTrace
);
586 .println("TsfTmIncubatorListener.tsfTmProcessEvent() Unexpected event source received: "
587 + selection
.getClass().getName());
593 public void timeSelected(TimeGraphTimeEvent event
) {
594 TimeGraphViewer rViewer
= (TimeGraphViewer
) event
.getSource();
595 TimeGraphViewer synchViewer
= null;
596 // Synchronize viewer selections if Enabled,
597 // make sure the selection does not go in loops
598 if (tsfviewer
== rViewer
) {
599 synchViewer
= tsfviewer2
;
601 synchViewer
= tsfviewer
;
603 long selTimens
= event
.getTime();
604 long tms
= (long) (selTimens
* 1E-6);
605 Date date
= new Date(tms
);
606 String fDate
= stimeformat
.format(date
);
607 String ns
= formatNs(selTimens
);
609 System
.out
.println("TsfTraceAnalysisView.timeSelected() Selected Event: \nTime: "
611 + "\nSelected Time: "
612 + selTimens
+ " " + fDate
+ " " + ns
);
614 synchViewer
.setSelectedTime(event
.getTime(), true, event
.getSource());
618 public void timeRangeUpdated(TimeGraphRangeUpdateEvent event
) {
621 Object source
= event
.getSource();
622 if (source
== null || !(source
instanceof TimeGraphViewer
)) {
626 if (event
instanceof TimeGraphRangeUpdateEvent
) {
627 TimeGraphRangeUpdateEvent rEvent
= (TimeGraphRangeUpdateEvent
) event
;
628 TimeGraphViewer rViewer
= (TimeGraphViewer
) event
630 TimeGraphViewer synchViewer
= null;
631 // Synchronize viewer selections if Enabled,
632 // make sure the selection does not go in loops
633 if (tsfviewer
== rViewer
) {
634 synchViewer
= tsfviewer2
;
636 synchViewer
= tsfviewer
;
640 synchViewer
.setSelectVisTimeWindow(rEvent
.getStartTime(), rEvent
641 .getEndTime(), source
);
646 * Obtains the remainder fraction on unit Seconds of the entered value in
647 * nanoseconds. e.g. input: 1241207054171080214 ns The number of seconds can
648 * be obtain by removing the last 9 digits: 1241207054 the fractional
649 * portion of seconds, expressed in ns is: 171080214
654 public String
formatNs(long v
) {
655 StringBuffer str
= new StringBuffer();
662 String strVal
= String
.valueOf(v
);
663 if (v
< 1000000000) {
667 // Extract the last nine digits (e.g. fraction of a S expressed in ns
668 return strVal
.substring(strVal
.length() - 9);