(no commit message)
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.ui.tests / widgetStubs / org / eclipse / linuxtools / tmf / ui / widgets / timeAnalysis / test / stub / views / TsfTraceAnalysisView.java
1 /*******************************************************************************
2 * Copyright (c) 2009, 2010 Ericsson
3 *
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
8 *
9 * Contributors:
10 * Alvaro Sanchez-Leon (alvsan09@gmail.com) - Initial API and implementation
11 *******************************************************************************/
12 package org.eclipse.linuxtools.tmf.ui.widgets.timeAnalysis.test.stub.views;
13
14 import java.text.SimpleDateFormat;
15 import java.util.ArrayList;
16 import java.util.Date;
17
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;
58
59 public class TsfTraceAnalysisView extends ViewPart implements
60 ITmfTimeSelectionListener, ITmfTimeScaleSelectionListener {
61
62 // ========================================================================
63 // Data
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;
79 private Action synch;
80 private Action events300K;
81
82 private Action doubleClickAction;
83 private ITimeAnalysisViewer tsfviewer;
84 private ITimeAnalysisViewer tsfviewer2;
85
86 private static SimpleDateFormat stimeformat = new SimpleDateFormat(
87 "yy/MM/dd HH:mm:ss");
88 private TraceModelImplFactory fact;
89
90 // ========================================================================
91 // Inner Classes
92 // ========================================================================
93 /*
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
98 * example).
99 */
100
101 class TreeObject implements IAdaptable {
102 private String name;
103 private TreeParent parent;
104
105 public TreeObject(String name) {
106 this.name = name;
107 }
108
109 public String getName() {
110 return name;
111 }
112
113 public void setParent(TreeParent parent) {
114 this.parent = parent;
115 }
116
117 public TreeParent getParent() {
118 return parent;
119 }
120
121 @Override
122 public String toString() {
123 return getName();
124 }
125
126 @SuppressWarnings("rawtypes")
127 public Object getAdapter(Class key) {
128 return null;
129 }
130 }
131
132 class TreeParent extends TreeObject {
133 private ArrayList<TreeObject> children;
134
135 public TreeParent(String name) {
136 super(name);
137 children = new ArrayList<TreeObject>();
138 }
139
140 public void addChild(TreeObject child) {
141 children.add(child);
142 child.setParent(this);
143 }
144
145 public void removeChild(TreeObject child) {
146 children.remove(child);
147 child.setParent(null);
148 }
149
150 public TreeObject[] getChildren() {
151 return children.toArray(new TreeObject[children
152 .size()]);
153 }
154
155 public boolean hasChildren() {
156 return children.size() > 0;
157 }
158 }
159
160 class ViewContentProvider implements IStructuredContentProvider,
161 ITreeContentProvider {
162 private TreeParent invisibleRoot;
163
164 public void inputChanged(Viewer v, Object oldInput, Object newInput) {
165 }
166
167 public void dispose() {
168 }
169
170 public Object[] getElements(Object parent) {
171 if (parent.equals(getViewSite())) {
172 if (invisibleRoot == null)
173 initialize();
174 return getChildren(invisibleRoot);
175 }
176 return getChildren(parent);
177 }
178
179 public Object getParent(Object child) {
180 if (child instanceof TreeObject) {
181 return ((TreeObject) child).getParent();
182 }
183 return null;
184 }
185
186 public Object[] getChildren(Object parent) {
187 if (parent instanceof TreeParent) {
188 return ((TreeParent) parent).getChildren();
189 }
190 return new Object[0];
191 }
192
193 public boolean hasChildren(Object parent) {
194 if (parent instanceof TreeParent)
195 return ((TreeParent) parent).hasChildren();
196 return false;
197 }
198
199 /*
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.
202 */
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");
208 p1.addChild(to1);
209 p1.addChild(to2);
210 p1.addChild(to3);
211
212 TreeObject to4 = new TreeObject("Leaf 4");
213 TreeParent p2 = new TreeParent("Parent 2");
214 p2.addChild(to4);
215
216 TreeParent root = new TreeParent("Root");
217 root.addChild(p1);
218 root.addChild(p2);
219
220 invisibleRoot = new TreeParent("");
221 invisibleRoot.addChild(root);
222 }
223 }
224
225 class ViewLabelProvider extends LabelProvider {
226
227 @Override
228 public String getText(Object obj) {
229 return obj.toString();
230 }
231
232 @Override
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(
238 imageKey);
239 }
240 }
241
242 class NameSorter extends ViewerSorter {
243 }
244
245 // ========================================================================
246 // Methods
247 // ========================================================================
248 /**
249 * This is a callback that will allow us to create the viewer and initialize
250 * it.
251 */
252 @Override
253 public void createPartControl(Composite parent) {
254 final SashForm sashForm = new SashForm(parent, SWT.NONE);
255 final SashForm sashForm2 = new SashForm(sashForm, SWT.NONE);
256
257 tsfviewer = TmfViewerFactory.createViewer(sashForm2,
258 new TsfImplProvider());
259 tsfviewer2 = TmfViewerFactory.createViewer(sashForm2,
260 new TsfImplProvider());
261
262 viewer = new TreeViewer(sashForm, SWT.MULTI | SWT.H_SCROLL
263 | SWT.V_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());
269
270 sashForm.setWeights(new int[] { 5, 1 });
271 sashForm2.setWeights(new int[] { 1, 1 });
272
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);
279
280 tsfviewer2.display(traceArr);
281 tsfviewer2.addWidgetSelectionListner(this);
282 tsfviewer2.addWidgetTimeScaleSelectionListner(this);
283 // tsfviewer2.setTimeFormat(ITimeAnalysisViewer.timeFormat.epoch);
284
285 makeActions();
286 hookContextMenu();
287 hookDoubleClickAction();
288 contributeToActionBars();
289 }
290
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);
297 }
298 });
299 Menu menu = menuMgr.createContextMenu(viewer.getControl());
300 viewer.getControl().setMenu(menu);
301 getSite().registerContextMenu(menuMgr, viewer);
302 }
303
304 private void contributeToActionBars() {
305 IActionBars bars = getViewSite().getActionBars();
306 fillLocalPullDown(bars.getMenuManager());
307 fillLocalToolBar(bars.getToolBarManager());
308 }
309
310 private void fillLocalPullDown(IMenuManager manager) {
311 manager.add(action1);
312 manager.add(new Separator());
313 manager.add(action2);
314 }
315
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));
323 }
324
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);
335 manager.add(zoomIn);
336 manager.add(zoomOut);
337 manager.add(synch);
338 manager.add(events300K);
339 manager.add(new Separator());
340
341 drillDownAdapter.addNavigationActions(manager);
342 }
343
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;
351 }
352
353 private void makeActions() {
354 // action1
355 action1 = new Action() {
356 @Override
357 public void run() {
358 showMessage("Action 1 executed");
359 }
360 };
361 action1.setText("Action 1");
362 action1.setToolTipText("Action 1 tooltip");
363 action1.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
364 .getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
365
366 // action2
367 action2 = new Action() {
368 @Override
369 public void run() {
370 showMessage("Action 2 executed");
371 }
372 };
373 action2.setText("Action 2");
374 action2.setToolTipText("Action 2 tooltip");
375 action2.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
376 .getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
377
378 // action3
379 actGroup = new Action() {
380 @Override
381 public void run() {
382 ITimeAnalysisViewer inFocusViewer = getActiveTsfCtrl();
383 if (inFocusViewer != null) {
384 if (actGroup.isChecked()) {
385 inFocusViewer.groupTraces(false);
386 } else {
387 inFocusViewer.groupTraces(true);
388 }
389 }
390 }
391 };
392 actGroup.setText("Group");
393 actGroup.setToolTipText("Groupped or flat list");
394 actGroup.setChecked(true);
395
396 // action4
397 resetScale = new Action() {
398 @Override
399 public void run() {
400 ITimeAnalysisViewer inFocusViewer = getActiveTsfCtrl();
401 if (inFocusViewer != null) {
402 inFocusViewer.resetStartFinishTime();
403 }
404
405 }
406 };
407 resetScale.setText("Reset");
408 resetScale.setToolTipText("Reset the Time Scale to Default");
409
410 // action5
411 nextEvent = new Action() {
412 @Override
413 public void run() {
414 ITimeAnalysisViewer inFocusViewer = getActiveTsfCtrl();
415 if (inFocusViewer != null) {
416 inFocusViewer.selectNextEvent();
417 }
418 }
419 };
420 nextEvent.setText("NextEv");
421 nextEvent.setToolTipText("Next Event");
422
423 // action6
424 prevEvent = new Action() {
425 @Override
426 public void run() {
427 ITimeAnalysisViewer inFocusViewer = getActiveTsfCtrl();
428 if (inFocusViewer != null) {
429 inFocusViewer.selectPrevEvent();
430 }
431 }
432 };
433 prevEvent.setText("PrevEv");
434 prevEvent.setToolTipText("Previous Event");
435
436 // action7
437 nextTrace = new Action() {
438 @Override
439 public void run() {
440 ITimeAnalysisViewer inFocusViewer = getActiveTsfCtrl();
441 if (inFocusViewer != null) {
442 inFocusViewer.selectNextTrace();
443 }
444 }
445 };
446 nextTrace.setText("NextTrace");
447 nextTrace.setToolTipText("Select Next Event");
448
449 // action8
450 prevTrace = new Action() {
451 @Override
452 public void run() {
453 ITimeAnalysisViewer inFocusViewer = getActiveTsfCtrl();
454 if (inFocusViewer != null) {
455 inFocusViewer.selectPrevTrace();
456 }
457 }
458 };
459 prevTrace.setText("PrevTrace");
460 prevTrace.setToolTipText("Select Previous Trace");
461
462 // action9
463 showLegent = new Action() {
464 @Override
465 public void run() {
466 ITimeAnalysisViewer inFocusViewer = getActiveTsfCtrl();
467 if (inFocusViewer != null) {
468 inFocusViewer.showLegend();
469 }
470 }
471 };
472 showLegent.setText("Legend");
473 showLegent.setToolTipText("Show Legend");
474
475 // action10
476 filterTraces = new Action() {
477 @Override
478 public void run() {
479 ITimeAnalysisViewer inFocusViewer = getActiveTsfCtrl();
480 if (inFocusViewer != null) {
481 inFocusViewer.filterTraces();
482 }
483 }
484 };
485 filterTraces.setText("Filter");
486 filterTraces.setToolTipText("Trace Filter options");
487
488 // action10
489 zoomIn = new Action() {
490 @Override
491 public void run() {
492 ITimeAnalysisViewer inFocusViewer = getActiveTsfCtrl();
493 if (inFocusViewer != null) {
494 inFocusViewer.zoomIn();
495 }
496 }
497 };
498 zoomIn.setText("Zoom In");
499 zoomIn.setToolTipText("Zoom In");
500
501 // action10
502 zoomOut = new Action() {
503 @Override
504 public void run() {
505 ITimeAnalysisViewer inFocusViewer = getActiveTsfCtrl();
506 if (inFocusViewer != null) {
507 inFocusViewer.zoomOut();
508 }
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();
517 // }
518 // }
519 }
520 };
521 zoomOut.setText("Zoom Out");
522 zoomOut.setToolTipText("Zoom Out");
523
524 // action11
525 synch = new Action() {
526 @Override
527 public void run() {
528 if (synch.isChecked()) {
529 tsfviewer.setAcceptSelectionAPIcalls(true);
530 tsfviewer2.setAcceptSelectionAPIcalls(true);
531 } else {
532 tsfviewer.setAcceptSelectionAPIcalls(false);
533 tsfviewer2.setAcceptSelectionAPIcalls(false);
534 }
535 }
536 };
537 synch.setText("Synchronize");
538 synch
539 .setToolTipText("Synchronize by listening to external API selection calls");
540 synch.setChecked(false);
541
542 // action12
543 events300K = new Action() {
544 @Override
545 public void run() {
546 ITimeAnalysisViewer inFocusViewer = getActiveTsfCtrl();
547 if (inFocusViewer != null) {
548 ITmfTimeAnalysisEntry[] traceArr = fact
549 .createLargeTraces(60);
550 inFocusViewer.display(traceArr);
551 }
552 }
553 };
554 events300K.setText("300K Events");
555 events300K.setToolTipText("Add 300K Events");
556
557 doubleClickAction = new Action() {
558 @Override
559 public void run() {
560 ISelection selection = viewer.getSelection();
561 Object obj = ((IStructuredSelection) selection)
562 .getFirstElement();
563 showMessage("Double-click detected on " + obj.toString());
564 }
565 };
566 }
567
568 private void hookDoubleClickAction() {
569 viewer.addDoubleClickListener(new IDoubleClickListener() {
570 public void doubleClick(DoubleClickEvent event) {
571 doubleClickAction.run();
572 }
573 });
574 }
575
576 private void showMessage(String message) {
577 MessageDialog.openInformation(viewer.getControl().getShell(),
578 "TsfTrace Analysis View", message);
579 }
580
581 /**
582 * Passing the focus request to the viewer's control.
583 */
584 @Override
585 public void setFocus() {
586 viewer.getControl().setFocus();
587 }
588
589 public void tsfTmProcessSelEvent(TmfTimeSelectionEvent event) {
590 Object source = event.getSource();
591 if (source == null || !(source instanceof ITimeAnalysisViewer)) {
592 return;
593 }
594
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;
601 } else {
602 synchViewer = tsfviewer;
603 }
604 Object selection = event.getSelection();
605
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);
611
612 if (selection instanceof EventImpl) {
613 EventImpl selEvent = (EventImpl) selection;
614 date = new Date((long) (selTimens / 1E-6));
615 System.out
616 .println("TsfTmIncubatorListener.tsfTmProcessEvent() Selected Event: \nType: "
617 + selEvent.getType().toString()
618 + "\nTime: "
619 + selEvent.getTime()
620 + "\nTrace Name: "
621 + selEvent.getEntry().getName()
622 + "\nSelection Type: "
623 + event.getDType().toString()
624 + "\nSelected Time: "
625 + selTimens + " " + fDate + " " + ns);
626
627 synchViewer.setSelectedEvent(selEvent, source);
628
629 } else if (selection instanceof TraceImpl) {
630 TraceImpl selTrace = (TraceImpl) selection;
631 System.out
632 .println("TsfTmIncubatorListener.tsfTmProcessEvent() Selected Trace: \nName: "
633 + selTrace.getName().toString()
634 + "\nClass Name: "
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);
642
643 synchViewer.setSelectedTraceTime(selTrace, event.getSelectedTime(),
644 source);
645 } else {
646 System.out
647 .println("TsfTmIncubatorListener.tsfTmProcessEvent() Unexpected event source received: "
648 + selection.getClass().getName());
649 }
650
651 }
652
653 public void tsfTmProcessTimeScaleEvent(TmfTimeScaleSelectionEvent event) {
654 Object source = event.getSource();
655 if (source == null || !(source instanceof ITimeAnalysisViewer)) {
656 return;
657 }
658
659 if (event != null && event instanceof TmfTimeScaleSelectionEvent) {
660 TmfTimeScaleSelectionEvent rEvent = (TmfTimeScaleSelectionEvent) event;
661 ITimeAnalysisViewer rViewer = (ITimeAnalysisViewer) event
662 .getSource();
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;
668 } else {
669 synchViewer = tsfviewer;
670 }
671
672
673 synchViewer.setSelectVisTimeWindow(rEvent.getTime0(), rEvent
674 .getTime1(), source);
675 }
676 }
677
678 /**
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
683 *
684 * @param v
685 * @return
686 */
687 public String formatNs(long v) {
688 StringBuffer str = new StringBuffer();
689 boolean neg = v < 0;
690 if (neg) {
691 v = -v;
692 str.append('-');
693 }
694
695 String strVal = String.valueOf(v);
696 if (v < 1000000000) {
697 return strVal;
698 }
699
700 // Extract the last nine digits (e.g. fraction of a S expressed in ns
701 return strVal.substring(strVal.length() - 9);
702 }
703 }
This page took 0.059143 seconds and 5 git commands to generate.