1 /*******************************************************************************
2 * Copyright (c) 2014 École Polytechnique de Montréal
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
10 * Bernd Hufmann - Initial API and implementation in TmfXYChartViewer
11 * Geneviève Bastien - Moved methods from TmfXYChartViewer to this interface
12 *******************************************************************************/
14 package org
.eclipse
.tracecompass
.tmf
.ui
.viewers
;
16 import org
.eclipse
.swt
.widgets
.Composite
;
17 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfWindowRangeUpdatedSignal
;
18 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfSignalHandler
;
19 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfSignalThrottler
;
20 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfSelectionRangeUpdatedSignal
;
21 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfTraceClosedSignal
;
22 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfTraceOpenedSignal
;
23 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfTraceRangeUpdatedSignal
;
24 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfTraceSelectedSignal
;
25 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfTraceUpdatedSignal
;
26 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.ITmfTimestamp
;
27 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.TmfTimeRange
;
28 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.TmfTimestamp
;
29 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.ITmfTrace
;
30 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.TmfTraceContext
;
31 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.TmfTraceManager
;
34 * Abstract class that extends {@link TmfViewer} that adds methods to
35 * synchronize with a trace's time information.
37 * This class will be extended by viewers who require time information to update
41 * It provides three times of data:
42 * - start and end time of the trace (available)
43 * - start, end and duration of the current time window, ie the visible time range
44 * - start and end of the time range selected
47 * @author Bernd Hufmann
48 * @author Geneviève Bastien
50 public abstract class TmfTimeViewer
extends TmfViewer
implements ITmfTimeProvider
{
52 /** Start time of trace */
53 private long fStartTime
;
54 /** End time of trace */
55 private long fEndTime
;
56 /** Start time of current time range */
57 private long fWindowStartTime
;
58 /** End time of current time range */
59 private long fWindowEndTime
;
60 /** Duration of current time range */
61 private long fWindowDuration
;
62 /** Current begin time of selection range */
63 private long fSelectionBeginTime
;
64 /** Current end of selection range */
65 private long fSelectionEndTime
;
66 /** The trace that is displayed by this viewer */
67 private ITmfTrace fTrace
;
68 /** A signal throttler for range updates */
69 private final TmfSignalThrottler fTimeRangeSyncThrottle
= new TmfSignalThrottler(this, 200);
72 * Default constructor.
74 public TmfTimeViewer() {
79 * Constructor that initializes the parent of the viewer
82 * The parent composite that holds this viewer
84 public TmfTimeViewer(Composite parent
) {
85 this(parent
, ""); //$NON-NLS-1$
89 * Constructor that initializes the parent of the viewer and that sets the
93 * The parent composite that holds this viewer
95 * The name of the viewer
97 public TmfTimeViewer(Composite parent
, String name
) {
101 // ------------------------------------------------------------------------
103 // ------------------------------------------------------------------------
106 * Sets the start time of the trace
109 * The start time to set
111 protected void setStartTime(long startTime
) {
112 fStartTime
= startTime
;
116 * Sets the end time of the trace
119 * The start time to set
121 protected void setEndTime(long endTime
) {
126 * Sets the start time of the current time range window (visible range)
128 * @param windowStartTime
129 * The start time to set
131 protected void setWindowStartTime(long windowStartTime
) {
132 fWindowStartTime
= windowStartTime
;
136 * Sets the end time of the current time range window (visible range)
138 * @param windowEndTime
139 * The start time to set
141 protected void setWindowEndTime(long windowEndTime
) {
142 fWindowEndTime
= windowEndTime
;
146 * Sets the duration of the current time range window (visible range)
148 * @param windowDuration
149 * The window duration
151 protected void setWindowDuration(long windowDuration
) {
152 fWindowDuration
= windowDuration
;
156 * Sets the begin time of the selected range.
158 * @param selectionBeginTime
159 * The begin time to set
161 protected void setSelectionBeginTime(long selectionBeginTime
) {
162 fSelectionBeginTime
= selectionBeginTime
;
166 * Sets the end time of the selected range.
168 * @param selectionEndTime
169 * The end time to set
171 protected void setSelectionEndTime(long selectionEndTime
) {
172 fSelectionEndTime
= selectionEndTime
;
176 * Sets the trace that is displayed by this viewer.
181 protected void setTrace(ITmfTrace trace
) {
186 * Gets the trace that is displayed by this viewer.
190 protected ITmfTrace
getTrace() {
194 // ------------------------------------------------------------------------
196 // ------------------------------------------------------------------------
199 public long getStartTime() {
204 public long getEndTime() {
209 public long getWindowStartTime() {
210 return fWindowStartTime
;
214 public long getWindowEndTime() {
215 return fWindowEndTime
;
219 public long getWindowDuration() {
220 return fWindowDuration
;
224 public long getSelectionBeginTime() {
225 return fSelectionBeginTime
;
229 public long getSelectionEndTime() {
230 return fSelectionEndTime
;
234 public void updateSelectionRange(final long currentBeginTime
, final long currentEndTime
) {
235 if (fTrace
!= null) {
236 setSelectionBeginTime(currentBeginTime
);
237 setSelectionEndTime(currentEndTime
);
239 final ITmfTimestamp startTimestamp
= new TmfTimestamp(getSelectionBeginTime(), ITmfTimestamp
.NANOSECOND_SCALE
);
240 final ITmfTimestamp endTimestamp
= new TmfTimestamp(getSelectionEndTime(), ITmfTimestamp
.NANOSECOND_SCALE
);
242 TmfSelectionRangeUpdatedSignal signal
= new TmfSelectionRangeUpdatedSignal(this, startTimestamp
, endTimestamp
);
248 public void updateWindow(long windowStartTime
, long windowEndTime
) {
250 setWindowStartTime(windowStartTime
);
251 setWindowEndTime(windowEndTime
);
252 setWindowDuration(windowEndTime
- windowStartTime
);
254 // Build the new time range; keep the current time
255 TmfTimeRange timeRange
= new TmfTimeRange(
256 new TmfTimestamp(getWindowStartTime(), ITmfTimestamp
.NANOSECOND_SCALE
),
257 new TmfTimestamp(getWindowEndTime(), ITmfTimestamp
.NANOSECOND_SCALE
));
260 TmfWindowRangeUpdatedSignal signal
= new TmfWindowRangeUpdatedSignal(this, timeRange
);
261 fTimeRangeSyncThrottle
.queue(signal
);
264 // ------------------------------------------------------------------------
266 // ------------------------------------------------------------------------
268 * A Method to load a trace into the viewer.
271 * A trace to apply in the viewer
273 public void loadTrace(ITmfTrace trace
) {
276 TmfTraceContext ctx
= TmfTraceManager
.getInstance().getCurrentTraceContext();
277 long timestamp
= ctx
.getSelectionRange().getStartTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
).getValue();
278 TmfTimeRange windowRange
= ctx
.getWindowRange();
280 long windowStartTime
= windowRange
.getStartTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
).getValue();
281 long windowEndTime
= windowRange
.getEndTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
).getValue();
282 long windowDuration
= windowEndTime
- windowStartTime
;
283 long startTime
= fTrace
.getStartTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
).getValue();
284 long endTime
= fTrace
.getEndTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
).getValue();
286 setSelectionBeginTime(timestamp
);
287 setSelectionEndTime(timestamp
);
288 setStartTime(startTime
);
289 setWindowStartTime(windowStartTime
);
290 setWindowEndTime(windowEndTime
);
291 setWindowDuration(windowDuration
);
296 * Resets the content of the viewer
298 public void reset() {
299 // Reset the internal data
300 setSelectionBeginTime(0);
301 setSelectionEndTime(0);
303 setWindowStartTime(0);
304 setWindowDuration(0);
310 // ------------------------------------------------------------------------
312 // ------------------------------------------------------------------------
315 * Signal handler for handling of the trace opened signal.
318 * The trace opened signal {@link TmfTraceOpenedSignal}
321 public void traceOpened(TmfTraceOpenedSignal signal
) {
322 fTrace
= signal
.getTrace();
323 loadTrace(getTrace());
327 * Signal handler for handling of the trace selected signal.
330 * The trace selected signal {@link TmfTraceSelectedSignal}
333 public void traceSelected(TmfTraceSelectedSignal signal
) {
334 if (fTrace
!= signal
.getTrace()) {
335 fTrace
= signal
.getTrace();
336 loadTrace(getTrace());
341 * Signal handler for handling of the trace closed signal.
344 * The trace closed signal {@link TmfTraceClosedSignal}
347 public void traceClosed(TmfTraceClosedSignal signal
) {
349 if (signal
.getTrace() != fTrace
) {
353 // Reset the internal data
359 * Signal handler for handling of the selected range signal.
362 * The {@link TmfSelectionRangeUpdatedSignal}
366 public void selectionRangeUpdated(TmfSelectionRangeUpdatedSignal signal
) {
367 if ((signal
.getSource() != this) && (fTrace
!= null)) {
368 ITmfTimestamp selectedTime
= signal
.getBeginTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
);
369 ITmfTimestamp selectedEndTime
= signal
.getEndTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
);
370 setSelectionBeginTime(selectedTime
.getValue());
371 setSelectionEndTime(selectedEndTime
.getValue());
376 * Signal handler for handling of the window range signal.
379 * The {@link TmfWindowRangeUpdatedSignal}
383 public void windowRangeUpdated(TmfWindowRangeUpdatedSignal signal
) {
385 if (fTrace
!= null) {
386 // Validate the time range
387 TmfTimeRange range
= signal
.getCurrentRange().getIntersection(fTrace
.getTimeRange());
392 if (signal
.getSource() != this) {
393 // Update the time range
394 long windowStartTime
= range
.getStartTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
).getValue();
395 long windowEndTime
= range
.getEndTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
).getValue();
396 long windowDuration
= windowEndTime
- windowStartTime
;
398 setWindowStartTime(windowStartTime
);
399 setWindowEndTime(windowEndTime
);
400 setWindowDuration(windowDuration
);
406 * Signal handler for handling of the trace range updated signal.
409 * The trace range signal {@link TmfTraceRangeUpdatedSignal}
412 public void traceRangeUpdated(TmfTraceRangeUpdatedSignal signal
) {
414 if (signal
.getTrace() != fTrace
) {
418 TmfTimeRange fullRange
= signal
.getRange();
420 long traceStartTime
= fullRange
.getStartTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
).getValue();
421 long traceEndTime
= fullRange
.getEndTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
).getValue();
423 setStartTime(traceStartTime
);
424 setEndTime(traceEndTime
);
428 * Signal handler for handling of the trace updated signal.
431 * The trace updated signal {@link TmfTraceUpdatedSignal}
434 public void traceUpdated(TmfTraceUpdatedSignal signal
) {
435 if (signal
.getTrace() != fTrace
) {
438 TmfTimeRange fullRange
= signal
.getTrace().getTimeRange();
439 long traceStartTime
= fullRange
.getStartTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
).getValue();
440 long traceEndTime
= fullRange
.getEndTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
).getValue();
442 setStartTime(traceStartTime
);
443 setEndTime(traceEndTime
);