tmf: Improve histogram responsiveness
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.ui / src / org / eclipse / linuxtools / tmf / ui / views / histogram / HistogramView.java
CommitLineData
6e512b93 1/*******************************************************************************
c8422608 2 * Copyright (c) 2009, 2013 Ericsson
1b055dfa 3 *
6e512b93
ASL
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
1b055dfa 8 *
6e512b93 9 * Contributors:
b59134e1 10 * William Bourque - Initial API and implementation
c392540b 11 * Yuriy Vashchuk - GUI reorganisation, simplification and some related code improvements.
1b055dfa 12 * Yuriy Vashchuk - Histograms optimisation.
c392540b
FC
13 * Yuriy Vashchuk - Histogram Canvas Heritage correction
14 * Francois Chouinard - Cleanup and refactoring
e0752744 15 * Francois Chouinard - Moved from LTTng to TMF
6e512b93 16 *******************************************************************************/
3e9fdb8b 17
e0752744 18package org.eclipse.linuxtools.tmf.ui.views.histogram;
6e512b93 19
e0752744 20import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;
6c13869b 21import org.eclipse.linuxtools.tmf.core.request.ITmfDataRequest.ExecutionType;
f6ad2e3d 22import org.eclipse.linuxtools.tmf.core.request.TmfDataRequest;
6c13869b
FC
23import org.eclipse.linuxtools.tmf.core.signal.TmfRangeSynchSignal;
24import org.eclipse.linuxtools.tmf.core.signal.TmfSignalHandler;
38df2c82 25import org.eclipse.linuxtools.tmf.core.signal.TmfSignalThrottler;
6c13869b 26import org.eclipse.linuxtools.tmf.core.signal.TmfTimeSynchSignal;
faa38350
PT
27import org.eclipse.linuxtools.tmf.core.signal.TmfTraceClosedSignal;
28import org.eclipse.linuxtools.tmf.core.signal.TmfTraceOpenedSignal;
29import org.eclipse.linuxtools.tmf.core.signal.TmfTraceRangeUpdatedSignal;
30import org.eclipse.linuxtools.tmf.core.signal.TmfTraceSelectedSignal;
31import org.eclipse.linuxtools.tmf.core.signal.TmfTraceUpdatedSignal;
3bd46eef
AM
32import org.eclipse.linuxtools.tmf.core.timestamp.ITmfTimestamp;
33import org.eclipse.linuxtools.tmf.core.timestamp.TmfTimeRange;
34import org.eclipse.linuxtools.tmf.core.timestamp.TmfTimestamp;
faa38350
PT
35import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;
36import org.eclipse.linuxtools.tmf.ui.editors.ITmfTraceEditor;
b59134e1
WB
37import org.eclipse.linuxtools.tmf.ui.views.TmfView;
38import org.eclipse.swt.SWT;
39import org.eclipse.swt.layout.GridData;
252ae4bd 40import org.eclipse.swt.layout.GridLayout;
6e512b93 41import org.eclipse.swt.widgets.Composite;
faa38350 42import org.eclipse.ui.IEditorPart;
6e512b93 43
544fe9b7 44/**
faa38350 45 * The purpose of this view is to provide graphical time distribution statistics about the trace events.
544fe9b7 46 * <p>
c392540b
FC
47 * The view is composed of two histograms and two controls:
48 * <ul>
faa38350 49 * <li>an event distribution histogram for the whole trace;
c392540b
FC
50 * <li>an event distribution histogram for current time window (window span);
51 * <li>the timestamp of the currently selected event;
52 * <li>the window span (size of the time window of the smaller histogram).
53 * </ul>
54 * The histograms x-axis show their respective time range.
abbdd66a 55 *
f8177ba2 56 * @version 2.0
2af7df97 57 * @author Francois Chouinard
544fe9b7 58 */
c392540b
FC
59public class HistogramView extends TmfView {
60
61 // ------------------------------------------------------------------------
62 // Constants
63 // ------------------------------------------------------------------------
64
b544077e
BH
65 /**
66 * The view ID as defined in plugin.xml
67 */
e0752744 68 public static final String ID = "org.eclipse.linuxtools.tmf.ui.views.histogram"; //$NON-NLS-1$
c392540b 69
c392540b
FC
70 // ------------------------------------------------------------------------
71 // Attributes
72 // ------------------------------------------------------------------------
73
74 // Parent widget
75 private Composite fParent;
76
faa38350
PT
77 // The current trace
78 private ITmfTrace fTrace;
c392540b 79
f8177ba2 80 // Current timestamp/time window - everything in the TIME_SCALE
faa38350
PT
81 private long fTraceStartTime;
82 private long fTraceEndTime;
c392540b
FC
83 private long fWindowStartTime;
84 private long fWindowEndTime;
d7ee91bb 85 private long fWindowSpan;
c392540b
FC
86 private long fCurrentTimestamp;
87
88 // Time controls
89 private HistogramTextControl fCurrentEventTimeControl;
90 private HistogramTextControl fTimeSpanControl;
91
92 // Histogram/request for the full trace range
93 private static FullTraceHistogram fFullTraceHistogram;
94 private HistogramRequest fFullTraceRequest;
95
96 // Histogram/request for the selected time range
97 private static TimeRangeHistogram fTimeRangeHistogram;
98 private HistogramRequest fTimeRangeRequest;
99
38df2c82
AM
100 // Throttlers for the time sync and time-range sync signals
101 private final TmfSignalThrottler fTimeSyncThrottle;
102 private final TmfSignalThrottler fTimeRangeSyncThrottle;
103
c392540b
FC
104 // ------------------------------------------------------------------------
105 // Constructor
106 // ------------------------------------------------------------------------
107
b544077e
BH
108 /**
109 * Default constructor
110 */
c392540b
FC
111 public HistogramView() {
112 super(ID);
38df2c82
AM
113 fTimeSyncThrottle = new TmfSignalThrottler(this, 200);
114 fTimeRangeSyncThrottle = new TmfSignalThrottler(this, 200);
c392540b
FC
115 }
116
6a13fa07 117 @Override
c392540b 118 public void dispose() {
1b055dfa 119 if ((fTimeRangeRequest != null) && !fTimeRangeRequest.isCompleted()) {
4dc47e28
FC
120 fTimeRangeRequest.cancel();
121 }
1b055dfa 122 if ((fFullTraceRequest != null) && !fFullTraceRequest.isCompleted()) {
4dc47e28
FC
123 fFullTraceRequest.cancel();
124 }
6a13fa07
FC
125 fFullTraceHistogram.dispose();
126 fTimeRangeHistogram.dispose();
f8177ba2
FC
127 fCurrentEventTimeControl.dispose();
128 fTimeSpanControl.dispose();
4dc47e28 129 super.dispose();
c392540b
FC
130 }
131
132 // ------------------------------------------------------------------------
133 // TmfView
134 // ------------------------------------------------------------------------
135
136 @Override
c392540b
FC
137 public void createPartControl(Composite parent) {
138
139 fParent = parent;
140
141 // Control labels
142 final String currentEventLabel = Messages.HistogramView_currentEventLabel;
143 final String windowSpanLabel = Messages.HistogramView_windowSpanLabel;
144
145 // --------------------------------------------------------------------
146 // Set the HistogramView layout
147 // --------------------------------------------------------------------
148
149 Composite viewComposite = new Composite(fParent, SWT.FILL);
150 GridLayout gridLayout = new GridLayout();
151 gridLayout.numColumns = 2;
152 gridLayout.horizontalSpacing = 5;
153 gridLayout.verticalSpacing = 0;
154 gridLayout.marginHeight = 0;
155 gridLayout.marginWidth = 0;
156 viewComposite.setLayout(gridLayout);
157
158 // Use all available space
159 GridData gridData = new GridData();
160 gridData.horizontalAlignment = SWT.FILL;
161 gridData.verticalAlignment = SWT.FILL;
162 gridData.grabExcessHorizontalSpace = true;
163 viewComposite.setLayoutData(gridData);
164
165 // --------------------------------------------------------------------
166 // Time controls
167 // --------------------------------------------------------------------
168
169 Composite controlsComposite = new Composite(viewComposite, SWT.FILL);
170 gridLayout = new GridLayout();
171 gridLayout.numColumns = 2;
172 gridLayout.marginHeight = 0;
173 gridLayout.marginWidth = 0;
174 gridLayout.horizontalSpacing = 5;
175 gridLayout.verticalSpacing = 0;
f8177ba2 176 gridLayout.makeColumnsEqualWidth = false;
c392540b
FC
177 gridLayout.marginLeft = 5;
178 gridLayout.marginRight = 5;
179 controlsComposite.setLayout(gridLayout);
180
181 // Current event time control
182 gridData = new GridData();
183 gridData.horizontalAlignment = SWT.CENTER;
184 gridData.verticalAlignment = SWT.CENTER;
f8177ba2 185 fCurrentEventTimeControl = new HistogramCurrentTimeControl(this, controlsComposite, currentEventLabel, 0L);
c392540b 186 fCurrentEventTimeControl.setLayoutData(gridData);
da7bdcbc 187 fCurrentEventTimeControl.setValue(Long.MIN_VALUE);
c392540b
FC
188
189 // Window span time control
190 gridData = new GridData();
191 gridData.horizontalAlignment = SWT.CENTER;
192 gridData.verticalAlignment = SWT.CENTER;
f8177ba2 193 fTimeSpanControl = new HistogramTimeRangeControl(this, controlsComposite, windowSpanLabel, 0L);
c392540b 194 fTimeSpanControl.setLayoutData(gridData);
da7bdcbc 195 fTimeSpanControl.setValue(Long.MIN_VALUE);
c392540b
FC
196
197 // --------------------------------------------------------------------
198 // Time range histogram
199 // --------------------------------------------------------------------
200
201 Composite timeRangeComposite = new Composite(viewComposite, SWT.FILL);
202 gridLayout = new GridLayout();
203 gridLayout.numColumns = 1;
204 gridLayout.marginHeight = 0;
205 gridLayout.marginWidth = 0;
206 gridLayout.marginTop = 5;
207 gridLayout.horizontalSpacing = 0;
208 gridLayout.verticalSpacing = 0;
209 gridLayout.marginLeft = 5;
210 gridLayout.marginRight = 5;
211 timeRangeComposite.setLayout(gridLayout);
212
213 // Use remaining horizontal space
214 gridData = new GridData();
215 gridData.horizontalAlignment = SWT.FILL;
216 gridData.verticalAlignment = SWT.FILL;
217 gridData.grabExcessHorizontalSpace = true;
218 timeRangeComposite.setLayoutData(gridData);
219
220 // Histogram
221 fTimeRangeHistogram = new TimeRangeHistogram(this, timeRangeComposite);
222
223 // --------------------------------------------------------------------
224 // Full range histogram
225 // --------------------------------------------------------------------
226
227 Composite fullRangeComposite = new Composite(viewComposite, SWT.FILL);
228 gridLayout = new GridLayout();
229 gridLayout.numColumns = 1;
230 gridLayout.marginHeight = 0;
231 gridLayout.marginWidth = 0;
232 gridLayout.marginTop = 5;
233 gridLayout.horizontalSpacing = 0;
234 gridLayout.verticalSpacing = 0;
235 gridLayout.marginLeft = 5;
236 gridLayout.marginRight = 5;
237 fullRangeComposite.setLayout(gridLayout);
238
239 // Use remaining horizontal space
240 gridData = new GridData();
241 gridData.horizontalAlignment = SWT.FILL;
242 gridData.verticalAlignment = SWT.FILL;
243 gridData.horizontalSpan = 2;
244 gridData.grabExcessHorizontalSpace = true;
245 fullRangeComposite.setLayoutData(gridData);
246
247 // Histogram
248 fFullTraceHistogram = new FullTraceHistogram(this, fullRangeComposite);
249
f28d404e 250 IEditorPart editor = getSite().getPage().getActiveEditor();
faa38350
PT
251 if (editor instanceof ITmfTraceEditor) {
252 ITmfTrace trace = ((ITmfTraceEditor) editor).getTrace();
253 if (trace != null) {
254 traceSelected(new TmfTraceSelectedSignal(this, trace));
255 }
1b055dfa 256 }
ecfd1d41 257 }
c392540b
FC
258
259 @Override
c392540b 260 public void setFocus() {
faa38350 261 fFullTraceHistogram.fCanvas.setFocus();
833a21aa 262 }
c392540b 263
f8177ba2
FC
264 void refresh() {
265 fParent.layout(true);
266 }
267
c392540b
FC
268 // ------------------------------------------------------------------------
269 // Accessors
270 // ------------------------------------------------------------------------
271
faa38350
PT
272 /**
273 * Returns the current trace handled by the view
274 *
275 * @return the current trace
276 * @since 2.0
277 */
278 public ITmfTrace getTrace() {
279 return fTrace;
280 }
281
b544077e
BH
282 /**
283 * Returns the time range of the current selected window (base on default time scale).
abbdd66a 284 *
b544077e 285 * @return the time range of current selected window.
3bd46eef 286 * @since 2.0
b544077e 287 */
c392540b 288 public TmfTimeRange getTimeRange() {
f8177ba2
FC
289 return new TmfTimeRange(
290 new TmfTimestamp(fWindowStartTime, ITmfTimestamp.NANOSECOND_SCALE),
291 new TmfTimestamp(fWindowEndTime, ITmfTimestamp.NANOSECOND_SCALE));
c392540b
FC
292 }
293
294 // ------------------------------------------------------------------------
295 // Operations
296 // ------------------------------------------------------------------------
297
b544077e
BH
298 /**
299 * Broadcast TmfSignal about new current time value.
300 * @param newTime the new current time.
301 */
f8177ba2 302 void updateCurrentEventTime(long newTime) {
faa38350 303 if (fTrace != null) {
f8177ba2 304 TmfTimeRange timeRange = new TmfTimeRange(new TmfTimestamp(newTime, ITmfTimestamp.NANOSECOND_SCALE), TmfTimestamp.BIG_CRUNCH);
f6ad2e3d 305 HistogramRequest request = new HistogramRequest(fTimeRangeHistogram.getDataModel(), timeRange, 0, 1, 0, ExecutionType.FOREGROUND) {
c392540b 306 @Override
e0752744 307 public void handleData(ITmfEvent event) {
c392540b 308 if (event != null) {
38df2c82
AM
309 ITmfTimestamp ts = event.getTimestamp();
310 updateDisplayedCurrentTime(ts.normalize(0, ITmfTimestamp.NANOSECOND_SCALE).getValue());
311 TmfTimeSynchSignal signal = new TmfTimeSynchSignal(this, ts);
312 fTimeSyncThrottle.queue(signal);
c392540b
FC
313 }
314 }
315 };
faa38350 316 fTrace.sendRequest(request);
c392540b
FC
317 }
318 }
319
b544077e
BH
320 /**
321 * Broadcast TmfSignal about new selected time range.
322 * @param startTime the new start time
323 * @param endTime the new end time
324 */
f8177ba2 325 void updateTimeRange(long startTime, long endTime) {
faa38350 326 if (fTrace != null) {
c392540b 327 // Build the new time range; keep the current time
f8177ba2
FC
328 TmfTimeRange timeRange = new TmfTimeRange(
329 new TmfTimestamp(startTime, ITmfTimestamp.NANOSECOND_SCALE),
330 new TmfTimestamp(endTime, ITmfTimestamp.NANOSECOND_SCALE));
331 ITmfTimestamp currentTime = new TmfTimestamp(fCurrentTimestamp, ITmfTimestamp.NANOSECOND_SCALE);
c392540b
FC
332 fTimeSpanControl.setValue(endTime - startTime);
333
38df2c82
AM
334 updateDisplayedTimeRange(startTime, endTime);
335
c392540b
FC
336 // Send the FW signal
337 TmfRangeSynchSignal signal = new TmfRangeSynchSignal(this, timeRange, currentTime);
38df2c82 338 fTimeRangeSyncThrottle.queue(signal);
c392540b
FC
339 }
340 }
341
b544077e
BH
342 /**
343 * Broadcast TmfSignal about new selected time range.
344 * @param newDuration new duration (relative to current start time)
345 */
c392540b 346 public synchronized void updateTimeRange(long newDuration) {
faa38350 347 if (fTrace != null) {
6a13fa07 348 long delta = newDuration - fWindowSpan;
1c6a842a 349 long newStartTime = fWindowStartTime - (delta / 2);
6a13fa07 350 setNewRange(newStartTime, newDuration);
c392540b
FC
351 }
352 }
353
354 private void setNewRange(long startTime, long duration) {
41b5c37f
AM
355 long realStart = startTime;
356
357 if (realStart < fTraceStartTime) {
358 realStart = fTraceStartTime;
1b055dfa 359 }
c392540b 360
41b5c37f 361 long endTime = realStart + duration;
faa38350
PT
362 if (endTime > fTraceEndTime) {
363 endTime = fTraceEndTime;
1c6a842a 364 if ((endTime - duration) > fTraceStartTime) {
41b5c37f 365 realStart = endTime - duration;
1b055dfa 366 } else {
41b5c37f 367 realStart = fTraceStartTime;
6a13fa07 368 }
c392540b 369 }
41b5c37f 370 updateTimeRange(realStart, endTime);
833a21aa 371 }
c392540b
FC
372
373 // ------------------------------------------------------------------------
374 // Signal handlers
375 // ------------------------------------------------------------------------
376
b544077e 377 /**
faa38350 378 * Handles trace opened signal. Loads histogram if new trace time range is not
b544077e 379 * equal <code>TmfTimeRange.NULL_RANGE</code>
faa38350
PT
380 * @param signal the trace selected signal
381 * @since 2.0
b544077e 382 */
1406f802 383 @TmfSignalHandler
faa38350 384 public void traceOpened(TmfTraceOpenedSignal signal) {
c392540b 385 assert (signal != null);
faa38350
PT
386 fTrace = signal.getTrace();
387 loadTrace();
ecfd1d41 388 }
550d787e 389
faa38350
PT
390 /**
391 * Handles trace selected signal. Loads histogram if new trace time range is not
392 * equal <code>TmfTimeRange.NULL_RANGE</code>
393 * @param signal the trace selected signal
394 * @since 2.0
395 */
396 @TmfSignalHandler
397 public void traceSelected(TmfTraceSelectedSignal signal) {
398 assert (signal != null);
399 if (fTrace != signal.getTrace()) {
400 fTrace = signal.getTrace();
401 loadTrace();
402 }
403 }
404
405 private void loadTrace() {
c392540b
FC
406 initializeHistograms();
407 fParent.redraw();
550d787e
FC
408 }
409
ea279a69 410 /**
faa38350
PT
411 * Handles trace closed signal. Clears the view and data model and cancels requests.
412 * @param signal the trace closed signal
ea279a69
FC
413 * @since 2.0
414 */
415 @TmfSignalHandler
faa38350
PT
416 public void traceClosed(TmfTraceClosedSignal signal) {
417
418 if (signal.getTrace() != fTrace) {
419 return;
420 }
ea279a69
FC
421
422 // Kill any running request
423 if ((fTimeRangeRequest != null) && !fTimeRangeRequest.isCompleted()) {
424 fTimeRangeRequest.cancel();
425 }
426 if ((fFullTraceRequest != null) && !fFullTraceRequest.isCompleted()) {
427 fFullTraceRequest.cancel();
428 }
429
430 // Initialize the internal data
faa38350
PT
431 fTrace = null;
432 fTraceStartTime = 0L;
433 fTraceEndTime = 0L;
f8177ba2
FC
434 fWindowStartTime = 0L;
435 fWindowEndTime = 0L;
d7ee91bb 436 fWindowSpan = 0L;
f8177ba2 437 fCurrentTimestamp = 0L;
ea279a69
FC
438
439 // Clear the UI widgets
440 fFullTraceHistogram.clear();
441 fTimeRangeHistogram.clear();
da7bdcbc 442 fCurrentEventTimeControl.setValue(Long.MIN_VALUE);
f8177ba2 443
da7bdcbc 444 fTimeSpanControl.setValue(Long.MIN_VALUE);
ea279a69
FC
445 }
446
b544077e 447 /**
faa38350 448 * Handles trace range updated signal. Extends histogram according to the new time range. If a
b544077e
BH
449 * HistogramRequest is already ongoing, it will be cancelled and a new request with the new range
450 * will be issued.
abbdd66a 451 *
faa38350
PT
452 * @param signal the trace range updated signal
453 * @since 2.0
b544077e 454 */
74237cc3 455 @TmfSignalHandler
faa38350 456 public void traceRangeUpdated(TmfTraceRangeUpdatedSignal signal) {
74237cc3 457
faa38350 458 if (signal.getTrace() != fTrace) {
09d11238
PT
459 return;
460 }
461
74237cc3
FC
462 TmfTimeRange fullRange = signal.getRange();
463
faa38350
PT
464 fTraceStartTime = fullRange.getStartTime().normalize(0, ITmfTimestamp.NANOSECOND_SCALE).getValue();
465 fTraceEndTime = fullRange.getEndTime().normalize(0, ITmfTimestamp.NANOSECOND_SCALE).getValue();
74237cc3 466
faa38350
PT
467 fFullTraceHistogram.setFullRange(fTraceStartTime, fTraceEndTime);
468 fTimeRangeHistogram.setFullRange(fTraceStartTime, fTraceEndTime);
74237cc3 469
74237cc3
FC
470 sendFullRangeRequest(fullRange);
471 }
c392540b 472
b544077e 473 /**
faa38350
PT
474 * Handles the trace updated signal. Used to update time limits (start and end time)
475 * @param signal the trace updated signal
476 * @since 2.0
b544077e 477 */
a28d503d 478 @TmfSignalHandler
faa38350
PT
479 public void traceUpdated(TmfTraceUpdatedSignal signal) {
480 if (signal.getTrace() != fTrace) {
a28d503d
PT
481 return;
482 }
faa38350
PT
483 TmfTimeRange fullRange = signal.getTrace().getTimeRange();
484 fTraceStartTime = fullRange.getStartTime().normalize(0, ITmfTimestamp.NANOSECOND_SCALE).getValue();
485 fTraceEndTime = fullRange.getEndTime().normalize(0, ITmfTimestamp.NANOSECOND_SCALE).getValue();
a28d503d 486
faa38350
PT
487 fFullTraceHistogram.setFullRange(fTraceStartTime, fTraceEndTime);
488 fTimeRangeHistogram.setFullRange(fTraceStartTime, fTraceEndTime);
489
13ccc36b 490 fFullTraceHistogram.setTimeRange(fTimeRangeHistogram.getStartTime(), fWindowSpan);
15844a4e 491 fTimeRangeHistogram.setTimeRange(fTimeRangeHistogram.getStartTime(), fWindowSpan);
13ccc36b 492
faa38350
PT
493 if ((fFullTraceRequest != null) && fFullTraceRequest.getRange().getEndTime().compareTo(signal.getRange().getEndTime()) < 0) {
494 sendFullRangeRequest(fullRange);
495 }
496}
a28d503d 497
b544077e
BH
498 /**
499 * Handles the current time updated signal. Sets the current time in the time range
500 * histogram as well as the full histogram.
abbdd66a 501 *
b544077e
BH
502 * @param signal the signal to process
503 */
c392540b
FC
504 @TmfSignalHandler
505 public void currentTimeUpdated(TmfTimeSynchSignal signal) {
506 // Because this can't happen :-)
507 assert (signal != null);
508
509 // Update the selected event time
f8177ba2 510 ITmfTimestamp currentTime = signal.getCurrentTime().normalize(0, ITmfTimestamp.NANOSECOND_SCALE);
38df2c82 511 updateDisplayedCurrentTime(currentTime.getValue());
ecfd1d41 512 }
f05aabed 513
b544077e
BH
514 /**
515 * Updates the current time range in the time range histogram and full range histogram.
516 * @param signal the signal to process
517 */
c392540b
FC
518 @TmfSignalHandler
519 public void timeRangeUpdated(TmfRangeSynchSignal signal) {
520 // Because this can't happen :-)
521 assert (signal != null);
522
faa38350 523 if (fTrace != null) {
1c6a842a
PT
524 // Validate the time range
525 TmfTimeRange range = signal.getCurrentRange().getIntersection(fTrace.getTimeRange());
526 if (range == null) {
527 return;
528 }
529
38df2c82
AM
530 updateDisplayedTimeRange(
531 range.getStartTime().normalize(0, ITmfTimestamp.NANOSECOND_SCALE).getValue(),
532 range.getEndTime().normalize(0, ITmfTimestamp.NANOSECOND_SCALE).getValue());
c392540b 533
38df2c82 534 // Send the event request to populate the small histogram
c392540b 535 sendTimeRangeRequest(fWindowStartTime, fWindowEndTime);
f8177ba2 536
c392540b
FC
537 fTimeSpanControl.setValue(fWindowSpan);
538 }
b59134e1 539 }
c392540b
FC
540
541 // ------------------------------------------------------------------------
542 // Helper functions
543 // ------------------------------------------------------------------------
544
545 private void initializeHistograms() {
faa38350 546 TmfTimeRange fullRange = updateTraceTimeRange();
d7ee91bb
PT
547 long timestamp = fTrace.getCurrentTime().normalize(0, ITmfTimestamp.NANOSECOND_SCALE).getValue();
548 long startTime = fTrace.getCurrentRange().getStartTime().normalize(0, ITmfTimestamp.NANOSECOND_SCALE).getValue();
549 long duration = fTrace.getCurrentRange().getEndTime().normalize(0, ITmfTimestamp.NANOSECOND_SCALE).getValue() - startTime;
74237cc3 550
faa38350
PT
551 if ((fTimeRangeRequest != null) && !fTimeRangeRequest.isCompleted()) {
552 fTimeRangeRequest.cancel();
553 }
74237cc3 554 fTimeRangeHistogram.clear();
faa38350 555 fTimeRangeHistogram.setFullRange(fTraceStartTime, fTraceEndTime);
d7ee91bb
PT
556 fTimeRangeHistogram.setTimeRange(startTime, duration);
557 fTimeRangeHistogram.setCurrentEvent(timestamp);
c392540b 558
faa38350
PT
559 if ((fFullTraceRequest != null) && !fFullTraceRequest.isCompleted()) {
560 fFullTraceRequest.cancel();
561 }
74237cc3 562 fFullTraceHistogram.clear();
faa38350 563 fFullTraceHistogram.setFullRange(fTraceStartTime, fTraceEndTime);
d7ee91bb
PT
564 fFullTraceHistogram.setTimeRange(startTime, duration);
565 fFullTraceHistogram.setCurrentEvent(timestamp);
c392540b 566
d7ee91bb
PT
567 fWindowStartTime = startTime;
568 fWindowSpan = duration;
569 fWindowEndTime = startTime + duration;
6a13fa07 570
d7ee91bb
PT
571 fCurrentTimestamp = timestamp;
572 fCurrentEventTimeControl.setValue(fCurrentTimestamp);
f8177ba2 573
d7ee91bb 574 fTimeSpanControl.setValue(duration);
6a13fa07 575
2af7df97 576 if (!fullRange.equals(TmfTimeRange.NULL_RANGE)) {
d7ee91bb 577 sendTimeRangeRequest(startTime, startTime + duration);
2af7df97
FC
578 sendFullRangeRequest(fullRange);
579 }
74237cc3
FC
580 }
581
38df2c82
AM
582 private void updateDisplayedCurrentTime(long time) {
583 fCurrentTimestamp = time;
584
585 fFullTraceHistogram.setCurrentEvent(fCurrentTimestamp);
586 fTimeRangeHistogram.setCurrentEvent(fCurrentTimestamp);
587 fCurrentEventTimeControl.setValue(fCurrentTimestamp);
588 }
589
590 private void updateDisplayedTimeRange(long start, long end) {
591 fWindowStartTime = start;
592 fWindowEndTime = end;
593 fWindowSpan = fWindowEndTime - fWindowStartTime;
594 fFullTraceHistogram.setTimeRange(fWindowStartTime, fWindowSpan);
595 }
596
faa38350
PT
597 private TmfTimeRange updateTraceTimeRange() {
598 fTraceStartTime = 0L;
599 fTraceEndTime = 0L;
74237cc3 600
faa38350 601 TmfTimeRange timeRange = fTrace.getTimeRange();
c6023803 602 if (!timeRange.equals(TmfTimeRange.NULL_RANGE)) {
faa38350
PT
603 fTraceStartTime = timeRange.getStartTime().normalize(0, ITmfTimestamp.NANOSECOND_SCALE).getValue();
604 fTraceEndTime = timeRange.getEndTime().normalize(0, ITmfTimestamp.NANOSECOND_SCALE).getValue();
74237cc3
FC
605 }
606 return timeRange;
b59134e1 607 }
c392540b
FC
608
609 private void sendTimeRangeRequest(long startTime, long endTime) {
1b055dfa 610 if ((fTimeRangeRequest != null) && !fTimeRangeRequest.isCompleted()) {
c392540b 611 fTimeRangeRequest.cancel();
088c1d4e 612 }
f8177ba2
FC
613 TmfTimestamp startTS = new TmfTimestamp(startTime, ITmfTimestamp.NANOSECOND_SCALE);
614 TmfTimestamp endTS = new TmfTimestamp(endTime, ITmfTimestamp.NANOSECOND_SCALE);
c392540b
FC
615 TmfTimeRange timeRange = new TmfTimeRange(startTS, endTS);
616
617 fTimeRangeHistogram.clear();
15844a4e 618 fTimeRangeHistogram.setFullRange(fTraceStartTime, fTraceEndTime);
c392540b 619 fTimeRangeHistogram.setTimeRange(startTime, endTime - startTime);
4cf201de 620
faa38350 621 int cacheSize = fTrace.getCacheSize();
f6ad2e3d 622 fTimeRangeRequest = new HistogramRequest(fTimeRangeHistogram.getDataModel(), timeRange, 0, TmfDataRequest.ALL_DATA, cacheSize, ExecutionType.FOREGROUND);
faa38350 623 fTrace.sendRequest(fTimeRangeRequest);
088c1d4e 624 }
c392540b 625
74237cc3 626 private void sendFullRangeRequest(TmfTimeRange fullRange) {
1b055dfa 627 if ((fFullTraceRequest != null) && !fFullTraceRequest.isCompleted()) {
c392540b
FC
628 fFullTraceRequest.cancel();
629 }
faa38350 630 int cacheSize = fTrace.getCacheSize();
fbd124dd 631 fFullTraceRequest = new HistogramRequest(fFullTraceHistogram.getDataModel(), fullRange, (int) fFullTraceHistogram.fDataModel.getNbEvents(),
f6ad2e3d 632 TmfDataRequest.ALL_DATA, cacheSize, ExecutionType.BACKGROUND);
faa38350 633 fTrace.sendRequest(fFullTraceRequest);
ed4b3b9f 634 }
c392540b 635
6e512b93 636}
This page took 0.0939 seconds and 5 git commands to generate.