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