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
.TmfRangeSynchSignal
;
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
.TmfTimeSynchSignal
;
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
.TmfTraceManager
;
33 * Abstract class that extends {@link TmfViewer} that adds methods to
34 * synchronize with a trace's time information.
36 * This class will be extended by viewers who require time information to update
40 * It provides three times of data:
41 * - start and end time of the trace (available)
42 * - start, end and duration of the current time window, ie the visible time range
43 * - start and end of the time range selected
46 * @author Bernd Hufmann
47 * @author Geneviève Bastien
49 public abstract class TmfTimeViewer
extends TmfViewer
implements ITmfTimeProvider
{
51 /** Start time of trace */
52 private long fStartTime
;
53 /** End time of trace */
54 private long fEndTime
;
55 /** Start time of current time range */
56 private long fWindowStartTime
;
57 /** End time of current time range */
58 private long fWindowEndTime
;
59 /** Duration of current time range */
60 private long fWindowDuration
;
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);
71 * Default constructor.
73 public TmfTimeViewer() {
78 * Constructor that initializes the parent of the viewer
81 * The parent composite that holds this viewer
83 public TmfTimeViewer(Composite parent
) {
84 this(parent
, ""); //$NON-NLS-1$
88 * Constructor that initializes the parent of the viewer and that sets the
92 * The parent composite that holds this viewer
94 * The name of the viewer
96 public TmfTimeViewer(Composite parent
, String name
) {
100 // ------------------------------------------------------------------------
102 // ------------------------------------------------------------------------
105 * Sets the start time of the trace
108 * The start time to set
110 protected void setStartTime(long startTime
) {
111 fStartTime
= startTime
;
115 * Sets the end time of the trace
118 * The start time to set
120 protected void setEndTime(long endTime
) {
125 * Sets the start time of the current time range window (visible range)
127 * @param windowStartTime
128 * The start time to set
130 protected void setWindowStartTime(long windowStartTime
) {
131 fWindowStartTime
= windowStartTime
;
135 * Sets the end time of the current time range window (visible range)
137 * @param windowEndTime
138 * The start time to set
140 protected void setWindowEndTime(long windowEndTime
) {
141 fWindowEndTime
= windowEndTime
;
145 * Sets the duration of the current time range window (visible range)
147 * @param windowDuration
148 * The window duration
150 protected void setWindowDuration(long windowDuration
) {
151 fWindowDuration
= windowDuration
;
155 * Sets the begin time of the selected range.
157 * @param selectionBeginTime
158 * The begin time to set
160 protected void setSelectionBeginTime(long selectionBeginTime
) {
161 fSelectionBeginTime
= selectionBeginTime
;
165 * Sets the end time of the selected range.
167 * @param selectionEndTime
168 * The end time to set
170 protected void setSelectionEndTime(long selectionEndTime
) {
171 fSelectionEndTime
= selectionEndTime
;
175 * Sets the trace that is displayed by this viewer.
180 protected void setTrace(ITmfTrace trace
) {
185 * Gets the trace that is displayed by this viewer.
189 protected ITmfTrace
getTrace() {
193 // ------------------------------------------------------------------------
195 // ------------------------------------------------------------------------
198 public long getStartTime() {
203 public long getEndTime() {
208 public long getWindowStartTime() {
209 return fWindowStartTime
;
213 public long getWindowEndTime() {
214 return fWindowEndTime
;
218 public long getWindowDuration() {
219 return fWindowDuration
;
223 public long getSelectionBeginTime() {
224 return fSelectionBeginTime
;
228 public long getSelectionEndTime() {
229 return fSelectionEndTime
;
233 public void updateSelectionRange(final long currentBeginTime
, final long currentEndTime
) {
234 if (fTrace
!= null) {
235 setSelectionBeginTime(currentBeginTime
);
236 setSelectionEndTime(currentEndTime
);
238 final ITmfTimestamp startTimestamp
= new TmfTimestamp(getSelectionBeginTime(), ITmfTimestamp
.NANOSECOND_SCALE
);
239 final ITmfTimestamp endTimestamp
= new TmfTimestamp(getSelectionEndTime(), ITmfTimestamp
.NANOSECOND_SCALE
);
241 TmfTimeSynchSignal signal
= new TmfTimeSynchSignal(this, startTimestamp
, endTimestamp
);
247 public void updateWindow(long windowStartTime
, long windowEndTime
) {
249 setWindowStartTime(windowStartTime
);
250 setWindowEndTime(windowEndTime
);
251 setWindowDuration(windowEndTime
- windowStartTime
);
253 // Build the new time range; keep the current time
254 TmfTimeRange timeRange
= new TmfTimeRange(
255 new TmfTimestamp(getWindowStartTime(), ITmfTimestamp
.NANOSECOND_SCALE
),
256 new TmfTimestamp(getWindowEndTime(), ITmfTimestamp
.NANOSECOND_SCALE
));
259 TmfRangeSynchSignal signal
= new TmfRangeSynchSignal(this, timeRange
);
260 fTimeRangeSyncThrottle
.queue(signal
);
263 // ------------------------------------------------------------------------
265 // ------------------------------------------------------------------------
267 * A Method to load a trace into the viewer.
270 * A trace to apply in the viewer
272 public void loadTrace(ITmfTrace trace
) {
275 long timestamp
= TmfTraceManager
.getInstance().getSelectionBeginTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
).getValue();
276 TmfTimeRange currentRange
= TmfTraceManager
.getInstance().getCurrentRange();
277 long windowStartTime
= currentRange
.getStartTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
).getValue();
278 long windowEndTime
= currentRange
.getEndTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
).getValue();
279 long windowDuration
= windowEndTime
- windowStartTime
;
280 long startTime
= fTrace
.getStartTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
).getValue();
281 long endTime
= fTrace
.getEndTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
).getValue();
283 setSelectionBeginTime(timestamp
);
284 setSelectionEndTime(timestamp
);
285 setStartTime(startTime
);
286 setWindowStartTime(windowStartTime
);
287 setWindowEndTime(windowEndTime
);
288 setWindowDuration(windowDuration
);
293 * Resets the content of the viewer
295 public void reset() {
296 // Reset the internal data
297 setSelectionBeginTime(0);
298 setSelectionEndTime(0);
300 setWindowStartTime(0);
301 setWindowDuration(0);
307 // ------------------------------------------------------------------------
309 // ------------------------------------------------------------------------
312 * Signal handler for handling of the trace opened signal.
315 * The trace opened signal {@link TmfTraceOpenedSignal}
318 public void traceOpened(TmfTraceOpenedSignal signal
) {
319 fTrace
= signal
.getTrace();
320 loadTrace(getTrace());
324 * Signal handler for handling of the trace selected signal.
327 * The trace selected signal {@link TmfTraceSelectedSignal}
330 public void traceSelected(TmfTraceSelectedSignal signal
) {
331 if (fTrace
!= signal
.getTrace()) {
332 fTrace
= signal
.getTrace();
333 loadTrace(getTrace());
338 * Signal handler for handling of the trace closed signal.
341 * The trace closed signal {@link TmfTraceClosedSignal}
344 public void traceClosed(TmfTraceClosedSignal signal
) {
346 if (signal
.getTrace() != fTrace
) {
350 // Reset the internal data
356 * Signal handler for handling of the time synch signal, ie the selected range.
359 * The time synch signal {@link TmfTimeSynchSignal}
362 public void selectionRangeUpdated(TmfTimeSynchSignal signal
) {
363 if ((signal
.getSource() != this) && (fTrace
!= null)) {
364 ITmfTimestamp selectedTime
= signal
.getBeginTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
);
365 ITmfTimestamp selectedEndTime
= signal
.getEndTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
);
366 setSelectionBeginTime(selectedTime
.getValue());
367 setSelectionEndTime(selectedEndTime
.getValue());
372 * Signal handler for handling of the time range synch signal, ie the visible range.
375 * The time range synch signal {@link TmfRangeSynchSignal}
378 public void timeRangeUpdated(TmfRangeSynchSignal signal
) {
380 if (fTrace
!= null) {
381 // Validate the time range
382 TmfTimeRange range
= signal
.getCurrentRange().getIntersection(fTrace
.getTimeRange());
387 if (signal
.getSource() != this) {
388 // Update the time range
389 long windowStartTime
= range
.getStartTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
).getValue();
390 long windowEndTime
= range
.getEndTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
).getValue();
391 long windowDuration
= windowEndTime
- windowStartTime
;
393 setWindowStartTime(windowStartTime
);
394 setWindowEndTime(windowEndTime
);
395 setWindowDuration(windowDuration
);
401 * Signal handler for handling of the trace range updated signal.
404 * The trace range signal {@link TmfTraceRangeUpdatedSignal}
407 public void traceRangeUpdated(TmfTraceRangeUpdatedSignal signal
) {
409 if (signal
.getTrace() != fTrace
) {
413 TmfTimeRange fullRange
= signal
.getRange();
415 long traceStartTime
= fullRange
.getStartTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
).getValue();
416 long traceEndTime
= fullRange
.getEndTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
).getValue();
418 setStartTime(traceStartTime
);
419 setEndTime(traceEndTime
);
423 * Signal handler for handling of the trace updated signal.
426 * The trace updated signal {@link TmfTraceUpdatedSignal}
429 public void traceUpdated(TmfTraceUpdatedSignal signal
) {
430 if (signal
.getTrace() != fTrace
) {
433 TmfTimeRange fullRange
= signal
.getTrace().getTimeRange();
434 long traceStartTime
= fullRange
.getStartTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
).getValue();
435 long traceEndTime
= fullRange
.getEndTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
).getValue();
437 setStartTime(traceStartTime
);
438 setEndTime(traceEndTime
);