ss: Move plugins to Trace Compass namespace
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.ui / src / org / eclipse / linuxtools / tmf / ui / views / histogram / FullTraceHistogram.java
CommitLineData
c392540b 1/*******************************************************************************
11252342 2 * Copyright (c) 2011, 2013 Ericsson
bfe038ff 3 *
c392540b
FC
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
bfe038ff 8 *
c392540b
FC
9 * Contributors:
10 * Francois Chouinard - Initial API and implementation
fbd124dd 11 * Bernd Hufmann - Changed to updated histogram data model
65cdf787 12 * Patrick Tasse - Update for mouse wheel zoom
c392540b
FC
13 *******************************************************************************/
14
e0752744 15package org.eclipse.linuxtools.tmf.ui.views.histogram;
c392540b
FC
16
17import org.eclipse.swt.SWT;
18import org.eclipse.swt.events.MouseEvent;
c392540b 19import org.eclipse.swt.events.PaintEvent;
c392540b
FC
20import org.eclipse.swt.graphics.GC;
21import org.eclipse.swt.graphics.Image;
22import org.eclipse.swt.widgets.Composite;
c392540b
FC
23
24/**
d26274e7 25 * A histogram widget that displays the event distribution of a whole trace.
c392540b
FC
26 * <p>
27 * It also features a selected range window that can be dragged and zoomed.
f8177ba2
FC
28 *
29 * @version 1.1
b544077e 30 * @author Francois Chouinard
c392540b 31 */
f888477a 32public class FullTraceHistogram extends Histogram {
c392540b 33
c392540b
FC
34 // ------------------------------------------------------------------------
35 // Attributes
36 // ------------------------------------------------------------------------
37
38 private final HistogramZoom fZoom;
39
f8177ba2 40 private long fRangeStartTime = 0L;
c392540b
FC
41 private long fRangeDuration;
42
43 // ------------------------------------------------------------------------
44 // Construction
45 // ------------------------------------------------------------------------
46
b544077e 47 /**
f8177ba2
FC
48 * Full Constructor
49 *
50 * @param view A reference to the parent histogram view
b544077e
BH
51 * @param parent A reference to the parent composite
52 */
c392540b
FC
53 public FullTraceHistogram(HistogramView view, Composite parent) {
54 super(view, parent);
65cdf787 55 fZoom = new HistogramZoom(this, getStartTime(), getTimeLimit());
c392540b
FC
56 }
57
58 @Override
59 public void dispose() {
c392540b
FC
60 super.dispose();
61 }
62
63 // ------------------------------------------------------------------------
64 // Operations
65 // ------------------------------------------------------------------------
66
1be49d83
PT
67 @Override
68 public void clear() {
69 fRangeStartTime = 0L;
70 fRangeDuration = 0L;
71 if (fZoom != null) {
72 fZoom.setFullRange(0L, 0L);
73 fZoom.setNewRange(0L, 0L);
1be49d83
PT
74 }
75 super.clear();
76 }
77
b544077e 78 /**
f8177ba2
FC
79 * Sets the time range of the full histogram.
80 *
b544077e
BH
81 * @param startTime A start time
82 * @param endTime A end time
83 */
6a13fa07
FC
84 public void setFullRange(long startTime, long endTime) {
85 fZoom.setFullRange(startTime, endTime);
80c930fa 86 fZoom.setNewRange(fRangeStartTime, fRangeDuration);
6a13fa07
FC
87 }
88
b544077e
BH
89 /**
90 * Sets the selected time range.
f8177ba2
FC
91 *
92 * @param startTime The histogram start time
93 * @param duration The histogram duration
b544077e 94 */
c392540b
FC
95 public void setTimeRange(long startTime, long duration) {
96 fRangeStartTime = startTime;
97 fRangeDuration = duration;
c392540b 98 fZoom.setNewRange(fRangeStartTime, fRangeDuration);
fbd124dd 99 fDataModel.complete();
c392540b
FC
100 }
101
c392540b
FC
102 // ------------------------------------------------------------------------
103 // MouseListener
104 // ------------------------------------------------------------------------
105
80c930fa 106 private int fStartDelta;
f888477a 107 private boolean fMouseMoved;
c392540b
FC
108
109 @Override
110 public void mouseDown(MouseEvent event) {
31d6440d 111 if (fScaledData != null && fDragState == DRAG_NONE && fDataModel.getStartTime() < fDataModel.getEndTime()) {
79d60771
PT
112 if (event.button == 2 || (event.button == 1 && (event.stateMask & SWT.MODIFIER_MASK) == SWT.CTRL)) {
113 fDragState = DRAG_RANGE;
114 fDragButton = event.button;
80c930fa
PT
115 int center = (int) (((fRangeStartTime + fRangeDuration / 2) - fScaledData.fFirstBucketTime) / fScaledData.fBucketDuration);
116 fStartDelta = center - event.x;
79d60771
PT
117 fMouseMoved = false;
118 return;
119 } else if (event.button == 3) {
120 fDragState = DRAG_ZOOM;
121 fDragButton = event.button;
122 long time = Math.min(getTimestamp(event.x), getEndTime());
123 if ((event.stateMask & SWT.MODIFIER_MASK) == SWT.SHIFT) {
124 if (time < fRangeStartTime + fRangeDuration / 2) {
125 fRangeStartTime = fRangeStartTime + fRangeDuration;
126 }
127 } else {
128 fRangeStartTime = time;
129 }
130 fRangeDuration = time - fRangeStartTime;
131 fCanvas.redraw();
132 return;
133 }
f888477a
PT
134 }
135 super.mouseDown(event);
c392540b 136 }
f8177ba2 137
c392540b
FC
138 @Override
139 public void mouseUp(MouseEvent event) {
f888477a
PT
140 if (fDragState == DRAG_RANGE && event.button == fDragButton) {
141 fDragState = DRAG_NONE;
142 fDragButton = 0;
143 if (!fMouseMoved) {
144 // if single click without move, center on the click
145 long startTime = getTimestamp(event.x) - fRangeDuration / 2;
146 fRangeStartTime = Math.max(getStartTime(), Math.min(getEndTime() - fRangeDuration, startTime));
1c467552 147 }
13ccc36b 148 ((HistogramView) fParentView).updateTimeRange(fRangeStartTime, fRangeStartTime + fRangeDuration);
f888477a 149 return;
79d60771
PT
150 } else if (fDragState == DRAG_ZOOM && event.button == fDragButton) {
151 fDragState = DRAG_NONE;
152 fDragButton = 0;
153 if (fRangeDuration < 0) {
154 fRangeStartTime = fRangeStartTime + fRangeDuration;
155 fRangeDuration = -fRangeDuration;
156 }
157 if (fRangeDuration > 0) {
158 ((HistogramView) fParentView).updateTimeRange(fRangeStartTime, fRangeStartTime + fRangeDuration);
159 } else {
160 fRangeStartTime = fZoom.getStartTime();
161 fRangeDuration = fZoom.getDuration();
162 fCanvas.redraw();
163 }
164 return;
c392540b 165 }
f888477a 166 super.mouseUp(event);
c392540b 167 }
f8177ba2 168
c392540b
FC
169 // ------------------------------------------------------------------------
170 // MouseMoveListener
171 // ------------------------------------------------------------------------
172
173 @Override
174 public void mouseMove(MouseEvent event) {
f888477a 175 if (fDragState == DRAG_RANGE) {
80c930fa
PT
176 int center = event.x + fStartDelta;
177 long newStart = getTimestamp(center) - fRangeDuration / 2;
178 fRangeStartTime = Math.max(getStartTime(), Math.min(getEndTime() - fRangeDuration, newStart));
f888477a
PT
179 fCanvas.redraw();
180 fMouseMoved = true;
181 return;
79d60771
PT
182 } else if (fDragState == DRAG_ZOOM) {
183 long endTime = Math.max(getStartTime(), Math.min(getEndTime(), getTimestamp(event.x)));
184 fRangeDuration = endTime - fRangeStartTime;
185 fCanvas.redraw();
186 return;
c392540b 187 }
f888477a 188 super.mouseMove(event);
c392540b
FC
189 }
190
191 // ------------------------------------------------------------------------
192 // PaintListener
193 // ------------------------------------------------------------------------
194
195 @Override
196 public void paintControl(PaintEvent event) {
197 super.paintControl(event);
198
199 Image image = (Image) fCanvas.getData(IMAGE_KEY);
200 assert image != null;
201
202 Image rangeRectangleImage = new Image(image.getDevice(), image, SWT.IMAGE_COPY);
203 GC rangeWindowGC = new GC(rangeRectangleImage);
204
79d60771
PT
205 if ((fScaledData != null) && (fRangeDuration != 0 || fDragState == DRAG_ZOOM)) {
206 drawTimeRangeWindow(rangeWindowGC, fRangeStartTime, fRangeDuration);
c392540b
FC
207 }
208
209 // Draws the buffer image onto the canvas.
210 event.gc.drawImage(rangeRectangleImage, 0, 0);
211
212 rangeWindowGC.dispose();
213 rangeRectangleImage.dispose();
214 }
215
65cdf787
PT
216 /**
217 * Get the histogram zoom
218 * @return the histogram zoom
219 * @since 2.0
220 */
221 public HistogramZoom getZoom() {
222 return fZoom;
223 }
c392540b 224}
This page took 0.06675 seconds and 5 git commands to generate.