From a974fd46d1226b7f1390f93536de2b5c5e12cbb8 Mon Sep 17 00:00:00 2001 From: Patrick Tasse Date: Thu, 3 Nov 2016 14:47:49 -0400 Subject: [PATCH] tmf: Fix MenuDetect handling in TimeGraphControl - If the menu is invoked with the mouse over the name space, then there is no need to delay the menu detect handling until mouseUp, since the right mouse button isn't being used to zoom - If it is a pending menu detect callback on mouseUp, and another drag operation is in progress or it is a drag zoom outside of the margin, then make sure the menu is not made visible by setting e.doit to false. - If the menu is invoked with the mouse over the name space, or with the keyboard, if there is any drag operation in progress make sure the menu is not made visible by setting e.doit to false. - If the menu detect is handled immediately (not after a pending menu detect on mouseUp) then there is no need to set the menu visible programmatically since the platform will do it after the MenuDetect event handling when e.doit is true. Change-Id: I0d76b9908782fc853a065567a6e907da5e2d9c86 Signed-off-by: Patrick Tasse Reviewed-on: https://git.eclipse.org/r/84434 Reviewed-by: Hudson CI Reviewed-by: Matthew Khouzam --- .../timegraph/widgets/TimeGraphControl.java | 35 ++++++++++++++----- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/widgets/timegraph/widgets/TimeGraphControl.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/widgets/timegraph/widgets/TimeGraphControl.java index 25129bb3d4..8e062d5a58 100644 --- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/widgets/timegraph/widgets/TimeGraphControl.java +++ b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/widgets/timegraph/widgets/TimeGraphControl.java @@ -1408,6 +1408,10 @@ public class TimeGraphControl extends TimeGraphBaseControl return Math.abs(x - nameWidth) < SNAP_WIDTH; } + boolean isOverTimeSpace(int x, int y) { + Point size = getSize(); + return x >= fTimeProvider.getNameSpace() && x < size.x && y >= 0 && y < size.y; + } /** * Gets the {@link ITimeGraphEntry} at the given location. * @@ -3351,8 +3355,13 @@ public class TimeGraphControl extends TimeGraphBaseControl if (null == fTimeProvider) { return; } + /* + * This flag indicates if menu was prevented from being shown below and + * therefore must be made visible on callback from mouseUp(). + */ + boolean pendingEventCallback = fPendingMenuDetectEvent != null; Point p = toControl(e.x, e.y); - if (e.detail == SWT.MENU_MOUSE) { + if (e.detail == SWT.MENU_MOUSE && isOverTimeSpace(p.x, p.y)) { if (fPendingMenuDetectEvent == null) { /* Feature in Linux. The MenuDetectEvent is received before mouseDown. * Store the event and trigger it later just before handling mouseUp. @@ -3360,25 +3369,35 @@ public class TimeGraphControl extends TimeGraphBaseControl */ fPendingMenuDetectEvent = e; /* - * Prevent the platform to show the menu when returning. The - * menu will be shown (see below) when this method is called - * again during mouseup(). + * Prevent the platform to show the menu when returning. The + * menu will be shown (see below) when this method is called + * again during mouseUp(). */ e.doit = false; return; } fPendingMenuDetectEvent = null; - if ((p.x >= fTimeProvider.getNameSpace()) && (fDragState != DRAG_ZOOM || !isInDragZoomMargin())) { + if (fDragState != DRAG_ZOOM || !isInDragZoomMargin()) { + /* + * Don't show the menu on mouseUp() if a drag zoom is in + * progress with a drag range outside of the drag zoom margin, + * or if any other drag operation, or none, is in progress. + */ + e.doit = false; return; } } else { if (fDragState != DRAG_NONE) { + /* + * Don't show the menu on keyboard menu or mouse menu outside of + * the time space if any drag operation is in progress. + */ + e.doit = false; return; } } int idx = getItemIndexAtY(p.y); if (idx >= 0 && idx < fItemData.fExpandedItems.length) { - e.doit = true; Item item = fItemData.fExpandedItems[idx]; ITimeGraphEntry entry = item.fEntry; @@ -3387,7 +3406,7 @@ public class TimeGraphControl extends TimeGraphBaseControl e.data = entry; fireMenuEventOnTimeGraphEntry(e); Menu menu = getMenu(); - if (e.doit && (menu != null)) { + if (pendingEventCallback && e.doit && (menu != null)) { menu.setVisible(true); } @@ -3399,7 +3418,7 @@ public class TimeGraphControl extends TimeGraphBaseControl e.data = event; fireMenuEventOnTimeEvent(e); menu = getMenu(); - if (e.doit && (menu != null)) { + if (pendingEventCallback && e.doit && (menu != null)) { menu.setVisible(true); } } -- 2.34.1