tmf: Support drag move in time range histogram
authorPatrick Tasse <patrick.tasse@gmail.com>
Mon, 11 Nov 2013 22:53:20 +0000 (17:53 -0500)
committerPatrick Tasse <patrick.tasse@gmail.com>
Mon, 25 Nov 2013 20:52:48 +0000 (15:52 -0500)
- Add support for bucket display offset in histogram
- Middle button or Ctrl-left button are used to drag the window in time
range histogram
- New time range is propagated when the mouse button is released
- Remove restriction of selection buckets to visible range in data model
- Adjust histogram tool tip according to bucket display offset
- Prevent histogram tool tip when mouse is not over visible time range

Change-Id: I9ee3663511b57ac32a668cc25cf97e903a72e60f
Signed-off-by: Patrick Tasse <patrick.tasse@gmail.com>
Reviewed-on: https://git.eclipse.org/r/18309
Tested-by: Hudson CI
Reviewed-by: Bernd Hufmann <bernd.hufmann@ericsson.com>
IP-Clean: Bernd Hufmann <bernd.hufmann@ericsson.com>
Tested-by: Bernd Hufmann <bernd.hufmann@ericsson.com>
Reviewed-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
IP-Clean: Matthew Khouzam <matthew.khouzam@ericsson.com>
Tested-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
Tested-by: Marc-Andre Laperle <marc-andre.laperle@ericsson.com>
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/histogram/Histogram.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/histogram/HistogramDataModel.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/histogram/TimeRangeHistogram.java

index afe31ff57eade0a22e95dc7bcee4cda3ec281ead..d31491bfb13e3bdcdedadd80cd017de1d087f1e5 100644 (file)
@@ -183,6 +183,11 @@ public abstract class Histogram implements ControlListener, PaintListener, KeyLi
      */
     protected int fDragButton = 0;
 
+    /**
+     * The bucket display offset
+     */
+    private int fOffset = 0;
+
     // ------------------------------------------------------------------------
     // Construction
     // ------------------------------------------------------------------------
@@ -448,7 +453,7 @@ public abstract class Histogram implements ControlListener, PaintListener, KeyLi
     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)
         }
@@ -467,6 +472,17 @@ public abstract class Histogram implements ControlListener, PaintListener, KeyLi
         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.
      *
@@ -658,7 +674,8 @@ public abstract class Histogram implements ControlListener, PaintListener, KeyLi
             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);
@@ -666,10 +683,10 @@ public abstract class Histogram implements ControlListener, PaintListener, KeyLi
                     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);
                         }
                     }
                 }
@@ -680,11 +697,11 @@ public abstract class Histogram implements ControlListener, PaintListener, KeyLi
             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);
             }
@@ -802,12 +819,15 @@ public abstract class Histogram implements ControlListener, PaintListener, KeyLi
 
     @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) {
index 7f4a9b6ff4730e7168963da74a0b1bee49fe0275..8c2be7226de37342662056815d90a83e72131b6c 100644 (file)
@@ -614,20 +614,8 @@ public class HistogramDataModel implements IHistogramDataModel {
 
         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;
index 4a14b25e67b4a20c41350c035a78de94cb8f58fc..ea162ce79fa80c1bbf80bab6d0718ea8b54a68d7 100644 (file)
@@ -15,6 +15,8 @@
 
 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;
 
 /**
@@ -36,6 +38,11 @@ public class TimeRangeHistogram extends Histogram {
 
     private HistogramZoom fZoom = null;
 
+    private long fRangeStartTime = 0L;
+    private long fRangeDuration;
+    private long fFullRangeStartTime = 0L;
+    private long fFullRangeEndTime = 0L;
+
     // ------------------------------------------------------------------------
     // Constructor
     // ------------------------------------------------------------------------
@@ -56,6 +63,10 @@ public class TimeRangeHistogram extends Histogram {
 
     @Override
     public synchronized void clear() {
+        fRangeStartTime = 0L;
+        fRangeDuration = 0L;
+        fFullRangeStartTime = 0L;
+        fFullRangeEndTime = 0L;
         if (fZoom != null) {
             fZoom.setFullRange(0L, 0L);
             fZoom.setNewRange(0L, 0L);
@@ -69,6 +80,8 @@ public class TimeRangeHistogram extends Histogram {
      * @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);
@@ -82,8 +95,65 @@ public class TimeRangeHistogram extends Histogram {
      * @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);
+    }
+
 }
This page took 0.031544 seconds and 5 git commands to generate.