analysis: Move plugins to their own sub-directory
[deliverable/tracecompass.git] / org.eclipse.tracecompass.tmf.ui / src / org / eclipse / tracecompass / tmf / ui / widgets / timegraph / widgets / TimeGraphControl.java
index 6b27bbe4f20d19a37a42fc18e78aa3fcd759cdb0..136105c39c57bd5300dbc239ebb238d015486ea1 100644 (file)
@@ -1,5 +1,5 @@
 /*****************************************************************************
- * Copyright (c) 2007, 2014 Intel Corporation and others
+ * Copyright (c) 2007, 2015 Intel Corporation and others
  *
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -22,6 +22,7 @@ package org.eclipse.tracecompass.tmf.ui.widgets.timegraph.widgets;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -37,8 +38,6 @@ import org.eclipse.jface.viewers.ISelectionProvider;
 import org.eclipse.jface.viewers.ViewerFilter;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.ControlListener;
 import org.eclipse.swt.events.FocusEvent;
 import org.eclipse.swt.events.FocusListener;
 import org.eclipse.swt.events.KeyEvent;
@@ -51,7 +50,6 @@ import org.eclipse.swt.events.MouseMoveListener;
 import org.eclipse.swt.events.MouseTrackListener;
 import org.eclipse.swt.events.MouseWheelListener;
 import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.events.TraverseEvent;
 import org.eclipse.swt.events.TraverseListener;
@@ -66,7 +64,10 @@ import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Event;
 import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.ScrollBar;
+import org.eclipse.tracecompass.tmf.core.signal.TmfSignalManager;
+import org.eclipse.tracecompass.tmf.ui.signal.TmfTimeViewAlignmentInfo;
+import org.eclipse.tracecompass.tmf.ui.signal.TmfTimeViewAlignmentSignal;
+import org.eclipse.tracecompass.tmf.ui.views.ITmfTimeAligned;
 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.ITimeGraphColorListener;
 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.ITimeGraphPresentationProvider;
 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.ITimeGraphPresentationProvider2;
@@ -84,20 +85,15 @@ import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.widgets.Utils.TimeForma
 /**
  * Time graph control implementation
  *
- * @version 1.0
  * @author Alvaro Sanchez-Leon
  * @author Patrick Tasse
  */
 public class TimeGraphControl extends TimeGraphBaseControl
