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