[Bug 303523] LTTng/TMF udpates:
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.ui / src / org / eclipse / linuxtools / tmf / ui / viewers / timeAnalysis / widgets / TmfTimeStatesCtrl.java
CommitLineData
b0d3496e
ASL
1/*****************************************************************************\r
2 * Copyright (c) 2007, 2008 Intel Corporation.\r
3 * All rights reserved. This program and the accompanying materials\r
4 * are made available under the terms of the Eclipse Public License v1.0\r
5 * which accompanies this distribution, and is available at\r
6 * http://www.eclipse.org/legal/epl-v10.html\r
7 *\r
8 * Contributors:\r
9 * Intel Corporation - Initial API and implementation\r
10 * Ruslan A. Scherbakov, Intel - Initial API and implementation\r
11 * Alvaro Sanchex-Leon - Udpated for TMF\r
12 *\r
13 * $Id: ThreadStatesCtrl.java,v 1.15 2008/07/11 13:49:01 aalexeev Exp $ \r
14 *****************************************************************************/\r
15\r
16package org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.widgets;\r
17\r
18import java.util.ArrayList;\r
19import java.util.HashMap;\r
20import java.util.Iterator;\r
21import java.util.List;\r
22import java.util.Map;\r
23import java.util.Vector;\r
24\r
25import org.eclipse.jface.viewers.ISelection;\r
26import org.eclipse.jface.viewers.ISelectionChangedListener;\r
27import org.eclipse.jface.viewers.ISelectionProvider;\r
28import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.Messages;\r
29import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.TmfTimeAnalysisProvider;\r
30import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.ITimeEvent;\r
31import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.ITmfTimeAnalysisEntry;\r
32import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.TimeEvent;\r
33import org.eclipse.osgi.util.NLS;\r
34import org.eclipse.swt.SWT;\r
35import org.eclipse.swt.events.ControlEvent;\r
36import org.eclipse.swt.events.ControlListener;\r
37import org.eclipse.swt.events.FocusEvent;\r
38import org.eclipse.swt.events.FocusListener;\r
39import org.eclipse.swt.events.KeyEvent;\r
40import org.eclipse.swt.events.KeyListener;\r
41import org.eclipse.swt.events.MouseEvent;\r
42import org.eclipse.swt.events.MouseListener;\r
43import org.eclipse.swt.events.MouseMoveListener;\r
44import org.eclipse.swt.events.MouseTrackListener;\r
45import org.eclipse.swt.events.MouseWheelListener;\r
46import org.eclipse.swt.events.PaintEvent;\r
47import org.eclipse.swt.events.SelectionEvent;\r
48import org.eclipse.swt.events.SelectionListener;\r
49import org.eclipse.swt.events.TraverseEvent;\r
50import org.eclipse.swt.events.TraverseListener;\r
51import org.eclipse.swt.graphics.Cursor;\r
52import org.eclipse.swt.graphics.GC;\r
53import org.eclipse.swt.graphics.Image;\r
54import org.eclipse.swt.graphics.Point;\r
55import org.eclipse.swt.graphics.Rectangle;\r
56import org.eclipse.swt.widgets.Composite;\r
b0d3496e
ASL
57import org.eclipse.swt.widgets.ScrollBar;\r
58\r
41dc35d0
FC
59/**\r
60 * @author alvaro\r
61 * \r
62 */\r
b0d3496e
ASL
63public class TmfTimeStatesCtrl extends TraceCtrl implements FocusListener,\r
64 KeyListener, MouseMoveListener, MouseListener, MouseWheelListener,\r
65 ControlListener, SelectionListener, MouseTrackListener,\r
66 TraverseListener, ISelectionProvider {\r
67\r
68 public static final boolean DEFAULT_DRAW_THREAD_JOIN = true;\r
69 public static final boolean DEFAULT_DRAW_THREAD_WAIT = true;\r
70 public static final boolean DEFAULT_DRAW_THREAD_RELEASE = true;\r
b0d3496e
ASL
71\r
72 private final double zoomCoeff = 1.5;\r
73\r
74 private ITimeDataProvider _timeProvider;\r
75 private boolean _isInFocus = false;\r
76 private boolean _isDragCursor3 = false;\r
41dc35d0 77 private boolean _isWaitCursor = true;\r
b0d3496e 78 private boolean _mouseHover = false;\r
79a3a76e 79 private int _itemHeightDefault = 18;\r
b0d3496e
ASL
80 private int _itemHeight = _itemHeightDefault;\r
81 private int _topItem = 0;\r
82 private int _dragState = 0;\r
83 private int _hitIdx = 0;\r
84 private int _dragX0 = 0;\r
85 private int _dragX = 0;\r
86 private int _idealNameWidth = 0;\r
79a3a76e
FC
87 // TODO: 050409\r
88 private double _timeStep = 0.001;\r
b0d3496e
ASL
89 // private double _timeStep = 10000000;\r
90 private long _time0bak;\r
91 private long _time1bak;\r
92 private TmfTimeAnalysisProvider utilImpl = null;\r
93 private ItemData _data = null;\r
94 private List<SelectionListener> _selectionListeners;\r
95 private List<ISelectionChangedListener> _selectionChangedListeners = new ArrayList<ISelectionChangedListener>();\r
96 private Rectangle _rect0 = new Rectangle(0, 0, 0, 0);\r
97 private Rectangle _rect1 = new Rectangle(0, 0, 0, 0);\r
98 private Cursor _dragCursor3;\r
41dc35d0 99 private Cursor _WaitCursor;\r
b0d3496e
ASL
100 private boolean drawTracesInteraction = false;\r
101 private boolean drawTraceJoins = DEFAULT_DRAW_THREAD_JOIN;\r
102 private boolean drawTraceWaits = DEFAULT_DRAW_THREAD_WAIT;\r
103 private boolean drawTraceReleases = DEFAULT_DRAW_THREAD_RELEASE;\r
104\r
105 // Vertical formatting formatting for the state control view\r
106 private boolean _visibleVerticalScroll = true;\r
107 private int _borderWidth = 0;\r
108 private int _headerHeight = 0;\r
109\r
b0d3496e
ASL
110 public TmfTimeStatesCtrl(Composite parent, TraceColorScheme colors,\r
111 TmfTimeAnalysisProvider rutilImp) {\r
112\r
113 super(parent, colors, SWT.NO_BACKGROUND | SWT.V_SCROLL | SWT.H_SCROLL\r
114 | SWT.DOUBLE_BUFFERED);\r
115\r
116 this.utilImpl = rutilImp;\r
117 _data = new ItemData(utilImpl);\r
118\r
119 addFocusListener(this);\r
120 addMouseListener(this);\r
121 addMouseMoveListener(this);\r
122 addMouseTrackListener(this);\r
123 addMouseWheelListener(this);\r
124 addTraverseListener(this);\r
125 addKeyListener(this);\r
126 addControlListener(this);\r
127 ScrollBar scrollVer = getVerticalBar();\r
128 ScrollBar scrollHor = getHorizontalBar();\r
129 if (scrollVer != null) {\r
130 scrollVer.addSelectionListener(this);\r
131 scrollVer.setVisible(_visibleVerticalScroll);\r
132 }\r
133\r
134 if (scrollHor != null) {\r
135 scrollHor.addSelectionListener(this);\r
136 }\r
b0d3496e
ASL
137\r
138 _dragCursor3 = new Cursor(super.getDisplay(), SWT.CURSOR_SIZEWE);\r
41dc35d0 139 _WaitCursor = new Cursor(super.getDisplay(), SWT.CURSOR_WAIT);\r
b0d3496e
ASL
140 }\r
141\r
4e3aa37d 142 @Override\r
b0d3496e
ASL
143 public void dispose() {\r
144 super.dispose();\r
145 _dragCursor3.dispose();\r
41dc35d0 146 _WaitCursor.dispose();\r
b0d3496e
ASL
147 }\r
148\r
149 public void setTimeProvider(ITimeDataProvider timeProvider) {\r
150 _timeProvider = timeProvider;\r
151 adjustScrolls();\r
152 redraw();\r
153 }\r
154\r
155 public void addSelectionListener(SelectionListener listener) {\r
156 if (listener == null)\r
157 SWT.error(SWT.ERROR_NULL_ARGUMENT);\r
158 if (null == _selectionListeners)\r
159 _selectionListeners = new ArrayList<SelectionListener>();\r
160 _selectionListeners.add(listener);\r
161 }\r
162\r
163 public void removeSelectionListener(SelectionListener listener) {\r
164 if (null != _selectionListeners)\r
165 _selectionListeners.remove(listener);\r
166 }\r
167\r
168 public void fireSelectionChanged() {\r
169 if (null != _selectionListeners) {\r
170 Iterator<SelectionListener> it = _selectionListeners.iterator();\r
171 while (it.hasNext()) {\r
172 SelectionListener listener = it.next();\r
173 listener.widgetSelected(null);\r
174 }\r
175 }\r
176 }\r
177\r
178 public void fireDefaultSelection() {\r
179 if (null != _selectionListeners) {\r
180 Iterator<SelectionListener> it = _selectionListeners.iterator();\r
181 while (it.hasNext()) {\r
182 SelectionListener listener = it.next();\r
183 listener.widgetDefaultSelected(null);\r
184 }\r
185 }\r
186 }\r
187\r
188 public Object[] getTraces() {\r
189 return _data.getTraces();\r
190 }\r
191\r
192 public boolean[] getTraceFilter() {\r
193 return _data.getTraceFilter();\r
194 }\r
195\r
196 public void refreshData() {\r
197 _data.refreshData();\r
198 adjustScrolls();\r
199 redraw();\r
200 }\r
201\r
202 public void refreshData(Object traces[]) {\r
203 _data.refreshData(traces);\r
204 adjustScrolls();\r
205 redraw();\r
206 }\r
207\r
208 public void refreshPartial(ITmfTimeAnalysisEntry parent, TimeEvent item) {\r
209 _data.refreshPartial(parent, item);\r
210 adjustScrolls();\r
211 redraw();\r
212 }\r
213\r
214 public void adjustScrolls() {\r
215 if (null == _timeProvider) {\r
216 getVerticalBar().setValues(0, 1, 1, 1, 1, 1);\r
217 getHorizontalBar().setValues(0, 1, 1, 1, 1, 1);\r
218 return;\r
219 }\r
b0d3496e
ASL
220 int page = countPerPage();\r
221 if (_topItem + page > _data._items.length)\r
222 _topItem = _data._items.length - page;\r
223 if (_topItem < 0)\r
224 _topItem = 0;\r
225 getVerticalBar().setValues(_topItem, 0, _data._items.length, page, 1,\r
226 page);\r
b0d3496e
ASL
227 long time0 = _timeProvider.getTime0();\r
228 long time1 = _timeProvider.getTime1();\r
b0d3496e
ASL
229 long timeMin = _timeProvider.getMinTime();\r
230 long timeMax = _timeProvider.getMaxTime();\r
231\r
79a3a76e
FC
232 // int timePage = (int) ((time1 - time0) / _timeStep);\r
233 // int timePos = (int) (time0 / _timeStep);\r
234 // int minimum = (int) (timeMin / _timeStep);\r
235 // int maximum = (int) (timeMax / _timeStep);\r
236\r
b0d3496e
ASL
237 long delta = timeMax - timeMin;\r
238\r
239 int timePos = 0;\r
79a3a76e
FC
240 int timePage = 0;\r
241 // Trace.debug("time0 - time1 = " + (time0 - timeMin));\r
b0d3496e 242 if (delta != 0) {\r
79a3a76e
FC
243 timePage = (int) (((double) (time1 - time0) / _timeStep) / delta);\r
244 timePos = (int) (((double) (time0 - timeMin) / _timeStep) / delta);\r
b0d3496e
ASL
245 }\r
246\r
79a3a76e
FC
247 int minimum = 0;\r
248 int maximum = 1000;\r
249 // Trace.debug("time0:" + time0 + " time1:" + time1 + " timeStep:"\r
250 // + _timeStep + " delta:" + delta);\r
251 // Trace.debug("selection:" + timePos + " min:" + minimum + " maximum:"\r
252 // + maximum + " Page:" + timePage);\r
253 getHorizontalBar().setValues(timePos, minimum, maximum, timePage, 1,\r
254 timePage);\r
b0d3496e
ASL
255 }\r
256\r
257 boolean ensureVisibleItem(int idx, boolean redraw) {\r
258 boolean changed = false;\r
259 if (idx < 0) {\r
260 for (idx = 0; idx < _data._items.length; idx++) {\r
261 if (((Item) _data._items[idx])._selected)\r
262 break;\r
263 }\r
264 }\r
265 if (idx >= _data._items.length)\r
266 return changed;\r
267 if (idx < _topItem) {\r
268 _topItem = idx;\r
269 getVerticalBar().setSelection(_topItem);\r
270 if (redraw)\r
271 redraw();\r
272 changed = true;\r
273 } else {\r
274 int page = countPerPage();\r
275 if (idx >= _topItem + page) {\r
276 _topItem = idx - page + 1;\r
277 getVerticalBar().setSelection(_topItem);\r
278 if (redraw)\r
279 redraw();\r
280 changed = true;\r
281 }\r
282 }\r
283 return changed;\r
284 }\r
285\r
286 public ISelection getSelection() {\r
287 PlainSelection sel = new PlainSelection();\r
288 ITmfTimeAnalysisEntry trace = getSelectedTrace();\r
289 if (null != trace && null != _timeProvider) {\r
290 long selectedTime = _timeProvider.getSelectedTime();\r
291 ITimeEvent event = Utils.findEvent(trace, selectedTime, 0);\r
292 if (event != null)\r
293 sel.add(event);\r
294 else\r
295 sel.add(trace);\r
296 }\r
297 return sel;\r
298 }\r
299\r
300 public ISelection getSelectionTrace() {\r
301 PlainSelection sel = new PlainSelection();\r
302 ITmfTimeAnalysisEntry trace = getSelectedTrace();\r
303 if (null != trace) {\r
304 sel.add(trace);\r
305 }\r
306 return sel;\r
307 }\r
308\r
309 public void selectTrace(int n) {\r
310 if (n != 1 && n != -1)\r
311 return;\r
312 boolean changed = false;\r
313 int lastSelection = -1;\r
314 for (int i = 0; i < _data._items.length; i++) {\r
315 Item item = (Item) _data._items[i];\r
316 if (item._selected) {\r
317 lastSelection = i;\r
318 if (1 == n && i < _data._items.length - 1) {\r
319 item._selected = false;\r
320 if (item._hasChildren)\r
321 _data.expandItem(i, true);\r
322 item = (Item) _data._items[i + 1];\r
323 if (item._hasChildren) {\r
324 _data.expandItem(i + 1, true);\r
325 item = (Item) _data._items[i + 2];\r
326 }\r
327 item._selected = true;\r
328 changed = true;\r
329 } else if (-1 == n && i > 0) {\r
330 i--;\r
331 Item prevItem = (Item) _data._items[i];\r
332 if (prevItem._hasChildren) {\r
333 if (prevItem._expanded) {\r
334 if (i > 0) {\r
335 i--;\r
336 prevItem = (Item) _data._items[i];\r
337 }\r
338 }\r
339 if (!prevItem._expanded) {\r
340 int added = _data.expandItem(i, true);\r
341 prevItem = (Item) _data._items[i + added];\r
342 item._selected = false;\r
343 prevItem._selected = true;\r
344 changed = true;\r
345 }\r
346 } else {\r
347 item._selected = false;\r
348 prevItem._selected = true;\r
349 changed = true;\r
350 }\r
351 }\r
352 break;\r
353 }\r
354 }\r
355 if (lastSelection < 0 && _data._items.length > 0) {\r
356 Item item = (Item) _data._items[0];\r
357 if (item._hasChildren) {\r
358 _data.expandItem(0, true);\r
359 item = (Item) _data._items[1];\r
360 item._selected = true;\r
361 changed = true;\r
362 } else {\r
363 item._selected = true;\r
364 changed = true;\r
365 }\r
366 }\r
367 if (changed) {\r
368 ensureVisibleItem(-1, false);\r
369 redraw();\r
370 fireSelectionChanged();\r
371 }\r
372 }\r
373\r
374 public void selectEvent(int n) {\r
375 if (null == _timeProvider)\r
376 return;\r
377 ITmfTimeAnalysisEntry trace = getSelectedTrace();\r
79a3a76e 378 if (trace == _timeProvider)\r
b0d3496e
ASL
379 return;\r
380 long selectedTime = _timeProvider.getSelectedTime();\r
381 long endTime = _timeProvider.getEndTime();\r
382 ITimeEvent nextEvent;\r
79a3a76e 383 if (-1 == n && selectedTime >= endTime)\r
b0d3496e
ASL
384 nextEvent = Utils.findEvent(trace, selectedTime, 0);\r
385 else\r
386 nextEvent = Utils.findEvent(trace, selectedTime, n);\r
387 if (null == nextEvent && -1 == n)\r
388 nextEvent = Utils.getFirstEvent(trace);\r
389 if (null != nextEvent) {\r
390 _timeProvider.setSelectedTimeInt(nextEvent.getTime(), true);\r
391 fireSelectionChanged();\r
392 } else if (1 == n) {\r
393 _timeProvider.setSelectedTimeInt(endTime, true);\r
394 fireSelectionChanged();\r
395 }\r
396 }\r
397\r
398 public void selectNextEvent() {\r
399 selectEvent(1);\r
400 }\r
401\r
402 public void selectPrevEvent() {\r
403 selectEvent(-1);\r
404 }\r
405\r
406 public void selectNextTrace() {\r
407 selectTrace(1);\r
408 }\r
409\r
410 public void selectPrevTrace() {\r
411 selectTrace(-1);\r
412 }\r
413\r
b0d3496e
ASL
414 public void zoomIn() {\r
415 long _time0 = _timeProvider.getTime0();\r
416 long _time1 = _timeProvider.getTime1();\r
417 long _range = _time1 - _time0;\r
418 long selTime = _timeProvider.getSelectedTime();\r
419 if (selTime <= _time0 || selTime >= _time1) {\r
420 selTime = (_time0 + _time1) / 2;\r
421 }\r
422 long time0 = selTime - (long) ((selTime - _time0) / zoomCoeff);\r
423 long time1 = selTime + (long) ((_time1 - selTime) / zoomCoeff);\r
424\r
425 long inaccuracy = (_timeProvider.getMaxTime() - _timeProvider\r
426 .getMinTime())\r
427 - (time1 - time0);\r
428\r
429 // Trace.debug("selTime:" + selTime + " time0:" + time0 + " time1:"\r
430 // + time1 + " inaccuracy:" + inaccuracy);\r
431\r
432 if (inaccuracy > 0 && inaccuracy < 100) {\r
79a3a76e 433 _timeProvider.setStartFinishTime(_timeProvider.getMinTime(),\r
b0d3496e
ASL
434 _timeProvider.getMaxTime());\r
435 return;\r
436 }\r
437\r
438 long m = _timeProvider.getMinTimeInterval();\r
439 if ((time1 - time0) < m) {\r
440 time0 = selTime - (long) ((selTime - _time0) * m / _range);\r
441 time1 = time0 + m;\r
442 }\r
443\r
79a3a76e 444 _timeProvider.setStartFinishTime(time0, time1);\r
b0d3496e
ASL
445 }\r
446\r
b0d3496e
ASL
447 public void zoomOut() {\r
448 long _time0 = _timeProvider.getTime0();\r
449 long _time1 = _timeProvider.getTime1();\r
450 long selTime = _timeProvider.getSelectedTime();\r
451 if (selTime <= _time0 || selTime >= _time1) {\r
452 selTime = (_time0 + _time1) / 2;\r
453 }\r
454 long time0 = (long) (selTime - (selTime - _time0) * zoomCoeff);\r
455 long time1 = (long) (selTime + (_time1 - selTime) * zoomCoeff);\r
456\r
457 long inaccuracy = (_timeProvider.getMaxTime() - _timeProvider\r
458 .getMinTime())\r
459 - (time1 - time0);\r
460 if (inaccuracy > 0 && inaccuracy < 100) {\r
79a3a76e 461 _timeProvider.setStartFinishTime(_timeProvider.getMinTime(),\r
b0d3496e
ASL
462 _timeProvider.getMaxTime());\r
463 return;\r
464 }\r
465\r
79a3a76e 466 _timeProvider.setStartFinishTime(time0, time1);\r
b0d3496e
ASL
467 }\r
468\r
469 public void groupTraces(boolean on) {\r
470 _data.groupTraces(on);\r
471 adjustScrolls();\r
472 redraw();\r
473 }\r
474\r
475 public void toggleTraceInteractionDrawing() {\r
476 drawTracesInteraction = !drawTracesInteraction;\r
477 redraw();\r
478 }\r
479\r
480 public void setTraceJoinDrawing(boolean on) {\r
481 drawTraceJoins = on;\r
482 drawTracesInteraction = true;\r
483 redraw();\r
484 }\r
485\r
486 public void setTraceWaitDrawing(boolean on) {\r
487 drawTraceWaits = on;\r
488 drawTracesInteraction = true;\r
489 redraw();\r
490 }\r
491\r
492 public void setTraceReleaseDrawing(boolean on) {\r
493 drawTraceReleases = on;\r
494 drawTracesInteraction = true;\r
495 redraw();\r
496 }\r
497\r
498 public boolean getTracesInteractionDrawing() {\r
499 return drawTracesInteraction;\r
500 }\r
501\r
502 public boolean getTraceJoinDrawing() {\r
503 return drawTraceJoins;\r
504 }\r
505\r
506 public boolean getTraceWaitDrawing() {\r
507 return drawTraceWaits;\r
508 }\r
509\r
510 public boolean getTraceReleaseDrawing() {\r
511 return drawTraceReleases;\r
512 }\r
513\r
514 public ITmfTimeAnalysisEntry getSelectedTrace() {\r
515 ITmfTimeAnalysisEntry trace = null;\r
516 int idx = getSelectedIndex();\r
517 if (idx >= 0 && _data._items[idx] instanceof TraceItem)\r
518 trace = ((TraceItem) _data._items[idx])._trace;\r
519 return trace;\r
520 }\r
521\r
522 public int getSelectedIndex() {\r
523 int idx = -1;\r
524 for (int i = 0; i < _data._items.length; i++) {\r
525 Item item = (Item) _data._items[i];\r
526 if (item._selected) {\r
527 idx = i;\r
528 break;\r
529 }\r
530 }\r
531 return idx;\r
532 }\r
533\r
534 boolean toggle(int idx) {\r
535 boolean toggled = false;\r
536 if (idx >= 0 && idx < _data._items.length) {\r
537 Item item = (Item) _data._items[idx];\r
538 if (item._hasChildren) {\r
539 item._expanded = !item._expanded;\r
540 _data.updateItems();\r
541 adjustScrolls();\r
542 redraw();\r
543 toggled = true;\r
544 }\r
545 }\r
546 return toggled;\r
547 }\r
548\r
549 int hitTest(int x, int y) {\r
550 if (x < 0 || y < 0)\r
551 return -1;\r
552 int hit = -1;\r
553 int idx = y / _itemHeight;\r
554 idx += _topItem;\r
555 if (idx < _data._items.length)\r
556 hit = idx;\r
557 return hit;\r
558 }\r
559\r
560 int hitSplitTest(int x, int y) {\r
561 if (x < 0 || y < 0 || null == _timeProvider)\r
562 return -1;\r
563 int w = 4;\r
564 int hit = -1;\r
565 int nameWidth = _timeProvider.getNameSpace();\r
566 if (x > nameWidth - w && x < nameWidth + w)\r
567 hit = 1;\r
568 return hit;\r
569 }\r
570\r
571 public Item getItem(Point pt) {\r
572 int idx = hitTest(pt.x, pt.y);\r
573 return idx >= 0 ? (Item) _data._items[idx] : null;\r
574 }\r
575\r
576 long hitTimeTest(int x, int y) {\r
577 if (null == _timeProvider)\r
578 return -1;\r
579 long hitTime = -1;\r
580 Point size = getCtrlSize();\r
581 long time0 = _timeProvider.getTime0();\r
582 long time1 = _timeProvider.getTime1();\r
583 int nameWidth = _timeProvider.getNameSpace();\r
584 x -= nameWidth;\r
585 if (x >= 0 && size.x >= nameWidth) {\r
79a3a76e 586 hitTime = time0 + ((time1 - time0) * x) / (size.x - nameWidth);\r
b0d3496e
ASL
587 }\r
588 return hitTime;\r
589 }\r
590\r
591 void selectItem(int idx, boolean addSelection) {\r
592 if (addSelection) {\r
593 if (idx >= 0 && idx < _data._items.length) {\r
594 Item item = (Item) _data._items[idx];\r
595 item._selected = true;\r
596 }\r
597 } else {\r
598 for (int i = 0; i < _data._items.length; i++) {\r
599 Item item = (Item) _data._items[i];\r
600 item._selected = i == idx;\r
601 }\r
602 }\r
603 boolean changed = ensureVisibleItem(idx, true);\r
604 if (!changed)\r
605 redraw();\r
606 }\r
607\r
608 public void selectItem(ITmfTimeAnalysisEntry trace, boolean addSelection) {\r
609 Integer idx = _data.findTraceItemIndex(trace);\r
610 selectItem(idx, addSelection);\r
611 }\r
612\r
613 public int countPerPage() {\r
614 int height = getCtrlSize().y;\r
615 int count = 0;\r
616 if (height > 0)\r
617 count = height / _itemHeight;\r
618 return count;\r
619 }\r
620\r
621 public int getTopIndex() {\r
622 int idx = -1;\r
623 if (_data._items.length > 0)\r
624 idx = 0;\r
625 return idx;\r
626 }\r
627\r
628 public int getBottomIndex() {\r
629 int idx = _data._items.length - 1;\r
630 return idx;\r
631 }\r
632\r
633 Point getCtrlSize() {\r
634 Point size = getSize();\r
79a3a76e
FC
635 size.x -= getVerticalBar().getSize().x;\r
636 size.y -= getHorizontalBar().getSize().y;\r
b0d3496e
ASL
637 return size;\r
638 }\r
639\r
640 void getNameRect(Rectangle rect, Rectangle bound, int idx, int nameWidth) {\r
641 idx -= _topItem;\r
642 rect.x = bound.x;\r
643 rect.y = bound.y + idx * _itemHeight;\r
644 rect.width = nameWidth;\r
645 rect.height = _itemHeight;\r
646 }\r
647\r
648 void getStatesRect(Rectangle rect, Rectangle bound, int idx, int nameWidth) {\r
649 idx -= _topItem;\r
650 rect.x = bound.x + nameWidth;\r
651 rect.y = bound.y + idx * _itemHeight;\r
652 rect.width = bound.width - rect.x;\r
653 rect.height = _itemHeight;\r
654 }\r
655\r
656 // private int getTraceNumber(int tid) {\r
657 // int num = -1;\r
658 //\r
659 // Object[] items = _data._items;\r
660 // for (int i = _topItem; i < items.length; i++) {\r
661 // Item item = (Item) items[i];\r
662 // if ((item instanceof TraceItem)) {\r
663 // TsfTmTrace trace = ((TraceItem) item)._trace;\r
664 // if (trace != null && trace.getId() == tid) {\r
665 // num = i;\r
666 // break;\r
667 // }\r
668 // }\r
669 // }\r
670 //\r
671 // return num;\r
672 // }\r
673\r
674 // private void drawArrow(GC gc, int x0, int y0, int x1, int y1, Color c) {\r
675 // gc.setForeground(c);\r
676 // gc.drawLine(x0, y0, x1, y1);\r
677 //\r
678 // if (y1 > y0) {\r
679 // gc.drawLine(x1 - 3, y1 - 3, x1, y1);\r
680 // gc.drawLine(x1 + 3, y1 - 3, x1, y1);\r
681 // } else {\r
682 // gc.drawLine(x1 - 3, y1 + 3, x1, y1);\r
683 // gc.drawLine(x1 + 3, y1 + 3, x1, y1);\r
684 // }\r
685 // }\r
686\r
687 // TODO: CC: used in the removed functionality to draw thread interactions.\r
688 // private void drawTraceThreadEvent(Rectangle bound, TsfTmEvent e,\r
689 // TsfTmTrace trace, int nItem, int color, GC gc) {\r
690 // if (trace == null)\r
691 // return;\r
692 //\r
693 // int tid = trace.getId();\r
694 // if (tid < 0 || getTraceNumber(tid) == -1)\r
695 // return;\r
696 //\r
697 // int nameWidth = _timeProvider.getNameSpace();\r
698 //\r
699 // double time0 = _timeProvider.getTime0();\r
700 // double time1 = _timeProvider.getTime1();\r
701 // if (time0 == time1)\r
702 // return;\r
703 //\r
704 // int xr = bound.x + nameWidth;\r
705 // double K = (double) (bound.width - xr) / (time1 - time0);\r
706 //\r
707 // int x0 = xr + (int) ((e.getTime() - time0) * K);\r
708 // if (x0 < xr)\r
709 // x0 = xr;\r
710 //\r
711 // int x1 = xr + (int) ((trace.getStartTime() - time0) * K);\r
712 // if (x1 < xr)\r
713 // return;\r
714 //\r
715 // int y0 = bound.y + (nItem - _topItem) * _itemHeight + 3\r
716 // + (_itemHeight - 6) / 2;\r
717 // int y1 = bound.y + (getTraceNumber(tid) - _topItem) * _itemHeight + 3\r
718 // + (_itemHeight - 6) / 2;\r
719 //\r
720 // drawArrow(gc, x0, y0, x1, y1, _colors.getColor(color));\r
721 // }\r
722\r
723 public void drawTraceEvent(Rectangle bound, ITimeEvent e, int nItem,\r
724 int color, GC gc) {\r
725 int nameWidth = _timeProvider.getNameSpace();\r
726\r
727 long time0 = _timeProvider.getTime0();\r
728 long time1 = _timeProvider.getTime1();\r
729 if (time0 == time1)\r
730 return;\r
731\r
732 int xr = bound.x + nameWidth;\r
79a3a76e 733 double K = (double) (bound.width - xr) / (time1 - time0);\r
b0d3496e 734\r
79a3a76e 735 int x0 = xr + (int) ((e.getTime() - time0) * K);\r
b0d3496e
ASL
736 if (x0 < xr)\r
737 return;\r
738\r
739 int y0 = bound.y + (nItem - _topItem) * _itemHeight + 3;\r
740\r
741 gc.setBackground(_colors.getColor(color));\r
742 int c[] = { x0 - 3, y0 - 3, x0, y0, x0 + 3, y0 - 3 };\r
743 gc.fillPolygon(c);\r
744 }\r
745\r
746 // TODO: CC:\r
747 // private void drawExecEvent(Rectangle bound, TsfTmTraceExecEventImpl e,\r
748 // int nitem, int color, GC gc) {\r
749 // List runnings = e.getRunningEvents();\r
750 // if (runnings == null)\r
751 // return;\r
752 //\r
753 // int nameWidth = _timeProvider.getNameSpace();\r
754 //\r
755 // double time0 = _timeProvider.getTime0();\r
756 // double time1 = _timeProvider.getTime1();\r
757 // if (time0 == time1)\r
758 // return;\r
759 //\r
760 // int xr = bound.x + nameWidth;\r
761 // double K = (double) (bound.width - xr) / (time1 - time0);\r
762 //\r
763 // int x0 = xr + (int) ((e.getTime() - time0) * K);\r
764 // if (x0 < xr)\r
765 // x0 = xr;\r
766 //\r
767 // Iterator it = runnings.iterator();\r
768 // while (it.hasNext()) {\r
769 // TsfTmTraceRunningEventImpl re = (TsfTmTraceRunningEventImpl) it\r
770 // .next();\r
771 // int tid = re.getThread().getId();\r
772 // if (tid < 0 || getThreadNumber(tid) == -1)\r
773 // continue;\r
774 //\r
775 // int x1 = xr + (int) ((re.getTime() - time0) * K);\r
776 // if (x1 < xr)\r
777 // continue;\r
778 //\r
779 // int y0 = bound.y + (nitem - _topItem) * _itemHeight + 3\r
780 // + (_itemHeight - 6) / 2;\r
781 // int y1 = bound.y + (getThreadNumber(tid) - _topItem) * _itemHeight\r
782 // + 3 + (_itemHeight - 6) / 2;\r
783 //\r
784 // drawArrow(gc, x0, y0, x1, y1, _colors.getColor(color));\r
785 // }\r
786 // }\r
787\r
788 public void drawTraceInteractions(Rectangle bound, GC gc) {\r
789 // int nameWidth = _timeProvider.getNameSpace();\r
790 // Object[] items = _data._items;\r
791 //\r
792 // double time0 = _timeProvider.getTime0();\r
793 // double time1 = _timeProvider.getTime1();\r
794 //\r
795 // if (time0 == time1)\r
796 // return;\r
797 //\r
798 // int xr = bound.x + nameWidth;\r
799 // double K = (double) (bound.width - xr) / (time1 - time0);\r
800\r
801 // for (int i = 0; i < items.length; i++) {\r
802 // Item item = (Item) items[i];\r
803 // if (!(item instanceof TraceItem))\r
804 // continue;\r
805 //\r
806 // TsfTmTrace trace = ((TraceItem) item)._trace;\r
807 // if (trace == null)\r
808 // continue;\r
809 //\r
810 // List<TsfTmEvent> list = trace.getTraceEvents();\r
811 // Iterator<TsfTmEvent> it = list.iterator();\r
812 // while (it.hasNext()) {\r
813 // TsfTmEvent te = (TsfTmEvent) it.next();\r
814 // TODO: CC: Thread Interactions,\r
815 // This needs to be accessed externally via a specific\r
816 // implementation.\r
817 // if (te instanceof TsfTmTraceStartThreadEventImpl) {\r
818 // TsfTmTrace child = ((TsfTmTraceStartThreadEventImpl) te)\r
819 // .getStartedThread();\r
820 // drawThreadThreadEvent(bound, te, child, i,\r
821 // TraceColorScheme.TI_START_THREAD, gc);\r
822 // } else if (te instanceof TsfTmTraceHandoffLockEventImpl) {\r
823 // if (drawThreadReleases)\r
824 // drawExecEvent(bound, (TsfTmTraceExecEventImpl) te, i,\r
825 // TraceColorScheme.TI_HANDOFF_LOCK, gc);\r
826 // } else if (te instanceof TsfTmTraceNotifyAllEventImpl) {\r
827 // if (drawThreadWaits)\r
828 // drawExecEvent(bound, (TsfTmTraceExecEventImpl) te, i,\r
829 // TraceColorScheme.TI_NOTIFY_ALL, gc);\r
830 // } else if (te instanceof TsfTmTraceNotifyEventImpl) {\r
831 // if (drawThreadWaits)\r
832 // drawExecEvent(bound, (TsfTmTraceExecEventImpl) te, i,\r
833 // TraceColorScheme.TI_NOTIFY, gc);\r
834 // } else if (te instanceof\r
835 // TsfTmTraceDeadAndNotifyJoinedEventImpl) {\r
836 // if (drawThreadJoins)\r
837 // drawExecEvent(bound, (TsfTmTraceExecEventImpl) te, i,\r
838 // TraceColorScheme.TI_NOTIFY_JOINED, gc);\r
839 // } else if (te instanceof TsfTmTraceInterruptThreadEventImpl)\r
840 // {\r
841 // if (drawThreadWaits)\r
842 // drawExecEvent(bound, (TsfTmTraceExecEventImpl) te, i,\r
843 // TraceColorScheme.TI_INTERRUPT, gc);\r
844 // } else if (te instanceof\r
845 // TsfTmTraceWaitTimeoutExceedEventImpl) {\r
846 // drawThreadEvent(bound, te, i,\r
847 // TraceColorScheme.TI_WAIT_EXCEEDED, gc);\r
848 // }\r
849 // }\r
850 // }\r
851 }\r
852\r
4e3aa37d 853 @Override\r
b0d3496e 854 void paint(Rectangle bound, PaintEvent e) {\r
79a3a76e
FC
855 // If no user preference defined for item height\r
856 if (_itemHeight == _itemHeightDefault) {\r
857 _itemHeight = getFontHeight() + 6;\r
858 }\r
b0d3496e
ASL
859\r
860 if (bound.width < 2 || bound.height < 2 || null == _timeProvider)\r
861 return;\r
862\r
863 _idealNameWidth = 0;\r
79a3a76e 864 GC gc = e.gc;\r
b0d3496e
ASL
865 int nameWidth = _timeProvider.getNameSpace();\r
866 long time0 = _timeProvider.getTime0();\r
867 long time1 = _timeProvider.getTime1();\r
868 long endTime = _timeProvider.getEndTime();\r
869 long selectedTime = _timeProvider.getSelectedTime();\r
870 // draw trace states\r
871 Object[] items = _data._items;\r
872 for (int i = _topItem; i < items.length; i++) {\r
873 Item item = (Item) items[i];\r
b0d3496e
ASL
874 getNameRect(_rect0, bound, i, nameWidth);\r
875 if (_rect0.y >= bound.y + bound.height)\r
876 break;\r
877\r
878 if (item instanceof GroupItem) {\r
879 getStatesRect(_rect1, bound, i, nameWidth);\r
880 _rect0.width += _rect1.width;\r
881 drawName(item, _rect0, gc);\r
882 } else {\r
883 drawName(item, _rect0, gc);\r
884 }\r
885 getStatesRect(_rect0, bound, i, nameWidth);\r
886 drawItemDataDurations(item, _rect0, time0, time1, endTime,\r
887 selectedTime, gc);\r
888 }\r
889\r
890 if (drawTracesInteraction)\r
891 drawTraceInteractions(bound, e.gc);\r
892\r
79a3a76e
FC
893 // fill free canvas area\r
894 _rect0.x = bound.x;\r
895 _rect0.y += _rect0.height;\r
896 _rect0.width = bound.width;\r
897 _rect0.height = bound.y + bound.height - _rect0.y;\r
898 if (_rect0.y < bound.y + bound.height) {\r
899 gc.setBackground(_colors.getColor(TraceColorScheme.BACKGROUND));\r
900 gc.fillRectangle(_rect0);\r
901 }\r
b0d3496e
ASL
902 // draw drag line, no line if name space is 0.\r
903 if (3 == _dragState) {\r
904 gc.setForeground(_colors.getColor(TraceColorScheme.BLACK));\r
905 gc.drawLine(bound.x + nameWidth, bound.y, bound.x + nameWidth,\r
906 bound.y + bound.height - 1);\r
907 } else if (0 == _dragState && _mouseHover\r
908 && _timeProvider.getNameSpace() > 0) {\r
909 gc.setForeground(_colors.getColor(TraceColorScheme.RED));\r
910 gc.drawLine(bound.x + nameWidth, bound.y, bound.x + nameWidth,\r
911 bound.y + bound.height - 1);\r
912 }\r
913 }\r
914\r
915 void drawName(Item item, Rectangle rect, GC gc) {\r
916 // No name to be drawn\r
917 if (_timeProvider.getNameSpace() == 0)\r
918 return;\r
919 boolean group = item instanceof GroupItem;\r
920\r
921 int elemHeight = rect.height / 2;\r
922 int elemWidth = elemHeight;\r
923 String name = item._name;\r
924 if (group) {\r
925 gc.setBackground(_colors\r
926 .getBkColorGroup(item._selected, _isInFocus));\r
927 gc.fillRectangle(rect);\r
928 if (item._selected && _isInFocus) {\r
929 gc.setForeground(_colors.getBkColor(item._selected, _isInFocus,\r
930 false));\r
931 gc.drawRectangle(rect.x, rect.y, rect.width - 2,\r
932 rect.height - 2);\r
933 }\r
934 gc.setForeground(_colors.getBkColor(false, false, false));\r
935 gc.drawLine(rect.x, rect.y + rect.height - 1, rect.width - 1,\r
936 rect.y + rect.height - 1);\r
937 gc.setForeground(_colors.getFgColorGroup(false, false));\r
938 gc.setBackground(_colors.getBkColor(false, false, false));\r
939 Utils.init(_rect1, rect);\r
940 _rect1.x += MARGIN;\r
941 _rect1.y += (rect.height - elemHeight) / 2;\r
942 _rect1.width = elemWidth;\r
943 _rect1.height = elemHeight;\r
944 // Get the icon rectangle in the group items\r
945 gc.fillRectangle(_rect1);\r
946 gc.drawRectangle(_rect1.x, _rect1.y, _rect1.width - 1,\r
947 _rect1.height - 1);\r
948 int p = _rect1.y + _rect1.height / 2;\r
949 gc.drawLine(_rect1.x + 2, p, _rect1.x + _rect1.width - 3, p);\r
950 if (!item._expanded) {\r
951 p = _rect1.x + _rect1.width / 2;\r
952 gc.drawLine(p, _rect1.y + 2, p, _rect1.y + _rect1.height - 3);\r
953 }\r
954 gc.setForeground(_colors\r
955 .getFgColorGroup(item._selected, _isInFocus));\r
956 elemWidth += MARGIN;\r
957 } else {\r
958 gc.setBackground(_colors.getBkColor(item._selected, _isInFocus,\r
959 true));\r
960 gc.setForeground(_colors.getFgColor(item._selected, _isInFocus));\r
961 gc.fillRectangle(rect);\r
962 Utils.init(_rect1, rect);\r
963 _rect1.x += MARGIN;\r
964 // draw icon\r
965 ITmfTimeAnalysisEntry trace = ((TraceItem) item)._trace;\r
966 Image img = utilImpl.getItemImage(trace);\r
967 if (null != img) {\r
968 _rect1.y += (rect.height - img.getImageData().height) / 2;\r
969 gc.drawImage(img, _rect1.x, _rect1.y);\r
970 }\r
971 elemWidth = SMALL_ICON_SIZE;\r
972 // cut long string with "..."\r
973 Point size = gc.stringExtent(name);\r
974 if (_idealNameWidth < size.x)\r
975 _idealNameWidth = size.x;\r
976 int width = rect.width - MARGIN - MARGIN - elemWidth;\r
977 int cuts = 0;\r
978 while (size.x > width && name.length() > 1) {\r
979 cuts++;\r
980 name = name.substring(0, name.length() - 1);\r
981 size = gc.stringExtent(name + "...");\r
982 }\r
983 if (cuts > 0)\r
984 name += "...";\r
985 elemWidth += MARGIN;\r
986 }\r
987 Utils.init(_rect1, rect);\r
988 int leftMargin = MARGIN + elemWidth;\r
989 _rect1.x += leftMargin;\r
990 _rect1.width -= leftMargin;\r
991 int textWidth = 0;\r
992 // draw text\r
993 if (_rect1.width > 0) {\r
994 _rect1.y += 2;\r
995 textWidth = Utils.drawText(gc, name, _rect1, true) + 8;\r
996 _rect1.y -= 2;\r
997 }\r
998 // draw middle line\r
999 if (_rect1.width > 0 && !group) {\r
1000 Utils.init(_rect1, rect);\r
1001 _rect1.x += leftMargin + textWidth;\r
1002 _rect1.width -= textWidth;\r
1003 gc.setForeground(_colors.getColor(TraceColorScheme.MID_LINE));\r
1004 int midy = _rect1.y + _rect1.height / 2;\r
1005 gc.drawLine(_rect1.x, midy, _rect1.x + _rect1.width, midy);\r
1006 }\r
1007 // gc.drawLine(_rect1.x + _rect1.width - 1, _rect1.y, _rect1.x +\r
1008 // _rect1.width - 1, _rect1.y + _rect1.height);\r
1009 }\r
1010\r
1011 void drawItemData(Item item, Rectangle rect, long time0, long time1,\r
1012 long endTime, long selectedTime, GC gc) {\r
1013 if (rect.isEmpty())\r
1014 return;\r
1015 if (time1 <= time0) {\r
1016 gc.setBackground(_colors.getBkColor(false, false, false));\r
1017 gc.fillRectangle(rect);\r
1018 return;\r
1019 }\r
1020\r
1021 Utils.init(_rect1, rect);\r
1022 boolean selected = item._selected;\r
79a3a76e 1023 double K = (double) rect.width / (time1 - time0);\r
b0d3496e
ASL
1024 boolean group = item instanceof GroupItem;\r
1025\r
1026 if (group) {\r
1027 // gc.setBackground(_colors.getBkColorGroup(selected, _isInFocus));\r
1028 // gc.fillRectangle(rect);\r
1029 } else if (item instanceof TraceItem) {\r
1030 ITmfTimeAnalysisEntry trace = ((TraceItem) item)._trace;\r
1031\r
1032 int x0 = rect.x;\r
1033 List<TimeEvent> list = trace.getTraceEvents();\r
1034 // Iterator it = list.iterator();\r
1035 int count = list.size();\r
1036 ITimeEvent lastEvent = null;\r
1037 if (count > 0) {\r
1038 ITimeEvent currEvent = list.get(0);\r
1039 ITimeEvent nextEvent = null;\r
1040 long currEventTime = currEvent.getTime();\r
1041 long nextEventTime = currEventTime;\r
79a3a76e
FC
1042 x0 = rect.x + (int) ((currEventTime - time0) * K);\r
1043 int xEnd = rect.x + (int) ((time1 - time0) * K);\r
b0d3496e
ASL
1044 int x1 = -1;\r
1045 int idx = 1;\r
1046\r
1047 // reduce rect\r
1048 _rect1.y += 3;\r
1049 _rect1.height -= 6;\r
1050 fillSpace(rect, gc, selected, _rect1.x, x0, xEnd);\r
1051\r
1052 // draw event states\r
1053 while (x0 <= xEnd && null != currEvent) {\r
1054 boolean stopped = false;// currEvent instanceof\r
1055 // TsfTmTraceDeadEvent;\r
1056 if (idx < count) {\r
1057 nextEvent = list.get(idx);\r
1058 nextEventTime = nextEvent.getTime();\r
1059 idx++;\r
1060 } else if (stopped) {\r
1061 nextEvent = null;\r
1062 nextEventTime = time1;\r
1063 } else {\r
1064 nextEvent = null;\r
1065 nextEventTime = endTime;\r
1066 }\r
79a3a76e 1067 x1 = rect.x + (int) ((nextEventTime - time0) * K);\r
b0d3496e
ASL
1068 if (x1 >= rect.x) {\r
1069 _rect1.x = x0 >= rect.x ? x0 : rect.x;\r
1070 _rect1.width = (x1 <= xEnd ? x1 : xEnd) - _rect1.x;\r
1071 boolean timeSelected = currEventTime <= selectedTime\r
1072 && selectedTime < nextEventTime;\r
1073 // Trace.debug("Drawing rectangle: " + _rect1.x + ","\r
1074 // + _rect1.y + "," + _rect1.height + ", "\r
1075 // + _rect1.width + "-->"\r
1076 // + ((int) _rect1.x + (int) _rect1.width));\r
1077 utilImpl.drawState(_colors, currEvent, _rect1, gc,\r
1078 selected, false, timeSelected);\r
1079 }\r
1080 lastEvent = currEvent;\r
1081 currEvent = nextEvent;\r
1082 currEventTime = nextEventTime;\r
1083 x0 = x1;\r
1084 }\r
1085 }\r
1086\r
1087 // fill space after last event\r
1088 int xEnd = rect.x + rect.width;\r
1089 if (x0 < xEnd) {\r
1090 _rect1.x = x0 >= rect.x ? x0 : rect.x;\r
1091 _rect1.width = xEnd - _rect1.x;\r
1092 gc.setBackground(_colors\r
1093 .getBkColor(selected, _isInFocus, false));\r
1094 gc.fillRectangle(_rect1);\r
1095 // draw middle line\r
1096 gc.setForeground(_colors.getColor(utilImpl\r
1097 .getEventColorVal(lastEvent)));\r
1098 int midy = _rect1.y + _rect1.height / 2;\r
1099 int lw = gc.getLineWidth();\r
1100 gc.setLineWidth(2);\r
1101 gc.drawLine(_rect1.x, midy, _rect1.x + _rect1.width, midy);\r
1102 gc.setLineWidth(lw);\r
1103 }\r
1104\r
1105 // draw focus ares\r
1106 Utils.init(_rect1, rect);\r
1107 gc.setForeground(_colors.getBkColor(selected, _isInFocus, false));\r
1108 int y = _rect1.y;\r
1109 gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
1110 y++;\r
1111 gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
1112 y++;\r
1113 gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
1114 y = _rect1.y + _rect1.height - 1;\r
1115 gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
1116 y--;\r
1117 gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
1118 y--;\r
1119 gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
1120 }\r
1121\r
1122 // draw selected time\r
79a3a76e 1123 int x = rect.x + (int) ((selectedTime - time0) * K);\r
b0d3496e
ASL
1124 if (x >= rect.x && x < rect.x + rect.width) {\r
1125 gc.setForeground(_colors.getColor(TraceColorScheme.SELECTED_TIME));\r
1126 if (group)\r
1127 gc.drawLine(x, rect.y + rect.height - 1, x, rect.y\r
1128 + rect.height);\r
1129 else\r
1130 gc.drawLine(x, rect.y, x, rect.y + rect.height);\r
1131 }\r
1132 }\r
1133\r
1134 /**\r
1135 * Represent the event in series of bursts rather than sequence of states\r
1136 * \r
1137 * @param item\r
1138 * @param rect\r
1139 * - The container rectangle to be colored to different states\r
1140 * @param time0\r
1141 * - Base time of all events\r
1142 * @param time1\r
1143 * - End time of all events\r
1144 * @param endTime\r
1145 * @param selectedTime\r
1146 * @param gc\r
1147 */\r
1148 void drawItemDataBurst(Item item, Rectangle rect, long time0, long time1,\r
1149 long endTime, long selectedTime, GC gc) {\r
1150 if (rect.isEmpty())\r
1151 return;\r
1152 if (time1 <= time0) {\r
1153 gc.setBackground(_colors.getBkColor(false, false, false));\r
1154 gc.fillRectangle(rect);\r
1155 return;\r
1156 }\r
1157\r
1158 // Initialize _rect1 to same values as enclosing rectangle rect\r
1159 Utils.init(_rect1, rect);\r
1160 boolean selected = item._selected;\r
1161 // K pixels per second\r
79a3a76e 1162 double K = (double) rect.width / (time1 - time0);\r
b0d3496e
ASL
1163 // Trace.debug("Value of K: " + K + " width:" + rect.width + " time0: "\r
1164 // + time0 + " time1:" + time1 + " endTime: " + endTime);\r
1165\r
1166 boolean group = item instanceof GroupItem;\r
1167\r
1168 if (group) {\r
1169 // gc.setBackground(_colors.getBkColorGroup(selected, _isInFocus));\r
1170 // gc.fillRectangle(rect);\r
1171 // if (Trace.isDEBUG()) {\r
1172 // Trace.debug("Group");\r
1173 // }\r
1174 } else if (item instanceof TraceItem) {\r
1175 ITmfTimeAnalysisEntry trace = ((TraceItem) item)._trace;\r
1176\r
1177 double x0 = rect.x;\r
1178 List<TimeEvent> list = trace.getTraceEvents();\r
1179 // Iterator it = list.iterator();\r
1180 int count = list.size();\r
1181 ITimeEvent lastEvent = null;\r
1182 // Trace.debug("count is: " + count);\r
1183 if (count > 0) {\r
1184 ITimeEvent currEvent = list.get(0);\r
1185 ITimeEvent nextEvent = null;\r
1186 long currEventTime = currEvent.getTime();\r
1187 long nextEventTime = currEventTime;\r
1188 // x0 - Points to the beginning of the event being drawn\r
79a3a76e 1189 double step = (double) ((currEventTime - time0) * K);\r
b0d3496e
ASL
1190 x0 = rect.x + step;\r
1191 // xEnd - Points to the end of the events rectangle\r
79a3a76e 1192 double xEnd = rect.x + (double) ((time1 - time0) * K);\r
b0d3496e
ASL
1193 double x1 = -1;\r
1194 int idx = 1;\r
1195 double xNext = 0;\r
1196\r
1197 // Drawing rectangle is smaller than reserved space\r
1198 _rect1.y += 3;\r
1199 _rect1.height -= 6;\r
1200\r
1201 // Clean up to empty line to draw on top\r
1202 fillSpace(rect, gc, selected, _rect1.x, xEnd, xEnd);\r
1203 // draw event states\r
1204 while (x0 <= xEnd && null != currEvent) {\r
1205 boolean stopped = false;// currEvent instanceof\r
1206 // TsfTmTraceDeadEvent;\r
1207 if (idx < count) {\r
1208 nextEvent = list.get(idx);\r
1209 nextEventTime = nextEvent.getTime();\r
1210 idx++;\r
1211 } else if (stopped) {\r
1212 nextEvent = null;\r
1213 nextEventTime = time1;\r
1214 } else {\r
1215 nextEvent = null;\r
1216 nextEventTime = endTime;\r
1217 // Trace\r
1218 // .debug("nexEventTime is endTime: "\r
1219 // + nextEventTime);\r
1220 }\r
1221\r
1222 // Draw it as a burst, one unit of width.\r
1223 x1 = x0 + (int) 2;\r
1224 if (x1 >= rect.x && x0 <= xEnd) {\r
1225 // Fill with space until x0\r
1226 _rect1.x = (int) (x0 >= rect.x ? x0 : rect.x);\r
1227 _rect1.width = (int) ((x1 <= xEnd ? x1 : xEnd) - _rect1.x);\r
1228 boolean timeSelected = currEventTime <= selectedTime\r
1229 && selectedTime < nextEventTime;\r
1230 utilImpl.drawState(_colors, currEvent, _rect1, gc,\r
1231 selected, false, timeSelected);\r
1232 // Trace.debug("Drawing rectangle: " + _rect1.x + ","\r
1233 // + _rect1.y + "," + _rect1.height + ", "\r
1234 // + _rect1.width + "-->"\r
1235 // + ((int) _rect1.x + (int) _rect1.width));\r
1236 // Advance rectangle to next start position and Fill\r
1237 // with space until next event\r
1238 _rect1.x += _rect1.width;\r
1239 x0 = x1;\r
79a3a76e 1240 xNext = rect.x + (double) ((nextEventTime - time0) * K);\r
b0d3496e
ASL
1241 }\r
1242 // Fill space till next event\r
1243 fillSpace(rect, gc, selected, x0, xNext, xEnd);\r
1244\r
1245 lastEvent = currEvent;\r
1246 currEvent = nextEvent;\r
1247 currEventTime = nextEventTime;\r
1248 // Move x0 to the beginning of next event\r
79a3a76e 1249 x0 = rect.x + (double) ((nextEventTime - time0) * K);\r
b0d3496e
ASL
1250 // Trace.debug("rect.x: " + rect.x + " + " +\r
1251 // "(nextEvenTime: "\r
1252 // + nextEventTime + "- time0: " + time0 + ") * K: "\r
1253 // + K + " = " + x0);\r
1254 }\r
1255 }\r
1256\r
1257 // fill space after last event\r
1258 int xEnd = rect.x + rect.width;\r
1259 if (x0 < xEnd) {\r
1260 // Trace.debug("Space after last event, x0: " + x0 + ", xEnd: "\r
1261 // + xEnd);\r
1262 _rect1.x = (int) (x0 >= rect.x ? x0 : rect.x);\r
1263 _rect1.width = xEnd - _rect1.x;\r
1264 gc.setBackground(_colors\r
1265 .getBkColor(selected, _isInFocus, false));\r
1266 gc.fillRectangle(_rect1);\r
1267 // draw middle line\r
1268 gc.setForeground(_colors.getColor(utilImpl\r
1269 .getEventColorVal(lastEvent)));\r
1270 int midy = _rect1.y + _rect1.height / 2;\r
1271 int lw = gc.getLineWidth();\r
1272 gc.setLineWidth(2);\r
1273 gc.drawLine(_rect1.x, midy, _rect1.x + _rect1.width, midy);\r
1274 gc.setLineWidth(lw);\r
1275 }\r
1276\r
1277 // draw focus area\r
1278 Utils.init(_rect1, rect);\r
1279 gc.setForeground(_colors.getBkColor(selected, _isInFocus, false));\r
1280 int y = _rect1.y;\r
1281 gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
1282 y++;\r
1283 gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
1284 y++;\r
1285 gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
1286 y = _rect1.y + _rect1.height - 1;\r
1287 gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
1288 y--;\r
1289 gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
1290 y--;\r
1291 gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
1292 }\r
1293\r
1294 // draw selected time\r
79a3a76e 1295 int x = rect.x + (int) ((selectedTime - time0) * K);\r
b0d3496e
ASL
1296 if (x >= rect.x && x < rect.x + rect.width) {\r
1297 gc.setForeground(_colors.getColor(TraceColorScheme.SELECTED_TIME));\r
1298 if (group)\r
1299 gc.drawLine(x, rect.y + rect.height - 1, x, rect.y\r
1300 + rect.height);\r
1301 else\r
1302 gc.drawLine(x, rect.y, x, rect.y + rect.height);\r
1303 }\r
1304 }\r
1305\r
1306 /**\r
1307 * Represent the series of events with specified durations\r
1308 * \r
1309 * @param item\r
1310 * @param rect\r
1311 * - The container rectangle to be colored to different states\r
1312 * @param time0\r
1313 * - Base time of all events - start of visible window\r
1314 * @param time1\r
1315 * - End time of visible events - end time of visible window\r
1316 * @param endTime\r
1317 * - End time of all events - may not be visible in selected\r
1318 * visible window\r
1319 * @param selectedTime\r
1320 * @param gc\r
1321 */\r
1322 void drawItemDataDurations(Item item, Rectangle rect, long time0,\r
1323 long time1, long endTime, long selectedTime, GC gc) {\r
1324 if (rect.isEmpty())\r
1325 return;\r
1326 if (time1 <= time0) {\r
1327 gc.setBackground(_colors.getBkColor(false, false, false));\r
1328 gc.fillRectangle(rect);\r
1329 return;\r
1330 }\r
1331\r
1332 // Initialize _rect1 to same values as enclosing rectangle rect\r
1333 Utils.init(_rect1, rect);\r
1334 boolean selected = item._selected;\r
1335 // K pixels per second\r
79a3a76e 1336 double K = (double) rect.width / (time1 - time0);\r
b0d3496e
ASL
1337 // Trace.debug("Value of K: " + K + " width:" + rect.width + " time0: "\r
1338 // + time0 + " time1:" + time1 + " endTime: " + endTime);\r
1339\r
1340 boolean group = item instanceof GroupItem;\r
1341\r
1342 if (group) {\r
1343 // gc.setBackground(_colors.getBkColorGroup(selected, _isInFocus));\r
1344 // gc.fillRectangle(rect);\r
79a3a76e
FC
1345 // if (Trace.isDEBUG()) {\r
1346 // Trace.debug("\n\t\t\tGroup: " + ((GroupItem) item)._name);\r
1347 // }\r
b0d3496e
ASL
1348 } else if (item instanceof TraceItem) {\r
1349 ITmfTimeAnalysisEntry trace = ((TraceItem) item)._trace;\r
1350\r
1351 double x0 = rect.x;\r
1352 List<TimeEvent> list = trace.getTraceEvents();\r
1353 // Iterator it = list.iterator();\r
1354 int count = list.size();\r
79a3a76e 1355 ITimeEvent lastEvent = null;\r
b0d3496e
ASL
1356 // if (Trace.isDEBUG()) {\r
1357 // Trace.debug("\n\t\t\tTrace: " + trace.getName()\r
1358 // + utilImpl.getTraceClassName(trace));\r
1359 // }\r
1360 // Trace.debug("count is: " + count);\r
b0d3496e
ASL
1361 if (count > 0) {\r
1362 ITimeEvent currEvent = list.get(0);\r
1363 ITimeEvent nextEvent = null;\r
1364 long currEventTime = currEvent.getTime();\r
1365 long currEventDuration = currEvent.getDuration();\r
1366 // initial value\r
1367 long nextEventTime = currEventTime;\r
1368 // x0 - Points to the beginning of the event being drawn\r
79a3a76e 1369 double step = (double) ((currEventTime - time0) * K);\r
b0d3496e
ASL
1370 x0 = rect.x + step;\r
1371 // xEnd - Points to the end of the events rectangle\r
79a3a76e 1372 double xEnd = rect.x + (double) ((time1 - time0) * K);\r
b0d3496e
ASL
1373 double x1 = -1;\r
1374 int idx = 1;\r
1375 double xNext = 0;\r
1376\r
79a3a76e
FC
1377 // Drawing rectangle is smaller than reserved space\r
1378 _rect1.y += 3;\r
1379 _rect1.height -= 6;\r
1380\r
1381 // Clean up to empty line to draw on top\r
1382 fillSpace(rect, gc, selected, _rect1.x, xEnd, xEnd);\r
b0d3496e 1383 // draw event states\r
79a3a76e 1384 while (x0 <= xEnd && null != currEvent) {\r
b0d3496e
ASL
1385 boolean stopped = false;// currEvent instanceof\r
1386 // refresh current event duration as the loop moves\r
1387 currEventDuration = currEvent.getDuration();\r
1388 // TsfTmTraceDeadEvent;\r
1389 if (idx < count) {\r
1390 nextEvent = list.get(idx);\r
1391 nextEventTime = nextEvent.getTime();\r
1392 idx++;\r
1393 } else if (stopped) {\r
1394 nextEvent = null;\r
1395 nextEventTime = time1;\r
1396 } else {\r
1397 nextEvent = null;\r
1398 nextEventTime = endTime;\r
1399 // Trace\r
1400 // .debug("nexEventTime is endTime: "\r
1401 // + nextEventTime);\r
1402 }\r
1403\r
1404 // Calculate position to next event\r
79a3a76e 1405 xNext = rect.x + (double) ((nextEventTime - time0) * K);\r
b0d3496e
ASL
1406\r
1407 // Calculate end position of current event\r
1408 if (currEventDuration < 0) {\r
79a3a76e 1409 x1 = rect.x + (double) ((nextEventTime - time0) * K);\r
b0d3496e 1410 } else {\r
79a3a76e
FC
1411 x1 = currEventDuration == 0 ? (x0 + 2)\r
1412 : (x0 + (double) ((currEventDuration) * K));\r
b0d3496e
ASL
1413 }\r
1414\r
1415 // If event end position x1 further away than start position\r
1416 // of\r
1417 // next event, cut width till next event\r
1418 // Trace.debug("Next Event Pos: " + xNext\r
1419 // + " End Of Current at: " + x1 + " Event Duration: "\r
1420 // + currEventDuration);\r
79a3a76e 1421 x1 = x1 > xNext ? xNext : x1;\r
b0d3496e
ASL
1422 // if event end boundary is within time range\r
1423 if (x1 >= rect.x && x0 <= xEnd) {\r
79a3a76e
FC
1424 // Fill with space until x0\r
1425 x0 = (double) (x0 >= rect.x ? x0 : rect.x);\r
1426 _rect1.width = (int) ((x1 <= xEnd ? x1 : xEnd) - x0);\r
b0d3496e
ASL
1427 _rect1.x = (int) x0;\r
1428 boolean timeSelected = currEventTime <= selectedTime\r
1429 && selectedTime < nextEventTime;\r
1430 utilImpl.drawState(_colors, currEvent, _rect1, gc,\r
1431 selected, false, timeSelected);\r
1432 // Trace.debug("Drawing rectangle: " + _rect1.x + ","\r
1433 // + _rect1.y + "," + _rect1.height + ", "\r
1434 // + _rect1.width + "-->"\r
1435 // + ((int) _rect1.x + (int) _rect1.width));\r
1436 // Advance rectangle to next start position and Fill\r
1437 // with space until next event\r
1438 _rect1.x += _rect1.width;\r
1439 x0 = _rect1.x;\r
1440 }\r
1441\r
1442 // Fill space till next event\r
79a3a76e 1443 fillSpace(rect, gc, selected, x0, xNext, xEnd);\r
b0d3496e 1444\r
79a3a76e 1445 lastEvent = currEvent;\r
b0d3496e
ASL
1446 currEvent = nextEvent;\r
1447 currEventTime = nextEventTime;\r
1448 // Move x0 to the beginning of next event\r
79a3a76e 1449 x0 = rect.x + (double) ((nextEventTime - time0) * K);\r
b0d3496e
ASL
1450 // Trace.debug("rect.x: " + rect.x + " + " +\r
1451 // "(nextEvenTime: "\r
1452 // + nextEventTime + "- time0: " + time0 + ") * K: "\r
1453 // + K + " = " + x0);\r
1454 }\r
1455 }\r
1456\r
79a3a76e
FC
1457 // fill space after last event\r
1458 int xEnd = rect.x + rect.width;\r
1459 if (x0 < xEnd) {\r
1460 // Trace.debug("Space after last event, x0: " + x0 + ", xEnd: "\r
1461 // + xEnd);\r
1462 _rect1.x = (int) (x0 >= rect.x ? x0 : rect.x);\r
1463 _rect1.width = xEnd - _rect1.x;\r
1464 gc.setBackground(_colors\r
1465 .getBkColor(selected, _isInFocus, false));\r
1466 gc.fillRectangle(_rect1);\r
1467 // draw middle line\r
1468 gc.setForeground(_colors.getColor(utilImpl\r
1469 .getEventColorVal(lastEvent)));\r
1470 int midy = _rect1.y + _rect1.height / 2;\r
1471 int lw = gc.getLineWidth();\r
1472 gc.setLineWidth(2);\r
1473 gc.drawLine(_rect1.x, midy, _rect1.x + _rect1.width, midy);\r
1474 gc.setLineWidth(lw);\r
1475 }\r
1476\r
b0d3496e
ASL
1477 // draw focus area\r
1478 Utils.init(_rect1, rect);\r
1479 gc.setForeground(_colors.getBkColor(selected, _isInFocus, false));\r
1480 int y = _rect1.y;\r
1481 gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
1482 y++;\r
1483 gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
1484 y++;\r
1485 gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
1486 y = _rect1.y + _rect1.height - 1;\r
1487 gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
1488 y--;\r
1489 gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
1490 y--;\r
1491 gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
1492 }\r
1493\r
1494 // draw selected time\r
79a3a76e 1495 int x = rect.x + (int) ((selectedTime - time0) * K);\r
b0d3496e
ASL
1496 if (x >= rect.x && x < rect.x + rect.width) {\r
1497 gc.setForeground(_colors.getColor(TraceColorScheme.SELECTED_TIME));\r
1498 if (group)\r
1499 gc.drawLine(x, rect.y + rect.height - 1, x, rect.y\r
1500 + rect.height);\r
1501 else\r
1502 gc.drawLine(x, rect.y, x, rect.y + rect.height);\r
1503 }\r
1504 }\r
1505\r
1506 private void fillSpace(Rectangle rect, GC gc, boolean selected, double x0,\r
1507 double x1, double xEnd) {\r
1508 // fill space before first event\r
1509 if (x0 >= rect.x && x0 < xEnd) {\r
1510 // _rect1.width = (int) ((x1 <= xEnd ? x1 : xEnd) - x0);\r
1511 // Trace.debug("Drawing Space: " + _rect1.x + "," + _rect1.y + ","\r
1512 // + _rect1.height + ", " + _rect1.width + "--> "\r
1513 // + ((int) _rect1.x + (int) _rect1.width));\r
1514\r
1515 // if (_rect1.width < 0) {\r
1516 // Trace.debug("Incorrect width:" + _rect1.width);\r
1517 // }\r
1518 gc.setBackground(_colors.getBkColor(selected, _isInFocus, false));\r
1519 gc.fillRectangle(_rect1);\r
1520 // draw middle line\r
1521 gc.setForeground(_colors.getColor(TraceColorScheme.MID_LINE));\r
1522 int midy = _rect1.y + _rect1.height / 2;\r
1523 gc.drawLine(_rect1.x, midy, _rect1.x + _rect1.width, midy);\r
1524 } else {\r
1525 // Trace.debug("No space added since, x0 is out of range " + x0\r
1526 // + " rect.x: " + rect.x + " xEnd: " + xEnd);\r
1527 }\r
1528 }\r
1529\r
1530 public void keyTraversed(TraverseEvent e) {\r
1531 if ((e.detail == SWT.TRAVERSE_TAB_NEXT)\r
1532 || (e.detail == SWT.TRAVERSE_TAB_PREVIOUS))\r
1533 e.doit = true;\r
1534 }\r
1535\r
1536 public void keyPressed(KeyEvent e) {\r
1537 int idx = -1;\r
1538 if (SWT.HOME == e.keyCode) {\r
1539 idx = getTopIndex();\r
1540 } else if (SWT.END == e.keyCode) {\r
1541 idx = getBottomIndex();\r
1542 } else if (SWT.ARROW_DOWN == e.keyCode) {\r
1543 idx = getSelectedIndex();\r
1544 if (idx < 0)\r
1545 idx = 0;\r
1546 else if (idx < _data._items.length - 1)\r
1547 idx++;\r
1548 } else if (SWT.ARROW_UP == e.keyCode) {\r
1549 idx = getSelectedIndex();\r
1550 if (idx < 0)\r
1551 idx = 0;\r
1552 else if (idx > 0)\r
1553 idx--;\r
1554 } else if (SWT.ARROW_LEFT == e.keyCode) {\r
1555 selectPrevEvent();\r
1556 } else if (SWT.ARROW_RIGHT == e.keyCode) {\r
1557 selectNextEvent();\r
1558 } else if (SWT.PAGE_DOWN == e.keyCode) {\r
1559 int page = countPerPage();\r
1560 idx = getSelectedIndex();\r
1561 if (idx < 0)\r
1562 idx = 0;\r
1563 idx += page;\r
1564 if (idx >= _data._items.length)\r
1565 idx = _data._items.length - 1;\r
1566 } else if (SWT.PAGE_UP == e.keyCode) {\r
1567 int page = countPerPage();\r
1568 idx = getSelectedIndex();\r
1569 if (idx < 0)\r
1570 idx = 0;\r
1571 idx -= page;\r
1572 if (idx < 0)\r
1573 idx = 0;\r
1574 } else if (SWT.CR == e.keyCode) {\r
1575 idx = getSelectedIndex();\r
1576 if (idx >= 0) {\r
1577 if (_data._items[idx] instanceof TraceItem)\r
1578 fireDefaultSelection();\r
1579 else if (_data._items[idx] instanceof GroupItem)\r
1580 toggle(idx);\r
1581 }\r
1582 idx = -1;\r
1583 }\r
1584 if (idx >= 0) {\r
1585 selectItem(idx, false);\r
1586 fireSelectionChanged();\r
1587 }\r
1588 }\r
1589\r
1590 public void keyReleased(KeyEvent e) {\r
1591 }\r
1592\r
1593 public void focusGained(FocusEvent e) {\r
1594 _isInFocus = true;\r
1595 redraw();\r
b0d3496e
ASL
1596 }\r
1597\r
1598 public void focusLost(FocusEvent e) {\r
1599 _isInFocus = false;\r
1600 if (0 != _dragState) {\r
1601 setCapture(false);\r
1602 _dragState = 0;\r
1603 }\r
1604 redraw();\r
b0d3496e
ASL
1605 }\r
1606\r
1607 public boolean isInFocus() {\r
1608 return _isInFocus;\r
1609 }\r
1610\r
1611 public void mouseMove(MouseEvent e) {\r
1612 if (null == _timeProvider)\r
1613 return;\r
1614 Point size = getCtrlSize();\r
1615 if (1 == _dragState) {\r
1616 int nameWidth = _timeProvider.getNameSpace();\r
1617 int x = e.x - nameWidth;\r
1618 if (x > 0 && size.x > nameWidth && _dragX != x) {\r
1619 _dragX = x;\r
79a3a76e
FC
1620 double K = (double) (size.x - nameWidth)\r
1621 / (_time1bak - _time0bak);\r
1622 long timeDelta = (long) ((_dragX - _dragX0) / K);\r
b0d3496e
ASL
1623 long time1 = _time1bak - timeDelta;\r
1624 long maxTime = _timeProvider.getMaxTime();\r
1625 if (time1 > maxTime)\r
1626 time1 = maxTime;\r
1627 long time0 = time1 - (_time1bak - _time0bak);\r
1628 if (time0 < _timeProvider.getMinTime()) {\r
1629 time0 = _timeProvider.getMinTime();\r
1630 time1 = time0 + (_time1bak - _time0bak);\r
1631 }\r
1632 _timeProvider.setStartFinishTime(time0, time1);\r
1633 }\r
1634 } else if (3 == _dragState) {\r
1635 _dragX = e.x;\r
1636 _timeProvider.setNameSpace(_hitIdx + _dragX - _dragX0);\r
1637 } else if (0 == _dragState) {\r
1638 boolean mouseHover = hitSplitTest(e.x, e.y) > 0;\r
1639 if (_mouseHover != mouseHover)\r
1640 redraw();\r
1641 _mouseHover = mouseHover;\r
b0d3496e
ASL
1642 }\r
1643 updateCursor(e.x, e.y);\r
1644 }\r
1645\r
1646 public void mouseDoubleClick(MouseEvent e) {\r
1647 if (null == _timeProvider)\r
1648 return;\r
1649 if (1 == e.button) {\r
1650 int idx = hitSplitTest(e.x, e.y);\r
1651 if (idx >= 0) {\r
1652 _timeProvider.setNameSpace(_idealNameWidth + 3 * MARGIN\r
1653 + SMALL_ICON_SIZE);\r
1654 return;\r
1655 }\r
1656 idx = hitTest(e.x, e.y);\r
1657 if (idx >= 0) {\r
1658 selectItem(idx, false);\r
1659 if (_data._items[idx] instanceof TraceItem) {\r
1660 fireDefaultSelection();\r
1661 }\r
1662 }\r
1663 }\r
1664 }\r
1665\r
41dc35d0
FC
1666 /**\r
1667 * <p>\r
1668 * If the x, y position is over the vertical split line (name to time\r
1669 * ranges), then change the cursor to a drag cursor to indicate the user the\r
1670 * possibility of resizing\r
1671 * </p>\r
1672 * \r
1673 * @param x\r
1674 * @param y\r
1675 */\r
b0d3496e 1676 void updateCursor(int x, int y) {\r
41dc35d0
FC
1677 // if Wait cursor not active, check for the need to change to a drag\r
1678 // cursor\r
1679 if (_isWaitCursor == false) {\r
1680 int idx = hitSplitTest(x, y);\r
1681 // No dragcursor is name space is fixed to zero\r
1682 if (idx > 0 && !_isDragCursor3 && _timeProvider.getNameSpace() > 0) {\r
1683 setCursor(_dragCursor3);\r
1684 _isDragCursor3 = true;\r
1685 } else if (idx <= 0 && _isDragCursor3) {\r
1686 setCursor(null);\r
1687 _isDragCursor3 = false;\r
1688 }\r
1689 }\r
1690 }\r
1691\r
1692 /**\r
1693 * Provide the possibilty to control the wait cursor externally e.g. data\r
1694 * requests in progress\r
1695 * \r
1696 * @param waitInd\r
1697 */\r
1698 public void waitCursor(boolean waitInd) {\r
1699 // Update cursor as indicated\r
1700 if (waitInd) {\r
1701 setCursor(_WaitCursor);\r
1702 _isWaitCursor = true;\r
1703 } else {\r
b0d3496e 1704 setCursor(null);\r
41dc35d0 1705 _isWaitCursor = false;\r
b0d3496e 1706 }\r
41dc35d0
FC
1707\r
1708 // Get ready for next mouse move\r
1709 _isDragCursor3 = false;\r
b0d3496e
ASL
1710 }\r
1711\r
1712 public void mouseDown(MouseEvent e) {\r
1713 if (null == _timeProvider)\r
1714 return;\r
1715 int idx;\r
1716 if (1 == e.button) {\r
1717 int namewidth = _timeProvider.getNameSpace();\r
1718 if (namewidth != 0) {\r
1719 idx = hitSplitTest(e.x, e.y);\r
1720 if (idx > 0) {\r
1721 _dragState = 3;\r
1722 _dragX = _dragX0 = e.x;\r
1723 _hitIdx = _timeProvider.getNameSpace();\r
1724 ;\r
1725 _time0bak = _timeProvider.getTime0();\r
1726 _time1bak = _timeProvider.getTime1();\r
1727 redraw();\r
1728 return;\r
1729 }\r
1730 }\r
1731\r
1732 idx = hitTest(e.x, e.y);\r
1733 if (idx >= 0) {\r
1734 if (_data._items[idx] instanceof TraceItem) {\r
1735 long hitTime = hitTimeTest(e.x, e.y);\r
1736 if (hitTime >= 0) {\r
1737 _timeProvider.setSelectedTimeInt(hitTime, false);\r
1738 setCapture(true);\r
1739 _dragState = 1;\r
1740 _dragX = _dragX0 = e.x - _timeProvider.getNameSpace();\r
1741 _time0bak = _timeProvider.getTime0();\r
1742 _time1bak = _timeProvider.getTime1();\r
1743 }\r
1744 } else if (_data._items[idx] instanceof GroupItem) {\r
1745 _hitIdx = idx;\r
1746 _dragState = 2;\r
1747 }\r
1748 selectItem(idx, false);\r
1749 fireSelectionChanged();\r
b0d3496e
ASL
1750 }\r
1751 }\r
1752 }\r
1753\r
1754 public void mouseUp(MouseEvent e) {\r
1755 if (0 != _dragState) {\r
1756 setCapture(false);\r
79a3a76e 1757 if (2 == _dragState) {\r
b0d3496e
ASL
1758 if (hitTest(e.x, e.y) == _hitIdx)\r
1759 toggle(_hitIdx);\r
1760 } else if (3 == _dragState) {\r
1761 redraw();\r
1762 }\r
1763 _dragState = 0;\r
1764 }\r
1765 }\r
1766\r
1767 public void controlMoved(ControlEvent e) {\r
1768 }\r
1769\r
1770 public void controlResized(ControlEvent e) {\r
1771 adjustScrolls();\r
1772 }\r
1773\r
1774 public void widgetDefaultSelected(SelectionEvent e) {\r
1775 }\r
1776\r
1777 public void widgetSelected(SelectionEvent e) {\r
1778 if (e.widget == getVerticalBar()) {\r
1779 _topItem = getVerticalBar().getSelection();\r
1780 if (_topItem < 0)\r
1781 _topItem = 0;\r
1782 redraw();\r
1783 } else if (e.widget == getHorizontalBar() && null != _timeProvider) {\r
79a3a76e 1784 int startTime = getHorizontalBar().getSelection();\r
b0d3496e
ASL
1785 long time0 = _timeProvider.getTime0();\r
1786 long time1 = _timeProvider.getTime1();\r
1787 long timeMin = _timeProvider.getMinTime();\r
1788 long timeMax = _timeProvider.getMaxTime();\r
1789 long delta = timeMax - timeMin;\r
1790\r
1791 long range = time1 - time0;\r
1792 // _timeRangeFixed = true;\r
79a3a76e 1793 time0 = timeMin + (long) ((double) (startTime * _timeStep) * delta);\r
b0d3496e 1794 time1 = time0 + range;\r
79a3a76e
FC
1795 // Trace.debug("\nstartTime:" + startTime + " time0:" + time0\r
1796 // + " time1:" + time1 + " Delta:" + delta);\r
1797 _timeProvider.setStartFinishTime(time0, time1);\r
b0d3496e
ASL
1798 }\r
1799 }\r
1800\r
1801 public void mouseEnter(MouseEvent e) {\r
1802 }\r
1803\r
1804 public void mouseExit(MouseEvent e) {\r
1805 if (_mouseHover) {\r
1806 _mouseHover = false;\r
1807 redraw();\r
1808 }\r
1809 }\r
1810\r
1811 public void mouseHover(MouseEvent e) {\r
1812 }\r
1813\r
1814 public void mouseScrolled(MouseEvent e) {\r
b0d3496e 1815 if (e.count > 0) {\r
79a3a76e 1816 zoomIn();\r
b0d3496e 1817 } else if (e.count < 0) {\r
79a3a76e 1818 zoomOut();\r
b0d3496e
ASL
1819 }\r
1820 }\r
1821\r
1822 public boolean isVisibleVerticalScroll() {\r
1823 return _visibleVerticalScroll;\r
1824 }\r
1825\r
1826 public void setVisibleVerticalScroll(boolean visibleVerticalScroll) {\r
1827 ScrollBar scrollVer = getVerticalBar();\r
1828 if (scrollVer != null) {\r
1829 scrollVer.setVisible(visibleVerticalScroll);\r
1830 }\r
1831 this._visibleVerticalScroll = visibleVerticalScroll;\r
1832 }\r
1833\r
4e3aa37d 1834 @Override\r
b0d3496e
ASL
1835 public int getBorderWidth() {\r
1836 return _borderWidth;\r
1837 }\r
1838\r
1839 public void setBorderWidth(int borderWidth) {\r
1840 this._borderWidth = borderWidth;\r
1841 }\r
1842\r
1843 public int getHeaderHeight() {\r
1844 return _headerHeight;\r
1845 }\r
1846\r
1847 public void setHeaderHeight(int headerHeight) {\r
1848 this._headerHeight = headerHeight;\r
1849 }\r
1850\r
1851 public int getItemHeight() {\r
1852 return _itemHeight;\r
1853 }\r
1854\r
1855 public void setItemHeight(int rowHeight) {\r
1856 this._itemHeight = rowHeight;\r
1857 }\r
1858\r
1859 public Vector<ITmfTimeAnalysisEntry> getFilteredOut() {\r
1860 return _data.getFilteredOut();\r
1861 }\r
1862\r
1863// @Override\r
1864 public void addSelectionChangedListener(ISelectionChangedListener listener) {\r
1865 if (listener != null) {\r
1866 if (!_selectionChangedListeners.contains(listener)) {\r
1867 _selectionChangedListeners.add(listener);\r
1868 }\r
1869 }\r
1870 }\r
1871\r
1872// @Override\r
1873 public void removeSelectionChangedListener(\r
1874 ISelectionChangedListener listener) {\r
1875 if (listener != null) {\r
1876 _selectionChangedListeners.remove(listener);\r
1877 }\r
1878 }\r
1879\r
1880// @Override\r
1881 public void setSelection(ISelection selection) {\r
1882 if (selection instanceof PlainSelection) {\r
1883 PlainSelection sel = (PlainSelection) selection;\r
1884 Object ob = sel.getFirstElement();\r
1885 if (ob instanceof ITmfTimeAnalysisEntry) {\r
1886 ITmfTimeAnalysisEntry trace = (ITmfTimeAnalysisEntry) ob;\r
1887 selectItem(trace, false);\r
1888 }\r
1889 }\r
1890\r
1891 }\r
1892}\r
1893\r
1894class Item {\r
1895 public boolean _expanded;\r
1896 public boolean _selected;\r
1897 public boolean _hasChildren;\r
1898 public String _name;\r
1899\r
1900 Item(String name) {\r
1901 _name = name;\r
1902 }\r
1903\r
4e3aa37d 1904 @Override\r
b0d3496e
ASL
1905 public String toString() {\r
1906 return _name;\r
1907 }\r
1908}\r
1909\r
1910class TraceItem extends Item {\r
1911 public ITmfTimeAnalysisEntry _trace;\r
1912\r
1913 TraceItem(ITmfTimeAnalysisEntry trace, String name) {\r
1914 super(name);\r
1915 _trace = trace;\r
1916 }\r
1917}\r
1918\r
1919class GroupItem extends Item {\r
1920 public List<ITmfTimeAnalysisEntry> _traces;\r
1921\r
1922 GroupItem(String name) {\r
1923 super(name);\r
1924 _traces = new ArrayList<ITmfTimeAnalysisEntry>();\r
1925 _hasChildren = true;\r
1926 }\r
1927\r
1928 void add(ITmfTimeAnalysisEntry trace) {\r
1929 _traces.add(trace);\r
1930 }\r
1931}\r
1932\r
1933class ItemData {\r
1934 public Object[] _items = new Object[0];\r
1935 private Object _traces[] = new Object[0];\r
1936 private boolean traceFilter[] = new boolean[0];\r
1937 private Map<String, GroupItem> _groupTable = new HashMap<String, GroupItem>();\r
1938 private boolean _flatList = false;\r
1939 private TmfTimeAnalysisProvider utilsImp;\r
1940 private Vector<ITmfTimeAnalysisEntry> filteredOut = new Vector<ITmfTimeAnalysisEntry>();\r
1941\r
1942 public ItemData(TmfTimeAnalysisProvider utils) {\r
1943 this.utilsImp = utils;\r
1944 }\r
1945\r
1946 protected void groupTraces(boolean on) {\r
1947 if (_flatList == on) {\r
1948 _flatList = !on;\r
1949 updateItems();\r
1950 }\r
1951 }\r
1952\r
1953 void clearGroups() {\r
1954 Iterator<GroupItem> it = _groupTable.values().iterator();\r
1955 while (it.hasNext()) {\r
1956 GroupItem group = it.next();\r
1957 group._traces.clear();\r
1958 }\r
1959 }\r
1960\r
1961 void deleteEmptyGroups() {\r
1962 Iterator<GroupItem> it = _groupTable.values().iterator();\r
1963 while (it.hasNext()) {\r
1964 GroupItem group = it.next();\r
1965 if (group._traces.size() == 0)\r
1966 it.remove();\r
1967 }\r
1968 }\r
1969\r
1970 TraceItem findTraceItem(ITmfTimeAnalysisEntry trace) {\r
1971 if (trace == null)\r
1972 return null;\r
1973\r
1974 int traceId = trace.getId();\r
1975 TraceItem traceItem = null;\r
1976\r
1977 for (int i = 0; i < _items.length; i++) {\r
1978 Object item = _items[i];\r
1979 if (item instanceof TraceItem) {\r
1980 TraceItem ti = (TraceItem) item;\r
1981 if (ti._trace.getId() == traceId) {\r
1982 traceItem = ti;\r
1983 break;\r
1984 }\r
1985 }\r
1986 }\r
1987\r
1988 return traceItem;\r
1989 }\r
1990\r
1991 Integer findTraceItemIndex(ITmfTimeAnalysisEntry trace) {\r
1992 if (trace == null)\r
1993 return null;\r
1994\r
1995 int traceId = trace.getId();\r
1996\r
1997 Integer idx = null;\r
1998 for (int i = 0; i < _items.length; i++) {\r
1999 idx = i;\r
2000 Object item = _items[i];\r
2001 if (item instanceof TraceItem) {\r
2002 TraceItem ti = (TraceItem) item;\r
2003 if (ti._trace.getId() == traceId) {\r
2004 break;\r
2005 }\r
2006 }\r
2007 }\r
2008\r
2009 return idx;\r
2010 }\r
2011\r
2012 public void updateItems() {\r
2013 List<Item> itemList = new ArrayList<Item>();\r
2014 String name = "";\r
2015\r
2016 Iterator<GroupItem> it = _groupTable.values().iterator();\r
2017 while (it.hasNext()) {\r
2018 GroupItem group = it.next();\r
2019 if (!_flatList)\r
2020 itemList.add(group);\r
2021\r
2022 if (_flatList || group._expanded) {\r
2023 Iterator<ITmfTimeAnalysisEntry> it2 = group._traces.iterator();\r
2024 while (it2.hasNext()) {\r
2025 ITmfTimeAnalysisEntry trace = it2.next();\r
2026 TraceItem traceItem = findTraceItem(trace);\r
2027 name = utilsImp.composeTraceName(trace, false);\r
2028 traceItem = new TraceItem(trace, name);\r
2029 itemList.add(traceItem);\r
2030 }\r
2031 }\r
2032 }\r
2033 _items = itemList.toArray();\r
2034 }\r
2035\r
2036 public int expandItem(int idx, boolean expand) {\r
2037 if (idx < 0 || idx >= _items.length)\r
2038 return 0;\r
2039 int ret = 0;\r
2040 Item item = (Item) _items[idx];\r
2041 if (item._hasChildren && !item._expanded) {\r
2042 item._expanded = expand;\r
2043 ret = _items.length;\r
2044 updateItems();\r
2045 ret = _items.length - ret;\r
2046 }\r
2047 return ret;\r
2048 }\r
2049\r
2050 public void refreshData(Object traces[]) {\r
2051 if (traces == null || traces.length == 0) {\r
2052 traceFilter = null;\r
2053 } else if (traceFilter == null || traces.length != traceFilter.length) {\r
2054 traceFilter = new boolean[traces.length];\r
2055 java.util.Arrays.fill(traceFilter, true);\r
2056 }\r
2057\r
2058 _traces = traces;\r
2059 refreshData();\r
2060 }\r
2061\r
2062 /**\r
2063 * Allows to update the GUI from a stream of events handling addition one by\r
2064 * one over known TmfTaTrace parents.\r
2065 * \r
2066 * @param parent\r
2067 * @param childItem\r
2068 */\r
2069 public void refreshPartial(ITmfTimeAnalysisEntry parent, TimeEvent childItem) {\r
2070 // Find the Trace item within the current list\r
2071 TraceItem item = findTraceItem(parent);\r
2072\r
bbeafe9d
FC
2073// This method is not used (yet) so this code can be commented out for now\r
2074// FIXME: Arrays.copyOf is a Java6 feature\r
2075// if (item == null) {\r
2076// // If the parent item is not found, make room for it in the current\r
2077// // array\r
2078// int length = 1;\r
2079// Object[] traces;\r
2080// if (_traces != null) {\r
2081// length = _traces.length + 1;\r
2082// traces = Arrays.copyOf(_traces, length);\r
2083// } else {\r
2084// traces = new Object[length];\r
2085// }\r
2086//\r
2087// // Add the new parent element to the end of the array.\r
2088// traces[length - 1] = parent;\r
2089//\r
2090// // update the filter array to accomodate a postion to the new\r
2091// // element\r
2092// traceFilter = new boolean[traces.length];\r
2093// java.util.Arrays.fill(traceFilter, true);\r
2094//\r
2095// // rebuild internal data\r
2096// _traces = traces;\r
2097// refreshData();\r
2098//\r
2099// // item must be there\r
2100// item = findTraceItem(parent);\r
2101// }\r
b0d3496e
ASL
2102\r
2103 ITmfTimeAnalysisEntry localTraceItem = item._trace;\r
2104 // Local trace found\r
2105 Vector<TimeEvent> children = localTraceItem.getTraceEvents();\r
2106 TimeEvent lastChildIn = children.lastElement();\r
2107 long lastChildSTime = lastChildIn.getTime();\r
2108 long newChildSTime = childItem.getTime();\r
2109 if (newChildSTime < lastChildSTime) {\r
2110 // The children are expected to arrive sorted by time\r
2111 // since the new time is earlier than the last child\r
2112 // The infomation is being refreshed from start, remove all\r
2113 // children and start over\r
2114 children.clear();\r
2115 }\r
2116 // Add the new item\r
2117 children.add(childItem);\r
2118\r
2119 }\r
2120\r
2121 public void refreshData() {\r
2122 clearGroups();\r
2123 filteredOut.clear();\r
2124 String undef = Messages._UNDEFINED_GROUP;\r
2125 List<GroupItem> groupList = new ArrayList<GroupItem>();\r
2126 for (int i = 0; i < _traces.length; i++) {\r
2127 ITmfTimeAnalysisEntry trace = (ITmfTimeAnalysisEntry) _traces[i];\r
2128 if (!traceFilter[i]) {\r
2129 filteredOut.add(trace);\r
2130 continue;\r
2131 }\r
2132\r
2133 String groupName = trace.getGroupName();\r
2134 if (null == groupName)\r
2135 groupName = undef;\r
2136\r
2137 GroupItem group = _groupTable.get(groupName);\r
2138 if (null == group) {\r
2139 group = new GroupItem(NLS.bind(Messages._TRACE_GROUP_LABEL,\r
2140 groupName));\r
2141 group._expanded = !groupName.equalsIgnoreCase("system")\r
2142 && !groupName.equalsIgnoreCase(undef);\r
2143 _groupTable.put(groupName, group);\r
2144 groupList.add(group);\r
2145 }\r
2146 group.add(trace);\r
2147 }\r
2148\r
2149 deleteEmptyGroups();\r
2150 updateItems();\r
2151 }\r
2152\r
2153 public Object[] getTraces() {\r
2154 return _traces;\r
2155 }\r
2156\r
2157 public boolean[] getTraceFilter() {\r
2158 return traceFilter;\r
2159 }\r
2160\r
2161 public Vector<ITmfTimeAnalysisEntry> getFilteredOut() {\r
2162 return filteredOut;\r
2163 }\r
2164}\r
This page took 0.122978 seconds and 5 git commands to generate.