tmf: Fix NullPointerExeptions in Histogram view
[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
PT
55 fZoom = new HistogramZoom(this, getStartTime(), getTimeLimit());
56 addMouseWheelListener(fZoom);
c392540b
FC
57 }
58
59 @Override
60 public void dispose() {
c392540b
FC
61 super.dispose();
62 }
63
64 // ------------------------------------------------------------------------
65 // Operations
66 // ------------------------------------------------------------------------
67
1be49d83
PT
68 @Override
69 public void clear() {
70 fRangeStartTime = 0L;
71 fRangeDuration = 0L;
72 if (fZoom != null) {
73 fZoom.setFullRange(0L, 0L);
74 fZoom.setNewRange(0L, 0L);
1be49d83
PT
75 }
76 super.clear();
77 }
78
b544077e 79 /**
f8177ba2
FC
80 * Sets the time range of the full histogram.
81 *
b544077e
BH
82 * @param startTime A start time
83 * @param endTime A end time
84 */
6a13fa07
FC
85 public void setFullRange(long startTime, long endTime) {
86 fZoom.setFullRange(startTime, endTime);
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
c392540b 106 private int fStartPosition;
f888477a 107 private boolean fMouseMoved;
c392540b
FC
108
109 @Override
110 public void mouseDown(MouseEvent event) {
647640df 111 if (fScaledData != null && fDragState == DRAG_NONE && fDataModel.getNbEvents() != 0) {
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;
115 fStartPosition = event.x;
116 fMouseMoved = false;
117 return;
118 } else if (event.button == 3) {
119 fDragState = DRAG_ZOOM;
120 fDragButton = event.button;
121 long time = Math.min(getTimestamp(event.x), getEndTime());
122 if ((event.stateMask & SWT.MODIFIER_MASK) == SWT.SHIFT) {
123 if (time < fRangeStartTime + fRangeDuration / 2) {
124 fRangeStartTime = fRangeStartTime + fRangeDuration;
125 }
126 } else {
127 fRangeStartTime = time;
128 }
129 fRangeDuration = time - fRangeStartTime;
130 fCanvas.redraw();
131 return;
132 }
f888477a
PT
133 }
134 super.mouseDown(event);
c392540b 135 }
f8177ba2 136
c392540b
FC
137 @Override
138 public void mouseUp(MouseEvent event) {
f888477a
PT
139 if (fDragState == DRAG_RANGE && event.button == fDragButton) {
140 fDragState = DRAG_NONE;
141 fDragButton = 0;
142 if (!fMouseMoved) {
143 // if single click without move, center on the click
144 long startTime = getTimestamp(event.x) - fRangeDuration / 2;
145 fRangeStartTime = Math.max(getStartTime(), Math.min(getEndTime() - fRangeDuration, startTime));
1c467552 146 }
13ccc36b 147 ((HistogramView) fParentView).updateTimeRange(fRangeStartTime, fRangeStartTime + fRangeDuration);
f888477a 148 return;
79d60771
PT
149 } else if (fDragState == DRAG_ZOOM && event.button == fDragButton) {
150 fDragState = DRAG_NONE;
151 fDragButton = 0;
152 if (fRangeDuration < 0) {
153 fRangeStartTime = fRangeStartTime + fRangeDuration;
154 fRangeDuration = -fRangeDuration;
155 }
156 if (fRangeDuration > 0) {
157 ((HistogramView) fParentView).updateTimeRange(fRangeStartTime, fRangeStartTime + fRangeDuration);
158 } else {
159 fRangeStartTime = fZoom.getStartTime();
160 fRangeDuration = fZoom.getDuration();
161 fCanvas.redraw();
162 }
163 return;
c392540b 164 }
f888477a 165 super.mouseUp(event);
c392540b 166 }
f8177ba2 167
c392540b
FC
168 // ------------------------------------------------------------------------
169 // MouseMoveListener
170 // ------------------------------------------------------------------------
171
172 @Override
173 public void mouseMove(MouseEvent event) {
f888477a 174 if (fDragState == DRAG_RANGE) {
c392540b
FC
175 int nbBuckets = event.x - fStartPosition;
176 long delta = nbBuckets * fScaledData.fBucketDuration;
177 long newStart = fZoom.getStartTime() + delta;
bfe038ff 178 if (newStart < getStartTime()) {
c392540b 179 newStart = getStartTime();
bfe038ff 180 }
c392540b
FC
181 long newEnd = newStart + fZoom.getDuration();
182 if (newEnd > getEndTime()) {
183 newEnd = getEndTime();
184 newStart = newEnd - fZoom.getDuration();
185 }
186 fRangeStartTime = newStart;
f888477a
PT
187 fCanvas.redraw();
188 fMouseMoved = true;
189 return;
79d60771
PT
190 } else if (fDragState == DRAG_ZOOM) {
191 long endTime = Math.max(getStartTime(), Math.min(getEndTime(), getTimestamp(event.x)));
192 fRangeDuration = endTime - fRangeStartTime;
193 fCanvas.redraw();
194 return;
c392540b 195 }
f888477a 196 super.mouseMove(event);
c392540b
FC
197 }
198
199 // ------------------------------------------------------------------------
200 // PaintListener
201 // ------------------------------------------------------------------------
202
203 @Override
204 public void paintControl(PaintEvent event) {
205 super.paintControl(event);
206
207 Image image = (Image) fCanvas.getData(IMAGE_KEY);
208 assert image != null;
209
210 Image rangeRectangleImage = new Image(image.getDevice(), image, SWT.IMAGE_COPY);
211 GC rangeWindowGC = new GC(rangeRectangleImage);
212
79d60771
PT
213 if ((fScaledData != null) && (fRangeDuration != 0 || fDragState == DRAG_ZOOM)) {
214 drawTimeRangeWindow(rangeWindowGC, fRangeStartTime, fRangeDuration);
c392540b
FC
215 }
216
217 // Draws the buffer image onto the canvas.
218 event.gc.drawImage(rangeRectangleImage, 0, 0);
219
220 rangeWindowGC.dispose();
221 rangeRectangleImage.dispose();
222 }
223
65cdf787
PT
224 /**
225 * Get the histogram zoom
226 * @return the histogram zoom
227 * @since 2.0
228 */
229 public HistogramZoom getZoom() {
230 return fZoom;
231 }
c392540b 232}
This page took 0.051894 seconds and 5 git commands to generate.