Add syscall state info in CFV, support of initial time range, bugfixes
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.ui / src / org / eclipse / linuxtools / tmf / ui / widgets / timegraph / TimeGraphViewer.java
CommitLineData
fb5cad3d
PT
1/*****************************************************************************\r
2 * Copyright (c) 2007, 2008 Intel Corporation, 2009, 2010, 2011, 2012 Ericsson.\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 * Alexander N. Alexeev, Intel - Add monitors statistics support\r
12 * Alvaro Sanchez-Leon - Adapted for TMF\r
13 * Patrick Tasse - Refactoring\r
14 *\r
15 *****************************************************************************/\r
16\r
17package org.eclipse.linuxtools.tmf.ui.widgets.timegraph;\r
18\r
19import java.util.ArrayList;\r
20\r
b83af2c3 21import org.eclipse.jface.action.Action;\r
fb5cad3d 22import org.eclipse.jface.viewers.ISelectionProvider;\r
b83af2c3
PT
23import org.eclipse.linuxtools.internal.tmf.ui.ITmfImageConstants;\r
24import org.eclipse.linuxtools.internal.tmf.ui.Messages;\r
25import org.eclipse.linuxtools.internal.tmf.ui.TmfUiPlugin;\r
fb5cad3d
PT
26import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.dialogs.TimeGraphLegend;\r
27import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent;\r
28import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeGraphEntry;\r
29import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.widgets.ITimeDataProvider;\r
b83af2c3 30import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.widgets.TimeGraphColorScheme;\r
fb5cad3d
PT
31import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.widgets.TimeGraphControl;\r
32import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.widgets.TimeGraphScale;\r
33import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.widgets.TimeGraphTooltipHandler;\r
fb5cad3d
PT
34import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.widgets.Utils;\r
35import org.eclipse.swt.SWT;\r
36import org.eclipse.swt.events.ControlAdapter;\r
37import org.eclipse.swt.events.ControlEvent;\r
b83af2c3
PT
38import org.eclipse.swt.events.KeyAdapter;\r
39import org.eclipse.swt.events.KeyEvent;\r
40import org.eclipse.swt.events.MouseEvent;\r
41import org.eclipse.swt.events.MouseWheelListener;\r
fb5cad3d
PT
42import org.eclipse.swt.events.SelectionAdapter;\r
43import org.eclipse.swt.events.SelectionEvent;\r
44import org.eclipse.swt.events.SelectionListener;\r
45import org.eclipse.swt.graphics.Rectangle;\r
46import org.eclipse.swt.layout.FillLayout;\r
47import org.eclipse.swt.layout.GridData;\r
48import org.eclipse.swt.layout.GridLayout;\r
49import org.eclipse.swt.widgets.Composite;\r
50import org.eclipse.swt.widgets.Control;\r
51import org.eclipse.swt.widgets.ScrollBar;\r
52import org.eclipse.swt.widgets.Slider;\r
53\r
54public class TimeGraphViewer implements ITimeDataProvider, SelectionListener {\r
55\r
56 /** vars */\r
57 private long _minTimeInterval;\r
58 private long _selectedTime;\r
59 private ITimeGraphEntry _selectedEntry;\r
60 private long _beginTime;\r
61 private long _endTime;\r
62 private long _time0;\r
63 private long _time1;\r
64 private long _time0_;\r
65 private long _time1_;\r
66 private long _time0_extSynch = 0;\r
67 private long _time1_extSynch = 0;\r
68 private boolean _timeRangeFixed;\r
69 private int _nameWidthPref = 200;\r
70 private int _minNameWidth = 6;\r
71 private int _nameWidth;\r
72 private Composite _dataViewer;\r
73\r
74 private TimeGraphControl _stateCtrl;\r
75 private TimeGraphScale _timeScaleCtrl;\r
76 private Slider _verticalScrollBar;\r
77 private TimeGraphTooltipHandler _threadTip;\r
78 private TimeGraphColorScheme _colors;\r
b83af2c3 79 private ITimeGraphPresentationProvider fTimeGraphProvider;\r
fb5cad3d
PT
80\r
81 ArrayList<ITimeGraphSelectionListener> fSelectionListeners = new ArrayList<ITimeGraphSelectionListener>();\r
82 ArrayList<ITimeGraphTimeListener> fTimeListeners = new ArrayList<ITimeGraphTimeListener>();\r
83 ArrayList<ITimeGraphRangeListener> fRangeListeners = new ArrayList<ITimeGraphRangeListener>();\r
84\r
85 // Calender Time format, using Epoch reference or Relative time\r
86 // format(default\r
87 private boolean calendarTimeFormat = false;\r
88 private int borderWidth = 4;\r
89 private int timeScaleHeight = 22;\r
90\r
b83af2c3
PT
91 private Action resetScale;\r
92 private Action showLegendAction;\r
93 private Action nextEventAction;\r
94 private Action prevEventAction;\r
95 private Action nextItemAction;\r
96 private Action previousItemAction;\r
97 private Action zoomInAction;\r
98 private Action zoomOutAction;\r
99\r
fb5cad3d
PT
100 /** ctor */\r
101 public TimeGraphViewer(Composite parent, int style) {\r
102 createDataViewer(parent, style);\r
103 }\r
104\r
105 /**\r
106 * Sets the timegraph provider used by this timegraph viewer.\r
107 * \r
108 * @param timeGraphProvider the timegraph provider\r
109 */\r
b83af2c3 110 public void setTimeGraphProvider(ITimeGraphPresentationProvider timeGraphProvider) {\r
fb5cad3d
PT
111 fTimeGraphProvider = timeGraphProvider;\r
112 _stateCtrl.setTimeGraphProvider(timeGraphProvider);\r
113 _threadTip = new TimeGraphTooltipHandler(_dataViewer.getShell(), fTimeGraphProvider, this);\r
114 _threadTip.activateHoverHelp(_stateCtrl);\r
115 }\r
116\r
b83af2c3
PT
117 /**\r
118 * Sets or clears the input for this time graph viewer.\r
119 * The input array should only contain top-level elements.\r
120 *\r
121 * @param input the input of this time graph viewer, or <code>null</code> if none\r
122 */\r
fb5cad3d
PT
123 public void setInput(ITimeGraphEntry[] input) {\r
124 if (null != _stateCtrl) {\r
125 if (null == input) {\r
126 input = new ITimeGraphEntry[0];\r
127 }\r
128 setTimeRange(input);\r
129 _verticalScrollBar.setEnabled(true);\r
130 setTopIndex(0);\r
3ac6ad1a 131 _selectedTime = 0;\r
fb5cad3d
PT
132 refreshAllData(input);\r
133 }\r
134 }\r
135\r
136 public void refresh() {\r
b83af2c3 137 setInput(_stateCtrl.getTraces());\r
fb5cad3d
PT
138 }\r
139\r
140 public void controlMoved(ControlEvent e) {\r
141 }\r
142\r
143 public void controlResized(ControlEvent e) {\r
144 resizeControls();\r
145 }\r
146\r
147 // called from the display order in the API\r
148 public void modelUpdate(ITimeGraphEntry[] traces, long start,\r
149 long end, boolean updateTimeBounds) {\r
150 if (null != _stateCtrl) {\r
151 //loadOptions();\r
152 updateInternalData(traces, start, end);\r
153 if (updateTimeBounds) {\r
154 _timeRangeFixed = true;\r
155 // set window to match limits\r
156 setStartFinishTime(_time0_, _time1_);\r
157 } else {\r
158 _stateCtrl.redraw();\r
159 _timeScaleCtrl.redraw();\r
160 }\r
161 }\r
162 }\r
163\r
fb5cad3d
PT
164 protected String getViewTypeStr() {\r
165 return "viewoption.threads"; //$NON-NLS-1$\r
166 }\r
167\r
168 int getMarginWidth(int idx) {\r
169 return 0;\r
170 }\r
171\r
172 int getMarginHeight(int idx) {\r
173 return 0;\r
174 }\r
175\r
176 void loadOptions() {\r
177 _minTimeInterval = 1;\r
178 _selectedTime = -1;\r
179 _nameWidth = Utils.loadIntOption(getPreferenceString("namewidth"), //$NON-NLS-1$\r
180 _nameWidthPref, _minNameWidth, 1000);\r
181 }\r
182\r
183 void saveOptions() {\r
184 Utils.saveIntOption(getPreferenceString("namewidth"), _nameWidth); //$NON-NLS-1$\r
185 }\r
186\r
187 protected Control createDataViewer(Composite parent, int style) {\r
188 loadOptions();\r
189 _colors = new TimeGraphColorScheme();\r
b83af2c3
PT
190 _dataViewer = new Composite(parent, style) {\r
191 @Override\r
192 public void redraw() {\r
193 _stateCtrl.redraw();\r
194 super.redraw();\r
195 }\r
196 };\r
fb5cad3d
PT
197 GridLayout gl = new GridLayout(2, false);\r
198 gl.marginHeight = borderWidth;\r
199 gl.marginWidth = 0;\r
200 gl.verticalSpacing = 0;\r
201 gl.horizontalSpacing = 0;\r
202 _dataViewer.setLayout(gl);\r
203\r
204 _timeScaleCtrl = new TimeGraphScale(_dataViewer, _colors);\r
205 _timeScaleCtrl.setTimeProvider(this);\r
206 _timeScaleCtrl.setLayoutData(new GridData(SWT.FILL, SWT.DEFAULT, true, false));\r
207 _timeScaleCtrl.setHeight(timeScaleHeight);\r
208\r
209 _verticalScrollBar = new Slider(_dataViewer, SWT.VERTICAL | SWT.NO_FOCUS);\r
210 _verticalScrollBar.setLayoutData(new GridData(SWT.DEFAULT, SWT.FILL, false, true, 1, 2));\r
211 _verticalScrollBar.addSelectionListener(new SelectionAdapter() {\r
212 @Override\r
213 public void widgetSelected(SelectionEvent e) {\r
214 setTopIndex(_verticalScrollBar.getSelection());\r
215 }\r
216 });\r
217 _verticalScrollBar.setEnabled(false);\r
218\r
219 _stateCtrl = createTimeGraphControl();\r
220\r
221 _stateCtrl.setTimeProvider(this);\r
222 _stateCtrl.addSelectionListener(this);\r
223 _stateCtrl.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 2));\r
b83af2c3
PT
224 _stateCtrl.addMouseWheelListener(new MouseWheelListener() {\r
225 @Override\r
226 public void mouseScrolled(MouseEvent e) {\r
227 adjustVerticalScrollBar();\r
228 }\r
229 });\r
230 _stateCtrl.addKeyListener(new KeyAdapter() {\r
231 @Override\r
232 public void keyPressed(KeyEvent e) {\r
233 adjustVerticalScrollBar();\r
234 }\r
235 });\r
fb5cad3d
PT
236\r
237 Composite filler = new Composite(_dataViewer, SWT.NONE);\r
238 GridData gd = new GridData(SWT.DEFAULT, SWT.DEFAULT, false, false);\r
239 gd.heightHint = _stateCtrl.getHorizontalBar().getSize().y;\r
240 filler.setLayoutData(gd);\r
241 filler.setLayout(new FillLayout());\r
242\r
243 _stateCtrl.addControlListener(new ControlAdapter() {\r
244 @Override\r
245 public void controlResized(ControlEvent event) {\r
246 resizeControls();\r
247 }\r
248 });\r
249 resizeControls();\r
250 _dataViewer.update();\r
251 adjustVerticalScrollBar();\r
252 return _dataViewer;\r
253 }\r
254\r
255 public void dispose() {\r
256 saveOptions();\r
257 _stateCtrl.dispose();\r
258 _dataViewer.dispose();\r
259 _colors.dispose();\r
260 }\r
261\r
262 protected TimeGraphControl createTimeGraphControl() {\r
263 return new TimeGraphControl(_dataViewer, _colors);\r
264 }\r
265\r
266 public void resizeControls() {\r
267 Rectangle r = _dataViewer.getClientArea();\r
268 if (r.isEmpty())\r
269 return;\r
270\r
271 int width = r.width;\r
272 if (_nameWidth > width - _minNameWidth)\r
273 _nameWidth = width - _minNameWidth;\r
274 if (_nameWidth < _minNameWidth)\r
275 _nameWidth = _minNameWidth;\r
276 adjustVerticalScrollBar();\r
277 }\r
278\r
279 /** Tries to set most convenient time range for display. */\r
b83af2c3 280 public void setTimeRange(ITimeGraphEntry traces[]) {\r
fb5cad3d
PT
281 _endTime = 0;\r
282 _beginTime = -1;\r
fb5cad3d 283 for (int i = 0; i < traces.length; i++) {\r
b83af2c3
PT
284 ITimeGraphEntry entry = traces[i];\r
285 if (entry.getEndTime() >= entry.getStartTime() && entry.getEndTime() > 0) {\r
fb5cad3d
PT
286 if (_beginTime < 0 || entry.getStartTime() < _beginTime) {\r
287 _beginTime = entry.getStartTime();\r
288 }\r
b83af2c3
PT
289 if (entry.getEndTime() > _endTime) {\r
290 _endTime = entry.getEndTime();\r
fb5cad3d
PT
291 }\r
292 }\r
fb5cad3d
PT
293 }\r
294\r
b83af2c3 295 if (_beginTime < 0) {\r
fb5cad3d 296 _beginTime = 0;\r
b83af2c3 297 }\r
fb5cad3d
PT
298 }\r
299\r
b83af2c3 300 public void setTimeBounds() {\r
fb5cad3d
PT
301 //_time0_ = _beginTime - (long) ((_endTime - _beginTime) * 0.02);\r
302 _time0_ = _beginTime;\r
303 if (_time0_ < 0)\r
304 _time0_ = 0;\r
305 // _time1_ = _time0_ + (_endTime - _time0_) * 1.05;\r
306 _time1_ = _endTime;\r
307 // _time0_ = Math.floor(_time0_);\r
308 // _time1_ = Math.ceil(_time1_);\r
309 if (!_timeRangeFixed) {\r
310 _time0 = _time0_;\r
311 _time1 = _time1_;\r
312 }\r
313 if (_time1 - _time0 < _minTimeInterval) {\r
314 _time1 = _time0 + _minTimeInterval;\r
315 }\r
316 }\r
317\r
318 /**\r
319 * @param traces\r
320 * @param start\r
321 * @param end\r
322 */\r
323 void updateInternalData(ITimeGraphEntry[] traces, long start, long end) {\r
324 if (null == traces)\r
325 traces = new ITimeGraphEntry[0];\r
326 if ((start == 0 && end == 0) || start < 0 || end < 0) {\r
327 // Start and end time are unspecified and need to be determined from\r
328 // individual processes\r
329 setTimeRange(traces);\r
330 } else {\r
331 _beginTime = start;\r
332 _endTime = end;\r
333 }\r
334\r
335 refreshAllData(traces);\r
336 }\r
337\r
338 /**\r
339 * @param traces\r
340 */\r
341 private void refreshAllData(ITimeGraphEntry[] traces) {\r
342 setTimeBounds();\r
343 if (_selectedTime < _beginTime) {\r
344 _selectedTime = _beginTime;\r
345 } else if (_selectedTime > _endTime) {\r
346 _selectedTime = _endTime;\r
347 }\r
348 _stateCtrl.refreshData(traces);\r
b83af2c3 349 _timeScaleCtrl.redraw();\r
fb5cad3d
PT
350 adjustVerticalScrollBar();\r
351 }\r
352\r
353 public void setFocus() {\r
354 if (null != _stateCtrl)\r
355 _stateCtrl.setFocus();\r
356 }\r
357\r
358 public boolean isInFocus() {\r
359 return _stateCtrl.isInFocus();\r
360 }\r
361\r
362 public ITimeGraphEntry getSelection() {\r
363 return _stateCtrl.getSelectedTrace();\r
364 }\r
365\r
366 public int getSelectionIndex() {\r
367 return _stateCtrl.getSelectedIndex();\r
368 }\r
369\r
370 @Override\r
371 public long getTime0() {\r
372 return _time0;\r
373 }\r
374\r
375 @Override\r
376 public long getTime1() {\r
377 return _time1;\r
378 }\r
379\r
380 @Override\r
381 public long getMinTimeInterval() {\r
382 return _minTimeInterval;\r
383 }\r
384\r
385 @Override\r
386 public int getNameSpace() {\r
387 return _nameWidth;\r
388 }\r
389\r
390 @Override\r
391 public void setNameSpace(int width) {\r
392 _nameWidth = width;\r
393 width = _stateCtrl.getClientArea().width;\r
394 if (_nameWidth > width - 6)\r
395 _nameWidth = width - 6;\r
396 if (_nameWidth < 6)\r
397 _nameWidth = 6;\r
398 _stateCtrl.adjustScrolls();\r
399 _stateCtrl.redraw();\r
400 _timeScaleCtrl.redraw();\r
401 }\r
402\r
403 @Override\r
404 public int getTimeSpace() {\r
405 int w = _stateCtrl.getClientArea().width;\r
406 return w - _nameWidth;\r
407 }\r
408\r
409 @Override\r
410 public long getSelectedTime() {\r
411 return _selectedTime;\r
412 }\r
413\r
414 @Override\r
415 public long getBeginTime() {\r
416 return _beginTime;\r
417 }\r
418\r
419 @Override\r
420 public long getEndTime() {\r
421 return _endTime;\r
422 }\r
423\r
424 @Override\r
425 public long getMaxTime() {\r
426 return _time1_;\r
427 }\r
428\r
429 @Override\r
430 public long getMinTime() {\r
431 return _time0_;\r
432 }\r
433\r
434 /*\r
435 * (non-Javadoc)\r
436 * \r
437 * @see\r
438 * org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.widgets.ITimeDataProvider\r
439 * #setStartFinishTimeNotify(long, long)\r
440 */\r
441 @Override\r
442 public void setStartFinishTimeNotify(long time0, long time1) {\r
443 setStartFinishTime(time0, time1);\r
444 notifyRangeListeners(time0, time1);\r
445 }\r
446\r
447\r
448 /* (non-Javadoc)\r
449 * @see org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.widgets.ITimeDataProvider#notifyStartFinishTime()\r
450 */\r
451 @Override\r
452 public void notifyStartFinishTime() {\r
453 notifyRangeListeners(_time0, _time1);\r
454 }\r
455\r
456 /*\r
457 * (non-Javadoc)\r
458 * \r
459 * @see\r
460 * org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.widgets.ITimeDataProvider\r
461 * #setStartFinishTime(long, long)\r
462 */\r
463 @Override\r
464 public void setStartFinishTime(long time0, long time1) {\r
465 _time0 = time0;\r
466 if (_time0 < _time0_)\r
467 _time0 = _time0_;\r
468 if (_time0 > _time1_)\r
469 _time0 = _time1_;\r
470 _time1 = time1;\r
471 if (_time1 < _time0_)\r
472 _time1 = _time0_;\r
473 if (_time1 > _time1_)\r
474 _time1 = _time1_;\r
475 if (_time1 - _time0 < _minTimeInterval)\r
476 _time1 = _time0 + _minTimeInterval;\r
477 _timeRangeFixed = true;\r
478 _stateCtrl.adjustScrolls();\r
479 _stateCtrl.redraw();\r
480 _timeScaleCtrl.redraw();\r
481 }\r
482\r
483 public void setTimeBounds(long beginTime, long endTime) {\r
484 _beginTime = beginTime;\r
485 _endTime = endTime;\r
486 _time0_ = beginTime;\r
487 _time1_ = endTime;\r
488 _stateCtrl.adjustScrolls();\r
489 }\r
490\r
491 @Override\r
492 public void resetStartFinishTime() {\r
493 setStartFinishTimeNotify(_time0_, _time1_);\r
494 _timeRangeFixed = false;\r
495 }\r
496\r
497 @Override\r
3ac6ad1a
BH
498 public void setSelectedTimeNotify(long time, boolean ensureVisible) {\r
499 setSelectedTimeInt(time, ensureVisible, true);\r
500 }\r
501 \r
502 @Override\r
503 public void setSelectedTime(long time, boolean ensureVisible) {\r
504 setSelectedTimeInt(time, ensureVisible, false);\r
505 }\r
506\r
507 private void setSelectedTimeInt(long time, boolean ensureVisible, boolean doNotify) {\r
fb5cad3d
PT
508 long time0 = _time0;\r
509 long time1 = _time1;\r
510 if (ensureVisible) {\r
511 double timeSpace = (_time1 - _time0) * .02;\r
512 double timeMid = (_time1 - _time0) * .1;\r
513 if (time < _time0 + timeSpace) {\r
514 long dt = (long) (_time0 - time + timeMid);\r
515 _time0 -= dt;\r
516 _time1 -= dt;\r
517 } else if (time > _time1 - timeSpace) {\r
518 long dt = (long) (time - _time1 + timeMid);\r
519 _time0 += dt;\r
520 _time1 += dt;\r
521 }\r
522 if (_time0 < _time0_) {\r
523 _time1 = Math.min(_time1_, _time1 + (_time0_ - _time0));\r
524 _time0 = _time0_;\r
525 } else if (_time1 > _time1_) {\r
526 _time0 = Math.max(_time0_, _time0 - (_time1 - _time1_));\r
527 _time1 = _time1_;\r
528 }\r
529 }\r
530 if (_time1 - _time0 < _minTimeInterval) {\r
531 _time1 = _time0 + _minTimeInterval;\r
532 }\r
533 _stateCtrl.adjustScrolls();\r
534 _stateCtrl.redraw();\r
535 _timeScaleCtrl.redraw();\r
3ac6ad1a
BH
536 \r
537 \r
538 boolean notifySelectedTime = (time != _selectedTime);\r
539 _selectedTime = time;\r
540 \r
541 if (doNotify && ((time0 != _time0) || (time1 != _time1))) {\r
fb5cad3d
PT
542 notifyRangeListeners(_time0, _time1);\r
543 }\r
3ac6ad1a
BH
544 \r
545 if (doNotify && notifySelectedTime) {\r
fb5cad3d
PT
546 notifyTimeListeners(_selectedTime);\r
547 }\r
548 }\r
549\r
550 @Override\r
551 public void widgetDefaultSelected(SelectionEvent e) {\r
552 if (_selectedEntry != getSelection()) {\r
553 _selectedEntry = getSelection();\r
554 notifySelectionListeners(_selectedEntry);\r
555 }\r
556 }\r
557\r
558 @Override\r
559 public void widgetSelected(SelectionEvent e) {\r
560 if (_selectedEntry != getSelection()) {\r
561 _selectedEntry = getSelection();\r
562 notifySelectionListeners(_selectedEntry);\r
563 }\r
564 }\r
565\r
566 public void selectNextEvent() {\r
567 _stateCtrl.selectNextEvent();\r
568 adjustVerticalScrollBar();\r
569 }\r
570\r
571 public void selectPrevEvent() {\r
572 _stateCtrl.selectPrevEvent();\r
573 adjustVerticalScrollBar();\r
574 }\r
575\r
b83af2c3 576 public void selectNextItem() {\r
fb5cad3d
PT
577 _stateCtrl.selectNextTrace();\r
578 adjustVerticalScrollBar();\r
579 }\r
580\r
b83af2c3 581 public void selectPrevItem() {\r
fb5cad3d
PT
582 _stateCtrl.selectPrevTrace();\r
583 adjustVerticalScrollBar();\r
584 }\r
585\r
586 public void showLegend() {\r
587 if (_dataViewer == null || _dataViewer.isDisposed())\r
588 return;\r
589\r
590 TimeGraphLegend.open(_dataViewer.getShell(), fTimeGraphProvider);\r
591 }\r
592\r
593 public void zoomIn() {\r
594 _stateCtrl.zoomIn();\r
595 }\r
596\r
597 public void zoomOut() {\r
598 _stateCtrl.zoomOut();\r
599 }\r
600\r
601 private String getPreferenceString(String string) {\r
602 return getViewTypeStr() + "." + string; //$NON-NLS-1$\r
603 }\r
604\r
605 public void addSelectionListener(ITimeGraphSelectionListener listener) {\r
606 fSelectionListeners.add(listener);\r
607 }\r
608\r
609 public void removeSelectionListener(ITimeGraphSelectionListener listener) {\r
610 fSelectionListeners.remove(listener);\r
611 }\r
612\r
613 private void notifySelectionListeners(ITimeGraphEntry selection) {\r
614 TimeGraphSelectionEvent event = new TimeGraphSelectionEvent(this, selection);\r
615\r
616 for (ITimeGraphSelectionListener listener : fSelectionListeners) {\r
617 listener.selectionChanged(event);\r
618 }\r
619 }\r
620\r
621 public void addTimeListener(ITimeGraphTimeListener listener) {\r
622 fTimeListeners.add(listener);\r
623 }\r
624\r
625 public void removeTimeListener(ITimeGraphTimeListener listener) {\r
626 fTimeListeners.remove(listener);\r
627 }\r
628\r
629 private void notifyTimeListeners(long time) {\r
630 TimeGraphTimeEvent event = new TimeGraphTimeEvent(this, time);\r
631\r
632 for (ITimeGraphTimeListener listener : fTimeListeners) {\r
633 listener.timeSelected(event);\r
634 }\r
635 }\r
636\r
637 public void addRangeListener(ITimeGraphRangeListener listener) {\r
638 fRangeListeners.add(listener);\r
639 }\r
640\r
641 public void removeRangeListener(ITimeGraphRangeListener listener) {\r
642 fRangeListeners.remove(listener);\r
643 }\r
644\r
645 private void notifyRangeListeners(long startTime, long endTime) {\r
646 // Check if the time has actually changed from last notification\r
647 if (startTime != _time0_extSynch || endTime != _time1_extSynch) {\r
648 // Notify Time Scale Selection Listeners\r
649 TimeGraphRangeUpdateEvent event = new TimeGraphRangeUpdateEvent(this, startTime, endTime);\r
650\r
651 for (ITimeGraphRangeListener listener : fRangeListeners) {\r
652 listener.timeRangeUpdated(event);\r
653 }\r
654\r
655 // update external synch timers\r
656 updateExtSynchTimers();\r
657 }\r
658 }\r
659\r
660 public void setSelectedTime(long time, boolean ensureVisible, Object source) {\r
661 if (this == source) {\r
662 return;\r
663 }\r
664\r
3ac6ad1a 665 setSelectedTimeNotify(time, ensureVisible);\r
fb5cad3d
PT
666 }\r
667\r
668 public void setSelectedEvent(ITimeEvent event, Object source) {\r
669 if (event == null || source == this) {\r
670 return;\r
671 }\r
b83af2c3
PT
672 _selectedEntry = event.getEntry();\r
673 _stateCtrl.selectItem(_selectedEntry, false);\r
fb5cad3d 674\r
3ac6ad1a 675 setSelectedTimeInt(event.getTime(), true, true);\r
fb5cad3d
PT
676 adjustVerticalScrollBar();\r
677 }\r
678\r
679 public void setSelectedTraceTime(ITimeGraphEntry trace, long time, Object source) {\r
680 if (trace == null || source == this) {\r
681 return;\r
682 }\r
b83af2c3
PT
683 _selectedEntry = trace;\r
684 _stateCtrl.selectItem(trace, false);\r
fb5cad3d 685\r
3ac6ad1a 686 setSelectedTimeInt(time, true, true);\r
fb5cad3d
PT
687 }\r
688\r
689 public void setSelection(ITimeGraphEntry trace) {\r
b83af2c3 690 _selectedEntry = trace;\r
fb5cad3d
PT
691 _stateCtrl.selectItem(trace, false);\r
692 adjustVerticalScrollBar();\r
693 }\r
694\r
695 public void setSelectVisTimeWindow(long time0, long time1, Object source) {\r
696 if (source == this) {\r
697 return;\r
698 }\r
699\r
700 setStartFinishTime(time0, time1);\r
701\r
702 // update notification time values since we are now in synch with the\r
703 // external application\r
704 updateExtSynchTimers();\r
705 }\r
706\r
707 /**\r
708 * update the cache timers used to identify the need to send a time window\r
709 * update to external registered listeners\r
710 */\r
711 private void updateExtSynchTimers() {\r
712 // last time notification cache\r
713 _time0_extSynch = _time0;\r
714 _time1_extSynch = _time1;\r
715 }\r
716\r
717 public void setTimeCalendarFormat(boolean toAbsoluteCaltime) {\r
718 calendarTimeFormat = toAbsoluteCaltime;\r
719 }\r
720\r
721 @Override\r
722 public boolean isCalendarFormat() {\r
723 return calendarTimeFormat;\r
724 }\r
725\r
726 public int getBorderWidth() {\r
727 return borderWidth;\r
728 }\r
729\r
730 public void setBorderWidth(int borderWidth) {\r
731 if (borderWidth > -1) {\r
732 this.borderWidth = borderWidth;\r
733 GridLayout gl = (GridLayout)_dataViewer.getLayout();\r
734 gl.marginHeight = borderWidth;\r
735 }\r
736 }\r
737\r
738 public int getHeaderHeight() {\r
739 return timeScaleHeight;\r
740 }\r
741\r
742 public void setHeaderHeight(int headerHeight) {\r
743 if (headerHeight > -1) {\r
744 this.timeScaleHeight = headerHeight;\r
745 _timeScaleCtrl.setHeight(headerHeight);\r
746 }\r
747 }\r
748\r
749 public int getItemHeight() {\r
750 if (_stateCtrl != null) {\r
751 return _stateCtrl.getItemHeight();\r
752 }\r
753 return 0;\r
754 }\r
755\r
756 public void setItemHeight(int rowHeight) {\r
757 if (_stateCtrl != null) {\r
758 _stateCtrl.setItemHeight(rowHeight);\r
759 }\r
760 }\r
761\r
762 public void setMinimumItemWidth(int width) {\r
763 if (_stateCtrl != null) {\r
764 _stateCtrl.setMinimumItemWidth(width);\r
765 }\r
766 }\r
767\r
768 public void setNameWidthPref(int width) {\r
769 _nameWidthPref = width;\r
770 if (width == 0) {\r
771 _minNameWidth = 0;\r
772 _nameWidth = 0;\r
773 }\r
774 }\r
775\r
776 public int getNameWidthPref(int width) {\r
777 return _nameWidthPref;\r
778 }\r
779\r
780 /**\r
781 * Returns the primary control associated with this viewer.\r
782 *\r
783 * @return the SWT control which displays this viewer's content\r
784 */\r
785 public Control getControl() {\r
786 return _dataViewer;\r
787 }\r
788\r
789 /**\r
790 * Returns the time graph control associated with this viewer.\r
791 *\r
792 * @return the time graph control\r
793 */\r
794 TimeGraphControl getTimeGraphControl() {\r
795 return _stateCtrl;\r
796 }\r
797\r
798 /**\r
799 * Get the selection provider\r
800 * \r
801 * @return the selection provider\r
802 */\r
803 public ISelectionProvider getSelectionProvider() {\r
804 return _stateCtrl;\r
805 }\r
806\r
807 /*\r
808 * (non-Javadoc)\r
809 * \r
810 * @see\r
811 * org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.ITimeAnalysisViewer\r
812 * #waitCursor(boolean)\r
813 */\r
814 public void waitCursor(boolean waitInd) {\r
815 _stateCtrl.waitCursor(waitInd);\r
816 }\r
817\r
818 public ScrollBar getHorizontalBar() {\r
819 return _stateCtrl.getHorizontalBar();\r
820 }\r
821\r
822 public Slider getVerticalBar() {\r
823 return _verticalScrollBar;\r
824 }\r
825\r
826 public void setTopIndex(int index) {\r
827 _stateCtrl.setTopIndex(index);\r
828 adjustVerticalScrollBar();\r
829 }\r
830\r
831 public int getTopIndex() {\r
832 return _stateCtrl.getTopIndex();\r
833 }\r
834\r
835 public void setExpandedState(ITimeGraphEntry entry, boolean expanded) {\r
836 _stateCtrl.setExpandedState(entry, expanded);\r
837 adjustVerticalScrollBar();\r
838 }\r
839\r
840 public void addTreeListener(ITimeGraphTreeListener listener) {\r
841 _stateCtrl.addTreeListener(listener);\r
842 }\r
843\r
844 public void removeTreeListener(ITimeGraphTreeListener listener) {\r
845 _stateCtrl.removeTreeListener(listener);\r
846 }\r
b83af2c3
PT
847 \r
848 public Action getResetScaleAction() {\r
849 if (resetScale == null) {\r
850 // resetScale\r
851 resetScale = new Action() {\r
852 @Override\r
853 public void run() {\r
854 resetStartFinishTime();\r
855 }\r
856 };\r
857 resetScale.setText(Messages.TmfTimeGraphViewer_ResetScaleActionNameText);\r
858 resetScale.setToolTipText(Messages.TmfTimeGraphViewer_ResetScaleActionToolTipText);\r
859 resetScale.setImageDescriptor(TmfUiPlugin.getDefault().getImageDescripterFromPath(ITmfImageConstants.IMG_UI_HOME_MENU));\r
860 } \r
861 return resetScale;\r
862 }\r
863\r
864 public Action getShowLegendAction() {\r
865 if (showLegendAction == null) {\r
866 // showLegend\r
867 showLegendAction = new Action() {\r
868 @Override\r
869 public void run() {\r
870 showLegend();\r
871 }\r
872 };\r
873 showLegendAction.setText(Messages.TmfTimeGraphViewer_LegendActionNameText);\r
874 showLegendAction.setToolTipText(Messages.TmfTimeGraphViewer_LegendActionToolTipText);\r
875 showLegendAction.setImageDescriptor(TmfUiPlugin.getDefault().getImageDescripterFromPath(ITmfImageConstants.IMG_UI_SHOW_LEGEND));\r
876 }\r
877\r
878 return showLegendAction;\r
879 }\r
880 \r
881 public Action getNextEventAction() {\r
882 if (nextEventAction == null) {\r
883 nextEventAction = new Action() {\r
884 @Override\r
885 public void run() {\r
886 selectNextEvent();\r
887 }\r
888 };\r
889\r
890 nextEventAction.setText(Messages.TmfTimeGraphViewer_NextEventActionNameText);\r
891 nextEventAction.setToolTipText(Messages.TmfTimeGraphViewer_NextEventActionToolTipText);\r
892 nextEventAction.setImageDescriptor(TmfUiPlugin.getDefault().getImageDescripterFromPath(ITmfImageConstants.IMG_UI_NEXT_EVENT));\r
893 } \r
894\r
895 return nextEventAction;\r
896 }\r
897\r
898 public Action getPreviousEventAction() {\r
899 if (prevEventAction == null) {\r
900 prevEventAction = new Action() {\r
901 @Override\r
902 public void run() {\r
903 selectPrevEvent();\r
904 }\r
905 };\r
906\r
907 prevEventAction.setText(Messages.TmfTimeGraphViewer_PreviousEventActionNameText);\r
908 prevEventAction.setToolTipText(Messages.TmfTimeGraphViewer_PreviousEventActionToolTipText);\r
909 prevEventAction.setImageDescriptor(TmfUiPlugin.getDefault().getImageDescripterFromPath(ITmfImageConstants.IMG_UI_PREV_EVENT));\r
910 } \r
911\r
912 return prevEventAction;\r
913 }\r
914\r
915 public Action getNextItemAction() {\r
916 if (nextItemAction == null) {\r
fb5cad3d 917\r
b83af2c3
PT
918 nextItemAction = new Action() {\r
919 @Override\r
920 public void run() {\r
921 selectNextItem();\r
922 }\r
923 };\r
924 nextItemAction.setText(Messages.TmfTimeGraphViewer_NextItemActionNameText);\r
925 nextItemAction.setToolTipText(Messages.TmfTimeGraphViewer_NextItemActionToolTipText);\r
926 nextItemAction.setImageDescriptor(TmfUiPlugin.getDefault().getImageDescripterFromPath(ITmfImageConstants.IMG_UI_NEXT_ITEM));\r
927 }\r
928 return nextItemAction;\r
929 }\r
930\r
931 public Action getPreviousItemAction() {\r
932 if (previousItemAction == null) {\r
933\r
934 previousItemAction = new Action() {\r
935 @Override\r
936 public void run() {\r
937 selectPrevItem();\r
938 }\r
939 };\r
940 previousItemAction.setText(Messages.TmfTimeGraphViewer_PreviousItemActionNameText);\r
941 previousItemAction.setToolTipText(Messages.TmfTimeGraphViewer_PreviousItemActionToolTipText);\r
942 previousItemAction.setImageDescriptor(TmfUiPlugin.getDefault().getImageDescripterFromPath(ITmfImageConstants.IMG_UI_PREV_ITEM));\r
943 }\r
944 return previousItemAction;\r
945 }\r
946 \r
947 public Action getZoomInAction() {\r
948 if (zoomInAction == null) {\r
949 zoomInAction = new Action() {\r
950 @Override\r
951 public void run() {\r
952 zoomIn();\r
953 }\r
954 };\r
955 zoomInAction.setText(Messages.TmfTimeGraphViewer_ZoomInActionNameText);\r
956 zoomInAction.setToolTipText(Messages.TmfTimeGraphViewer_ZoomInActionToolTipText);\r
957 zoomInAction.setImageDescriptor(TmfUiPlugin.getDefault().getImageDescripterFromPath(ITmfImageConstants.IMG_UI_ZOOM_IN_MENU));\r
958 }\r
959 return zoomInAction;\r
960 }\r
961\r
962 public Action getZoomOutAction() {\r
963 if (zoomOutAction == null) {\r
964 zoomOutAction = new Action() {\r
965 @Override\r
966 public void run() {\r
967 zoomOut();\r
968 }\r
969 };\r
970 zoomOutAction.setText(Messages.TmfTimeGraphViewer_ZoomOutActionNameText);\r
971 zoomOutAction.setToolTipText(Messages.TmfTimeGraphViewer_ZoomOutActionToolTipText);\r
972 zoomOutAction.setImageDescriptor(TmfUiPlugin.getDefault().getImageDescripterFromPath(ITmfImageConstants.IMG_UI_ZOOM_OUT_MENU));\r
973 }\r
974 return zoomOutAction;\r
975 }\r
976 \r
977 \r
fb5cad3d
PT
978 private void adjustVerticalScrollBar() {\r
979 int topIndex = _stateCtrl.getTopIndex();\r
980 int countPerPage = _stateCtrl.countPerPage();\r
981 int expandedElementCount = _stateCtrl.getExpandedElementCount();\r
982 if (topIndex + countPerPage > expandedElementCount) {\r
983 _stateCtrl.setTopIndex(Math.max(0, expandedElementCount - countPerPage));\r
984 }\r
985\r
986 int selection = _stateCtrl.getTopIndex();\r
987 int min = 0;\r
988 int max = Math.max(1, expandedElementCount - 1);\r
989 int thumb = Math.min(max, Math.max(1, countPerPage - 1));\r
990 int increment = 1;\r
991 int pageIncrement = Math.max(1, countPerPage);\r
992 _verticalScrollBar.setValues(selection, min, max, thumb, increment, pageIncrement);\r
993 }\r
b83af2c3
PT
994 \r
995 \r
fb5cad3d
PT
996\r
997}\r
This page took 0.070808 seconds and 5 git commands to generate.