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