-        implements FocusListener, KeyListener, MouseMoveListener, MouseListener, MouseWheelListener,
-        ControlListener, SelectionListener, MouseTrackListener, TraverseListener, ISelectionProvider,
+        implements FocusListener, KeyListener, MouseMoveListener, MouseListener,
+        MouseWheelListener, MouseTrackListener, TraverseListener, ISelectionProvider,
         MenuDetectListener, ITmfTimeGraphDrawingHelper, ITimeGraphColorListener, Listener {
 
-    /** Max scrollbar size */
-    public static final int H_SCROLLBAR_MAX = Integer.MAX_VALUE - 1;
-
-    /** Constant indicating that all levels of the time graph should be expanded
-     * @since 3.1 */
+    /** Constant indicating that all levels of the time graph should be expanded */
     public static final int ALL_LEVELS = AbstractTreeViewer.ALL_LEVELS;
 
     private static final int DRAG_NONE = 0;
@@ -116,6 +112,7 @@ public class TimeGraphControl extends TimeGraphBaseControl
     private static final int ARROW_HOVER_MAX_DIST = 5;
 
     private static final int NO_STATUS = -1;
+    private static final int STATUS_WITHOUT_CURSOR_TIME = -2;
 
     /** Resource manager */
     private LocalResourceManager fResourceManager = new LocalResourceManager(JFaceResources.getResources());
@@ -133,6 +130,7 @@ public class TimeGraphControl extends TimeGraphBaseControl
     private int fMinimumItemWidth = 0;
     private int fTopIndex = 0;
     private int fDragState = DRAG_NONE;
+    private boolean fDragBeginMarker = false;
     private int fDragButton;
     private int fDragX0 = 0;
     private int fDragX = 0;
@@ -160,44 +158,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
     private int fBorderWidth = 0;
     private int fHeaderHeight = 0;
 
-    private MouseScrollNotifier fMouseScrollNotifier;
-    private final Object fMouseScrollNotifierLock = new Object();
-
-    private class MouseScrollNotifier extends Thread {
-        private static final long DELAY = 400L;
-        private static final long POLLING_INTERVAL = 10L;
-        private long fLastScrollTime = Long.MAX_VALUE;
-
-        @Override
-        public void run() {
-            while ((System.currentTimeMillis() - fLastScrollTime) < DELAY) {
-                try {
-                    Thread.sleep(POLLING_INTERVAL);
-                } catch (Exception e) {
-                    return;
-                }
-            }
-            if (!isInterrupted()) {
-                Display.getDefault().asyncExec(new Runnable() {
-                    @Override
-                    public void run() {
-                        if (isDisposed()) {
-                            return;
-                        }
-                        fTimeProvider.notifyStartFinishTime();
-                    }
-                });
-            }
-            synchronized (fMouseScrollNotifierLock) {
-                fMouseScrollNotifier = null;
-            }
-        }
-
-        public void mouseScrolled() {
-            fLastScrollTime = System.currentTimeMillis();
-        }
-    }
-
     /**
      * Standard constructor
      *
@@ -208,7 +168,7 @@ public class TimeGraphControl extends TimeGraphBaseControl
      */
     public TimeGraphControl(Composite parent, TimeGraphColorScheme colors) {
 
-        super(parent, colors, SWT.NO_BACKGROUND | SWT.H_SCROLL | SWT.DOUBLE_BUFFERED);
+        super(parent, colors, SWT.NO_BACKGROUND | SWT.DOUBLE_BUFFERED);
 
         fItemData = new ItemData();
 
@@ -219,14 +179,8 @@ public class TimeGraphControl extends TimeGraphBaseControl
         addMouseWheelListener(this);
         addTraverseListener(this);
         addKeyListener(this);
-        addControlListener(this);
         addMenuDetectListener(this);
         addListener(SWT.MouseWheel, this);
-        ScrollBar scrollHor = getHorizontalBar();
-
-        if (scrollHor != null) {
-            scrollHor.addSelectionListener(this);
-        }
     }
 
     @Override
@@ -256,7 +210,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
      * Gets the timegraph provider used by this timegraph viewer.
      *
      * @return the timegraph provider, or <code>null</code> if not set.
-     * @since 3.0
      */
     public ITimeGraphPresentationProvider getTimeGraphProvider() {
         return fTimeGraphProvider;
@@ -266,7 +219,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
      * Gets the color map used by this timegraph viewer.
      *
      * @return a color map, or <code>null</code> if not set.
-     * @since 3.0
      */
     public Color[] getEventColorMap() {
         return fEventColorMap;
@@ -280,7 +232,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
      */
     public void setTimeProvider(ITimeDataProvider timeProvider) {
         fTimeProvider = timeProvider;
-        adjustScrolls();
         redraw();
     }
 
@@ -289,7 +240,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
      *
      * @param statusLineManager
      *            The status line manager, or null to disable status line messages
-     * @since 2.1
      */
     public void setStatusLineManager(IStatusLineManager statusLineManager) {
         if (fStatusLineManager != null && statusLineManager == null) {
@@ -303,7 +253,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
      *
      * @param timeGraphScale
      *            The time graph scale
-     * @since 2.1
      */
     public void setTimeGraphScale(TimeGraphScale timeGraphScale) {
         fTimeGraphScale = timeGraphScale;
@@ -368,7 +317,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
      *
      * @param listener
      *            The listener to add
-     * @since 3.1
      */
     public void addDragSelectionListener(ITimeGraphTimeListener listener) {
         if (listener == null) {
@@ -385,7 +333,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
      *
      * @param listener
      *            The listener to remove
-     * @since 3.1
      */
     public void removeDragSelectionListener(ITimeGraphTimeListener listener) {
         if (null != fDragSelectionListeners) {
@@ -400,7 +347,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
      *            Time interval start
      * @param end
      *            Time interval end
-     * @since 3.1
      */
     public void fireDragSelectionChanged(long start, long end) {
         // check for backward intervals
@@ -445,7 +391,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
      */
     public void refreshData() {
         fItemData.refreshData();
-        adjustScrolls();
         redraw();
     }
 
@@ -457,52 +402,27 @@ public class TimeGraphControl extends TimeGraphBaseControl
      */
     public void refreshData(ITimeGraphEntry[] traces) {
         fItemData.refreshData(traces);
-        adjustScrolls();
         redraw();
     }
 
     /**
      * Refresh the links (arrows) of this widget
      *
-     * @param events The link events to refresh
-     * @since 2.1
+     * @param events The link event list
      */
     public void refreshArrows(List<ILinkEvent> events) {
         fItemData.refreshArrows(events);
     }
 
     /**
-     * Adjust the scoll bars
+     * Get the links (arrows) of this widget
+     *
+     * @return The unmodifiable link event list
+     *
+     * @since 1.0
      */
-    public void adjustScrolls() {
-        if (null == fTimeProvider) {
-            getHorizontalBar().setValues(0, 1, 1, 1, 1, 1);
-            return;
-        }
-
-        // HORIZONTAL BAR
-        // Visible window
-        long time0 = fTimeProvider.getTime0();
-        long time1 = fTimeProvider.getTime1();
-        // Time boundaries
-        long timeMin = fTimeProvider.getMinTime();
-        long timeMax = fTimeProvider.getMaxTime();
-
-        long delta = timeMax - timeMin;
-
-        int timePos = 0;
-        int thumb = H_SCROLLBAR_MAX;
-
-        if (delta != 0) {
-            // Thumb size (page size)
-            thumb = Math.max(1, (int) (H_SCROLLBAR_MAX * ((double) (time1 - time0) / delta)));
-            // At the beginning of visible window
-            timePos = (int) (H_SCROLLBAR_MAX * ((double) (time0 - timeMin) / delta));
-        }
-
-        // position, minimum, maximum, thumb size, increment (half page)t, page
-        // increment size (full page)
-        getHorizontalBar().setValues(timePos, 0, H_SCROLLBAR_MAX, thumb, Math.max(1, thumb / 2), Math.max(2, thumb));
+    public List<ILinkEvent> getArrows() {
+        return Collections.unmodifiableList(fItemData.fLinks);
     }
 
     boolean ensureVisibleItem(int idx, boolean redraw) {
@@ -563,7 +483,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
      * @param level
      *            non-negative level, or <code>ALL_LEVELS</code> to expand all
      *            levels of the tree
-     * @since 3.1
      */
     public void setAutoExpandLevel(int level) {
         fAutoExpandLevel = level;
@@ -575,7 +494,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
      * @return non-negative level, or <code>ALL_LEVELS</code> if all levels of
      *         the tree are expanded automatically
      * @see #setAutoExpandLevel
-     * @since 3.1
      */
     public int getAutoExpandLevel() {
         return fAutoExpandLevel;
@@ -600,8 +518,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
 
     /**
      * Collapses all nodes of the viewer's tree, starting with the root.
-     *
-     * @since 2.0
      */
     public void collapseAll() {
         for (Item item : fItemData.fItems) {
@@ -613,8 +529,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
 
     /**
      * Expands all nodes of the viewer's tree, starting with the root.
-     *
-     * @since 2.0
      */
     public void expandAll() {
         for (Item item : fItemData.fItems) {
@@ -669,9 +583,9 @@ public class TimeGraphControl extends TimeGraphBaseControl
 
     /**
      * Add a menu listener on {@link ITimeGraphEntry}s
+     *
      * @param listener
      *            The listener to add
-     * @since 1.2
      */
     public void addTimeGraphEntryMenuListener(MenuDetectListener listener) {
         if (!fTimeGraphEntryMenuListeners.contains(listener)) {
@@ -684,7 +598,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
      *
      * @param listener
      *            The listener to remove
-     * @since 1.2
      */
     public void removeTimeGraphEntryMenuListener(MenuDetectListener listener) {
         if (fTimeGraphEntryMenuListeners.contains(listener)) {
@@ -709,7 +622,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
      *
      * @param listener
      *            The listener to add
-     * @since 1.2
      */
     public void addTimeEventMenuListener(MenuDetectListener listener) {
         if (!fTimeEventMenuListeners.contains(listener)) {
@@ -722,7 +634,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
      *
      * @param listener
      *            The listener to remove
-     * @since 1.2
      */
     public void removeTimeEventMenuListener(MenuDetectListener listener) {
         if (fTimeEventMenuListeners.contains(listener)) {
@@ -823,8 +734,11 @@ public class TimeGraphControl extends TimeGraphBaseControl
      *
      * @param n
      *            1 for next event, -1 for previous event
+     * @param extend
+     *            true to extend selection range, false for single selection
+     * @since 1.0
      */
-    public void selectEvent(int n) {
+    public void selectEvent(int n, boolean extend) {
         if (null == fTimeProvider) {
             return;
         }
@@ -832,15 +746,15 @@ public class TimeGraphControl extends TimeGraphBaseControl
         if (trace == null) {
             return;
         }
-        long selectedTime = fTimeProvider.getSelectionBegin();
-        long endTime = fTimeProvider.getEndTime();
+        long selectedTime = fTimeProvider.getSelectionEnd();
+        long endTime = fTimeProvider.getMaxTime();
         ITimeEvent nextEvent;
-        if (-1 == n && selectedTime > endTime) {
+        if (n == -1 && selectedTime > endTime) {
             nextEvent = Utils.findEvent(trace, selectedTime, 0);
         } else {
             nextEvent = Utils.findEvent(trace, selectedTime, n);
         }
-        if (null == nextEvent && -1 == n) {
+        if (null == nextEvent && n == -1) {
             nextEvent = Utils.getFirstEvent(trace);
         }
         if (null != nextEvent) {
@@ -858,28 +772,45 @@ public class TimeGraphControl extends TimeGraphBaseControl
                 // for previous event go to its end time unless we were already there
                 nextTime = nextEvent.getTime() + nextEvent.getDuration();
             }
-            fTimeProvider.setSelectedTimeNotify(nextTime, true);
+            if (extend) {
+                fTimeProvider.setSelectionRangeNotify(fTimeProvider.getSelectionBegin(), nextTime);
+            } else {
+                fTimeProvider.setSelectedTimeNotify(nextTime, true);
+            }
             fireSelectionChanged();
-        } else if (1 == n) {
-            fTimeProvider.setSelectedTimeNotify(endTime, true);
+        } else if (n == 1) {
+            if (extend) {
+                fTimeProvider.setSelectionRangeNotify(fTimeProvider.getSelectionBegin(), endTime);
+            } else {
+                fTimeProvider.setSelectedTimeNotify(endTime, true);
+            }
             fireSelectionChanged();
         }
+        updateStatusLine(STATUS_WITHOUT_CURSOR_TIME);
     }
 
     /**
      * Select the next event
+     *
+     * @param extend
+     *            true to extend selection range, false for single selection
+     * @since 1.0
      */
-    public void selectNextEvent() {
-        selectEvent(1);
+    public void selectNextEvent(boolean extend) {
+        selectEvent(1, extend);
         // Notify if visible time window has been adjusted
         fTimeProvider.setStartFinishTimeNotify(fTimeProvider.getTime0(), fTimeProvider.getTime1());
     }
 
     /**
      * Select the previous event
+     *
+     * @param extend
+     *            true to extend selection range, false for single selection
+     * @since 1.0
      */
-    public void selectPrevEvent() {
-        selectEvent(-1);
+    public void selectPrevEvent(boolean extend) {
+        selectEvent(-1, extend);
         // Notify if visible time window has been adjusted
         fTimeProvider.setStartFinishTimeNotify(fTimeProvider.getTime0(), fTimeProvider.getTime1());
     }
@@ -898,6 +829,32 @@ public class TimeGraphControl extends TimeGraphBaseControl
         selectTrace(-1);
     }
 
+    /**
+     * Scroll left or right by one half window size
+     *
+     * @param left
+     *            true to scroll left, false to scroll right
+     */
+    public void horizontalScroll(boolean left) {
+        long time0 = fTimeProvider.getTime0();
+        long time1 = fTimeProvider.getTime1();
+        long timeMin = fTimeProvider.getMinTime();
+        long timeMax = fTimeProvider.getMaxTime();
+        long range = time1 - time0;
+        if (range <= 0) {
+            return;
+        }
+        long increment = Math.max(1, range / 2);
+        if (left) {
+            time0 = Math.max(time0 - increment, timeMin);
+            time1 = time0 + range;
+        } else {
+            time1 = Math.min(time1 + increment, timeMax);
+            time0 = time1 - range;
+        }
+        fTimeProvider.setStartFinishTimeNotify(time0, time1);
+    }
+
     /**
      * Zoom based on mouse cursor location with mouse scrolling
      *
@@ -924,14 +881,7 @@ public class TimeGraphControl extends TimeGraphBaseControl
         long center = time0 + Math.round(((double) (xPos - nameSpace) / timeSpace * interval));
         long newTime0 = center - Math.round((double) newInterval * (center - time0) / interval);
         long newTime1 = newTime0 + newInterval;
-        fTimeProvider.setStartFinishTime(newTime0, newTime1);
-        synchronized (fMouseScrollNotifierLock) {
-            if (fMouseScrollNotifier == null) {
-                fMouseScrollNotifier = new MouseScrollNotifier();
-                fMouseScrollNotifier.start();
-            }
-            fMouseScrollNotifier.mouseScrolled();
-        }
+        fTimeProvider.setStartFinishTimeNotify(newTime0, newTime1);
     }
 
     /**
@@ -995,8 +945,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
      * Hide arrows
      *
      * @param hideArrows true to hide arrows
-     *
-     * @since 2.1
      */
     public void hideArrows(boolean hideArrows) {
         fHideArrows = hideArrows;
@@ -1005,53 +953,67 @@ public class TimeGraphControl extends TimeGraphBaseControl
     /**
      * Follow the arrow forward
      *
-     * @since 2.1
+     * @param extend
+     *            true to extend selection range, false for single selection
+     * @since 1.0
      */
-    public void followArrowFwd() {
+    public void followArrowFwd(boolean extend) {
         ITimeGraphEntry trace = getSelectedTrace();
         if (trace == null) {
             return;
         }
-        long selectedTime = fTimeProvider.getSelectionBegin();
+        long selectedTime = fTimeProvider.getSelectionEnd();
         for (ILinkEvent link : fItemData.fLinks) {
             if (link.getEntry() == trace && link.getTime() == selectedTime) {
                 selectItem(link.getDestinationEntry(), false);
                 if (link.getDuration() != 0) {
-                    fTimeProvider.setSelectedTimeNotify(link.getTime() + link.getDuration(), true);
+                    if (extend) {
+                        fTimeProvider.setSelectionRangeNotify(fTimeProvider.getSelectionBegin(), link.getTime() + link.getDuration());
+                    } else {
+                        fTimeProvider.setSelectedTimeNotify(link.getTime() + link.getDuration(), true);
+                    }
                     // Notify if visible time window has been adjusted
                     fTimeProvider.setStartFinishTimeNotify(fTimeProvider.getTime0(), fTimeProvider.getTime1());
                 }
                 fireSelectionChanged();
+                updateStatusLine(STATUS_WITHOUT_CURSOR_TIME);
                 return;
             }
         }
-        selectNextEvent();
+        selectNextEvent(extend);
     }
 
     /**
      * Follow the arrow backward
      *
-     * @since 2.1
+     * @param extend
+     *            true to extend selection range, false for single selection
+     * @since 1.0
      */
-    public void followArrowBwd() {
+    public void followArrowBwd(boolean extend) {
         ITimeGraphEntry trace = getSelectedTrace();
         if (trace == null) {
             return;
         }
-        long selectedTime = fTimeProvider.getSelectionBegin();
+        long selectedTime = fTimeProvider.getSelectionEnd();
         for (ILinkEvent link : fItemData.fLinks) {
             if (link.getDestinationEntry() == trace && link.getTime() + link.getDuration() == selectedTime) {
                 selectItem(link.getEntry(), false);
                 if (link.getDuration() != 0) {
-                    fTimeProvider.setSelectedTimeNotify(link.getTime(), true);
+                    if (extend) {
+                        fTimeProvider.setSelectionRangeNotify(fTimeProvider.getSelectionBegin(), link.getTime());
+                    } else {
+                        fTimeProvider.setSelectedTimeNotify(link.getTime(), true);
+                    }
                     // Notify if visible time window has been adjusted
                     fTimeProvider.setStartFinishTimeNotify(fTimeProvider.getTime0(), fTimeProvider.getTime1());
                 }
                 fireSelectionChanged();
+                updateStatusLine(STATUS_WITHOUT_CURSOR_TIME);
                 return;
             }
         }
-        selectPrevEvent();
+        selectPrevEvent(extend);
     }
 
     /**
@@ -1092,7 +1054,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
             if (item.fHasChildren) {
                 item.fExpanded = !item.fExpanded;
                 fItemData.updateExpandedItems();
-                adjustScrolls();
                 redraw();
                 toggled = true;
                 fireTreeEvent(item.fEntry, item.fExpanded);
@@ -1107,7 +1068,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
      * @param y
      *            the y coordinate
      * @return the index of the item at the given location, of -1 if none.
-     * @since 3.0
      */
     protected int getItemIndexAtY(int y) {
         if (y < 0) {
@@ -1138,7 +1098,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
      *            a point in the widget
      * @return the {@link ITimeGraphEntry} at this point, or <code>null</code>
      *         if none.
-     * @since 3.0
      */
     protected ITimeGraphEntry getEntry(Point pt) {
         int idx = getItemIndexAtY(pt.y);
@@ -1152,7 +1111,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
      * @param pt
      *            a point in the widget
      * @return The closest arrow event, or null if there is none close enough.
-     * @since 3.2
      */
     protected ILinkEvent getArrow(Point pt) {
         if (fHideArrows) {
@@ -1180,9 +1138,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
         return null;
     }
 
-    /**
-     * @since 2.0
-     */
     @Override
     public int getXForTime(long time) {
         if (null == fTimeProvider) {
@@ -1190,23 +1145,20 @@ public class TimeGraphControl extends TimeGraphBaseControl
         }
         long time0 = fTimeProvider.getTime0();
         long time1 = fTimeProvider.getTime1();
-        int width = getCtrlSize().x;
+        int width = getSize().x;
         int nameSpace = fTimeProvider.getNameSpace();
         double pixelsPerNanoSec = (width - nameSpace <= RIGHT_MARGIN) ? 0 : (double) (width - nameSpace - RIGHT_MARGIN) / (time1 - time0);
         int x = getBounds().x + nameSpace + (int) ((time - time0) * pixelsPerNanoSec);
         return x;
     }
 
-    /**
-     * @since 2.0
-     */
     @Override
     public long getTimeAtX(int coord) {
         if (null == fTimeProvider) {
             return -1;
         }
         long hitTime = -1;
-        Point size = getCtrlSize();
+        Point size = getSize();
         long time0 = fTimeProvider.getTime0();
         long time1 = fTimeProvider.getTime1();
         int nameWidth = fTimeProvider.getNameSpace();
@@ -1266,7 +1218,7 @@ public class TimeGraphControl extends TimeGraphBaseControl
      * @return The count
      */
     public int countPerPage() {
-        int height = getCtrlSize().y;
+        int height = getSize().y;
         int count = 0;
         int ySum = 0;
         for (int idx = fTopIndex; idx < fItemData.fExpandedItems.length; idx++) {
@@ -1317,14 +1269,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
         return elements.toArray(new ITimeGraphEntry[0]);
     }
 
-    Point getCtrlSize() {
-        Point size = getSize();
-        if (getHorizontalBar().isVisible()) {
-            size.y -= getHorizontalBar().getSize().y;
-        }
-        return size;
-    }
-
     Rectangle getNameRect(Rectangle bound, int idx, int nameWidth) {
         Rectangle rect = getStatesRect(bound, idx, nameWidth);
         rect.x = bound.x;
@@ -1480,7 +1424,7 @@ public class TimeGraphControl extends TimeGraphBaseControl
         ITimeGraphEntry entry = item.fEntry;
         long time0 = timeProvider.getTime0();
         long time1 = timeProvider.getTime1();
-        long selectedTime = fTimeProvider.getSelectionBegin();
+        long selectedTime = fTimeProvider.getSelectionEnd();
 
         Rectangle nameRect = getNameRect(bounds, i, nameSpace);
         if (nameRect.y >= bounds.y + bounds.height) {
@@ -1565,7 +1509,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
      *            The width reserved for the names
      * @param gc
      *            Reference to the SWT GC object
-     * @since 2.1
      */
     public void drawLinks(Rectangle bounds, ITimeDataProvider timeProvider,
             List<ILinkEvent> links, int nameSpace, GC gc) {
@@ -1592,7 +1535,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
      *            the name space
      * @param gc
      *            Graphics context
-     * @since 2.1
      */
     protected void drawLink(ILinkEvent event, Rectangle bounds, ITimeDataProvider timeProvider, int nameSpace, GC gc) {
         drawArrow(getColorScheme(), event, getArrowRectangle(bounds, event), gc);
@@ -1635,7 +1577,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
      * @param gc
      *            Graphics context
      * @return true if the state was drawn
-     * @since 2.1
      */
     protected boolean drawArrow(TimeGraphColorScheme colors, ITimeEvent event,
             Rectangle rect, GC gc) {
@@ -1813,7 +1754,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
      * @param timeSelected
      *            Is the timestamp currently selected
      * @return true if the state was drawn
-     * @since 2.0
      */
     protected boolean drawState(TimeGraphColorScheme colors, ITimeEvent event,
             Rectangle rect, GC gc, boolean selected, boolean timeSelected) {
@@ -1918,10 +1858,12 @@ public class TimeGraphControl extends TimeGraphBaseControl
             } else if (idx > 0) {
                 idx--;
             }
-        } else if (SWT.ARROW_LEFT == e.keyCode) {
-            selectPrevEvent();
-        } else if (SWT.ARROW_RIGHT == e.keyCode) {
-            selectNextEvent();
+        } else if (SWT.ARROW_LEFT == e.keyCode && fDragState == DRAG_NONE) {
+            boolean extend = (e.stateMask & SWT.SHIFT) != 0;
+            selectPrevEvent(extend);
+        } else if (SWT.ARROW_RIGHT == e.keyCode && fDragState == DRAG_NONE) {
+            boolean extend = (e.stateMask & SWT.SHIFT) != 0;
+            selectNextEvent(extend);
         } else if (SWT.PAGE_DOWN == e.keyCode) {
             int page = countPerPage();
             idx = getSelectedIndex();
@@ -1971,7 +1913,7 @@ public class TimeGraphControl extends TimeGraphBaseControl
     public void focusGained(FocusEvent e) {
         fIsInFocus = true;
         redraw();
-        updateStatusLine(NO_STATUS);
+        updateStatusLine(STATUS_WITHOUT_CURSOR_TIME);
     }
 
     @Override
@@ -2048,44 +1990,49 @@ public class TimeGraphControl extends TimeGraphBaseControl
         TimeFormat tf = tdp.getTimeFormat();
         Resolution res = Resolution.NANOSEC;
         StringBuilder message = new StringBuilder();
-        if (x >= 0 && fDragState == DRAG_NONE) {
-            long time = getTimeAtX(x);
-            if (time >= 0) {
-                if (tdp instanceof ITimeDataProviderConverter) {
-                    time = ((ITimeDataProviderConverter) tdp).convertTime(time);
-                }
-                long selectionBegin = tdp.getSelectionBegin();
-                long selectionEnd = tdp.getSelectionEnd();
-                message.append(NLS.bind("T: {0}{1}     T1: {2}{3}", //$NON-NLS-1$
-                        new Object[] {
-                                tf == TimeFormat.CALENDAR ? Utils.formatDate(time) + ' ' : "", //$NON-NLS-1$
-                                Utils.formatTime(time, tf, res),
-                                tf == TimeFormat.CALENDAR ? Utils.formatDate(Math.min(selectionBegin, selectionEnd)) + ' ' : "", //$NON-NLS-1$
-                                Utils.formatTime(Math.min(selectionBegin, selectionEnd), tf, res)
-                        }));
-                if (selectionBegin != selectionEnd) {
-                    message.append(NLS.bind("     T2: {0}{1}     \u0394: {2}", //$NON-NLS-1$
+        if ((x >= 0 || x == STATUS_WITHOUT_CURSOR_TIME) && fDragState == DRAG_NONE) {
+            if (x != STATUS_WITHOUT_CURSOR_TIME) {
+                long time = getTimeAtX(x);
+                if (time >= 0) {
+                    if (tdp instanceof ITimeDataProviderConverter) {
+                        time = ((ITimeDataProviderConverter) tdp).convertTime(time);
+                    }
+                    message.append(NLS.bind("T: {0}{1}     ", //$NON-NLS-1$
                             new Object[] {
-                                    tf == TimeFormat.CALENDAR ? Utils.formatDate(Math.max(selectionBegin, selectionEnd)) + ' ' : "", //$NON-NLS-1$
-                                    Utils.formatTime(Math.max(selectionBegin, selectionEnd), tf, res),
-                                    Utils.formatDelta(Math.abs(selectionBegin - selectionEnd), tf, res)
+                                    tf == TimeFormat.CALENDAR ? Utils.formatDate(time) + ' ' : "", //$NON-NLS-1$
+                                    Utils.formatTime(time, tf, res)
                             }));
                 }
             }
+            long selectionBegin = tdp.getSelectionBegin();
+            long selectionEnd = tdp.getSelectionEnd();
+            message.append(NLS.bind("T1: {0}{1}", //$NON-NLS-1$
+                    new Object[] {
+                            tf == TimeFormat.CALENDAR ? Utils.formatDate(selectionBegin) + ' ' : "", //$NON-NLS-1$
+                            Utils.formatTime(selectionBegin, tf, res)
+                    }));
+            if (selectionBegin != selectionEnd) {
+                message.append(NLS.bind("     T2: {0}{1}     \u0394: {2}", //$NON-NLS-1$
+                        new Object[] {
+                                tf == TimeFormat.CALENDAR ? Utils.formatDate(selectionEnd) + ' ' : "", //$NON-NLS-1$
+                                Utils.formatTime(selectionEnd, tf, res),
+                                Utils.formatDelta(selectionEnd - selectionBegin, tf, res)
+                        }));
+            }
         } else if (fDragState == DRAG_SELECTION || fDragState == DRAG_ZOOM) {
-            long time0 = fDragTime0;
-            long time = getTimeAtX(fDragX);
+            long time0 = fDragBeginMarker ? getTimeAtX(fDragX0) : fDragTime0;
+            long time = fDragBeginMarker ? fDragTime0 : getTimeAtX(fDragX);
             if (tdp instanceof ITimeDataProviderConverter) {
                 time0 = ((ITimeDataProviderConverter) tdp).convertTime(time0);
                 time = ((ITimeDataProviderConverter) tdp).convertTime(time);
             }
             message.append(NLS.bind("T1: {0}{1}     T2: {2}{3}     \u0394: {4}", //$NON-NLS-1$
                     new Object[] {
-                            tf == TimeFormat.CALENDAR ? Utils.formatDate(Math.min(time, time0)) + ' ' : "", //$NON-NLS-1$
-                            Utils.formatTime(Math.min(time, time0), tf, res),
-                            tf == TimeFormat.CALENDAR ? Utils.formatDate(Math.max(time, time0)) + ' ' : "", //$NON-NLS-1$
-                            Utils.formatTime(Math.max(time, time0), tf, res),
-                            Utils.formatDelta(Math.abs(time - time0), tf, res)
+                            tf == TimeFormat.CALENDAR ? Utils.formatDate(time0) + ' ' : "", //$NON-NLS-1$
+                            Utils.formatTime(time0, tf, res),
+                            tf == TimeFormat.CALENDAR ? Utils.formatDate(time) + ' ' : "", //$NON-NLS-1$
+                            Utils.formatTime(time, tf, res),
+                            Utils.formatDelta(time - time0, tf, res)
                     }));
         }
         fStatusLineManager.setMessage(message.toString());
@@ -2096,7 +2043,7 @@ public class TimeGraphControl extends TimeGraphBaseControl
         if (null == fTimeProvider) {
             return;
         }
-        Point size = getCtrlSize();
+        Point size = getSize();
         if (DRAG_TRACE_ITEM == fDragState) {
             int nameWidth = fTimeProvider.getNameSpace();
             if (e.x > nameWidth && size.x > nameWidth && fDragX != e.x) {
@@ -2113,13 +2060,18 @@ public class TimeGraphControl extends TimeGraphBaseControl
                     time0 = fTimeProvider.getMinTime();
                     time1 = time0 + (fTime1bak - fTime0bak);
                 }
-                fTimeProvider.setStartFinishTime(time0, time1);
+                fTimeProvider.setStartFinishTimeNotify(time0, time1);
             }
         } else if (DRAG_SPLIT_LINE == fDragState) {
             fDragX = e.x;
             fTimeProvider.setNameSpace(e.x);
+            TmfSignalManager.dispatchSignal(new TmfTimeViewAlignmentSignal(this, getTimeViewAlignmentInfo()));
         } else if (DRAG_SELECTION == fDragState) {
-            fDragX = Math.min(Math.max(e.x, fTimeProvider.getNameSpace()), size.x - RIGHT_MARGIN);
+            if (fDragBeginMarker) {
+                fDragX0 = Math.min(Math.max(e.x, fTimeProvider.getNameSpace()), size.x - RIGHT_MARGIN);
+            } else {
+                fDragX = Math.min(Math.max(e.x, fTimeProvider.getNameSpace()), size.x - RIGHT_MARGIN);
+            }
             redraw();
             fTimeGraphScale.setDragRange(fDragX0, fDragX);
             fireDragSelectionChanged(getTimeAtX(fDragX0), getTimeAtX(fDragX));
@@ -2151,6 +2103,7 @@ public class TimeGraphControl extends TimeGraphBaseControl
                     redraw();
                 }
                 fMouseOverSplitLine = mouseOverSplitLine;
+                TmfSignalManager.dispatchSignal(new TmfTimeViewAlignmentSignal(this, getTimeViewAlignmentInfo()));
                 return;
             }
             int idx = getItemIndexAtY(e.y);
@@ -2165,7 +2118,7 @@ public class TimeGraphControl extends TimeGraphBaseControl
     public void mouseDown(MouseEvent e) {
         if (fDragState != DRAG_NONE || null == fTimeProvider ||
                 fTimeProvider.getTime0() == fTimeProvider.getTime1() ||
-                getCtrlSize().x - fTimeProvider.getNameSpace() <= 0) {
+                getSize().x - fTimeProvider.getNameSpace() <= 0) {
             return;
         }
         int idx;
@@ -2203,6 +2156,7 @@ public class TimeGraphControl extends TimeGraphBaseControl
                 setCapture(true);
 
                 fDragState = DRAG_SELECTION;
+                fDragBeginMarker = false;
                 fDragButton = e.button;
                 fDragX = e.x;
                 fDragX0 = fDragX;
@@ -2214,7 +2168,9 @@ public class TimeGraphControl extends TimeGraphBaseControl
                 if ((e.stateMask & SWT.MODIFIER_MASK) == SWT.SHIFT) {
                     long time = getTimeAtX(e.x);
                     if (Math.abs(time - selectionBegin) < Math.abs(time - selectionEnd)) {
-                        fDragX0 = xEnd;
+                        fDragBeginMarker = true;
+                        fDragX = xEnd;
+                        fDragX0 = e.x;
                         fDragTime0 = selectionEnd;
                     } else {
                         fDragX0 = xBegin;
@@ -2223,7 +2179,9 @@ public class TimeGraphControl extends TimeGraphBaseControl
                 } else {
                     long time = getTimeAtX(e.x);
                     if (Math.abs(e.x - xBegin) < SNAP_WIDTH && Math.abs(time - selectionBegin) <= Math.abs(time - selectionEnd)) {
-                        fDragX0 = xEnd;
+                        fDragBeginMarker = true;
+                        fDragX = xEnd;
+                        fDragX0 = e.x;
                         fDragTime0 = selectionEnd;
                     } else if (Math.abs(e.x - xEnd) < SNAP_WIDTH && Math.abs(time - selectionEnd) <= Math.abs(time - selectionBegin)) {
                         fDragX0 = xBegin;
@@ -2250,7 +2208,7 @@ public class TimeGraphControl extends TimeGraphBaseControl
             }
         } else if (3 == e.button) {
             setCapture(true);
-            fDragX = Math.min(Math.max(e.x, fTimeProvider.getNameSpace()), getCtrlSize().x - RIGHT_MARGIN);
+            fDragX = Math.min(Math.max(e.x, fTimeProvider.getNameSpace()), getSize().x - RIGHT_MARGIN);
             fDragX0 = fDragX;
             fDragTime0 = getTimeAtX(fDragX0);
             fDragState = DRAG_ZOOM;
@@ -2281,13 +2239,9 @@ public class TimeGraphControl extends TimeGraphBaseControl
                     long time = getTimeAtX(e.x);
                     fTimeProvider.setSelectedTimeNotify(time, false);
                 } else {
-                    long time0 = fDragTime0;
-                    long time1 = getTimeAtX(fDragX);
-                    if (time0 <= time1) {
-                        fTimeProvider.setSelectionRangeNotify(time0, time1);
-                    } else {
-                        fTimeProvider.setSelectionRangeNotify(time1, time0);
-                    }
+                    long time0 = fDragBeginMarker ? getTimeAtX(fDragX0) : fDragTime0;
+                    long time1 = fDragBeginMarker ? fDragTime0 : getTimeAtX(fDragX);
+                    fTimeProvider.setSelectionRangeNotify(time0, time1);
                 }
                 fDragState = DRAG_NONE;
                 redraw();
@@ -2323,7 +2277,7 @@ public class TimeGraphControl extends TimeGraphBaseControl
             fMouseOverSplitLine = false;
             redraw();
         }
-        updateStatusLine(NO_STATUS);
+        updateStatusLine(STATUS_WITHOUT_CURSOR_TIME);
     }
 
     @Override
@@ -2336,16 +2290,24 @@ public class TimeGraphControl extends TimeGraphBaseControl
             return;
         }
         boolean zoomScroll = false;
+        boolean horizontalScroll = false;
         Point p = getParent().toControl(getDisplay().getCursorLocation());
         Point parentSize = getParent().getSize();
         if (p.x >= 0 && p.x < parentSize.x && p.y >= 0 && p.y < parentSize.y) {
             // over the parent control
-            if (e.x > getCtrlSize().x) {
+            if (e.x > getSize().x) {
                 // over the vertical scroll bar
                 zoomScroll = false;
-            } else if (e.y < 0 || e.y >= getCtrlSize().y) {
-                // over the time scale or horizontal scroll bar
+            } else if (e.y < 0) {
+                // over the time scale
                 zoomScroll = true;
+            } else if (e.y >= getSize().y) {
+                // over the horizontal scroll bar
+                if ((e.stateMask & SWT.MODIFIER_MASK) == SWT.CTRL) {
+                    zoomScroll = true;
+                } else {
+                    horizontalScroll = true;
+                }
             } else {
                 if (e.x < fTimeProvider.getNameSpace()) {
                     // over the name space
@@ -2368,6 +2330,8 @@ public class TimeGraphControl extends TimeGraphBaseControl
             } else if (e.count < 0) {
                 zoom(false);
             }
+        } else if (horizontalScroll) {
+            horizontalScroll(e.count > 0);
         } else {
             setTopIndex(getTopIndex() - e.count);
         }
@@ -2382,46 +2346,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
         }
     }
 
-    @Override
-    public void controlMoved(ControlEvent e) {
-    }
-
-    @Override
-    public void controlResized(ControlEvent e) {
-        adjustScrolls();
-    }
-
-    @Override
-    public void widgetDefaultSelected(SelectionEvent e) {
-    }
-
-    @Override
-    public void widgetSelected(SelectionEvent e) {
-        if (e.widget == getVerticalBar()) {
-            setTopIndex(getVerticalBar().getSelection());
-        } else if (e.widget == getHorizontalBar() && null != fTimeProvider) {
-            int start = getHorizontalBar().getSelection();
-            long time0 = fTimeProvider.getTime0();
-            long time1 = fTimeProvider.getTime1();
-            long timeMin = fTimeProvider.getMinTime();
-            long timeMax = fTimeProvider.getMaxTime();
-            long delta = timeMax - timeMin;
-
-            long range = time1 - time0;
-            time0 = timeMin + Math.round(delta * ((double) start / H_SCROLLBAR_MAX));
-            time1 = time0 + range;
-
-            // TODO: Follow-up with Bug 310310
-            // In Linux SWT.DRAG is the only value received
-            // https://bugs.eclipse.org/bugs/show_bug.cgi?id=310310
-            if (e.detail == SWT.DRAG) {
-                fTimeProvider.setStartFinishTime(time0, time1);
-            } else {
-                fTimeProvider.setStartFinishTimeNotify(time0, time1);
-            }
-        }
-    }
-
     @Override
     public int getBorderWidth() {
         return fBorderWidth;
@@ -2479,8 +2403,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
      * @param rowHeight
      *            The height
      * @return true if the height is successfully stored, false otherwise
-     *
-     * @since 2.1
      */
     public boolean setItemHeight(ITimeGraphEntry entry, int rowHeight) {
         Item item = fItemData.findItem(entry);
@@ -2509,8 +2431,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
 
     /**
      * @return The entries that are currently filtered out
-     *
-     * @since 2.0
      */
     public List<ITimeGraphEntry> getFilteredOut() {
         return fItemData.getFilteredOut();
@@ -2545,7 +2465,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
 
     /**
      * @param filter The filter object to be attached to the view
-     * @since 2.0
      */
     public void addFilter(ViewerFilter filter) {
         if (!fFilters.contains(filter)) {
@@ -2555,15 +2474,11 @@ public class TimeGraphControl extends TimeGraphBaseControl
 
     /**
      * @param filter The filter object to be attached to the view
-     * @since 2.0
      */
     public void removeFilter(ViewerFilter filter) {
         fFilters.remove(filter);
     }
 
-    /**
-     * @since 3.0
-     */
     @Override
     public void colorSettingsChanged(StateItem[] stateItems) {
         /* Destroy previous colors from the resource manager */
@@ -2744,9 +2659,6 @@ public class TimeGraphControl extends TimeGraphBaseControl
         }
     }
 
-    /**
-     * @since 1.2
-     */
     @Override
     public void menuDetected(MenuDetectEvent e) {
         if (null == fTimeProvider) {
@@ -2788,6 +2700,32 @@ public class TimeGraphControl extends TimeGraphBaseControl
         }
     }
 
+    /**
+     * Perform the alignment operation.
+     *
+     * @param offset
+     *            the alignment offset
+     *
+     * @see ITmfTimeAligned
+     *
+     * @since 1.0
+     */
+    public void performAlign(int offset) {
+        fTimeProvider.setNameSpace(offset);
+    }
+
+    /**
+     * Return the time alignment information
+     *
+     * @return the time alignment information
+     *
+     * @see ITmfTimeAligned
+     *
+     * @since 1.0
+     */
+    public TmfTimeViewAlignmentInfo getTimeViewAlignmentInfo() {
+        return new TmfTimeViewAlignmentInfo(getShell(), toDisplay(0, 0), fTimeProvider.getNameSpace());
+    }
 }
 
 
This page took 0.069046 seconds and 5 git commands to generate.