Update Javadoc for the public API in legacy LTTng
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.ui / src / org / eclipse / linuxtools / tmf / ui / views / histogram / HistogramView.java
CommitLineData
6e512b93 1/*******************************************************************************
e0752744 2 * Copyright (c) 2009, 2010, 2011, 2012 Ericsson
6e512b93
ASL
3 *
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
8 *
9 * Contributors:
b59134e1 10 * William Bourque - Initial API and implementation
c392540b
FC
11 * Yuriy Vashchuk - GUI reorganisation, simplification and some related code improvements.
12 * Yuriy Vashchuk - Histograms optimisation.
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;
4df4581d 21import org.eclipse.linuxtools.tmf.core.event.ITmfTimestamp;
6c13869b
FC
22import org.eclipse.linuxtools.tmf.core.event.TmfTimeRange;
23import org.eclipse.linuxtools.tmf.core.event.TmfTimestamp;
6c13869b 24import org.eclipse.linuxtools.tmf.core.request.ITmfDataRequest.ExecutionType;
f6ad2e3d 25import org.eclipse.linuxtools.tmf.core.request.TmfDataRequest;
6c13869b
FC
26import org.eclipse.linuxtools.tmf.core.signal.TmfExperimentRangeUpdatedSignal;
27import org.eclipse.linuxtools.tmf.core.signal.TmfExperimentSelectedSignal;
a28d503d 28import org.eclipse.linuxtools.tmf.core.signal.TmfExperimentUpdatedSignal;
6c13869b
FC
29import org.eclipse.linuxtools.tmf.core.signal.TmfRangeSynchSignal;
30import org.eclipse.linuxtools.tmf.core.signal.TmfSignalHandler;
31import org.eclipse.linuxtools.tmf.core.signal.TmfSignalManager;
32import org.eclipse.linuxtools.tmf.core.signal.TmfTimeSynchSignal;
9e0640dc 33import org.eclipse.linuxtools.tmf.core.trace.TmfExperiment;
b59134e1
WB
34import org.eclipse.linuxtools.tmf.ui.views.TmfView;
35import org.eclipse.swt.SWT;
36import org.eclipse.swt.layout.GridData;
252ae4bd 37import org.eclipse.swt.layout.GridLayout;
6e512b93 38import org.eclipse.swt.widgets.Composite;
6e512b93 39
544fe9b7 40/**
12c155f5 41 * The purpose of this view is to provide graphical time distribution statistics about the experiment/trace events.
544fe9b7 42 * <p>
c392540b
FC
43 * The view is composed of two histograms and two controls:
44 * <ul>
45 * <li>an event distribution histogram for the whole experiment;
46 * <li>an event distribution histogram for current time window (window span);
47 * <li>the timestamp of the currently selected event;
48 * <li>the window span (size of the time window of the smaller histogram).
49 * </ul>
50 * The histograms x-axis show their respective time range.
2af7df97
FC
51 *
52 * @version 1.0
53 * @author Francois Chouinard
544fe9b7 54 */
c392540b
FC
55public class HistogramView extends TmfView {
56
57 // ------------------------------------------------------------------------
58 // Constants
59 // ------------------------------------------------------------------------
60
61 // The view ID as defined in plugin.xml
e0752744 62 public static final String ID = "org.eclipse.linuxtools.tmf.ui.views.histogram"; //$NON-NLS-1$
c392540b
FC
63
64 // The initial window span (in nanoseconds)
1cceddbe 65 public static final long INITIAL_WINDOW_SPAN = (1L * 100 * 1000 * 1000); // .1sec
c392540b
FC
66
67 // Time scale
68 private final byte TIME_SCALE = Histogram.TIME_SCALE;
69
70 // ------------------------------------------------------------------------
71 // Attributes
72 // ------------------------------------------------------------------------
73
74 // Parent widget
75 private Composite fParent;
76
77 // The current experiment
e0752744 78 private TmfExperiment<ITmfEvent> fCurrentExperiment;
c392540b
FC
79
80 // Current timestamp/time window
81 private long fExperimentStartTime;
82 private long fExperimentEndTime;
83 private long fWindowStartTime;
84 private long fWindowEndTime;
85 private long fWindowSpan = INITIAL_WINDOW_SPAN;
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
100 // ------------------------------------------------------------------------
101 // Constructor
102 // ------------------------------------------------------------------------
103
104 public HistogramView() {
105 super(ID);
106 }
107
6a13fa07 108 @Override
c392540b 109 public void dispose() {
4dc47e28
FC
110 if (fTimeRangeRequest != null && !fTimeRangeRequest.isCompleted()) {
111 fTimeRangeRequest.cancel();
112 }
113 if (fFullTraceRequest != null && !fFullTraceRequest.isCompleted()) {
114 fFullTraceRequest.cancel();
115 }
6a13fa07
FC
116 fFullTraceHistogram.dispose();
117 fTimeRangeHistogram.dispose();
4dc47e28 118 super.dispose();
c392540b
FC
119 }
120
121 // ------------------------------------------------------------------------
122 // TmfView
123 // ------------------------------------------------------------------------
124
125 @Override
b59134e1 126 @SuppressWarnings("unchecked")
c392540b
FC
127 public void createPartControl(Composite parent) {
128
129 fParent = parent;
130
131 // Control labels
132 final String currentEventLabel = Messages.HistogramView_currentEventLabel;
133 final String windowSpanLabel = Messages.HistogramView_windowSpanLabel;
134
135 // --------------------------------------------------------------------
136 // Set the HistogramView layout
137 // --------------------------------------------------------------------
138
139 Composite viewComposite = new Composite(fParent, SWT.FILL);
140 GridLayout gridLayout = new GridLayout();
141 gridLayout.numColumns = 2;
142 gridLayout.horizontalSpacing = 5;
143 gridLayout.verticalSpacing = 0;
144 gridLayout.marginHeight = 0;
145 gridLayout.marginWidth = 0;
146 viewComposite.setLayout(gridLayout);
147
148 // Use all available space
149 GridData gridData = new GridData();
150 gridData.horizontalAlignment = SWT.FILL;
151 gridData.verticalAlignment = SWT.FILL;
152 gridData.grabExcessHorizontalSpace = true;
153 viewComposite.setLayoutData(gridData);
154
155 // --------------------------------------------------------------------
156 // Time controls
157 // --------------------------------------------------------------------
158
159 Composite controlsComposite = new Composite(viewComposite, SWT.FILL);
160 gridLayout = new GridLayout();
161 gridLayout.numColumns = 2;
162 gridLayout.marginHeight = 0;
163 gridLayout.marginWidth = 0;
164 gridLayout.horizontalSpacing = 5;
165 gridLayout.verticalSpacing = 0;
166 gridLayout.makeColumnsEqualWidth = true;
167 gridLayout.marginLeft = 5;
168 gridLayout.marginRight = 5;
169 controlsComposite.setLayout(gridLayout);
170
171 // Current event time control
172 gridData = new GridData();
173 gridData.horizontalAlignment = SWT.CENTER;
174 gridData.verticalAlignment = SWT.CENTER;
0301dc43 175 fCurrentEventTimeControl = new HistogramCurrentTimeControl(this, controlsComposite, SWT.BORDER, SWT.NONE,
12c155f5 176 currentEventLabel, HistogramUtils.nanosecondsToString(0L));
c392540b
FC
177 fCurrentEventTimeControl.setLayoutData(gridData);
178
179 // Window span time control
180 gridData = new GridData();
181 gridData.horizontalAlignment = SWT.CENTER;
182 gridData.verticalAlignment = SWT.CENTER;
0301dc43 183 fTimeSpanControl = new HistogramTimeRangeControl(this, controlsComposite, SWT.BORDER, SWT.NONE,
12c155f5 184 windowSpanLabel, HistogramUtils.nanosecondsToString(0L));
c392540b
FC
185 fTimeSpanControl.setLayoutData(gridData);
186
187 // --------------------------------------------------------------------
188 // Time range histogram
189 // --------------------------------------------------------------------
190
191 Composite timeRangeComposite = new Composite(viewComposite, SWT.FILL);
192 gridLayout = new GridLayout();
193 gridLayout.numColumns = 1;
194 gridLayout.marginHeight = 0;
195 gridLayout.marginWidth = 0;
196 gridLayout.marginTop = 5;
197 gridLayout.horizontalSpacing = 0;
198 gridLayout.verticalSpacing = 0;
199 gridLayout.marginLeft = 5;
200 gridLayout.marginRight = 5;
201 timeRangeComposite.setLayout(gridLayout);
202
203 // Use remaining horizontal space
204 gridData = new GridData();
205 gridData.horizontalAlignment = SWT.FILL;
206 gridData.verticalAlignment = SWT.FILL;
207 gridData.grabExcessHorizontalSpace = true;
208 timeRangeComposite.setLayoutData(gridData);
209
210 // Histogram
211 fTimeRangeHistogram = new TimeRangeHistogram(this, timeRangeComposite);
212
213 // --------------------------------------------------------------------
214 // Full range histogram
215 // --------------------------------------------------------------------
216
217 Composite fullRangeComposite = new Composite(viewComposite, SWT.FILL);
218 gridLayout = new GridLayout();
219 gridLayout.numColumns = 1;
220 gridLayout.marginHeight = 0;
221 gridLayout.marginWidth = 0;
222 gridLayout.marginTop = 5;
223 gridLayout.horizontalSpacing = 0;
224 gridLayout.verticalSpacing = 0;
225 gridLayout.marginLeft = 5;
226 gridLayout.marginRight = 5;
227 fullRangeComposite.setLayout(gridLayout);
228
229 // Use remaining horizontal space
230 gridData = new GridData();
231 gridData.horizontalAlignment = SWT.FILL;
232 gridData.verticalAlignment = SWT.FILL;
233 gridData.horizontalSpan = 2;
234 gridData.grabExcessHorizontalSpace = true;
235 fullRangeComposite.setLayoutData(gridData);
236
237 // Histogram
238 fFullTraceHistogram = new FullTraceHistogram(this, fullRangeComposite);
239
240 // Load the experiment if present
e0752744 241 fCurrentExperiment = (TmfExperiment<ITmfEvent>) TmfExperiment.getCurrentExperiment();
c392540b
FC
242 if (fCurrentExperiment != null)
243 loadExperiment();
ecfd1d41 244 }
c392540b
FC
245
246 @Override
3e9fdb8b 247 @SuppressWarnings("unchecked")
c392540b 248 public void setFocus() {
e0752744 249 TmfExperiment<ITmfEvent> experiment = (TmfExperiment<ITmfEvent>) TmfExperiment.getCurrentExperiment();
c392540b
FC
250 if ((experiment != null) && (experiment != fCurrentExperiment)) {
251 fCurrentExperiment = experiment;
252 initializeHistograms();
253 }
254 fParent.redraw();
833a21aa 255 }
c392540b
FC
256
257 // ------------------------------------------------------------------------
258 // Accessors
259 // ------------------------------------------------------------------------
260
261 public TmfTimeRange getTimeRange() {
12c155f5
FC
262 return new TmfTimeRange(new TmfTimestamp(fWindowStartTime, TIME_SCALE), new TmfTimestamp(fWindowEndTime,
263 TIME_SCALE));
c392540b
FC
264 }
265
266 // ------------------------------------------------------------------------
267 // Operations
268 // ------------------------------------------------------------------------
269
270 public void updateCurrentEventTime(long newTime) {
271 if (fCurrentExperiment != null) {
a4115405 272 TmfTimeRange timeRange = new TmfTimeRange(new TmfTimestamp(newTime, TIME_SCALE), TmfTimestamp.BIG_CRUNCH);
f6ad2e3d 273 HistogramRequest request = new HistogramRequest(fTimeRangeHistogram.getDataModel(), timeRange, 0, 1, 0, ExecutionType.FOREGROUND) {
c392540b 274 @Override
e0752744 275 public void handleData(ITmfEvent event) {
c392540b
FC
276 if (event != null) {
277 TmfTimeSynchSignal signal = new TmfTimeSynchSignal(this, event.getTimestamp());
278 TmfSignalManager.dispatchSignal(signal);
279 }
280 }
281 };
282 fCurrentExperiment.sendRequest(request);
283 }
284 }
285
286 public void updateTimeRange(long startTime, long endTime) {
287 if (fCurrentExperiment != null) {
288 // Build the new time range; keep the current time
12c155f5
FC
289 TmfTimeRange timeRange = new TmfTimeRange(new TmfTimestamp(startTime, TIME_SCALE), new TmfTimestamp(
290 endTime, TIME_SCALE));
c392540b 291 TmfTimestamp currentTime = new TmfTimestamp(fCurrentTimestamp, TIME_SCALE);
6a13fa07 292
c392540b
FC
293 fTimeSpanControl.setValue(endTime - startTime);
294
295 // Send the FW signal
296 TmfRangeSynchSignal signal = new TmfRangeSynchSignal(this, timeRange, currentTime);
297 TmfSignalManager.dispatchSignal(signal);
298 }
299 }
300
301 public synchronized void updateTimeRange(long newDuration) {
302 if (fCurrentExperiment != null) {
6a13fa07
FC
303 long delta = newDuration - fWindowSpan;
304 long newStartTime = fWindowStartTime + delta / 2;
305 setNewRange(newStartTime, newDuration);
c392540b
FC
306 }
307 }
308
309 private void setNewRange(long startTime, long duration) {
310 if (startTime < fExperimentStartTime)
6a13fa07 311 startTime = fExperimentStartTime;
c392540b
FC
312
313 long endTime = startTime + duration;
314 if (endTime > fExperimentEndTime) {
6a13fa07
FC
315 endTime = fExperimentEndTime;
316 if (endTime - duration > fExperimentStartTime)
317 startTime = endTime - duration;
318 else {
319 startTime = fExperimentStartTime;
320 }
c392540b
FC
321 }
322 updateTimeRange(startTime, endTime);
833a21aa 323 }
c392540b
FC
324
325 // ------------------------------------------------------------------------
326 // Signal handlers
327 // ------------------------------------------------------------------------
328
1406f802 329 @TmfSignalHandler
c392540b 330 @SuppressWarnings("unchecked")
e0752744 331 public void experimentSelected(TmfExperimentSelectedSignal<ITmfEvent> signal) {
c392540b 332 assert (signal != null);
e0752744 333 fCurrentExperiment = (TmfExperiment<ITmfEvent>) signal.getExperiment();
c392540b 334 loadExperiment();
ecfd1d41 335 }
550d787e 336
c392540b 337 private void loadExperiment() {
c392540b
FC
338 initializeHistograms();
339 fParent.redraw();
550d787e
FC
340 }
341
74237cc3 342 @TmfSignalHandler
74237cc3
FC
343 public void experimentRangeUpdated(TmfExperimentRangeUpdatedSignal signal) {
344
09d11238
PT
345 if (signal.getExperiment() != fCurrentExperiment) {
346 return;
347 }
348
74237cc3
FC
349 boolean drawTimeRangeHistogram = fExperimentStartTime == 0;
350 TmfTimeRange fullRange = signal.getRange();
351
cbfc3c2a
PT
352 fExperimentStartTime = fullRange.getStartTime().normalize(0, -9).getValue();
353 fExperimentEndTime = fullRange.getEndTime().normalize(0, -9).getValue();
74237cc3
FC
354
355 fFullTraceHistogram.setFullRange(fExperimentStartTime, fExperimentEndTime);
356 fTimeRangeHistogram.setFullRange(fExperimentStartTime, fExperimentEndTime);
357
358 if (drawTimeRangeHistogram) {
359 fCurrentTimestamp = fExperimentStartTime;
360 fCurrentEventTimeControl.setValue(fCurrentTimestamp);
361 fFullTraceHistogram.setTimeRange(fExperimentStartTime, INITIAL_WINDOW_SPAN);
362 fTimeRangeHistogram.setTimeRange(fExperimentStartTime, INITIAL_WINDOW_SPAN);
363 sendTimeRangeRequest(fExperimentStartTime, fExperimentStartTime + INITIAL_WINDOW_SPAN);
364 }
365
366 sendFullRangeRequest(fullRange);
367 }
c392540b 368
a28d503d
PT
369 @TmfSignalHandler
370 public void experimentUpdated(TmfExperimentUpdatedSignal signal) {
371 if (signal.getExperiment() != fCurrentExperiment) {
372 return;
373 }
374 TmfTimeRange fullRange = signal.getExperiment().getTimeRange();
cbfc3c2a
PT
375 fExperimentStartTime = fullRange.getStartTime().normalize(0, -9).getValue();
376 fExperimentEndTime = fullRange.getEndTime().normalize(0, -9).getValue();
a28d503d
PT
377
378 fFullTraceHistogram.setFullRange(fExperimentStartTime, fExperimentEndTime);
379 fTimeRangeHistogram.setFullRange(fExperimentStartTime, fExperimentEndTime);
380 }
381
c392540b
FC
382 @TmfSignalHandler
383 public void currentTimeUpdated(TmfTimeSynchSignal signal) {
384 // Because this can't happen :-)
385 assert (signal != null);
386
387 // Update the selected event time
4df4581d 388 ITmfTimestamp currentTime = signal.getCurrentTime();
cbfc3c2a 389 fCurrentTimestamp = currentTime.normalize(0, -9).getValue();
c392540b
FC
390
391 // Notify the relevant widgets
392 fFullTraceHistogram.setCurrentEvent(fCurrentTimestamp);
393 fTimeRangeHistogram.setCurrentEvent(fCurrentTimestamp);
394 fCurrentEventTimeControl.setValue(fCurrentTimestamp);
ecfd1d41 395 }
f05aabed 396
c392540b
FC
397 @TmfSignalHandler
398 public void timeRangeUpdated(TmfRangeSynchSignal signal) {
399 // Because this can't happen :-)
400 assert (signal != null);
401
402 if (fCurrentExperiment != null) {
403 // Update the time range
cbfc3c2a
PT
404 fWindowStartTime = signal.getCurrentRange().getStartTime().normalize(0, -9).getValue();
405 fWindowEndTime = signal.getCurrentRange().getEndTime().normalize(0, -9).getValue();
c392540b
FC
406 fWindowSpan = fWindowEndTime - fWindowStartTime;
407
408 // Notify the relevant widgets
409 sendTimeRangeRequest(fWindowStartTime, fWindowEndTime);
410 fFullTraceHistogram.setTimeRange(fWindowStartTime, fWindowSpan);
411 fTimeSpanControl.setValue(fWindowSpan);
412 }
b59134e1 413 }
c392540b
FC
414
415 // ------------------------------------------------------------------------
416 // Helper functions
417 // ------------------------------------------------------------------------
418
419 private void initializeHistograms() {
74237cc3
FC
420 TmfTimeRange fullRange = updateExperimentTimeRange(fCurrentExperiment);
421
422 fTimeRangeHistogram.clear();
c392540b
FC
423 fTimeRangeHistogram.setFullRange(fExperimentStartTime, fExperimentEndTime);
424 fTimeRangeHistogram.setTimeRange(fExperimentStartTime, INITIAL_WINDOW_SPAN);
425 fTimeRangeHistogram.setCurrentEvent(fExperimentStartTime);
426
74237cc3 427 fFullTraceHistogram.clear();
6a13fa07 428 fFullTraceHistogram.setFullRange(fExperimentStartTime, fExperimentEndTime);
c392540b
FC
429 fFullTraceHistogram.setTimeRange(fExperimentStartTime, INITIAL_WINDOW_SPAN);
430 fFullTraceHistogram.setCurrentEvent(fExperimentStartTime);
431
432 fWindowStartTime = fExperimentStartTime;
433 fWindowSpan = INITIAL_WINDOW_SPAN;
434 fWindowEndTime = fWindowStartTime + fWindowSpan;
6a13fa07 435
c392540b
FC
436 fCurrentEventTimeControl.setValue(fExperimentStartTime);
437 fTimeSpanControl.setValue(fWindowSpan);
6a13fa07 438
2af7df97
FC
439 if (!fullRange.equals(TmfTimeRange.NULL_RANGE)) {
440 sendTimeRangeRequest(fExperimentStartTime, fExperimentStartTime + fWindowSpan);
441 sendFullRangeRequest(fullRange);
442 }
74237cc3
FC
443 }
444
e0752744 445 private TmfTimeRange updateExperimentTimeRange(TmfExperiment<ITmfEvent> experiment) {
74237cc3
FC
446 fExperimentStartTime = 0;
447 fExperimentEndTime = 0;
448 fCurrentTimestamp = 0;
449
450 TmfTimeRange timeRange = fCurrentExperiment.getTimeRange();
c6023803 451 if (!timeRange.equals(TmfTimeRange.NULL_RANGE)) {
cbfc3c2a
PT
452 fExperimentStartTime = timeRange.getStartTime().normalize(0, -9).getValue();
453 fExperimentEndTime = timeRange.getEndTime().normalize(0, -9).getValue();
74237cc3
FC
454 fCurrentTimestamp = fExperimentStartTime;
455 }
456 return timeRange;
b59134e1 457 }
c392540b
FC
458
459 private void sendTimeRangeRequest(long startTime, long endTime) {
460 if (fTimeRangeRequest != null && !fTimeRangeRequest.isCompleted()) {
461 fTimeRangeRequest.cancel();
088c1d4e 462 }
c392540b
FC
463 TmfTimestamp startTS = new TmfTimestamp(startTime, TIME_SCALE);
464 TmfTimestamp endTS = new TmfTimestamp(endTime, TIME_SCALE);
465 TmfTimeRange timeRange = new TmfTimeRange(startTS, endTS);
466
467 fTimeRangeHistogram.clear();
468 fTimeRangeHistogram.setTimeRange(startTime, endTime - startTime);
4cf201de 469
f6ad2e3d
FC
470 int cacheSize = fCurrentExperiment.getCacheSize();
471 fTimeRangeRequest = new HistogramRequest(fTimeRangeHistogram.getDataModel(), timeRange, 0, TmfDataRequest.ALL_DATA, cacheSize, ExecutionType.FOREGROUND);
c392540b 472 fCurrentExperiment.sendRequest(fTimeRangeRequest);
088c1d4e 473 }
c392540b 474
74237cc3 475 private void sendFullRangeRequest(TmfTimeRange fullRange) {
c392540b
FC
476 if (fFullTraceRequest != null && !fFullTraceRequest.isCompleted()) {
477 fFullTraceRequest.cancel();
478 }
f6ad2e3d 479 int cacheSize = fCurrentExperiment.getCacheSize();
fbd124dd 480 fFullTraceRequest = new HistogramRequest(fFullTraceHistogram.getDataModel(), fullRange, (int) fFullTraceHistogram.fDataModel.getNbEvents(),
f6ad2e3d 481 TmfDataRequest.ALL_DATA, cacheSize, ExecutionType.BACKGROUND);
c392540b 482 fCurrentExperiment.sendRequest(fFullTraceRequest);
ed4b3b9f 483 }
c392540b 484
6e512b93 485}
This page took 0.07056 seconds and 5 git commands to generate.