Commit | Line | Data |
---|---|---|
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 |
65cdf787 | 16 | * Patrick Tasse - Update for mouse wheel zoom |
6e512b93 | 17 | *******************************************************************************/ |
3e9fdb8b | 18 | |
e0752744 | 19 | package org.eclipse.linuxtools.tmf.ui.views.histogram; |
6e512b93 | 20 | |
6c13869b | 21 | import org.eclipse.linuxtools.tmf.core.request.ITmfDataRequest.ExecutionType; |
f6ad2e3d | 22 | import org.eclipse.linuxtools.tmf.core.request.TmfDataRequest; |
6c13869b FC |
23 | import org.eclipse.linuxtools.tmf.core.signal.TmfRangeSynchSignal; |
24 | import org.eclipse.linuxtools.tmf.core.signal.TmfSignalHandler; | |
38df2c82 | 25 | import org.eclipse.linuxtools.tmf.core.signal.TmfSignalThrottler; |
6c13869b | 26 | import org.eclipse.linuxtools.tmf.core.signal.TmfTimeSynchSignal; |
faa38350 PT |
27 | import org.eclipse.linuxtools.tmf.core.signal.TmfTraceClosedSignal; |
28 | import org.eclipse.linuxtools.tmf.core.signal.TmfTraceOpenedSignal; | |
29 | import org.eclipse.linuxtools.tmf.core.signal.TmfTraceRangeUpdatedSignal; | |
30 | import org.eclipse.linuxtools.tmf.core.signal.TmfTraceSelectedSignal; | |
31 | import org.eclipse.linuxtools.tmf.core.signal.TmfTraceUpdatedSignal; | |
3bd46eef AM |
32 | import org.eclipse.linuxtools.tmf.core.timestamp.ITmfTimestamp; |
33 | import org.eclipse.linuxtools.tmf.core.timestamp.TmfTimeRange; | |
34 | import org.eclipse.linuxtools.tmf.core.timestamp.TmfTimestamp; | |
faa38350 | 35 | import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace; |
b59134e1 WB |
36 | import org.eclipse.linuxtools.tmf.ui.views.TmfView; |
37 | import org.eclipse.swt.SWT; | |
65cdf787 | 38 | import org.eclipse.swt.events.MouseWheelListener; |
b59134e1 | 39 | import org.eclipse.swt.layout.GridData; |
252ae4bd | 40 | import org.eclipse.swt.layout.GridLayout; |
6e512b93 | 41 | import org.eclipse.swt.widgets.Composite; |
6e512b93 | 42 | |
544fe9b7 | 43 | /** |
faa38350 | 44 | * The purpose of this view is to provide graphical time distribution statistics about the trace events. |
544fe9b7 | 45 | * <p> |
c392540b FC |
46 | * The view is composed of two histograms and two controls: |
47 | * <ul> | |
faa38350 | 48 | * <li>an event distribution histogram for the whole trace; |
c392540b FC |
49 | * <li>an event distribution histogram for current time window (window span); |
50 | * <li>the timestamp of the currently selected event; | |
51 | * <li>the window span (size of the time window of the smaller histogram). | |
52 | * </ul> | |
53 | * The histograms x-axis show their respective time range. | |
abbdd66a | 54 | * |
f8177ba2 | 55 | * @version 2.0 |
2af7df97 | 56 | * @author Francois Chouinard |
544fe9b7 | 57 | */ |
c392540b FC |
58 | public class HistogramView extends TmfView { |
59 | ||
60 | // ------------------------------------------------------------------------ | |
61 | // Constants | |
62 | // ------------------------------------------------------------------------ | |
63 | ||
b544077e BH |
64 | /** |
65 | * The view ID as defined in plugin.xml | |
66 | */ | |
e0752744 | 67 | public static final String ID = "org.eclipse.linuxtools.tmf.ui.views.histogram"; //$NON-NLS-1$ |
c392540b | 68 | |
c392540b FC |
69 | // ------------------------------------------------------------------------ |
70 | // Attributes | |
71 | // ------------------------------------------------------------------------ | |
72 | ||
73 | // Parent widget | |
74 | private Composite fParent; | |
75 | ||
faa38350 PT |
76 | // The current trace |
77 | private ITmfTrace fTrace; | |
c392540b | 78 | |
f8177ba2 | 79 | // Current timestamp/time window - everything in the TIME_SCALE |
faa38350 PT |
80 | private long fTraceStartTime; |
81 | private long fTraceEndTime; | |
c392540b FC |
82 | private long fWindowStartTime; |
83 | private long fWindowEndTime; | |
d7ee91bb | 84 | private long fWindowSpan; |
0fcf3b09 PT |
85 | private long fSelectionBeginTime; |
86 | private long fSelectionEndTime; | |
c392540b FC |
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 | ||
65cdf787 PT |
250 | // Add mouse wheel listener to time span control |
251 | MouseWheelListener listener = fFullTraceHistogram.getZoom(); | |
252 | fTimeSpanControl.addMouseWheelListener(listener); | |
253 | ||
3ac5721a AM |
254 | ITmfTrace trace = getActiveTrace(); |
255 | if (trace != null) { | |
256 | traceSelected(new TmfTraceSelectedSignal(this, trace)); | |
1b055dfa | 257 | } |
ecfd1d41 | 258 | } |
c392540b FC |
259 | |
260 | @Override | |
c392540b | 261 | public void setFocus() { |
faa38350 | 262 | fFullTraceHistogram.fCanvas.setFocus(); |
833a21aa | 263 | } |
c392540b | 264 | |
f8177ba2 FC |
265 | void refresh() { |
266 | fParent.layout(true); | |
267 | } | |
268 | ||
c392540b FC |
269 | // ------------------------------------------------------------------------ |
270 | // Accessors | |
271 | // ------------------------------------------------------------------------ | |
272 | ||
faa38350 PT |
273 | /** |
274 | * Returns the current trace handled by the view | |
275 | * | |
276 | * @return the current trace | |
277 | * @since 2.0 | |
278 | */ | |
279 | public ITmfTrace getTrace() { | |
280 | return fTrace; | |
281 | } | |
282 | ||
b544077e BH |
283 | /** |
284 | * Returns the time range of the current selected window (base on default time scale). | |
abbdd66a | 285 | * |
b544077e | 286 | * @return the time range of current selected window. |
3bd46eef | 287 | * @since 2.0 |
b544077e | 288 | */ |
c392540b | 289 | public TmfTimeRange getTimeRange() { |
f8177ba2 FC |
290 | return new TmfTimeRange( |
291 | new TmfTimestamp(fWindowStartTime, ITmfTimestamp.NANOSECOND_SCALE), | |
292 | new TmfTimestamp(fWindowEndTime, ITmfTimestamp.NANOSECOND_SCALE)); | |
c392540b FC |
293 | } |
294 | ||
295 | // ------------------------------------------------------------------------ | |
296 | // Operations | |
297 | // ------------------------------------------------------------------------ | |
298 | ||
b544077e | 299 | /** |
0fcf3b09 PT |
300 | * Broadcast TmfSignal about new current selection time range. |
301 | * @param beginTime the begin time of current selection. | |
302 | * @param endTime the end time of current selection. | |
b544077e | 303 | */ |
0fcf3b09 PT |
304 | void updateSelectionTime(long beginTime, long endTime) { |
305 | updateDisplayedSelectionTime(beginTime, endTime); | |
306 | TmfTimestamp beginTs = new TmfTimestamp(beginTime, ITmfTimestamp.NANOSECOND_SCALE); | |
307 | TmfTimestamp endTs = new TmfTimestamp(endTime, ITmfTimestamp.NANOSECOND_SCALE); | |
308 | TmfTimeSynchSignal signal = new TmfTimeSynchSignal(this, beginTs, endTs); | |
309 | fTimeSyncThrottle.queue(signal); | |
c392540b FC |
310 | } |
311 | ||
b544077e | 312 | /** |
0fcf3b09 | 313 | * Broadcast TmfSignal about new selection time range. |
b544077e BH |
314 | * @param startTime the new start time |
315 | * @param endTime the new end time | |
316 | */ | |
f8177ba2 | 317 | void updateTimeRange(long startTime, long endTime) { |
faa38350 | 318 | if (fTrace != null) { |
c392540b | 319 | // Build the new time range; keep the current time |
f8177ba2 FC |
320 | TmfTimeRange timeRange = new TmfTimeRange( |
321 | new TmfTimestamp(startTime, ITmfTimestamp.NANOSECOND_SCALE), | |
322 | new TmfTimestamp(endTime, ITmfTimestamp.NANOSECOND_SCALE)); | |
c392540b FC |
323 | fTimeSpanControl.setValue(endTime - startTime); |
324 | ||
38df2c82 AM |
325 | updateDisplayedTimeRange(startTime, endTime); |
326 | ||
c392540b | 327 | // Send the FW signal |
0fcf3b09 | 328 | TmfRangeSynchSignal signal = new TmfRangeSynchSignal(this, timeRange); |
38df2c82 | 329 | fTimeRangeSyncThrottle.queue(signal); |
c392540b FC |
330 | } |
331 | } | |
332 | ||
b544077e BH |
333 | /** |
334 | * Broadcast TmfSignal about new selected time range. | |
335 | * @param newDuration new duration (relative to current start time) | |
336 | */ | |
c392540b | 337 | public synchronized void updateTimeRange(long newDuration) { |
faa38350 | 338 | if (fTrace != null) { |
6a13fa07 | 339 | long delta = newDuration - fWindowSpan; |
1c6a842a | 340 | long newStartTime = fWindowStartTime - (delta / 2); |
6a13fa07 | 341 | setNewRange(newStartTime, newDuration); |
c392540b FC |
342 | } |
343 | } | |
344 | ||
345 | private void setNewRange(long startTime, long duration) { | |
41b5c37f AM |
346 | long realStart = startTime; |
347 | ||
348 | if (realStart < fTraceStartTime) { | |
349 | realStart = fTraceStartTime; | |
1b055dfa | 350 | } |
c392540b | 351 | |
41b5c37f | 352 | long endTime = realStart + duration; |
faa38350 PT |
353 | if (endTime > fTraceEndTime) { |
354 | endTime = fTraceEndTime; | |
1c6a842a | 355 | if ((endTime - duration) > fTraceStartTime) { |
41b5c37f | 356 | realStart = endTime - duration; |
1b055dfa | 357 | } else { |
41b5c37f | 358 | realStart = fTraceStartTime; |
6a13fa07 | 359 | } |
c392540b | 360 | } |
41b5c37f | 361 | updateTimeRange(realStart, endTime); |
833a21aa | 362 | } |
c392540b FC |
363 | |
364 | // ------------------------------------------------------------------------ | |
365 | // Signal handlers | |
366 | // ------------------------------------------------------------------------ | |
367 | ||
b544077e | 368 | /** |
faa38350 | 369 | * Handles trace opened signal. Loads histogram if new trace time range is not |
b544077e | 370 | * equal <code>TmfTimeRange.NULL_RANGE</code> |
fec1ac0b | 371 | * @param signal the trace opened signal |
faa38350 | 372 | * @since 2.0 |
b544077e | 373 | */ |
1406f802 | 374 | @TmfSignalHandler |
faa38350 | 375 | public void traceOpened(TmfTraceOpenedSignal signal) { |
c392540b | 376 | assert (signal != null); |
faa38350 PT |
377 | fTrace = signal.getTrace(); |
378 | loadTrace(); | |
ecfd1d41 | 379 | } |
550d787e | 380 | |
faa38350 PT |
381 | /** |
382 | * Handles trace selected signal. Loads histogram if new trace time range is not | |
383 | * equal <code>TmfTimeRange.NULL_RANGE</code> | |
384 | * @param signal the trace selected signal | |
385 | * @since 2.0 | |
386 | */ | |
387 | @TmfSignalHandler | |
388 | public void traceSelected(TmfTraceSelectedSignal signal) { | |
389 | assert (signal != null); | |
390 | if (fTrace != signal.getTrace()) { | |
391 | fTrace = signal.getTrace(); | |
392 | loadTrace(); | |
393 | } | |
394 | } | |
395 | ||
396 | private void loadTrace() { | |
c392540b FC |
397 | initializeHistograms(); |
398 | fParent.redraw(); | |
550d787e FC |
399 | } |
400 | ||
ea279a69 | 401 | /** |
faa38350 PT |
402 | * Handles trace closed signal. Clears the view and data model and cancels requests. |
403 | * @param signal the trace closed signal | |
ea279a69 FC |
404 | * @since 2.0 |
405 | */ | |
406 | @TmfSignalHandler | |
faa38350 PT |
407 | public void traceClosed(TmfTraceClosedSignal signal) { |
408 | ||
409 | if (signal.getTrace() != fTrace) { | |
410 | return; | |
411 | } | |
ea279a69 FC |
412 | |
413 | // Kill any running request | |
414 | if ((fTimeRangeRequest != null) && !fTimeRangeRequest.isCompleted()) { | |
415 | fTimeRangeRequest.cancel(); | |
416 | } | |
417 | if ((fFullTraceRequest != null) && !fFullTraceRequest.isCompleted()) { | |
418 | fFullTraceRequest.cancel(); | |
419 | } | |
420 | ||
421 | // Initialize the internal data | |
faa38350 PT |
422 | fTrace = null; |
423 | fTraceStartTime = 0L; | |
424 | fTraceEndTime = 0L; | |
f8177ba2 FC |
425 | fWindowStartTime = 0L; |
426 | fWindowEndTime = 0L; | |
d7ee91bb | 427 | fWindowSpan = 0L; |
0fcf3b09 PT |
428 | fSelectionBeginTime = 0L; |
429 | fSelectionEndTime = 0L; | |
ea279a69 FC |
430 | |
431 | // Clear the UI widgets | |
432 | fFullTraceHistogram.clear(); | |
433 | fTimeRangeHistogram.clear(); | |
da7bdcbc | 434 | fCurrentEventTimeControl.setValue(Long.MIN_VALUE); |
f8177ba2 | 435 | |
da7bdcbc | 436 | fTimeSpanControl.setValue(Long.MIN_VALUE); |
ea279a69 FC |
437 | } |
438 | ||
b544077e | 439 | /** |
faa38350 | 440 | * Handles trace range updated signal. Extends histogram according to the new time range. If a |
b544077e BH |
441 | * HistogramRequest is already ongoing, it will be cancelled and a new request with the new range |
442 | * will be issued. | |
abbdd66a | 443 | * |
faa38350 PT |
444 | * @param signal the trace range updated signal |
445 | * @since 2.0 | |
b544077e | 446 | */ |
74237cc3 | 447 | @TmfSignalHandler |
faa38350 | 448 | public void traceRangeUpdated(TmfTraceRangeUpdatedSignal signal) { |
74237cc3 | 449 | |
faa38350 | 450 | if (signal.getTrace() != fTrace) { |
09d11238 PT |
451 | return; |
452 | } | |
453 | ||
74237cc3 FC |
454 | TmfTimeRange fullRange = signal.getRange(); |
455 | ||
faa38350 PT |
456 | fTraceStartTime = fullRange.getStartTime().normalize(0, ITmfTimestamp.NANOSECOND_SCALE).getValue(); |
457 | fTraceEndTime = fullRange.getEndTime().normalize(0, ITmfTimestamp.NANOSECOND_SCALE).getValue(); | |
74237cc3 | 458 | |
faa38350 PT |
459 | fFullTraceHistogram.setFullRange(fTraceStartTime, fTraceEndTime); |
460 | fTimeRangeHistogram.setFullRange(fTraceStartTime, fTraceEndTime); | |
74237cc3 | 461 | |
74237cc3 FC |
462 | sendFullRangeRequest(fullRange); |
463 | } | |
c392540b | 464 | |
b544077e | 465 | /** |
faa38350 PT |
466 | * Handles the trace updated signal. Used to update time limits (start and end time) |
467 | * @param signal the trace updated signal | |
468 | * @since 2.0 | |
b544077e | 469 | */ |
a28d503d | 470 | @TmfSignalHandler |
faa38350 PT |
471 | public void traceUpdated(TmfTraceUpdatedSignal signal) { |
472 | if (signal.getTrace() != fTrace) { | |
a28d503d PT |
473 | return; |
474 | } | |
faa38350 PT |
475 | TmfTimeRange fullRange = signal.getTrace().getTimeRange(); |
476 | fTraceStartTime = fullRange.getStartTime().normalize(0, ITmfTimestamp.NANOSECOND_SCALE).getValue(); | |
477 | fTraceEndTime = fullRange.getEndTime().normalize(0, ITmfTimestamp.NANOSECOND_SCALE).getValue(); | |
a28d503d | 478 | |
faa38350 PT |
479 | fFullTraceHistogram.setFullRange(fTraceStartTime, fTraceEndTime); |
480 | fTimeRangeHistogram.setFullRange(fTraceStartTime, fTraceEndTime); | |
481 | ||
13ccc36b | 482 | fFullTraceHistogram.setTimeRange(fTimeRangeHistogram.getStartTime(), fWindowSpan); |
15844a4e | 483 | fTimeRangeHistogram.setTimeRange(fTimeRangeHistogram.getStartTime(), fWindowSpan); |
13ccc36b | 484 | |
faa38350 PT |
485 | if ((fFullTraceRequest != null) && fFullTraceRequest.getRange().getEndTime().compareTo(signal.getRange().getEndTime()) < 0) { |
486 | sendFullRangeRequest(fullRange); | |
487 | } | |
488 | } | |
a28d503d | 489 | |
b544077e BH |
490 | /** |
491 | * Handles the current time updated signal. Sets the current time in the time range | |
492 | * histogram as well as the full histogram. | |
abbdd66a | 493 | * |
b544077e BH |
494 | * @param signal the signal to process |
495 | */ | |
c392540b FC |
496 | @TmfSignalHandler |
497 | public void currentTimeUpdated(TmfTimeSynchSignal signal) { | |
498 | // Because this can't happen :-) | |
499 | assert (signal != null); | |
500 | ||
0fcf3b09 PT |
501 | // Update the selected time range |
502 | ITmfTimestamp beginTime = signal.getBeginTime().normalize(0, ITmfTimestamp.NANOSECOND_SCALE); | |
503 | ITmfTimestamp endTime = signal.getEndTime().normalize(0, ITmfTimestamp.NANOSECOND_SCALE); | |
504 | updateDisplayedSelectionTime(beginTime.getValue(), endTime.getValue()); | |
ecfd1d41 | 505 | } |
f05aabed | 506 | |
b544077e BH |
507 | /** |
508 | * Updates the current time range in the time range histogram and full range histogram. | |
509 | * @param signal the signal to process | |
510 | */ | |
c392540b FC |
511 | @TmfSignalHandler |
512 | public void timeRangeUpdated(TmfRangeSynchSignal signal) { | |
513 | // Because this can't happen :-) | |
514 | assert (signal != null); | |
515 | ||
faa38350 | 516 | if (fTrace != null) { |
1c6a842a PT |
517 | // Validate the time range |
518 | TmfTimeRange range = signal.getCurrentRange().getIntersection(fTrace.getTimeRange()); | |
519 | if (range == null) { | |
520 | return; | |
521 | } | |
522 | ||
38df2c82 AM |
523 | updateDisplayedTimeRange( |
524 | range.getStartTime().normalize(0, ITmfTimestamp.NANOSECOND_SCALE).getValue(), | |
525 | range.getEndTime().normalize(0, ITmfTimestamp.NANOSECOND_SCALE).getValue()); | |
c392540b | 526 | |
38df2c82 | 527 | // Send the event request to populate the small histogram |
c392540b | 528 | sendTimeRangeRequest(fWindowStartTime, fWindowEndTime); |
f8177ba2 | 529 | |
c392540b FC |
530 | fTimeSpanControl.setValue(fWindowSpan); |
531 | } | |
b59134e1 | 532 | } |
c392540b FC |
533 | |
534 | // ------------------------------------------------------------------------ | |
535 | // Helper functions | |
536 | // ------------------------------------------------------------------------ | |
537 | ||
538 | private void initializeHistograms() { | |
faa38350 | 539 | TmfTimeRange fullRange = updateTraceTimeRange(); |
0fcf3b09 PT |
540 | long selectionBeginTime = fTraceManager.getSelectionBeginTime().normalize(0, ITmfTimestamp.NANOSECOND_SCALE).getValue(); |
541 | long selectionEndTime = fTraceManager.getSelectionEndTime().normalize(0, ITmfTimestamp.NANOSECOND_SCALE).getValue(); | |
248af329 AM |
542 | long startTime = fTraceManager.getCurrentRange().getStartTime().normalize(0, ITmfTimestamp.NANOSECOND_SCALE).getValue(); |
543 | long duration = fTraceManager.getCurrentRange().getEndTime().normalize(0, ITmfTimestamp.NANOSECOND_SCALE).getValue() - startTime; | |
74237cc3 | 544 | |
faa38350 PT |
545 | if ((fTimeRangeRequest != null) && !fTimeRangeRequest.isCompleted()) { |
546 | fTimeRangeRequest.cancel(); | |
547 | } | |
74237cc3 | 548 | fTimeRangeHistogram.clear(); |
faa38350 | 549 | fTimeRangeHistogram.setFullRange(fTraceStartTime, fTraceEndTime); |
d7ee91bb | 550 | fTimeRangeHistogram.setTimeRange(startTime, duration); |
0fcf3b09 | 551 | fTimeRangeHistogram.setSelection(selectionBeginTime, selectionEndTime); |
c392540b | 552 | |
faa38350 PT |
553 | if ((fFullTraceRequest != null) && !fFullTraceRequest.isCompleted()) { |
554 | fFullTraceRequest.cancel(); | |
555 | } | |
74237cc3 | 556 | fFullTraceHistogram.clear(); |
faa38350 | 557 | fFullTraceHistogram.setFullRange(fTraceStartTime, fTraceEndTime); |
d7ee91bb | 558 | fFullTraceHistogram.setTimeRange(startTime, duration); |
0fcf3b09 | 559 | fFullTraceHistogram.setSelection(selectionBeginTime, selectionEndTime); |
c392540b | 560 | |
d7ee91bb PT |
561 | fWindowStartTime = startTime; |
562 | fWindowSpan = duration; | |
563 | fWindowEndTime = startTime + duration; | |
6a13fa07 | 564 | |
0fcf3b09 PT |
565 | fSelectionBeginTime = selectionBeginTime; |
566 | fSelectionEndTime = selectionEndTime; | |
567 | fCurrentEventTimeControl.setValue(fSelectionBeginTime); | |
f8177ba2 | 568 | |
d7ee91bb | 569 | fTimeSpanControl.setValue(duration); |
6a13fa07 | 570 | |
2af7df97 | 571 | if (!fullRange.equals(TmfTimeRange.NULL_RANGE)) { |
d7ee91bb | 572 | sendTimeRangeRequest(startTime, startTime + duration); |
2af7df97 FC |
573 | sendFullRangeRequest(fullRange); |
574 | } | |
74237cc3 FC |
575 | } |
576 | ||
0fcf3b09 PT |
577 | private void updateDisplayedSelectionTime(long beginTime, long endTime) { |
578 | fSelectionBeginTime = beginTime; | |
579 | fSelectionEndTime = endTime; | |
38df2c82 | 580 | |
0fcf3b09 PT |
581 | fFullTraceHistogram.setSelection(fSelectionBeginTime, fSelectionEndTime); |
582 | fTimeRangeHistogram.setSelection(fSelectionBeginTime, fSelectionEndTime); | |
583 | fCurrentEventTimeControl.setValue(fSelectionBeginTime); | |
38df2c82 AM |
584 | } |
585 | ||
586 | private void updateDisplayedTimeRange(long start, long end) { | |
587 | fWindowStartTime = start; | |
588 | fWindowEndTime = end; | |
589 | fWindowSpan = fWindowEndTime - fWindowStartTime; | |
590 | fFullTraceHistogram.setTimeRange(fWindowStartTime, fWindowSpan); | |
591 | } | |
592 | ||
faa38350 PT |
593 | private TmfTimeRange updateTraceTimeRange() { |
594 | fTraceStartTime = 0L; | |
595 | fTraceEndTime = 0L; | |
74237cc3 | 596 | |
faa38350 | 597 | TmfTimeRange timeRange = fTrace.getTimeRange(); |
c6023803 | 598 | if (!timeRange.equals(TmfTimeRange.NULL_RANGE)) { |
faa38350 PT |
599 | fTraceStartTime = timeRange.getStartTime().normalize(0, ITmfTimestamp.NANOSECOND_SCALE).getValue(); |
600 | fTraceEndTime = timeRange.getEndTime().normalize(0, ITmfTimestamp.NANOSECOND_SCALE).getValue(); | |
74237cc3 FC |
601 | } |
602 | return timeRange; | |
b59134e1 | 603 | } |
c392540b FC |
604 | |
605 | private void sendTimeRangeRequest(long startTime, long endTime) { | |
1b055dfa | 606 | if ((fTimeRangeRequest != null) && !fTimeRangeRequest.isCompleted()) { |
c392540b | 607 | fTimeRangeRequest.cancel(); |
088c1d4e | 608 | } |
f8177ba2 FC |
609 | TmfTimestamp startTS = new TmfTimestamp(startTime, ITmfTimestamp.NANOSECOND_SCALE); |
610 | TmfTimestamp endTS = new TmfTimestamp(endTime, ITmfTimestamp.NANOSECOND_SCALE); | |
c392540b FC |
611 | TmfTimeRange timeRange = new TmfTimeRange(startTS, endTS); |
612 | ||
613 | fTimeRangeHistogram.clear(); | |
15844a4e | 614 | fTimeRangeHistogram.setFullRange(fTraceStartTime, fTraceEndTime); |
c392540b | 615 | fTimeRangeHistogram.setTimeRange(startTime, endTime - startTime); |
4cf201de | 616 | |
faa38350 | 617 | int cacheSize = fTrace.getCacheSize(); |
f6ad2e3d | 618 | fTimeRangeRequest = new HistogramRequest(fTimeRangeHistogram.getDataModel(), timeRange, 0, TmfDataRequest.ALL_DATA, cacheSize, ExecutionType.FOREGROUND); |
faa38350 | 619 | fTrace.sendRequest(fTimeRangeRequest); |
088c1d4e | 620 | } |
c392540b | 621 | |
74237cc3 | 622 | private void sendFullRangeRequest(TmfTimeRange fullRange) { |
1b055dfa | 623 | if ((fFullTraceRequest != null) && !fFullTraceRequest.isCompleted()) { |
c392540b FC |
624 | fFullTraceRequest.cancel(); |
625 | } | |
faa38350 | 626 | int cacheSize = fTrace.getCacheSize(); |
fbd124dd | 627 | fFullTraceRequest = new HistogramRequest(fFullTraceHistogram.getDataModel(), fullRange, (int) fFullTraceHistogram.fDataModel.getNbEvents(), |
f6ad2e3d | 628 | TmfDataRequest.ALL_DATA, cacheSize, ExecutionType.BACKGROUND); |
faa38350 | 629 | fTrace.sendRequest(fFullTraceRequest); |
ed4b3b9f | 630 | } |
c392540b | 631 | |
6e512b93 | 632 | } |