tmf: Simple warning fixes in tmf.ui and tests
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.ui / src / org / eclipse / linuxtools / tmf / ui / views / uml2sd / TimeCompressionBar.java
1 /**********************************************************************
2 * Copyright (c) 2005, 2008 IBM Corporation and others.
3 * Copyright (c) 2011, 2012 Ericsson.
4 *
5 * All rights reserved. This program and the accompanying materials
6 * are made available under the terms of the Eclipse Public License v1.0
7 * which accompanies this distribution, and is available at
8 * http://www.eclipse.org/legal/epl-v10.html
9 *
10 * Contributors:
11 * IBM - Initial API and implementation
12 * Bernd Hufmann - Updated for TMF
13 *
14 **********************************************************************/
15 package org.eclipse.linuxtools.tmf.ui.views.uml2sd;
16
17 import java.util.ArrayList;
18 import java.util.Arrays;
19 import java.util.List;
20
21 import org.eclipse.linuxtools.internal.tmf.ui.Activator;
22 import org.eclipse.linuxtools.tmf.core.event.ITmfTimestamp;
23 import org.eclipse.linuxtools.tmf.core.event.TmfTimestamp;
24 import org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.AsyncMessage;
25 import org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.AsyncMessageReturn;
26 import org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.BaseMessage;
27 import org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.ExecutionOccurrence;
28 import org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.Frame;
29 import org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.GraphNode;
30 import org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.ITimeRange;
31 import org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.Lifeline;
32 import org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.Metrics;
33 import org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.SDTimeEvent;
34 import org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.SyncMessage;
35 import org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IColor;
36 import org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.impl.ColorImpl;
37 import org.eclipse.linuxtools.tmf.ui.views.uml2sd.preferences.SDViewPref;
38 import org.eclipse.linuxtools.tmf.ui.views.uml2sd.util.TimeEventComparator;
39 import org.eclipse.swt.SWT;
40 import org.eclipse.swt.accessibility.ACC;
41 import org.eclipse.swt.accessibility.Accessible;
42 import org.eclipse.swt.accessibility.AccessibleAdapter;
43 import org.eclipse.swt.accessibility.AccessibleControlAdapter;
44 import org.eclipse.swt.accessibility.AccessibleControlEvent;
45 import org.eclipse.swt.accessibility.AccessibleEvent;
46 import org.eclipse.swt.events.DisposeEvent;
47 import org.eclipse.swt.events.DisposeListener;
48 import org.eclipse.swt.events.FocusEvent;
49 import org.eclipse.swt.events.FocusListener;
50 import org.eclipse.swt.events.KeyEvent;
51 import org.eclipse.swt.events.MouseEvent;
52 import org.eclipse.swt.events.TraverseEvent;
53 import org.eclipse.swt.events.TraverseListener;
54 import org.eclipse.swt.graphics.Color;
55 import org.eclipse.swt.graphics.GC;
56 import org.eclipse.swt.graphics.Image;
57 import org.eclipse.swt.widgets.Composite;
58 import org.eclipse.swt.widgets.Control;
59 import org.eclipse.swt.widgets.Display;
60
61 /**
62 * <p>
63 * The time compression bar implementation.
64 * </p>
65 *
66 * @version 1.0
67 * @author sveyrier
68 */
69 public class TimeCompressionBar extends ScrollView implements DisposeListener {
70
71 // ------------------------------------------------------------------------
72 // Attributes
73 // ------------------------------------------------------------------------
74
75 /**
76 * The listener list
77 */
78 protected List<ITimeCompressionListener> fListenerList = null;
79 /**
80 * The current frame displayed.
81 */
82 protected Frame fFrame = null;
83 /**
84 * List of time events.
85 */
86 protected List<SDTimeEvent> fNodeList = null;
87 /**
88 * The minimum time delta.
89 */
90 protected ITmfTimestamp fMinTime = new TmfTimestamp();
91 /**
92 * The maximum time delta.
93 */
94 protected ITmfTimestamp fMaxTime = new TmfTimestamp();
95 /**
96 * The current zoom value.
97 */
98 protected float fZoomValue = 1;
99 /**
100 * The tooltip to display.
101 */
102 protected DrawableToolTip fTooltip = null;
103 /**
104 * Array of colors for displaying wight of time deltas.
105 */
106 protected ColorImpl[] fColors;
107 /**
108 * The accessible object reference.
109 */
110 protected Accessible fAccessible = null;
111 /**
112 * The focused widget reference.
113 */
114 protected int fFocusedWidget = -1;
115 /**
116 * The sequence diagram view reference.
117 */
118 protected SDView view = null;
119 /**
120 * The current lifeline.
121 */
122 protected Lifeline fLifeline = null;
123 /**
124 * The current start event value.
125 */
126 protected int fLifelineStart = 0;
127 /**
128 * The current number of events.
129 */
130 protected int fLifelineNumEvents = 0;
131 /**
132 * The Current color of range to display.
133 */
134 protected IColor fLifelineColor = null;
135 /**
136 * The next graph node y coordinate.
137 */
138 protected int fNextNodeY = 0;
139 /**
140 * The previous graph node y coordinate.
141 */
142 protected int fPrevNodeY = 0;
143
144 // ------------------------------------------------------------------------
145 // Constructors
146 // ------------------------------------------------------------------------
147 /**
148 * Standard constructor
149 *
150 * @param parent The parent composite
151 * @param s The style bits
152 */
153 public TimeCompressionBar(Composite parent, int s) {
154 super(parent, s | SWT.NO_BACKGROUND, false);
155 setVScrollBarMode(ScrollView.ALWAYS_OFF);
156 setHScrollBarMode(ScrollView.ALWAYS_OFF);
157 fListenerList = new ArrayList<ITimeCompressionListener>();
158 fColors = new ColorImpl[10];
159 fColors[0] = new ColorImpl(Display.getDefault(), 255, 229, 229);
160 fColors[1] = new ColorImpl(Display.getDefault(), 255, 204, 204);
161 fColors[2] = new ColorImpl(Display.getDefault(), 255, 178, 178);
162 fColors[3] = new ColorImpl(Display.getDefault(), 255, 153, 153);
163 fColors[4] = new ColorImpl(Display.getDefault(), 255, 127, 127);
164 fColors[5] = new ColorImpl(Display.getDefault(), 255, 102, 102);
165 fColors[6] = new ColorImpl(Display.getDefault(), 255, 76, 76);
166 fColors[7] = new ColorImpl(Display.getDefault(), 255, 51, 51);
167 fColors[8] = new ColorImpl(Display.getDefault(), 255, 25, 25);
168 fColors[9] = new ColorImpl(Display.getDefault(), 255, 0, 0);
169 super.addDisposeListener(this);
170
171 fAccessible = getViewControl().getAccessible();
172
173 fAccessible.addAccessibleListener(new AccessibleAdapter() {
174 @Override
175 public void getName(AccessibleEvent e) {
176 // Case toolTip
177 if (e.childID == 0) {
178 if (fTooltip != null) {
179 e.result = fTooltip.getAccessibleText();
180 }
181 } else if (e.childID == 1) {
182 createFakeTooltip();
183 e.result = fTooltip.getAccessibleText();
184 }
185 }
186 });
187
188 fAccessible.addAccessibleControlListener(new AccessibleControlAdapter() {
189 /*
190 * (non-Javadoc)
191 * @see org.eclipse.swt.accessibility.AccessibleControlAdapter#getFocus(org.eclipse.swt.accessibility.AccessibleControlEvent)
192 */
193 @Override
194 public void getFocus(AccessibleControlEvent e) {
195 if (fFocusedWidget == -1) {
196 e.childID = ACC.CHILDID_SELF;
197 }
198 else {
199 e.childID = fFocusedWidget;
200 }
201 }
202
203 /*
204 * (non-Javadoc)
205 * @see org.eclipse.swt.accessibility.AccessibleControlAdapter#getRole(org.eclipse.swt.accessibility.AccessibleControlEvent)
206 */
207 @Override
208 public void getRole(AccessibleControlEvent e) {
209 switch (e.childID) {
210 case ACC.CHILDID_SELF:
211 e.detail = ACC.ROLE_CLIENT_AREA;
212 break;
213 case 0:
214 e.detail = ACC.ROLE_TOOLTIP;
215 break;
216 case 1:
217 e.detail = ACC.ROLE_LABEL;
218 break;
219 default:
220 break;
221 }
222 }
223
224 /*
225 * (non-Javadoc)
226 * @see org.eclipse.swt.accessibility.AccessibleControlAdapter#getState(org.eclipse.swt.accessibility.AccessibleControlEvent)
227 */
228 @Override
229 public void getState(AccessibleControlEvent e) {
230 e.detail = ACC.STATE_FOCUSABLE;
231 if (e.childID == ACC.CHILDID_SELF) {
232 e.detail |= ACC.STATE_FOCUSED;
233 } else {
234 e.detail |= ACC.STATE_SELECTABLE;
235 if (e.childID == fFocusedWidget) {
236 e.detail |= ACC.STATE_FOCUSED | ACC.STATE_SELECTED | ACC.STATE_CHECKED;
237 }
238 }
239 }
240 });
241
242 getViewControl().addTraverseListener(new LocalTraverseListener());
243
244 addTraverseListener(new LocalTraverseListener());
245
246 getViewControl().addFocusListener(new FocusListener() {
247
248 /*
249 * (non-Javadoc)
250 * @see org.eclipse.swt.events.FocusListener#focusGained(org.eclipse.swt.events.FocusEvent)
251 */
252 @Override
253 public void focusGained(FocusEvent e) {
254 redraw();
255 }
256
257 /*
258 * (non-Javadoc)
259 * @see org.eclipse.swt.events.FocusListener#focusLost(org.eclipse.swt.events.FocusEvent)
260 */
261 @Override
262 public void focusLost(FocusEvent e) {
263 redraw();
264 }
265 });
266 }
267
268 // ------------------------------------------------------------------------
269 // Methods
270 // ------------------------------------------------------------------------
271
272 /**
273 * Sets the focus widget
274 *
275 * @param newFocusShape widget reference to set
276 */
277 void setFocus(int newFocusShape) {
278 fFocusedWidget = newFocusShape;
279 if (fFocusedWidget == -1) {
280 getViewControl().getAccessible().setFocus(ACC.CHILDID_SELF);
281 } else {
282 getViewControl().getAccessible().setFocus(fFocusedWidget);
283 }
284 }
285
286 /**
287 * Sets the current frame.
288 *
289 * @param theFrame The frame to set
290 */
291 public void setFrame(Frame theFrame) {
292 fFrame = theFrame;
293 fMinTime = fFrame.getMinTime();
294 fMaxTime = fFrame.getMaxTime();
295 }
296
297 /*
298 * (non-Javadoc)
299 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.ScrollView#drawContents(org.eclipse.swt.graphics.GC, int, int, int, int)
300 */
301 @Override
302 protected void drawContents(GC gc, int clipx, int clipy, int clipw, int cliph) {
303 if (fFrame == null) {
304 return;
305 }
306 fNodeList = new ArrayList<SDTimeEvent>();
307 int messageArraysStep = 1;
308
309 if ((Metrics.getMessageFontHeigth() + Metrics.MESSAGES_NAME_SPACING * 2) * fZoomValue < Metrics.MESSAGE_SIGNIFICANT_VSPACING + 1) {
310 messageArraysStep = Math.round(Metrics.MESSAGE_SIGNIFICANT_VSPACING + 1 / ((Metrics.getMessageFontHeigth() + Metrics.MESSAGES_NAME_SPACING * 2) * fZoomValue));
311 }
312
313 int firstVisible = fFrame.getFirstVisibleSyncMessage();
314 if (firstVisible > 0) {
315 firstVisible = firstVisible - 1;
316 }
317 for (int i = firstVisible; i < fFrame.syncMessageCount(); i = i + messageArraysStep) {
318 SyncMessage m = fFrame.getSyncMessage(i);
319 if (m.hasTimeInfo()) {
320 SDTimeEvent t = new SDTimeEvent(m.getStartTime(), m.getEventOccurrence(), m);
321 fNodeList.add(t);
322 if (m.getY() * fZoomValue > getContentsY() + getVisibleHeight()) {
323 break;
324 }
325 }
326 }
327
328 firstVisible = fFrame.getFirstVisibleSyncMessageReturn();
329 if (firstVisible > 0) {
330 firstVisible = firstVisible - 1;
331 }
332 for (int i = firstVisible; i < fFrame.syncMessageReturnCount(); i = i + messageArraysStep) {
333 SyncMessage m = fFrame.getSyncMessageReturn(i);
334 if (m.hasTimeInfo()) {
335 SDTimeEvent t = new SDTimeEvent(m.getStartTime(), m.getEventOccurrence(), m);
336 fNodeList.add(t);
337 if (m.getY() * fZoomValue > getContentsY() + getVisibleHeight()) {
338 break;
339 }
340 }
341 }
342
343 firstVisible = fFrame.getFirstVisibleAsyncMessage();
344 if (firstVisible > 0) {
345 firstVisible = firstVisible - 1;
346 }
347 for (int i = firstVisible; i < fFrame.asyncMessageCount(); i = i + messageArraysStep) {
348 AsyncMessage m = fFrame.getAsyncMessage(i);
349 if (m.hasTimeInfo()) {
350 SDTimeEvent t = new SDTimeEvent(m.getStartTime(), m.getStartOccurrence(), m);
351 fNodeList.add(t);
352 t = new SDTimeEvent(m.getEndTime(), m.getEndOccurrence(), m);
353 fNodeList.add(t);
354 if (m.getY() * fZoomValue > getContentsY() + getVisibleHeight()) {
355 break;
356 }
357 }
358 }
359
360 firstVisible = fFrame.getFirstVisibleAsyncMessageReturn();
361 if (firstVisible > 0) {
362 firstVisible = firstVisible - 1;
363 }
364 for (int i = firstVisible; i < fFrame.asyncMessageReturnCount(); i = i + messageArraysStep) {
365 AsyncMessageReturn m = fFrame.getAsyncMessageReturn(i);
366 if (m.hasTimeInfo()) {
367 SDTimeEvent t = new SDTimeEvent(m.getStartTime(), m.getStartOccurrence(), m);
368 fNodeList.add(t);
369 t = new SDTimeEvent(m.getEndTime(), m.getEndOccurrence(), m);
370 fNodeList.add(t);
371 if (m.getY() * fZoomValue > getContentsY() + getVisibleHeight()) {
372 break;
373 }
374 }
375 }
376
377 List<SDTimeEvent> executionOccurrencesWithTime = fFrame.getExecutionOccurrencesWithTime();
378 if (executionOccurrencesWithTime != null) {
379 fNodeList.addAll(executionOccurrencesWithTime);
380 }
381
382 SDTimeEvent[] temp = fNodeList.toArray(new SDTimeEvent[fNodeList.size()]);
383 Arrays.sort(temp, new TimeEventComparator());
384 fNodeList = Arrays.asList(temp);
385
386 Image dbuffer = null;
387 GC gcim = null;
388 try {
389 dbuffer = new Image(getDisplay(), getClientArea().width, getClientArea().height);
390 } catch (Exception e) {
391 Activator.getDefault().logError("Error creating image", e); //$NON-NLS-1$
392 }
393 gcim = new GC(dbuffer);
394 for (int i = 0; i < fNodeList.size() - 1; i++) {
395 SDTimeEvent m1 = fNodeList.get(i);
396 SDTimeEvent m2 = fNodeList.get(i + 1);
397
398 if ((SDViewPref.getInstance().excludeExternalTime()) && ((m1.getGraphNode() instanceof BaseMessage) && (m2.getGraphNode() instanceof BaseMessage))) {
399 BaseMessage mes1 = (BaseMessage) m1.getGraphNode();
400 BaseMessage mes2 = (BaseMessage) m2.getGraphNode();
401 if ((mes2.getStartLifeline() == null) || (mes1.getEndLifeline() == null)) {
402 continue;
403 }
404 }
405
406 fMinTime = fFrame.getMinTime();
407 fMaxTime = fFrame.getMaxTime();
408 ITmfTimestamp minMaxdelta = fMaxTime.getDelta(fMinTime);
409 double gr = (minMaxdelta.getValue()) / (double) 10;
410
411 ITmfTimestamp delta = m2.getTime().getDelta(m1.getTime()).getDelta(fMinTime);
412 long absDelta = Math.abs(delta.getValue());
413
414 ColorImpl color;
415 if (gr != 0) {
416 int colIndex = Math.round((float) (absDelta / gr));
417 if (colIndex < fColors.length && colIndex > 0) {
418 color = fColors[colIndex - 1];
419 } else if (colIndex <= 0) {
420 color = fColors[0];
421 } else {
422 color = fColors[fColors.length - 1];
423 }
424 } else {
425 color = fColors[0];
426 }
427
428 if (color.getColor() instanceof Color) {
429 gcim.setBackground((Color) color.getColor());
430 }
431 int y1 = ((GraphNode) m1.getGraphNode()).getY();
432 int y2 = ((GraphNode) m2.getGraphNode()).getY();
433 if (m1.getGraphNode() instanceof AsyncMessage) {
434 AsyncMessage as = (AsyncMessage) m1.getGraphNode();
435 if (as.getEndTime() == m1.getTime()) {
436 y1 += as.getHeight();
437 }
438 }
439 if (m2.getGraphNode() instanceof AsyncMessage) {
440 AsyncMessage as = (AsyncMessage) m2.getGraphNode();
441 if (as.getEndTime() == m2.getTime()) {
442 y2 += as.getHeight();
443 }
444 }
445 if (m1.getGraphNode() instanceof ExecutionOccurrence) {
446
447 ExecutionOccurrence eo = (ExecutionOccurrence) m1.getGraphNode();
448 if (m1.getEvent() == eo.getEndOccurrence()) {
449 y1 += eo.getHeight();
450 }
451
452 if (m2.getGraphNode() instanceof ExecutionOccurrence) {
453
454 ExecutionOccurrence eo2 = (ExecutionOccurrence) m2.getGraphNode();
455 if (m2.getEvent() == eo2.getEndOccurrence()) {
456 y2 += eo2.getHeight();
457 }
458
459 }
460 }
461 gcim.fillRectangle(contentsToViewX(0), contentsToViewY(Math.round(y1 * fZoomValue)), 10, Math.round((y2 - y1) * fZoomValue) + 1);
462 if (messageArraysStep == 1) {
463 Color backupColor = gcim.getForeground();
464 gcim.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
465 gcim.drawRectangle(contentsToViewX(0), contentsToViewY(Math.round(y1 * fZoomValue)), 9, Math.round((y2 - y1) * fZoomValue));
466 gcim.setForeground(backupColor);
467 }
468 }
469 if (getViewControl().isFocusControl() || isFocusControl()) {
470 gcim.drawFocus(contentsToViewX(0), contentsToViewY(Math.round(fPrevNodeY * fZoomValue)), contentsToViewX(10), Math.round((fNextNodeY - fPrevNodeY) * fZoomValue));
471 }
472 try {
473 gc.drawImage(dbuffer, 0, 0, getClientArea().width, getClientArea().height, 0, 0, getClientArea().width, getClientArea().height);
474 } catch (Exception e) {
475 Activator.getDefault().logError("Error drawing image", e); //$NON-NLS-1$
476 }
477 gcim.dispose();
478 if (dbuffer != null) {
479 dbuffer.dispose();
480 }
481 gc.dispose();
482 }
483
484 /**
485 * Checks for focus of children.
486 *
487 * @param children Control to check
488 * @return true if child is on focus else false
489 */
490 protected boolean checkFocusOnChilds(Control childs) {
491 if (childs instanceof Composite) {
492 Control[] child = ((Composite) childs).getChildren();
493 for (int i = 0; i < child.length; i++) {
494 if (child[i].isFocusControl()) {
495 return true;
496 }
497 checkFocusOnChilds(child[i]);
498 }
499 }
500 return false;
501 }
502
503 /*
504 * (non-Javadoc)
505 * @see org.eclipse.swt.widgets.Control#isFocusControl()
506 */
507 @Override
508 public boolean isFocusControl() {
509 Control[] child = getChildren();
510 for (int i = 0; i < child.length; i++) {
511 if (child[i].isFocusControl()) {
512 return true;
513 }
514 checkFocusOnChilds(child[i]);
515 }
516 return false;
517 }
518
519 /*
520 * (non-Javadoc)
521 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.ScrollView#contentsMouseMoveEvent(org.eclipse.swt.events.MouseEvent)
522 */
523 @Override
524 protected void contentsMouseMoveEvent(MouseEvent event) {
525 if (fTooltip != null) {
526 fTooltip.hideToolTip();
527 }
528 super.contentsMouseMoveEvent(event);
529 if (!isFocusControl() || getViewControl().isFocusControl()) {
530 Control[] child = getParent().getChildren();
531 for (int i = 0; i < child.length; i++) {
532 if (child[i].isFocusControl()) {
533 break;
534 }
535 }
536 }
537 setFocus(-1);
538 }
539
540 /*
541 * (non-Javadoc)
542 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.ScrollView#contentsMouseHover(org.eclipse.swt.events.MouseEvent)
543 */
544 @Override
545 protected void contentsMouseHover(MouseEvent e) {
546 if (fTooltip == null) {
547 fTooltip = new DrawableToolTip(this);
548 }
549 if (fFrame != null) {
550 setFocus(0);
551 for (int i = 0; i < fNodeList.size() - 1; i++) {
552 SDTimeEvent m1 = fNodeList.get(i);
553 SDTimeEvent m2 = fNodeList.get(i + 1);
554
555 if ((SDViewPref.getInstance().excludeExternalTime()) && ((m1.getGraphNode() instanceof BaseMessage) && (m2.getGraphNode() instanceof BaseMessage))) {
556 BaseMessage mes1 = (BaseMessage) m1.getGraphNode();
557 BaseMessage mes2 = (BaseMessage) m2.getGraphNode();
558 if ((mes2.getStartLifeline() == null) || (mes1.getEndLifeline() == null)) {
559 continue;
560 }
561 }
562
563 int y1 = ((GraphNode) m1.getGraphNode()).getY();
564 int y2 = ((GraphNode) m2.getGraphNode()).getY();
565
566 if (m1.getGraphNode() instanceof AsyncMessage) {
567 AsyncMessage as = (AsyncMessage) m1.getGraphNode();
568 if (as.getEndTime() == m1.getTime()) {
569 y1 += as.getHeight();
570 }
571 }
572 if (m2.getGraphNode() instanceof AsyncMessage) {
573 AsyncMessage as = (AsyncMessage) m2.getGraphNode();
574 if (as.getEndTime() == m2.getTime()) {
575 y2 += as.getHeight();
576 }
577 }
578 if (m1.getGraphNode() instanceof ExecutionOccurrence) {
579 ExecutionOccurrence eo = (ExecutionOccurrence) m1.getGraphNode();
580 if (m1.getEvent() == eo.getEndOccurrence()) {
581 y1 += eo.getHeight();
582 }
583
584 if (m2.getGraphNode() instanceof ExecutionOccurrence) {
585
586 ExecutionOccurrence eo2 = (ExecutionOccurrence) m2.getGraphNode();
587 if (m2.getEvent() == eo2.getEndOccurrence()) {
588 y2 += eo2.getHeight();
589 }
590 }
591 }
592 int m1Y = Math.round(y1 * fZoomValue);
593 int m2Y = Math.round(y2 * fZoomValue);
594 if ((m1Y < e.y) && (m2Y >= e.y)) {
595 ITmfTimestamp delta = m2.getTime().getDelta(m1.getTime());
596 fTooltip.showToolTip(delta, fMinTime, fMaxTime);
597 }
598 }
599 }
600 setFocus(0);
601 }
602
603 /*
604 * (non-Javadoc)
605 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.ScrollView#contentsMouseExit(org.eclipse.swt.events.MouseEvent)
606 */
607 @Override
608 protected void contentsMouseExit(MouseEvent e) {
609 if (fTooltip != null) {
610 fTooltip.hideToolTip();
611 }
612 }
613
614 /*
615 * (non-Javadoc)
616 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.ScrollView#contentsMouseUpEvent(org.eclipse.swt.events.MouseEvent)
617 */
618 @Override
619 protected void contentsMouseUpEvent(MouseEvent event) {
620 selectTimeDelta(event.y, 0);
621 setFocus();
622 super.contentsMouseUpEvent(event);
623 }
624
625 /**
626 * Force the time compression bar to highlight the event occurrences between
627 * the two given messages. The event occurrences are highlighted on the
628 * first message's end lifeline
629 *
630 * @param mes1
631 * the first message
632 * @param mes2
633 * the second message
634 */
635 public void highlightRegion(BaseMessage mes1, BaseMessage mes2) {
636 BaseMessage localMes1 = mes1;
637 BaseMessage localMes2 = mes2;
638
639 if (fFrame == null) {
640 return;
641 }
642 if (!(localMes1 instanceof ITimeRange)) {
643 return;
644 }
645 if (!(localMes2 instanceof ITimeRange)) {
646 return;
647 }
648 ITimeRange t1 = (ITimeRange) localMes1;
649 ITimeRange t2 = (ITimeRange) localMes2;
650
651 ITmfTimestamp time1 = t1.getStartTime();
652 ITmfTimestamp time2 = t2.getStartTime();
653 int event1 = localMes1.getEventOccurrence();
654 int event2 = localMes2.getEventOccurrence();
655
656 if (localMes1 instanceof AsyncMessage) {
657 AsyncMessage as = (AsyncMessage) localMes1;
658 time1 = as.getEndTime();
659 event1 = as.getEndOccurrence();
660 }
661 if (localMes2 instanceof AsyncMessage) {
662 AsyncMessage as = (AsyncMessage) localMes2;
663 if (as.getEndOccurrence() > as.getStartOccurrence()) {
664 time1 = as.getEndTime();
665 event1 = as.getEndOccurrence();
666 } else {
667 time1 = as.getStartTime();
668 event1 = as.getStartOccurrence();
669 }
670 }
671
672 if (event1 > event2) {
673 BaseMessage tempMes = localMes2;
674 localMes2 = localMes1;
675 localMes1 = tempMes;
676
677 t1 = (ITimeRange) localMes1;
678 t2 = (ITimeRange) localMes2;
679
680 time1 = t1.getStartTime();
681 time2 = t2.getStartTime();
682 event1 = localMes1.getEventOccurrence();
683 event2 = localMes2.getEventOccurrence();
684
685 if (localMes1 instanceof AsyncMessage) {
686 AsyncMessage as = (AsyncMessage) localMes1;
687 time1 = as.getEndTime();
688 event1 = as.getEndOccurrence();
689 }
690 if (localMes2 instanceof AsyncMessage) {
691 AsyncMessage as = (AsyncMessage) localMes2;
692 if (as.getEndOccurrence() > as.getStartOccurrence()) {
693 time1 = as.getEndTime();
694 event1 = as.getEndOccurrence();
695 } else {
696 time1 = as.getStartTime();
697 event1 = as.getStartOccurrence();
698 }
699 }
700 }
701
702 ITmfTimestamp minMaxdelta = fMaxTime.getDelta(fMinTime);
703 double gr = (minMaxdelta.getValue()) / (double) 10;
704
705 ITmfTimestamp delta = time2.getDelta(time1).getDelta(fMinTime);
706 long absDelta = Math.abs(delta.getValue());
707
708 int colIndex = 0;
709 if (gr != 0) {
710 colIndex = Math.round((float) (absDelta / gr));
711 if (colIndex >= fColors.length) {
712 colIndex = fColors.length - 1;
713 } else if (colIndex < 0) {
714 colIndex = 0;
715 }
716 } else {
717 colIndex = 0;
718 }
719 for (int j = 0; j < fListenerList.size(); j++) {
720 ITimeCompressionListener list = fListenerList.get(j);
721 if (localMes1.getEndLifeline() != null) {
722 list.deltaSelected(localMes1.getEndLifeline(), event1, event2 - event1, fColors[colIndex]);
723 } else if (localMes2.getStartLifeline() != null) {
724 list.deltaSelected(localMes2.getStartLifeline(), event1, event2 - event1, fColors[colIndex]);
725 } else {
726 list.deltaSelected(localMes1.getStartLifeline(), event1, event2 - event1, fColors[colIndex]);
727 }
728 }
729 }
730
731 /**
732 * Force the time compression bar to highlight the event occurrences between the two given messages. The event
733 * occurrences are highlighted on the first message's end lifeline
734 *
735 * @param mes1 the first message
736 * @param mes2 the second message
737 */
738 public void highlightRegionSync(final BaseMessage mes1, final BaseMessage mes2) {
739 getDisplay().syncExec(new Runnable() {
740 @Override
741 public void run() {
742 highlightRegion(mes1, mes2);
743 }
744 });
745 }
746
747 /*
748 * (non-Javadoc)
749 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.ScrollView#scrollBy(int, int)
750 */
751 @Override
752 public void scrollBy(int x, int y) {
753 }
754
755 /**
756 * Sets the zoom value.
757 *
758 * @param value The zoom value to set.
759 */
760 public void setZoom(float value) {
761 fZoomValue = value;
762 redraw();
763 }
764
765 /**
766 * Adds a listener to the time compression listener list to be notified about selected deltas.
767 *
768 * @param listener The listener to add
769 */
770 public void addTimeCompressionListener(ITimeCompressionListener listener) {
771 if (!fListenerList.contains(listener)) {
772 fListenerList.add(listener);
773 }
774 }
775
776 /**
777 * Removes a time compression listener.
778 *
779 * @param listener The listener to remove.
780 */
781 public void removeSelectionChangedListener(ITimeCompressionListener listener) {
782 fListenerList.remove(listener);
783 }
784
785 /*
786 * (non-Javadoc)
787 * @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent)
788 */
789 @Override
790 public void widgetDisposed(DisposeEvent e) {
791 if (fTooltip != null) {
792 fTooltip.dispose();
793 }
794 super.removeDisposeListener(this);
795 for (int i = 0; i < fColors.length; i++) {
796 fColors[i].dispose();
797 }
798 }
799
800 /*
801 * (non-Javadoc)
802 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.ScrollView#keyPressedEvent(org.eclipse.swt.events.KeyEvent)
803 */
804 @Override
805 protected void keyPressedEvent(KeyEvent event) {
806 if (fTooltip != null) {
807 fTooltip.hideToolTip();
808 }
809 if (!isFocusControl() || getViewControl().isFocusControl()) {
810 Control[] child = getParent().getChildren();
811 for (int i = 0; i < child.length; i++) {
812 if (child[i].isFocusControl()) {
813 // getViewControl().setFocus();
814 break;
815 }
816 }
817 }
818 setFocus(-1);
819
820 boolean top = false;
821 if (fNextNodeY == 0) {
822 top = true;
823 }
824 if ((fFrame != null) && (fNextNodeY == 0)) {
825 for (int i = 0; i < fNodeList.size() - 1 && i < 1; i++) {
826 SDTimeEvent m1 = fNodeList.get(i);
827 SDTimeEvent m2 = fNodeList.get(i + 1);
828 if ((SDViewPref.getInstance().excludeExternalTime()) && ((m1.getGraphNode() instanceof BaseMessage) && (m2.getGraphNode() instanceof BaseMessage))) {
829 BaseMessage mes1 = (BaseMessage) m1.getGraphNode();
830 BaseMessage mes2 = (BaseMessage) m2.getGraphNode();
831 if ((mes2.getStartLifeline() == null) || (mes1.getEndLifeline() == null)) {
832 continue;
833 }
834 }
835
836 int y1 = ((GraphNode) m1.getGraphNode()).getY();
837 int y2 = ((GraphNode) m2.getGraphNode()).getY();
838 if (m1.getGraphNode() instanceof AsyncMessage) {
839 AsyncMessage as = (AsyncMessage) m1.getGraphNode();
840 if (as.getEndTime() == m1.getTime()) {
841 y1 += as.getHeight();
842 }
843 }
844 if (m2.getGraphNode() instanceof AsyncMessage) {
845 AsyncMessage as = (AsyncMessage) m2.getGraphNode();
846 if (as.getEndTime() == m2.getTime()) {
847 y2 += as.getHeight();
848 }
849 }
850 if (m1.getGraphNode() instanceof ExecutionOccurrence) {
851 ExecutionOccurrence eo = (ExecutionOccurrence) m1.getGraphNode();
852 if (m1.getEvent() == eo.getEndOccurrence()) {
853 y1 += eo.getHeight();
854 }
855
856 if (m2.getGraphNode() instanceof ExecutionOccurrence) {
857
858 ExecutionOccurrence eo2 = (ExecutionOccurrence) m2.getGraphNode();
859 if (m2.getEvent() == eo2.getEndOccurrence()) {
860 y2 += eo2.getHeight();
861 }
862 }
863 }
864 fPrevNodeY = Math.round(y1 * fZoomValue);
865 fNextNodeY = Math.round(y2 * fZoomValue);
866 }
867 }
868
869 if (fLifeline != null) {
870 for (int j = 0; j < fListenerList.size(); j++) {
871 ITimeCompressionListener list = fListenerList.get(j);
872 list.deltaSelected(fLifeline, fLifelineStart, fLifelineNumEvents, fLifelineColor);
873 }
874 }
875
876 if (event.keyCode == SWT.ARROW_DOWN) {
877 if (!top) {
878 selectTimeDelta(fNextNodeY + 1, 1);
879 } else {
880 selectTimeDelta(fPrevNodeY + 1, 1);
881 }
882 setFocus(1);
883 } else if (event.keyCode == SWT.ARROW_UP) {
884 selectTimeDelta(fPrevNodeY - 1, 2);
885 setFocus(1);
886 } else if (event.keyCode == SWT.ARROW_RIGHT) {
887 selectTimeDelta(fPrevNodeY, 1);
888 setFocus(1);
889 }
890 super.keyPressedEvent(event);
891 }
892
893 /**
894 * Selects the time delta for given delta y coordinate and direction.
895 *
896 * @param dy The delta in y coordinate.
897 * @param direction 0 no direction, 1 = down, 2 = up
898 */
899 protected void selectTimeDelta(int dy, int direction) {
900 SDTimeEvent lastM1 = null;
901 SDTimeEvent lastM2 = null;
902 int lastY1 = 0;
903 int lastY2 = 0;
904 boolean done = false;
905 if (fFrame != null) {
906 for (int i = 0; i < fNodeList.size() - 1; i++) {
907 SDTimeEvent m1 = fNodeList.get(i);
908 SDTimeEvent m2 = fNodeList.get(i + 1);
909 if ((SDViewPref.getInstance().excludeExternalTime()) && ((m1.getGraphNode() instanceof BaseMessage) && (m2.getGraphNode() instanceof BaseMessage))) {
910 BaseMessage mes1 = (BaseMessage) m1.getGraphNode();
911 BaseMessage mes2 = (BaseMessage) m2.getGraphNode();
912 if ((mes2.getStartLifeline() == null) || (mes1.getEndLifeline() == null)) {
913 continue;
914 }
915 }
916
917 int y1 = ((GraphNode) m1.getGraphNode()).getY();
918 int y2 = ((GraphNode) m2.getGraphNode()).getY();
919 if (m1.getGraphNode() instanceof AsyncMessage) {
920 AsyncMessage as = (AsyncMessage) m1.getGraphNode();
921 if (as.getEndTime() == m1.getTime()) {
922 y1 += as.getHeight();
923 }
924 }
925 if (m2.getGraphNode() instanceof AsyncMessage) {
926 AsyncMessage as = (AsyncMessage) m2.getGraphNode();
927 if (as.getEndTime() == m2.getTime()) {
928 y2 += as.getHeight();
929 }
930 }
931 if (m1.getGraphNode() instanceof ExecutionOccurrence) {
932 ExecutionOccurrence eo = (ExecutionOccurrence) m1.getGraphNode();
933 if (m1.getEvent() == eo.getEndOccurrence()) {
934 y1 += eo.getHeight();
935 }
936
937 if (m2.getGraphNode() instanceof ExecutionOccurrence) {
938 ExecutionOccurrence eo2 = (ExecutionOccurrence) m2.getGraphNode();
939 if (m2.getEvent() == eo2.getEndOccurrence()) {
940 y2 += eo2.getHeight();
941 }
942 }
943 }
944 int m1Y = Math.round(y1 * fZoomValue);
945 int m2Y = Math.round(y2 * fZoomValue);
946
947 if ((m1Y < dy) && (m2Y > dy) || (!done && m2Y > dy && direction == 1 && lastM1 != null) || (!done && m1Y > dy && direction == 2 && lastM1 != null)) {
948 if (m1Y > dy && direction == 2) {
949 m1 = lastM1;
950 m2 = lastM2;
951 m1Y = lastY1;
952 m2Y = lastY2;
953 }
954 done = true;
955 fPrevNodeY = m1Y;
956 fNextNodeY = m2Y;
957 ITmfTimestamp minMaxdelta = fMaxTime.getDelta(fMinTime);
958 double gr = (minMaxdelta.getValue()) / (double) 10;
959
960 ITmfTimestamp delta = m2.getTime().getDelta(m1.getTime()).getDelta(fMinTime);
961 long absDelta = Math.abs(delta.getValue());
962
963 int colIndex = 0;
964 if (gr != 0) {
965 colIndex = Math.round((float) (absDelta / gr));
966 if (colIndex >= fColors.length) {
967 colIndex = fColors.length - 1;
968 } else if (colIndex < 0) {
969 colIndex = 0;
970 }
971 } else {
972 colIndex = 0;
973 }
974 if (m1.getGraphNode() instanceof BaseMessage) {
975 BaseMessage mes1 = (BaseMessage) m1.getGraphNode();
976 if (mes1.getEndLifeline() != null) {
977 fLifeline = mes1.getEndLifeline();
978 fLifelineStart = m1.getEvent();
979 fLifelineNumEvents = m2.getEvent() - m1.getEvent();
980 fLifelineColor = fColors[colIndex];
981 } else if (m2.getGraphNode() instanceof BaseMessage && ((BaseMessage) m2.getGraphNode()).getStartLifeline() != null) {
982 fLifeline = ((BaseMessage) m2.getGraphNode()).getStartLifeline();
983 fLifelineStart = m1.getEvent();
984 fLifelineNumEvents = m2.getEvent() - m1.getEvent();
985 fLifelineColor = fColors[colIndex];
986 } else {
987 fLifeline = mes1.getStartLifeline();
988 fLifelineStart = m1.getEvent();
989 fLifelineNumEvents = m2.getEvent() - m1.getEvent();
990 fLifelineColor = fColors[colIndex];
991 }
992 } else if (m1.getGraphNode() instanceof ExecutionOccurrence) {
993 if (m2.getGraphNode() instanceof ExecutionOccurrence) {
994 ExecutionOccurrence eo = (ExecutionOccurrence) m2.getGraphNode();
995 fLifeline = eo.getLifeline();
996 fLifelineStart = m1.getEvent();
997 fLifelineNumEvents = m2.getEvent() - m1.getEvent();
998 fLifelineColor = fColors[colIndex];
999 } else {
1000 ExecutionOccurrence eo = (ExecutionOccurrence) m1.getGraphNode();
1001 fLifeline = eo.getLifeline();
1002 fLifelineStart = m1.getEvent();
1003 fLifelineNumEvents = m2.getEvent() - m1.getEvent();
1004 fLifelineColor = fColors[colIndex];
1005 }
1006 }
1007 for (int j = 0; j < fListenerList.size(); j++) {
1008 ITimeCompressionListener list = fListenerList.get(j);
1009 list.deltaSelected(fLifeline, fLifelineStart, fLifelineNumEvents, fLifelineColor);
1010 }
1011 break;
1012 }
1013 lastM1 = m1;
1014 lastM2 = m2;
1015 lastY1 = m1Y;
1016 lastY2 = m2Y;
1017 }
1018 }
1019 }
1020
1021 /**
1022 * Creates a fake tool tip.
1023 */
1024 protected void createFakeTooltip() {
1025 if (fTooltip == null) {
1026 fTooltip = new DrawableToolTip(this);
1027 }
1028
1029 if (fFrame != null) {
1030 setFocus(0);
1031 for (int i = 0; i < fNodeList.size() - 1; i++) {
1032 SDTimeEvent m1 = fNodeList.get(i);
1033 SDTimeEvent m2 = fNodeList.get(i + 1);
1034
1035 if ((SDViewPref.getInstance().excludeExternalTime()) && ((m1.getGraphNode() instanceof BaseMessage) && (m2.getGraphNode() instanceof BaseMessage))) {
1036 BaseMessage mes1 = (BaseMessage) m1.getGraphNode();
1037 BaseMessage mes2 = (BaseMessage) m2.getGraphNode();
1038 if ((mes2.getStartLifeline() == null) || (mes1.getEndLifeline() == null)) {
1039 continue;
1040 }
1041 }
1042
1043 int y1 = ((GraphNode) m1.getGraphNode()).getY();
1044 int y2 = ((GraphNode) m2.getGraphNode()).getY();
1045
1046 if (m1.getGraphNode() instanceof AsyncMessage) {
1047 AsyncMessage as = (AsyncMessage) m1.getGraphNode();
1048 if (as.getEndTime() == m1.getTime()) {
1049 y1 += as.getHeight();
1050 }
1051 }
1052 if (m2.getGraphNode() instanceof AsyncMessage) {
1053 AsyncMessage as = (AsyncMessage) m2.getGraphNode();
1054 if (as.getEndTime() == m2.getTime()) {
1055 y2 += as.getHeight();
1056 }
1057 }
1058 if (m1.getGraphNode() instanceof ExecutionOccurrence) {
1059 ExecutionOccurrence eo = (ExecutionOccurrence) m1.getGraphNode();
1060 if (m1.getEvent() == eo.getEndOccurrence()) {
1061 y1 += eo.getHeight();
1062 }
1063
1064 if (m2.getGraphNode() instanceof ExecutionOccurrence) {
1065
1066 ExecutionOccurrence eo2 = (ExecutionOccurrence) m2.getGraphNode();
1067 if (m2.getEvent() == eo2.getEndOccurrence()) {
1068 y2 += eo2.getHeight();
1069 }
1070 }
1071 }
1072 int m1Y = Math.round(y1 * fZoomValue);
1073 int m2Y = Math.round(y2 * fZoomValue);
1074 if ((m1Y < fPrevNodeY + 1) && (m2Y >= fPrevNodeY + 1)) {
1075 ITmfTimestamp delta = m2.getTime().getDelta(m1.getTime());
1076 fTooltip.showToolTip(delta, fMinTime, fMaxTime);
1077 fTooltip.hideToolTip();
1078 }
1079 }
1080 }
1081 }
1082
1083 /**
1084 * Traverse Listener implementation.
1085 */
1086 protected static class LocalTraverseListener implements TraverseListener {
1087
1088 /*
1089 * (non-Javadoc)
1090 * @see org.eclipse.swt.events.TraverseListener#keyTraversed(org.eclipse.swt.events.TraverseEvent)
1091 */
1092 @Override
1093 public void keyTraversed(TraverseEvent e) {
1094 if ((e.detail == SWT.TRAVERSE_TAB_NEXT) || (e.detail == SWT.TRAVERSE_TAB_PREVIOUS)) {
1095 e.doit = true;
1096 }
1097 }
1098 }
1099 }
This page took 0.057412 seconds and 6 git commands to generate.