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