tmf.ui: Make TmfTimeViewer handlers parameters nullable
[deliverable/tracecompass.git] / tmf / org.eclipse.tracecompass.tmf.ui / src / org / eclipse / tracecompass / tmf / ui / viewers / TmfTimeViewer.java
CommitLineData
843c272b 1/*******************************************************************************
4e72adee 2 * Copyright (c) 2014, 2015 École Polytechnique de Montréal and others.
843c272b
GB
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:
10 * Bernd Hufmann - Initial API and implementation in TmfXYChartViewer
11 * Geneviève Bastien - Moved methods from TmfXYChartViewer to this interface
12 *******************************************************************************/
13
2bdf0193 14package org.eclipse.tracecompass.tmf.ui.viewers;
843c272b 15
7d65c2b5 16import org.eclipse.jdt.annotation.Nullable;
843c272b 17import org.eclipse.swt.widgets.Composite;
16801c72 18import org.eclipse.tracecompass.tmf.core.signal.TmfSelectionRangeUpdatedSignal;
2bdf0193
AM
19import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
20import org.eclipse.tracecompass.tmf.core.signal.TmfSignalThrottler;
2bdf0193
AM
21import org.eclipse.tracecompass.tmf.core.signal.TmfTraceClosedSignal;
22import org.eclipse.tracecompass.tmf.core.signal.TmfTraceOpenedSignal;
23import org.eclipse.tracecompass.tmf.core.signal.TmfTraceRangeUpdatedSignal;
24import org.eclipse.tracecompass.tmf.core.signal.TmfTraceSelectedSignal;
25import org.eclipse.tracecompass.tmf.core.signal.TmfTraceUpdatedSignal;
16801c72 26import org.eclipse.tracecompass.tmf.core.signal.TmfWindowRangeUpdatedSignal;
2bdf0193
AM
27import org.eclipse.tracecompass.tmf.core.timestamp.ITmfTimestamp;
28import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange;
29import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
30import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
21852dfa 31import org.eclipse.tracecompass.tmf.core.trace.TmfTraceContext;
2bdf0193 32import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
843c272b
GB
33
34/**
35 * Abstract class that extends {@link TmfViewer} that adds methods to
36 * synchronize with a trace's time information.
37 *
38 * This class will be extended by viewers who require time information to update
39 * their content.
40 *
41 * <pre>
42 * It provides three times of data:
43 * - start and end time of the trace (available)
44 * - start, end and duration of the current time window, ie the visible time range
45 * - start and end of the time range selected
46 * </pre>
47 *
48 * @author Bernd Hufmann
49 * @author Geneviève Bastien
843c272b
GB
50 */
51public abstract class TmfTimeViewer extends TmfViewer implements ITmfTimeProvider {
52
53 /** Start time of trace */
54 private long fStartTime;
55 /** End time of trace */
56 private long fEndTime;
57 /** Start time of current time range */
58 private long fWindowStartTime;
59 /** End time of current time range */
60 private long fWindowEndTime;
843c272b
GB
61 /** Current begin time of selection range */
62 private long fSelectionBeginTime;
63 /** Current end of selection range */
64 private long fSelectionEndTime;
65 /** The trace that is displayed by this viewer */
66 private ITmfTrace fTrace;
67 /** A signal throttler for range updates */
68 private final TmfSignalThrottler fTimeRangeSyncThrottle = new TmfSignalThrottler(this, 200);
69
70 /**
71 * Default constructor.
72 */
73 public TmfTimeViewer() {
74 super();
75 }
76
77 /**
78 * Constructor that initializes the parent of the viewer
79 *
80 * @param parent
81 * The parent composite that holds this viewer
82 */
83 public TmfTimeViewer(Composite parent) {
84 this(parent, ""); //$NON-NLS-1$
85 }
86
87 /**
88 * Constructor that initializes the parent of the viewer and that sets the
89 * name of the viewer
90 *
91 * @param parent
92 * The parent composite that holds this viewer
93 * @param name
94 * The name of the viewer
95 */
96 public TmfTimeViewer(Composite parent, String name) {
97 init(parent, name);
98 }
99
100 // ------------------------------------------------------------------------
101 // Getter/Setters
102 // ------------------------------------------------------------------------
103
104 /**
105 * Sets the start time of the trace
106 *
107 * @param startTime
108 * The start time to set
109 */
110 protected void setStartTime(long startTime) {
111 fStartTime = startTime;
112 }
113
114 /**
115 * Sets the end time of the trace
116 *
117 * @param endTime
118 * The start time to set
119 */
120 protected void setEndTime(long endTime) {
121 fEndTime = endTime;
122 }
123
124 /**
16801c72
MK
125 * Sets the start time and end of the current time range window (visible
126 * range)
843c272b
GB
127 *
128 * @param windowStartTime
129 * The start time to set
843c272b
GB
130 * @param windowEndTime
131 * The start time to set
2a3d8f39 132 * @since 1.0
843c272b 133 */
2a3d8f39
BH
134 protected void setWindowRange(long windowStartTime, long windowEndTime) {
135 fWindowStartTime = windowStartTime;
843c272b
GB
136 fWindowEndTime = windowEndTime;
137 }
138
843c272b 139 /**
842b496e
BH
140 * Sets the begin and end time of the selected range without sending the
141 * {@link TmfSelectionRangeUpdatedSignal} signal.
843c272b
GB
142 *
143 * @param selectionBeginTime
144 * The begin time to set
843c272b
GB
145 * @param selectionEndTime
146 * The end time to set
842b496e
BH
147 *
148 * @since 1.0
843c272b 149 */
842b496e
BH
150 protected void setSelectionRange(long selectionBeginTime, long selectionEndTime) {
151 fSelectionBeginTime = selectionBeginTime;
843c272b
GB
152 fSelectionEndTime = selectionEndTime;
153 }
154
155 /**
156 * Sets the trace that is displayed by this viewer.
157 *
158 * @param trace
159 * The trace to set
160 */
161 protected void setTrace(ITmfTrace trace) {
162 fTrace = trace;
163 }
164
165 /**
166 * Gets the trace that is displayed by this viewer.
167 *
168 * @return the trace
169 */
170 protected ITmfTrace getTrace() {
171 return fTrace;
172 }
173
174 // ------------------------------------------------------------------------
175 // ITmfTimeProvider
176 // ------------------------------------------------------------------------
177
178 @Override
179 public long getStartTime() {
180 return fStartTime;
181 }
182
183 @Override
184 public long getEndTime() {
185 return fEndTime;
186 }
187
188 @Override
189 public long getWindowStartTime() {
190 return fWindowStartTime;
191 }
192
193 @Override
194 public long getWindowEndTime() {
195 return fWindowEndTime;
196 }
197
198 @Override
199 public long getWindowDuration() {
4e72adee 200 return getWindowEndTime() - getWindowStartTime();
843c272b
GB
201 }
202
203 @Override
204 public long getSelectionBeginTime() {
205 return fSelectionBeginTime;
206 }
207
208 @Override
209 public long getSelectionEndTime() {
210 return fSelectionEndTime;
211 }
212
213 @Override
214 public void updateSelectionRange(final long currentBeginTime, final long currentEndTime) {
215 if (fTrace != null) {
842b496e 216 setSelectionRange(currentBeginTime, currentEndTime);
843c272b 217
b2c971ec
MK
218 final ITmfTimestamp startTimestamp = TmfTimestamp.fromNanos(getSelectionBeginTime());
219 final ITmfTimestamp endTimestamp = TmfTimestamp.fromNanos(getSelectionEndTime());
843c272b 220
97c71024 221 TmfSelectionRangeUpdatedSignal signal = new TmfSelectionRangeUpdatedSignal(this, startTimestamp, endTimestamp);
843c272b
GB
222 broadcast(signal);
223 }
224 }
225
226 @Override
227 public void updateWindow(long windowStartTime, long windowEndTime) {
228
2a3d8f39 229 setWindowRange(windowStartTime, windowEndTime);
843c272b
GB
230
231 // Build the new time range; keep the current time
232 TmfTimeRange timeRange = new TmfTimeRange(
b2c971ec
MK
233 TmfTimestamp.fromNanos(getWindowStartTime()),
234 TmfTimestamp.fromNanos(getWindowEndTime()));
843c272b
GB
235
236 // Send the signal
97c71024 237 TmfWindowRangeUpdatedSignal signal = new TmfWindowRangeUpdatedSignal(this, timeRange);
843c272b
GB
238 fTimeRangeSyncThrottle.queue(signal);
239 }
240
241 // ------------------------------------------------------------------------
242 // Operations
243 // ------------------------------------------------------------------------
244 /**
245 * A Method to load a trace into the viewer.
246 *
247 * @param trace
248 * A trace to apply in the viewer
249 */
250 public void loadTrace(ITmfTrace trace) {
251 fTrace = trace;
252
21852dfa 253 TmfTraceContext ctx = TmfTraceManager.getInstance().getCurrentTraceContext();
16801c72
MK
254 long selectionStart = ctx.getSelectionRange().getStartTime().toNanos();
255 long selectionEnd = ctx.getSelectionRange().getEndTime().toNanos();
21852dfa
AM
256 TmfTimeRange windowRange = ctx.getWindowRange();
257
16801c72
MK
258 long windowStartTime = windowRange.getStartTime().toNanos();
259 long windowEndTime = windowRange.getEndTime().toNanos();
260 long startTime = fTrace.getStartTime().toNanos();
261 long endTime = fTrace.getEndTime().toNanos();
843c272b 262
842b496e
BH
263 setSelectionRange(selectionStart, selectionEnd);
264
843c272b 265 setStartTime(startTime);
2a3d8f39 266 setWindowRange(windowStartTime, windowEndTime);
843c272b 267 setEndTime(endTime);
843c272b
GB
268 }
269
270 /**
271 * Resets the content of the viewer
272 */
273 public void reset() {
274 // Reset the internal data
842b496e 275 setSelectionRange(0, 0);
843c272b 276 setStartTime(0);
2a3d8f39 277 setWindowRange(0, 0);
843c272b 278 setEndTime(0);
843c272b
GB
279 setTrace(null);
280 }
281
282 // ------------------------------------------------------------------------
283 // Signal Handler
284 // ------------------------------------------------------------------------
285
286 /**
287 * Signal handler for handling of the trace opened signal.
288 *
289 * @param signal
290 * The trace opened signal {@link TmfTraceOpenedSignal}
291 */
292 @TmfSignalHandler
7d65c2b5
MK
293 public void traceOpened(@Nullable TmfTraceOpenedSignal signal) {
294 if (signal == null) {
295 return;
296 }
843c272b
GB
297 fTrace = signal.getTrace();
298 loadTrace(getTrace());
299 }
300
301 /**
302 * Signal handler for handling of the trace selected signal.
303 *
304 * @param signal
305 * The trace selected signal {@link TmfTraceSelectedSignal}
306 */
307 @TmfSignalHandler
7d65c2b5
MK
308 public void traceSelected(@Nullable TmfTraceSelectedSignal signal) {
309 if (signal != null && fTrace != signal.getTrace()) {
843c272b
GB
310 fTrace = signal.getTrace();
311 loadTrace(getTrace());
312 }
313 }
314
315 /**
316 * Signal handler for handling of the trace closed signal.
317 *
318 * @param signal
319 * The trace closed signal {@link TmfTraceClosedSignal}
320 */
321 @TmfSignalHandler
7d65c2b5 322 public void traceClosed(@Nullable TmfTraceClosedSignal signal) {
843c272b 323
7d65c2b5 324 if (signal == null || signal.getTrace() != fTrace) {
843c272b
GB
325 return;
326 }
327
328 // Reset the internal data
329 fTrace = null;
330 reset();
331 }
332
333 /**
97c71024 334 * Signal handler for handling of the selected range signal.
843c272b
GB
335 *
336 * @param signal
97c71024
AM
337 * The {@link TmfSelectionRangeUpdatedSignal}
338 * @since 1.0
843c272b
GB
339 */
340 @TmfSignalHandler
7d65c2b5
MK
341 public void selectionRangeUpdated(@Nullable TmfSelectionRangeUpdatedSignal signal) {
342 if (signal != null && (signal.getSource() != this) && (fTrace != null)) {
16801c72
MK
343 long selectedTime = signal.getBeginTime().toNanos();
344 long selectedEndTime = signal.getEndTime().toNanos();
345 setSelectionRange(selectedTime, selectedEndTime);
843c272b
GB
346 }
347 }
348
349 /**
97c71024 350 * Signal handler for handling of the window range signal.
843c272b
GB
351 *
352 * @param signal
97c71024
AM
353 * The {@link TmfWindowRangeUpdatedSignal}
354 * @since 1.0
843c272b
GB
355 */
356 @TmfSignalHandler
7d65c2b5 357 public void windowRangeUpdated(@Nullable TmfWindowRangeUpdatedSignal signal) {
843c272b 358
7d65c2b5 359 if (signal != null && fTrace != null) {
843c272b
GB
360 // Validate the time range
361 TmfTimeRange range = signal.getCurrentRange().getIntersection(fTrace.getTimeRange());
362 if (range == null) {
363 return;
364 }
365
366 if (signal.getSource() != this) {
367 // Update the time range
16801c72
MK
368 long windowStartTime = range.getStartTime().toNanos();
369 long windowEndTime = range.getEndTime().toNanos();
843c272b 370
2a3d8f39 371 setWindowRange(windowStartTime, windowEndTime);
843c272b
GB
372 }
373 }
374 }
375
376 /**
377 * Signal handler for handling of the trace range updated signal.
378 *
379 * @param signal
380 * The trace range signal {@link TmfTraceRangeUpdatedSignal}
381 */
382 @TmfSignalHandler
7d65c2b5
MK
383 public void traceRangeUpdated(@Nullable TmfTraceRangeUpdatedSignal signal) {
384 if (signal == null || signal.getTrace() != fTrace) {
843c272b
GB
385 return;
386 }
387
388 TmfTimeRange fullRange = signal.getRange();
389
16801c72
MK
390 long traceStartTime = fullRange.getStartTime().toNanos();
391 long traceEndTime = fullRange.getEndTime().toNanos();
843c272b
GB
392
393 setStartTime(traceStartTime);
394 setEndTime(traceEndTime);
395 }
396
397 /**
398 * Signal handler for handling of the trace updated signal.
399 *
400 * @param signal
401 * The trace updated signal {@link TmfTraceUpdatedSignal}
402 */
403 @TmfSignalHandler
7d65c2b5
MK
404 public void traceUpdated(@Nullable TmfTraceUpdatedSignal signal) {
405 if (signal == null || signal.getTrace() != fTrace) {
843c272b
GB
406 return;
407 }
408 TmfTimeRange fullRange = signal.getTrace().getTimeRange();
16801c72
MK
409
410 long traceStartTime = fullRange.getStartTime().toNanos();
411 long traceEndTime = fullRange.getEndTime().toNanos();
843c272b
GB
412
413 setStartTime(traceStartTime);
414 setEndTime(traceEndTime);
415 }
416
417}
This page took 0.102825 seconds and 5 git commands to generate.