e7b482e6ba7832f02b4a189c8a67c3a880680d57
[deliverable/tracecompass.git] / tmf / org.eclipse.tracecompass.tmf.ui.tests / widgetStubs / org / eclipse / tracecompass / tmf / ui / widgets / timegraph / test / stub / views / TsfTraceAnalysisView.java
1 /*******************************************************************************
2 * Copyright (c) 2009, 2015 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 * Patrick Tasse - Support selection range
12 *******************************************************************************/
13 package org.eclipse.tracecompass.tmf.ui.widgets.timegraph.test.stub.views;
14
15 import java.text.SimpleDateFormat;
16 import java.util.ArrayList;
17 import java.util.Date;
18
19 import org.eclipse.core.runtime.PlatformObject;
20 import org.eclipse.jface.action.Action;
21 import org.eclipse.jface.action.IMenuListener;
22 import org.eclipse.jface.action.IMenuManager;
23 import org.eclipse.jface.action.IToolBarManager;
24 import org.eclipse.jface.action.MenuManager;
25 import org.eclipse.jface.action.Separator;
26 import org.eclipse.jface.dialogs.MessageDialog;
27 import org.eclipse.jface.viewers.DoubleClickEvent;
28 import org.eclipse.jface.viewers.IDoubleClickListener;
29 import org.eclipse.jface.viewers.ISelection;
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.swt.SWT;
37 import org.eclipse.swt.custom.SashForm;
38 import org.eclipse.swt.graphics.Image;
39 import org.eclipse.swt.widgets.Composite;
40 import org.eclipse.swt.widgets.Menu;
41 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.ITimeGraphRangeListener;
42 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.ITimeGraphSelectionListener;
43 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.ITimeGraphTimeListener;
44 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.TimeGraphRangeUpdateEvent;
45 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.TimeGraphSelectionEvent;
46 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.TimeGraphTimeEvent;
47 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.TimeGraphViewer;
48 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.ITimeGraphEntry;
49 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.test.stub.adaption.TsfImplProvider;
50 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.test.stub.model.EventImpl;
51 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.test.stub.model.TraceImpl;
52 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.test.stub.model.TraceModelImplFactory;
53 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.widgets.Utils.TimeFormat;
54 import org.eclipse.ui.IActionBars;
55 import org.eclipse.ui.ISharedImages;
56 import org.eclipse.ui.IWorkbenchActionConstants;
57 import org.eclipse.ui.PlatformUI;
58 import org.eclipse.ui.part.DrillDownAdapter;
59 import org.eclipse.ui.part.ViewPart;
60
61 @SuppressWarnings("javadoc")
62 public class TsfTraceAnalysisView extends ViewPart implements
63 ITimeGraphSelectionListener, ITimeGraphTimeListener, ITimeGraphRangeListener {
64
65 // ========================================================================
66 // Data
67 // ========================================================================
68
69 private TreeViewer viewer;
70 private DrillDownAdapter drillDownAdapter;
71 private Action action1;
72 private Action action2;
73 private Action resetScale;
74 private Action nextEvent;
75 private Action prevEvent;
76 private Action nextTrace;
77 private Action prevTrace;
78 private Action showLegent;
79 private Action zoomIn;
80 private Action zoomOut;
81 private Action events300K;
82
83 private Action doubleClickAction;
84 private TimeGraphViewer tsfviewer;
85 private TimeGraphViewer tsfviewer2;
86
87 private static SimpleDateFormat stimeformat = new SimpleDateFormat(
88 "yy/MM/dd HH:mm:ss");
89 private TraceModelImplFactory fact;
90
91 // ========================================================================
92 // Inner Classes
93 // ========================================================================
94 /*
95 * The content provider class is responsible for providing objects to the
96 * view. It can wrap existing objects in adapters or simply return objects
97 * as-is. These objects may be sensitive to the current input of the view,
98 * or ignore it and always show the same content (like Task List, for
99 * example).
100 */
101
102 class TreeObject extends PlatformObject {
103 private final String name;
104 private TreeParent parent;
105
106 public TreeObject(String name) {
107 this.name = name;
108 }
109
110 public String getName() {
111 return name;
112 }
113
114 public void setParent(TreeParent parent) {
115 this.parent = parent;
116 }
117
118 public TreeParent getParent() {
119 return parent;
120 }
121
122 @Override
123 public String toString() {
124 return getName();
125 }
126 }
127
128 class TreeParent extends TreeObject {
129 private final ArrayList<TreeObject> children;
130
131 public TreeParent(String name) {
132 super(name);
133 children = new ArrayList<>();
134 }
135
136 public void addChild(TreeObject child) {
137 children.add(child);
138 child.setParent(this);
139 }
140
141 public void removeChild(TreeObject child) {
142 children.remove(child);
143 child.setParent(null);
144 }
145
146 public TreeObject[] getChildren() {
147 return children.toArray(new TreeObject[children
148 .size()]);
149 }
150
151 public boolean hasChildren() {
152 return children.size() > 0;
153 }
154 }
155
156 class ViewContentProvider implements ITreeContentProvider {
157 private TreeParent invisibleRoot;
158
159 @Override
160 public void inputChanged(Viewer v, Object oldInput, Object newInput) {
161 }
162
163 @Override
164 public void dispose() {
165 }
166
167 @Override
168 public Object[] getElements(Object parent) {
169 if (parent.equals(getViewSite())) {
170 if (invisibleRoot == null) {
171 initialize();
172 }
173 return getChildren(invisibleRoot);
174 }
175 return getChildren(parent);
176 }
177
178 @Override
179 public Object getParent(Object child) {
180 if (child instanceof TreeObject) {
181 return ((TreeObject) child).getParent();
182 }
183 return null;
184 }
185
186 @Override
187 public Object[] getChildren(Object parent) {
188 if (parent instanceof TreeParent) {
189 return ((TreeParent) parent).getChildren();
190 }
191 return new Object[0];
192 }
193
194 @Override
195 public boolean hasChildren(Object parent) {
196 if (parent instanceof TreeParent) {
197 return ((TreeParent) parent).hasChildren();
198 }
199 return false;
200 }
201
202 /*
203 * We will set up a dummy model to initialize tree heararchy. In a real
204 * code, you will connect to a real model and expose its hierarchy.
205 */
206 private void initialize() {
207 TreeObject to1 = new TreeObject("Leaf 1");
208 TreeObject to2 = new TreeObject("Leaf 2");
209 TreeObject to3 = new TreeObject("Leaf 3");
210 TreeParent p1 = new TreeParent("Parent 1");
211 p1.addChild(to1);
212 p1.addChild(to2);
213 p1.addChild(to3);
214
215 TreeObject to4 = new TreeObject("Leaf 4");
216 TreeParent p2 = new TreeParent("Parent 2");
217 p2.addChild(to4);
218
219 TreeParent root = new TreeParent("Root");
220 root.addChild(p1);
221 root.addChild(p2);
222
223 invisibleRoot = new TreeParent("");
224 invisibleRoot.addChild(root);
225 }
226 }
227
228 static class ViewLabelProvider extends LabelProvider {
229
230 @Override
231 public String getText(Object obj) {
232 return obj.toString();
233 }
234
235 @Override
236 public Image getImage(Object obj) {
237 String imageKey = ISharedImages.IMG_OBJ_ELEMENT;
238 if (obj instanceof TreeParent) {
239 imageKey = ISharedImages.IMG_OBJ_FOLDER;
240 }
241 return PlatformUI.getWorkbench().getSharedImages().getImage(
242 imageKey);
243 }
244 }
245
246 static class NameSorter extends ViewerSorter {
247 }
248
249 // ========================================================================
250 // Methods
251 // ========================================================================
252 /**
253 * This is a callback that will allow us to create the viewer and initialize
254 * it.
255 */
256 @Override
257 public void createPartControl(Composite parent) {
258 final SashForm sashForm = new SashForm(parent, SWT.NONE);
259 final SashForm sashForm2 = new SashForm(sashForm, SWT.NONE);
260
261 tsfviewer = new TimeGraphViewer(sashForm2, SWT.NONE);
262 tsfviewer.setTimeGraphProvider(new TsfImplProvider());
263 tsfviewer2 = new TimeGraphViewer(sashForm2, SWT.NONE);
264 tsfviewer2.setTimeGraphProvider(new TsfImplProvider());
265
266 viewer = new TreeViewer(sashForm, SWT.MULTI | SWT.H_SCROLL
267 | SWT.V_SCROLL);
268 drillDownAdapter = new DrillDownAdapter(viewer);
269 viewer.setContentProvider(new ViewContentProvider());
270 viewer.setLabelProvider(new ViewLabelProvider());
271 viewer.setSorter(new NameSorter());
272 viewer.setInput(getViewSite());
273
274 sashForm.setWeights(new int[] { 5, 1 });
275 sashForm2.setWeights(new int[] { 1, 1 });
276
277 fact = new TraceModelImplFactory();
278 ITimeGraphEntry[] traceArr = fact.createTraces();
279 tsfviewer.setInput(traceArr);
280 tsfviewer.addSelectionListener(this);
281 tsfviewer.addRangeListener(this);
282 tsfviewer.setTimeFormat(TimeFormat.CALENDAR);
283
284 tsfviewer2.setInput(traceArr);
285 tsfviewer2.addSelectionListener(this);
286 tsfviewer2.addRangeListener(this);
287 // tsfviewer2.setTimeFormat(TimeGraphViewer.timeFormat.epoch);
288
289 makeActions();
290 hookContextMenu();
291 hookDoubleClickAction();
292 contributeToActionBars();
293 }
294
295 private void hookContextMenu() {
296 MenuManager menuMgr = new MenuManager("#PopupMenu");
297 menuMgr.setRemoveAllWhenShown(true);
298 menuMgr.addMenuListener(new IMenuListener() {
299 @Override
300 public void menuAboutToShow(IMenuManager manager) {
301 TsfTraceAnalysisView.this.fillContextMenu(manager);
302 }
303 });
304 Menu menu = menuMgr.createContextMenu(viewer.getControl());
305 viewer.getControl().setMenu(menu);
306 getSite().registerContextMenu(menuMgr, viewer);
307 }
308
309 private void contributeToActionBars() {
310 IActionBars bars = getViewSite().getActionBars();
311 fillLocalPullDown(bars.getMenuManager());
312 fillLocalToolBar(bars.getToolBarManager());
313 }
314
315 private void fillLocalPullDown(IMenuManager manager) {
316 manager.add(action1);
317 manager.add(new Separator());
318 manager.add(action2);
319 }
320
321 private void fillContextMenu(IMenuManager manager) {
322 manager.add(action1);
323 manager.add(action2);
324 manager.add(new Separator());
325 drillDownAdapter.addNavigationActions(manager);
326 // Other plug-ins can contribute there actions here
327 manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
328 }
329
330 private void fillLocalToolBar(IToolBarManager manager) {
331 manager.add(new Separator());
332 manager.add(resetScale);
333 manager.add(nextEvent);
334 manager.add(prevEvent);
335 manager.add(nextTrace);
336 manager.add(prevTrace);
337 manager.add(showLegent);
338 manager.add(zoomIn);
339 manager.add(zoomOut);
340 manager.add(events300K);
341 manager.add(new Separator());
342
343 drillDownAdapter.addNavigationActions(manager);
344 }
345
346 private TimeGraphViewer getActiveTsfCtrl() {
347 TimeGraphViewer inFocusViewer = null;
348 if (tsfviewer.isInFocus()) {
349 inFocusViewer = tsfviewer;
350 } else if (tsfviewer2.isInFocus()) {
351 inFocusViewer = tsfviewer2;
352 }
353 return inFocusViewer;
354 }
355
356 private void makeActions() {
357 // action1
358 action1 = new Action() {
359 @Override
360 public void run() {
361 showMessage("Action 1 executed");
362 }
363 };
364 action1.setText("Action 1");
365 action1.setToolTipText("Action 1 tooltip");
366 action1.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
367 .getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
368
369 // action2
370 action2 = new Action() {
371 @Override
372 public void run() {
373 showMessage("Action 2 executed");
374 }
375 };
376 action2.setText("Action 2");
377 action2.setToolTipText("Action 2 tooltip");
378 action2.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
379 .getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
380
381 // action4
382 resetScale = new Action() {
383 @Override
384 public void run() {
385 TimeGraphViewer inFocusViewer = getActiveTsfCtrl();
386 if (inFocusViewer != null) {
387 inFocusViewer.resetStartFinishTime();
388 }
389
390 }
391 };
392 resetScale.setText("Reset");
393 resetScale.setToolTipText("Reset the Time Scale to Default");
394
395 // action5
396 nextEvent = new Action() {
397 @Override
398 public void run() {
399 TimeGraphViewer inFocusViewer = getActiveTsfCtrl();
400 if (inFocusViewer != null) {
401 inFocusViewer.selectNextEvent(false);
402 }
403 }
404 };
405 nextEvent.setText("NextEv");
406 nextEvent.setToolTipText("Next Event");
407
408 // action6
409 prevEvent = new Action() {
410 @Override
411 public void run() {
412 TimeGraphViewer inFocusViewer = getActiveTsfCtrl();
413 if (inFocusViewer != null) {
414 inFocusViewer.selectPrevEvent(false);
415 }
416 }
417 };
418 prevEvent.setText("PrevEv");
419 prevEvent.setToolTipText("Previous Event");
420
421 // action7
422 nextTrace = new Action() {
423 @Override
424 public void run() {
425 TimeGraphViewer inFocusViewer = getActiveTsfCtrl();
426 if (inFocusViewer != null) {
427 inFocusViewer.selectNextItem();
428 }
429 }
430 };
431 nextTrace.setText("NextTrace");
432 nextTrace.setToolTipText("Select Next Event");
433
434 // action8
435 prevTrace = new Action() {
436 @Override
437 public void run() {
438 TimeGraphViewer inFocusViewer = getActiveTsfCtrl();
439 if (inFocusViewer != null) {
440 inFocusViewer.selectPrevItem();
441 }
442 }
443 };
444 prevTrace.setText("PrevTrace");
445 prevTrace.setToolTipText("Select Previous Trace");
446
447 // action9
448 showLegent = new Action() {
449 @Override
450 public void run() {
451 TimeGraphViewer inFocusViewer = getActiveTsfCtrl();
452 if (inFocusViewer != null) {
453 inFocusViewer.showLegend();
454 }
455 }
456 };
457 showLegent.setText("Legend");
458 showLegent.setToolTipText("Show Legend");
459
460 // action10
461 zoomIn = new Action() {
462 @Override
463 public void run() {
464 TimeGraphViewer inFocusViewer = getActiveTsfCtrl();
465 if (inFocusViewer != null) {
466 inFocusViewer.zoomIn();
467 }
468 }
469 };
470 zoomIn.setText("Zoom In");
471 zoomIn.setToolTipText("Zoom In");
472
473 // action10
474 zoomOut = new Action() {
475 @Override
476 public void run() {
477 TimeGraphViewer inFocusViewer = getActiveTsfCtrl();
478 if (inFocusViewer != null) {
479 inFocusViewer.zoomOut();
480 }
481 // ISelection selection = inFocusViewer.getSelection();
482 // Object sel = null;
483 // if (selection != null && !selection.isEmpty()) {
484 // sel = ((IStructuredSelection) selection)
485 // .getFirstElement();
486 // if (sel instanceof EventImpl) {
487 // EventImpl event = (EventImpl) sel;
488 // inFocusViewer.selectNextEvent();
489 // }
490 // }
491 }
492 };
493 zoomOut.setText("Zoom Out");
494 zoomOut.setToolTipText("Zoom Out");
495
496 // action12
497 events300K = new Action() {
498 @Override
499 public void run() {
500 TimeGraphViewer inFocusViewer = getActiveTsfCtrl();
501 if (inFocusViewer != null) {
502 ITimeGraphEntry[] traceArr = fact
503 .createLargeTraces(60);
504 inFocusViewer.setInput(traceArr);
505 }
506 }
507 };
508 events300K.setText("300K Events");
509 events300K.setToolTipText("Add 300K Events");
510
511 doubleClickAction = new Action() {
512 @Override
513 public void run() {
514 ISelection selection = viewer.getSelection();
515 Object obj = ((IStructuredSelection) selection)
516 .getFirstElement();
517 showMessage("Double-click detected on " + obj.toString());
518 }
519 };
520 }
521
522 private void hookDoubleClickAction() {
523 viewer.addDoubleClickListener(new IDoubleClickListener() {
524 @Override
525 public void doubleClick(DoubleClickEvent event) {
526 doubleClickAction.run();
527 }
528 });
529 }
530
531 private void showMessage(String message) {
532 MessageDialog.openInformation(viewer.getControl().getShell(),
533 "TsfTrace Analysis View", message);
534 }
535
536 /**
537 * Passing the focus request to the viewer's control.
538 */
539 @Override
540 public void setFocus() {
541 viewer.getControl().setFocus();
542 }
543
544 @Override
545 public void selectionChanged(TimeGraphSelectionEvent event) {
546 Object source = event.getSource();
547 if (source == null || !(source instanceof TimeGraphViewer)) {
548 return;
549 }
550
551 TimeGraphViewer rViewer = (TimeGraphViewer) event.getSource();
552 TimeGraphViewer synchViewer = null;
553 // Synchronize viewer selections if Enabled,
554 // make sure the selection does not go in loops
555 if (tsfviewer == rViewer) {
556 synchViewer = tsfviewer2;
557 } else {
558 synchViewer = tsfviewer;
559 }
560 Object selection = event.getSelection();
561
562 if (selection instanceof EventImpl) {
563 EventImpl selEvent = (EventImpl) selection;
564 System.out
565 .println("TsfTraceAnalysisView.selectionChanged() Selected Event: \nType: "
566 + selEvent.getType().toString()
567 + "\nTime: "
568 + selEvent.getTime()
569 + "\nTrace Name: "
570 + selEvent.getEntry().getName());
571
572 synchViewer.setSelectedEvent(selEvent, source);
573
574 } else if (selection instanceof TraceImpl) {
575 TraceImpl selTrace = (TraceImpl) selection;
576 System.out
577 .println("TsfTraceAnalysisView.selectionChanged() Selected Trace: \nName: "
578 + selTrace.getName().toString()
579 + "\nClass Name: "
580 + selTrace.getClassName());
581
582 synchViewer.setSelection(selTrace);
583 } else {
584 System.out
585 .println("TsfTmIncubatorListener.tsfTmProcessEvent() Unexpected event source received: "
586 + selection.getClass().getName());
587 }
588
589 }
590
591 @Override
592 public void timeSelected(TimeGraphTimeEvent event) {
593 TimeGraphViewer rViewer = (TimeGraphViewer) event.getSource();
594 TimeGraphViewer synchViewer = null;
595 // Synchronize viewer selections if Enabled,
596 // make sure the selection does not go in loops
597 if (tsfviewer == rViewer) {
598 synchViewer = tsfviewer2;
599 } else {
600 synchViewer = tsfviewer;
601 }
602 long selTimens = event.getBeginTime();
603 long tms = (long) (selTimens * 1E-6);
604 Date date = new Date(tms);
605 String fDate = stimeformat.format(date);
606 String ns = formatNs(selTimens);
607
608 System.out.println("TsfTraceAnalysisView.timeSelected() Selected Event: \nTime: "
609 + event.getBeginTime()
610 + "\nSelected Time: "
611 + selTimens + " " + fDate + " " + ns);
612
613 synchViewer.setSelectedTime(event.getBeginTime(), true);
614 }
615
616 @Override
617 public void timeRangeUpdated(TimeGraphRangeUpdateEvent event) {
618 if (event == null) {
619 return;
620 }
621 Object source = event.getSource();
622 if (source == null || !(source instanceof TimeGraphViewer)) {
623 return;
624 }
625
626 TimeGraphRangeUpdateEvent rEvent = event;
627 TimeGraphViewer rViewer = (TimeGraphViewer) event
628 .getSource();
629 TimeGraphViewer synchViewer = null;
630 // Synchronize viewer selections if Enabled,
631 // make sure the selection does not go in loops
632 if (tsfviewer == rViewer) {
633 synchViewer = tsfviewer2;
634 } else {
635 synchViewer = tsfviewer;
636 }
637
638 synchViewer.setSelectVisTimeWindow(rEvent.getStartTime(), rEvent.getEndTime(), source);
639 }
640
641 /**
642 * Obtains the remainder fraction on unit Seconds of the entered value in
643 * nanoseconds. e.g. input: 1241207054171080214 ns The number of seconds can
644 * be obtain by removing the last 9 digits: 1241207054 the fractional
645 * portion of seconds, expressed in ns is: 171080214
646 *
647 * @param v
648 * @return
649 */
650 public String formatNs(long v) {
651 StringBuffer str = new StringBuffer();
652 long val = v;
653 boolean neg = val < 0;
654 if (neg) {
655 val = -val;
656 str.append('-');
657 }
658
659 String strVal = String.valueOf(val);
660 if (val < 1000000000) {
661 return strVal;
662 }
663
664 // Extract the last nine digits (e.g. fraction of a S expressed in ns
665 return strVal.substring(strVal.length() - 9);
666 }
667 }
This page took 0.069383 seconds and 4 git commands to generate.