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