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