*/
protected int fDragButton = 0;
+ /**
+ * The bucket display offset
+ */
+ private int fOffset = 0;
+
// ------------------------------------------------------------------------
// Construction
// ------------------------------------------------------------------------
public synchronized long getTimestamp(final int offset) {
assert offset > 0 && offset < fScaledData.fWidth;
try {
- return fDataModel.getFirstBucketTime() + fScaledData.fBucketDuration * offset;
+ return fScaledData.fFirstBucketTime + fScaledData.fBucketDuration * offset;
} catch (final Exception e) {
return 0; // TODO: Fix that racing condition (NPE)
}
return (int) ((timestamp - fDataModel.getFirstBucketTime()) / fScaledData.fBucketDuration);
}
+ /**
+ * Set the bucket display offset
+ *
+ * @param offset
+ * the bucket display offset
+ * @since 2.2
+ */
+ protected void setOffset(final int offset) {
+ fOffset = offset;
+ }
+
/**
* Move the currently selected bar cursor to a non-empty bucket.
*
for (int i = 0; i < limit; i++) {
imageGC.setForeground(fHistoBarColor);
final int value = (int) Math.ceil(scaledData.fData[i] * factor);
- imageGC.drawLine(i, height - value, i, height);
+ int x = i + fOffset;
+ imageGC.drawLine(x, height - value, x, height);
if (!HistogramScaledData.hideLostEvents) {
imageGC.setForeground(fLostEventColor);
if (lostEventValue != 0) {
if (lostEventValue == 1) {
// in linux, a line from x to x is not drawn, in windows it is.
- imageGC.drawPoint(i, height - value - 1);
+ imageGC.drawPoint(x, height - value - 1);
} else {
// drawing a line is inclusive, so we need to remove 1 from the destination to have the correct length
- imageGC.drawLine(i, height - value - lostEventValue, i, height - value - 1);
+ imageGC.drawLine(x, height - value - lostEventValue, x, height - value - 1);
}
}
}
imageGC.setAlpha(100);
imageGC.setForeground(fSelectionForegroundColor);
imageGC.setBackground(fSelectionBackgroundColor);
- final int beginBucket = scaledData.fSelectionBeginBucket;
+ final int beginBucket = scaledData.fSelectionBeginBucket + fOffset;
if (beginBucket >= 0 && beginBucket < limit) {
imageGC.drawLine(beginBucket, 0, beginBucket, height);
}
- final int endBucket = scaledData.fSelectionEndBucket;
+ final int endBucket = scaledData.fSelectionEndBucket + fOffset;
if (endBucket >= 0 && endBucket < limit && endBucket != beginBucket) {
imageGC.drawLine(endBucket, 0, endBucket, height);
}
@Override
public void mouseHover(final MouseEvent event) {
- if (fDataModel.getNbEvents() > 0 && fScaledData != null && fScaledData.fLastBucket >= event.x) {
- final String tooltip = formatToolTipLabel(event.x);
- fCanvas.setToolTipText(tooltip);
- } else {
- fCanvas.setToolTipText(null);
+ if (fDataModel.getNbEvents() > 0 && fScaledData != null) {
+ int delimiterIndex = (int) ((fDataModel.getEndTime() - fScaledData.getFirstBucketTime()) / fScaledData.fBucketDuration) + 1;
+ if (event.x < delimiterIndex) {
+ final String tooltip = formatToolTipLabel(event.x - fOffset);
+ fCanvas.setToolTipText(tooltip);
+ return;
+ }
}
+ fCanvas.setToolTipText(null);
}
private String formatToolTipLabel(final int index) {
fBucketDuration = Math.max(fBucketDuration, 1);
// Set selection begin and end index in the scaled histogram
- if (fSelectionBegin < fFirstBucketTime) {
- result.fSelectionBeginBucket = -1;
- } else if (fSelectionBegin > fEndTime) {
- result.fSelectionBeginBucket = fLastBucket;
- } else {
- result.fSelectionBeginBucket = (int) ((fSelectionBegin - fFirstBucketTime) / fBucketDuration) / bucketsPerBar;
- }
- if (fSelectionEnd < fFirstBucketTime) {
- result.fSelectionEndBucket = -1;
- } else if (fSelectionEnd > fEndTime) {
- result.fSelectionEndBucket = fLastBucket;
- } else {
- result.fSelectionEndBucket = (int) ((fSelectionEnd - fFirstBucketTime) / fBucketDuration) / bucketsPerBar;
- }
+ result.fSelectionBeginBucket = (int) ((fSelectionBegin - fFirstBucketTime) / fBucketDuration) / bucketsPerBar;
+ result.fSelectionEndBucket = (int) ((fSelectionEnd - fFirstBucketTime) / fBucketDuration) / bucketsPerBar;
result.fFirstBucketTime = fFirstBucketTime;
result.fFirstEventTime = fFirstEventTime;
package org.eclipse.linuxtools.tmf.ui.views.histogram;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.widgets.Composite;
/**
private HistogramZoom fZoom = null;
+ private long fRangeStartTime = 0L;
+ private long fRangeDuration;
+ private long fFullRangeStartTime = 0L;
+ private long fFullRangeEndTime = 0L;
+
// ------------------------------------------------------------------------
// Constructor
// ------------------------------------------------------------------------
@Override
public synchronized void clear() {
+ fRangeStartTime = 0L;
+ fRangeDuration = 0L;
+ fFullRangeStartTime = 0L;
+ fFullRangeEndTime = 0L;
if (fZoom != null) {
fZoom.setFullRange(0L, 0L);
fZoom.setNewRange(0L, 0L);
* @param duration The duration of the time range
*/
public synchronized void setTimeRange(long startTime, long duration) {
+ fRangeStartTime = startTime;
+ fRangeDuration = duration;
fZoom.setNewRange(startTime, duration);
if (getDataModel().getNbEvents() == 0) {
getDataModel().setTimeRange(startTime, startTime + duration);
* @param endTime The end time
*/
public void setFullRange(long startTime, long endTime) {
+ fFullRangeStartTime = startTime;
+ fFullRangeEndTime = endTime;
long currentFirstEvent = getStartTime();
fZoom.setFullRange((currentFirstEvent == 0) ? startTime : currentFirstEvent, endTime);
}
+ // ------------------------------------------------------------------------
+ // MouseListener
+ // ------------------------------------------------------------------------
+
+ private int fStartPosition;
+ private int fMinOffset;
+ private int fMaxOffset;
+
+ @Override
+ public void mouseDown(MouseEvent event) {
+ if ((event.button == 2 || (event.button == 1 && (event.stateMask & SWT.MODIFIER_MASK) == SWT.CTRL)) &&
+ fDragState == DRAG_NONE && fDataModel.getNbEvents() != 0) {
+ fDragState = DRAG_RANGE;
+ fDragButton = event.button;
+ fStartPosition = event.x;
+ fMaxOffset = (int) ((fRangeStartTime - fFullRangeStartTime) / fScaledData.fBucketDuration);
+ fMinOffset = (int) ((fRangeStartTime + fRangeDuration - fFullRangeEndTime) / fScaledData.fBucketDuration);
+ return;
+ }
+ super.mouseDown(event);
+ }
+
+ @Override
+ public void mouseUp(MouseEvent event) {
+ if (fDragState == DRAG_RANGE && event.button == fDragButton) {
+ fDragState = DRAG_NONE;
+ fDragButton = 0;
+ if (event.x != fStartPosition) {
+ int nbBuckets = event.x - fStartPosition;
+ long delta = nbBuckets * fScaledData.fBucketDuration;
+ long startTime = fRangeStartTime - delta;
+ fRangeStartTime = Math.max(fFullRangeStartTime, Math.min(fFullRangeEndTime - fRangeDuration, startTime));
+ ((HistogramView) fParentView).updateTimeRange(fRangeStartTime, fRangeStartTime + fRangeDuration);
+ setOffset(0);
+ }
+ return;
+ }
+ super.mouseUp(event);
+ }
+
+ // ------------------------------------------------------------------------
+ // MouseMoveListener
+ // ------------------------------------------------------------------------
+
+ @Override
+ public void mouseMove(MouseEvent event) {
+ if (fDragState == DRAG_RANGE) {
+ int offset = Math.max(fMinOffset, Math.min(fMaxOffset, event.x - fStartPosition));
+ setOffset(offset);
+ fCanvas.redraw();
+ return;
+ }
+ super.mouseMove(event);
+ }
+
}