Rename xxx.lttng to xxx.lttng.core
[deliverable/tracecompass.git] / org.eclipse.linuxtools.lttng.ui / src / org / eclipse / linuxtools / lttng / ui / views / timeframe / TimeFrameView.java
CommitLineData
6e512b93 1/*******************************************************************************
8827c197 2 * Copyright (c) 2009 2010 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:
10 * Francois Chouinard - Initial API and implementation
11 *******************************************************************************/
12
13package org.eclipse.linuxtools.lttng.ui.views.timeframe;
14
e31e01e8 15import org.eclipse.linuxtools.lttng.event.LttngEvent;
6e512b93
ASL
16import org.eclipse.linuxtools.tmf.event.TmfTimeRange;
17import org.eclipse.linuxtools.tmf.event.TmfTimestamp;
e31e01e8 18import org.eclipse.linuxtools.tmf.experiment.TmfExperiment;
ff4ed569
FC
19import org.eclipse.linuxtools.tmf.signal.TmfExperimentSelectedSignal;
20import org.eclipse.linuxtools.tmf.signal.TmfExperimentUpdatedSignal;
8827c197 21import org.eclipse.linuxtools.tmf.signal.TmfRangeSynchSignal;
6e512b93
ASL
22import org.eclipse.linuxtools.tmf.signal.TmfSignalHandler;
23import org.eclipse.linuxtools.tmf.signal.TmfTimeSynchSignal;
6d848cce 24import org.eclipse.linuxtools.tmf.ui.views.TmfView;
6e512b93
ASL
25import org.eclipse.swt.SWT;
26import org.eclipse.swt.layout.GridData;
27import org.eclipse.swt.layout.GridLayout;
28import org.eclipse.swt.widgets.Composite;
62d1696a
FC
29import org.eclipse.swt.widgets.Event;
30import org.eclipse.swt.widgets.Listener;
6e512b93
ASL
31import org.eclipse.swt.widgets.Slider;
32
33/**
34 * <b><u>TimeFrameView</u></b>
35 * <p>
12c155f5
FC
36 * The TimeFrameView provides a set of spinners to monitor and set the start time, end time, the current time interval
37 * and current time of the trace set at the nanosecond level.
6e512b93
ASL
38 * <p>
39 * It ensures that the following relations are always true:
40 * <p>
41 * <li>[ startTime >= start time of the trace ]
42 * <li>[ endTime <= end time of the trace ]
43 * <li>[ startTime <= currentTime <= endTime ]
a2e53983 44 * <li>[ interval == (endTime - startTime) ]</li>
6e512b93 45 * <p>
12c155f5 46 * It provides a slider to rapidly set the current time within the time range (i.e. between startTime and endTime).
6e512b93 47 * <p>
12c155f5
FC
48 * Finally, it allows modification of the time range and the current time. This triggers notifications to the other
49 * LTTng views.
6e512b93 50 * <p>
12c155f5
FC
51 * FIXME: The slider is very jumpy due to the large number of async updates FIXME: Revisit the control flow between
52 * View, Spinners and Slider
6e512b93 53 */
12c155f5 54@Deprecated
6d848cce 55public class TimeFrameView extends TmfView {
6e512b93 56
3b38ea61 57 public static final String ID = "org.eclipse.linuxtools.lttng.ui.views.timeframe"; //$NON-NLS-1$
6e512b93 58
a2e53983 59 // ------------------------------------------------------------------------
6e512b93 60 // TimeFrameView
a2e53983 61 // ------------------------------------------------------------------------
6e512b93
ASL
62
63 // The event log timestamp characteristics
8d2e2848 64 private TmfTimestamp fTraceStartTime = new TmfTimestamp();
a2e53983
FC
65 private TmfTimestamp fTraceEndTime = new TmfTimestamp();
66
67 private TmfTimestamp fCurrentTime = new TmfTimestamp();
6e512b93 68
6e512b93 69 private TmfTimeRange fTraceTimeRange = new TmfTimeRange(fTraceStartTime, fTraceEndTime);
a2e53983 70 private TmfTimeRange fTraceSpan = new TmfTimeRange(fTraceStartTime, fTraceEndTime);
6e512b93
ASL
71 private byte fScale = 0;
72
62d1696a 73 // Labels
12c155f5
FC
74 private static final String START_TIME_LABEL = Messages.TimeFrameView_WindowStartTime;
75 private static final String END_TIME_LABEL = Messages.TimeFrameView_WindowEndTime;
76 private static final String TIME_RANGE_LABEL = Messages.TimeFrameView_WindowRange;
a2e53983 77 private static final String CURRENT_TIME_LABEL = Messages.TimeFrameView_CurrentTime;
62d1696a 78
6e512b93
ASL
79 private static final int SLIDER_RANGE = 10000;
80
81 private SpinnerGroup fStartGroup;
82 private SpinnerGroup fEndGroup;
83 private SpinnerGroup fRangeGroup;
84 private SpinnerGroup fCurrentGroup;
85
86 // The slider
87 private Slider fSlider;
88
62d1696a 89 // The current experiment
e31e01e8 90 TmfExperiment<LttngEvent> fExperiment = null;
8827c197 91
a2e53983
FC
92 // notify external listeners may not be needed if the update originated externally
93 private boolean fupdateExternalListeners = true;
6e512b93 94
a2e53983
FC
95 // ------------------------------------------------------------------------
96 // Constructor
97 // ------------------------------------------------------------------------
12c155f5 98
6e512b93
ASL
99 /**
100 * Constructor
101 */
102 public TimeFrameView() {
12c155f5 103 super("TimeFrameView"); //$NON-NLS-1$
6e512b93
ASL
104 }
105
a2e53983
FC
106 /*
107 * (non-Javadoc)
108 *
12c155f5 109 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets .Composite)
6e512b93 110 */
a2e53983
FC
111 @Override
112 public void createPartControl(Composite parent) {
6e512b93 113
12c155f5
FC
114 // Set the view layout
115 GridLayout layout = new GridLayout(4, true);
116 parent.setLayout(layout);
6e512b93 117
12c155f5
FC
118 fStartGroup = new SpinnerGroup(this, parent, START_TIME_LABEL, fTraceTimeRange, fTraceStartTime);
119 fEndGroup = new SpinnerGroup(this, parent, END_TIME_LABEL, fTraceTimeRange, fTraceEndTime);
120 fRangeGroup = new SpinnerGroup(this, parent, TIME_RANGE_LABEL, fTraceTimeRange, fTraceEndTime);
121 fCurrentGroup = new SpinnerGroup(this, parent, CURRENT_TIME_LABEL, fTraceTimeRange, fTraceStartTime);
6e512b93 122
12c155f5
FC
123 // Create the slider
124 createSlider(parent);
6e512b93
ASL
125 }
126
a2e53983
FC
127 /*
128 * (non-Javadoc)
129 *
6e512b93
ASL
130 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
131 */
a2e53983
FC
132 @Override
133 public void setFocus() {
12c155f5 134 // TODO Auto-generated method stub
6e512b93
ASL
135 }
136
a2e53983 137 // ------------------------------------------------------------------------
6e512b93 138 // Operators
a2e53983 139 // ------------------------------------------------------------------------
6e512b93
ASL
140
141 /**
142 * One of the spinners has been updated. Synchronize the other widgets.
143 */
144 public void synchTimeFrameWidgets(SpinnerGroup trigger) {
12c155f5
FC
145 boolean trangeUpdated = false;
146
147 // Collect the data
148 TmfTimestamp startTime = fStartGroup.getCurrentTime();
149 TmfTimestamp endTime = fEndGroup.getCurrentTime();
150 TmfTimestamp timeRange = fRangeGroup.getCurrentTime();
151 TmfTimestamp currentTime = fCurrentGroup.getCurrentTime();
152
153 // If startTime was set beyond endTime, adjust endTime and interval
154 if (trigger == fStartGroup) {
155 if (startTime.compareTo(endTime, false) > 0) {
156 endTime = startTime;
157 trangeUpdated = true;
158 }
159 }
160
161 // If endTime was set beyond startTime, adjust startTime and interval
162 if (trigger == fEndGroup) {
163 if (endTime.compareTo(startTime, false) < 0) {
164 startTime = endTime;
165 trangeUpdated = true;
166 }
167 }
168
169 // If timeRange was set, adjust endTime
170 if (trigger == fRangeGroup) {
171 long start = startTime.getValue();
172 long span = timeRange.getValue();
173 TmfTimestamp ts = new TmfTimestamp(start + span, startTime.getScale(), 0);
174 if (ts.compareTo(fTraceEndTime, false) > 0) {
175 ts = fTraceEndTime.synchronize(fTraceEndTime.getValue(), startTime.getScale());
176 }
177 endTime = ts;
178 trangeUpdated = true;
179 }
180
181 // Compute the new time range
182 TmfTimeRange subrange = new TmfTimeRange(startTime, endTime);
183 byte scale = startTime.getScale();
184 TmfTimestamp interval = new TmfTimestamp(startTime.getAdjustment(endTime, scale), scale, 0);
185
186 // Update the spinner groups
187 fStartGroup.setContent(fTraceTimeRange, startTime);
188 fEndGroup.setContent(fTraceTimeRange, endTime);
189 fRangeGroup.setContent(fTraceSpan, interval);
190 fCurrentGroup.setContent(subrange, currentTime);
191
192 updateSlider(subrange, currentTime);
193 // Notify other views, only if the update originated from this view
194 if (fupdateExternalListeners) {
195 if (!fCurrentTime.equals(currentTime)) {
196 fCurrentTime = currentTime;
197 broadcast(new TmfTimeSynchSignal(this, currentTime));
198 }
199
200 // Notify the views if the time range has been impacted
201 if (trangeUpdated) {
202 TmfTimeRange trange = new TmfTimeRange(startTime, endTime);
203 broadcast(new TmfRangeSynchSignal(this, trange, currentTime));
204 }
205 }
6e512b93
ASL
206 }
207
a2e53983 208 // ------------------------------------------------------------------------
6e512b93 209 // Slider Handling
a2e53983 210 // ------------------------------------------------------------------------
6e512b93
ASL
211
212 /**
213 * @param parent
214 */
215 private void createSlider(Composite parent) {
12c155f5
FC
216 fSlider = new Slider(parent, SWT.SMOOTH | SWT.FILL);
217 fSlider.setMinimum(0);
218 fSlider.setMaximum(SLIDER_RANGE + fSlider.getThumb());
219 fSlider.setIncrement(SLIDER_RANGE / 100);
220 fSlider.setPageIncrement(SLIDER_RANGE / 10);
221 fSlider.setSelection(0);
222
223 GridData gridData = new GridData(SWT.LEFT, SWT.TOP, true, false);
224 gridData.horizontalAlignment = SWT.FILL;
225 gridData.horizontalSpan = 4;
226 fSlider.setLayoutData(gridData);
227
228 fSlider.addListener(SWT.Selection, new Listener() {
229 @Override
230 public void handleEvent(Event event) {
231 int ratio = fSlider.getSelection();
232 TmfTimestamp span = fCurrentGroup.getSpan();
233 long value = span.getValue() * ratio / SLIDER_RANGE;
234 TmfTimestamp start = fCurrentGroup.getStartTime();
235 TmfTimestamp current = new TmfTimestamp(start.getValue() + value, start.getScale(), 0);
236 fCurrentGroup.setValue(current);
237 }
238 });
bf5aa8e4 239
6e512b93
ASL
240 }
241
242 /**
243 * @param range
8d2e2848 244 * @param timestamp
6e512b93 245 */
8d2e2848 246 private void updateSlider(TmfTimeRange range, TmfTimestamp timestamp) {
6e512b93 247
12c155f5
FC
248 // Ignore update if disposed
249 if (fSlider.isDisposed())
250 return;
251
252 // Determine the new relative position
253 byte scale = range.getEndTime().getScale();
254 long total = range.getStartTime().getAdjustment(range.getEndTime(), scale);
255 long relative = range.getStartTime().getAdjustment(timestamp, scale);
256
257 // Set the slider value
258 final long position = (total > 0) ? (relative * SLIDER_RANGE / total) : 0;
259
260 // Update the slider on the UI thread
261 long current = fSlider.getSelection();
262 if (position != current) {
263 fSlider.getDisplay().asyncExec(new Runnable() {
264 @Override
265 public void run() {
266 fSlider.setSelection((int) position);
267 }
268 });
269 }
8b29a712
FC
270 }
271
a2e53983
FC
272 /*
273 * (non-Javadoc)
274 *
275 * @see java.lang.Object#toString()
276 */
277 @Override
278 @SuppressWarnings("nls")
279 public String toString() {
12c155f5 280 return "[TimeFrameView]";
a2e53983 281 }
8d2e2848 282
a2e53983
FC
283 // ------------------------------------------------------------------------
284 // Signal Handling
285 // ------------------------------------------------------------------------
6e512b93 286
a2e53983 287 /**
6e512b93
ASL
288 * @param signal
289 */
09acd610 290 @SuppressWarnings("unchecked")
6e512b93 291 @TmfSignalHandler
951d134a 292 public void experimentSelected(TmfExperimentSelectedSignal<LttngEvent> signal) {
6e512b93 293
12c155f5
FC
294 // Update the trace reference
295 fExperiment = (TmfExperiment<LttngEvent>) signal.getExperiment();
6e512b93 296
12c155f5
FC
297 // Update the time frame
298 fTraceTimeRange = fExperiment.getTimeRange();
299 fTraceStartTime = fTraceTimeRange.getStartTime();
300 fTraceEndTime = fTraceTimeRange.getEndTime();
301 fScale = fTraceStartTime.getScale();
6e512b93 302
12c155f5
FC
303 // Update the widgets
304 fStartGroup.setContent(fTraceTimeRange, fTraceStartTime);
305 fEndGroup.setContent(fTraceTimeRange, fTraceEndTime);
306 fCurrentGroup.setContent(fTraceTimeRange, fTraceStartTime);
6e512b93 307
12c155f5 308 fCurrentTime = fTraceStartTime;
6e512b93 309
12c155f5
FC
310 TmfTimestamp delta = new TmfTimestamp(fTraceStartTime.getAdjustment(fTraceEndTime, fScale), fScale, 0);
311 fTraceSpan = new TmfTimeRange(new TmfTimestamp(0, fScale, 0), delta);
312 // fRangeGroup.setContent(fTraceSpan, delta);
313 TmfTimestamp start = new TmfTimestamp(1, (byte) -1, 0);
314 fRangeGroup.setContent(fTraceSpan, start);
6e512b93
ASL
315 }
316
317 /**
318 * @param signal
319 */
320 @TmfSignalHandler
6d848cce 321 public void experimentUpdated(TmfExperimentUpdatedSignal signal) {
6e512b93 322
12c155f5
FC
323 // Update the time frame
324 // fTraceTimeRange = signal.getTrace().getTimeRange();
325 fTraceTimeRange = signal.getExperiment().getTimeRange();
326 fTraceStartTime = fTraceTimeRange.getStartTime();
327 fTraceEndTime = fTraceTimeRange.getEndTime();
328 fScale = fTraceStartTime.getScale();
329
330 // Update the widgets
331 fStartGroup.setContent(fTraceTimeRange, fStartGroup.getCurrentTime());
332 fEndGroup.setContent(fTraceTimeRange, fTraceEndTime);
333 fCurrentGroup.setContent(fTraceTimeRange, fCurrentGroup.getCurrentTime());
334
335 TmfTimestamp delta = new TmfTimestamp(fTraceStartTime.getAdjustment(fTraceEndTime, fScale), fScale, 0);
336 fTraceSpan = new TmfTimeRange(new TmfTimestamp(0, fScale, 0), delta);
337 fRangeGroup.setContent(fTraceSpan, delta);
6e512b93
ASL
338 }
339
a2e53983
FC
340 /**
341 * @param signal
342 */
343 @TmfSignalHandler
344 public void currentTimeRangeUpdated(TmfRangeSynchSignal signal) {
12c155f5
FC
345 if (signal.getSource() != this) {
346 // Update the time frame
347 TmfTimeRange selTimeRange = signal.getCurrentRange();
348 TmfTimestamp selStart = selTimeRange.getStartTime().synchronize(0, fScale);
349 TmfTimestamp selEnd = selTimeRange.getEndTime().synchronize(0, fScale);
a2e53983 350
12c155f5
FC
351 fupdateExternalListeners = false;
352 // Update the widgets and prevent broadcast notifications to
353 // the views which have been notified already.
354 {
355 fStartGroup.setContent(fTraceTimeRange, selStart);
356 fEndGroup.setContent(fTraceTimeRange, selEnd);
a2e53983 357
12c155f5 358 TmfTimestamp delta = new TmfTimestamp(selStart.getAdjustment(selEnd, fScale), fScale, 0);
a2e53983 359
12c155f5
FC
360 fRangeGroup.setContent(fTraceSpan, delta);
361 }
a2e53983 362
12c155f5
FC
363 // restore the external notification flag
364 fupdateExternalListeners = true;
8827c197 365
12c155f5 366 }
a2e53983 367 }
8827c197 368
6e512b93
ASL
369 /**
370 * @param signal
371 */
372 @TmfSignalHandler
373 public void currentTimeUpdated(TmfTimeSynchSignal signal) {
12c155f5
FC
374 if (signal.getSource() != this) {
375 // prevent loop to external notifications
376 fupdateExternalListeners = false;
377 fCurrentTime = signal.getCurrentTime().synchronize(0, fStartGroup.getCurrentTime().getScale());
378 if (fStartGroup.getCurrentTime().compareTo(fCurrentTime, false) > 0) {
379 fStartGroup.setContent(new TmfTimeRange(fCurrentTime, fEndGroup.getCurrentTime()), fCurrentTime);
380 }
381 if (fEndGroup.getCurrentTime().compareTo(fCurrentTime, false) < 0) {
382 fEndGroup.setContent(new TmfTimeRange(fStartGroup.getCurrentTime(), fCurrentTime), fCurrentTime);
383 }
384 fCurrentGroup.setContent(null, fCurrentTime);
385 updateSlider(fCurrentGroup.getTimeRange(), fCurrentTime);
386
387 // Enable external notifications
388 fupdateExternalListeners = true;
389 }
6e512b93
ASL
390 }
391
bf5aa8e4 392}
This page took 0.051021 seconds and 5 git commands to generate.