tmf: Support for context-sensitive menu in Time Graph combos
authorBernd Hufmann <Bernd.Hufmann@ericsson.com>
Thu, 7 Apr 2016 12:10:47 +0000 (08:10 -0400)
committerBernd Hufmann <bernd.hufmann@ericsson.com>
Tue, 12 Apr 2016 00:14:26 +0000 (20:14 -0400)
Up to now, there were specific context-sensitive menus in Call Stack
and Control Flow view using the right mouse button on the tree.

This commit adds a generic support for context-sensitive menus to the
AbstractTimeGaph views when using Time Graph combos. It allows
extending classes to add both programmatically and declaratively
(using the plug-in.xml) menu entries to the context-sensitive menu.

The implementation of the Call Stack view and Control Flow view have
been adjusted to use this new API.

Change-Id: Ic0f0971ac32767446d0f555315f6ecbf0aeba09a
Signed-off-by: Bernd Hufmann <Bernd.Hufmann@ericsson.com>
Reviewed-on: https://git.eclipse.org/r/70136
Reviewed-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
Tested-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
Reviewed-by: Hudson CI
analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/analysis/os/linux/ui/views/controlflow/ControlFlowView.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/callstack/CallStackView.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/timegraph/AbstractTimeGraphView.java

index ce9a84318eb73701de6225541701cc6fd0d659c7..2f77ab1ba412e43a9f0350ca0f9b354179199554 100644 (file)
@@ -24,17 +24,12 @@ import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
 import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
 import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.events.MenuDetectEvent;
-import org.eclipse.swt.events.MenuDetectListener;
-import org.eclipse.swt.graphics.Point;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.TreeItem;
 import org.eclipse.tracecompass.analysis.os.linux.core.kernel.Attributes;
 import org.eclipse.tracecompass.analysis.os.linux.core.kernel.KernelAnalysisModule;
 import org.eclipse.tracecompass.internal.analysis.os.linux.core.kernel.handlers.KernelEventHandlerUtils;
@@ -54,7 +49,6 @@ import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
 import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
 import org.eclipse.tracecompass.tmf.core.util.Pair;
 import org.eclipse.tracecompass.tmf.ui.views.timegraph.AbstractStateSystemTimeGraphView;
-import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.TimeGraphCombo;
 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.ILinkEvent;
 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.ITimeEvent;
 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.ITimeGraphEntry;
@@ -119,8 +113,6 @@ public class ControlFlowView extends AbstractStateSystemTimeGraphView {
         COLUMN_COMPARATORS = l.toArray(new Comparator[l.size()]);
     }
 
-    private MenuManager fMenuMgr;
-
     // ------------------------------------------------------------------------
     // Constructors
     // ------------------------------------------------------------------------
@@ -146,32 +138,21 @@ public class ControlFlowView extends AbstractStateSystemTimeGraphView {
         // add "Uncheck inactive" Button to TimeGraphFilterDialog
         super.getTimeGraphCombo().addTimeGraphFilterUncheckInactiveButton(
                 new ControlFlowCheckActiveProvider(Messages.ControlFlowView_uncheckInactiveLabel, Messages.ControlFlowView_uncheckInactiveToolTip));
-        createContextMenu();
     }
 
-    private void createContextMenu() {
-        fMenuMgr = new MenuManager();
-        final TimeGraphCombo timeGraphCombo = getTimeGraphCombo();
-        TreeViewer treeViewer = timeGraphCombo.getTreeViewer();
-        Control control = treeViewer.getControl();
-        Menu menu = fMenuMgr.createContextMenu(control);
-        control.setMenu(menu);
-        control.addMenuDetectListener(new MenuDetectListener() {
-            @Override
-            public void menuDetected(MenuDetectEvent event) {
-                fMenuMgr.removeAll();
-                Point point = control.toControl(event.x, event.y);
-                // this is super important, it makes zoom still work. Do not try
-                // to extend to the time graph area.
-                TreeItem item = treeViewer.getTree().getItem(point);
-
-                if (item.getData() instanceof ControlFlowEntry) {
-                    ControlFlowEntry entry = (ControlFlowEntry) item.getData();
-                    fMenuMgr.add(new FollowThreadAction(ControlFlowView.this, entry.getName(), entry.getThreadId(), entry.getTrace()));
-                }
+    /**
+     * @since 2.0
+     */
+    @Override
+    protected void fillTimeGraphEntryContextMenu(@NonNull IMenuManager menuManager) {
+        ISelection selection = getSite().getSelectionProvider().getSelection();
+        if (selection instanceof StructuredSelection) {
+            StructuredSelection sSel = (StructuredSelection) selection;
+            if (sSel.getFirstElement() instanceof ControlFlowEntry) {
+                ControlFlowEntry entry = (ControlFlowEntry) sSel.getFirstElement();
+                menuManager.add(new FollowThreadAction(ControlFlowView.this, entry.getName(), entry.getThreadId(), entry.getTrace()));
             }
-        });
-
+        }
     }
 
     @Override
index 110b9a3bc38cf55c4434fb9fb92d88fe67b7c242..9e2f560a72ca4ae568992ba02bfae1fb7f5956ce 100644 (file)
@@ -28,8 +28,8 @@ import org.eclipse.jdt.annotation.Nullable;
 import org.eclipse.jface.action.Action;
 import org.eclipse.jface.action.GroupMarker;
 import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
 import org.eclipse.jface.action.Separator;
 import org.eclipse.jface.dialogs.IDialogConstants;
 import org.eclipse.jface.dialogs.IDialogSettings;
@@ -40,15 +40,12 @@ import org.eclipse.jface.viewers.DoubleClickEvent;
 import org.eclipse.jface.viewers.IDoubleClickListener;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.MouseAdapter;
 import org.eclipse.swt.events.MouseEvent;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Tree;
 import org.eclipse.tracecompass.internal.tmf.ui.Activator;
 import org.eclipse.tracecompass.internal.tmf.ui.ITmfImageConstants;
 import org.eclipse.tracecompass.internal.tmf.ui.Messages;
@@ -421,7 +418,6 @@ public class CallStackView extends AbstractTimeGraphView {
         });
 
         contributeToActionBars();
-        createContextMenu();
         loadSortOption();
 
         IEditorPart editor = getSite().getPage().getActiveEditor();
@@ -855,19 +851,15 @@ public class CallStackView extends AbstractTimeGraphView {
         manager.add(getTimeGraphViewer().getZoomOutAction());
     }
 
-    private void createContextMenu() {
-        final MenuManager contextMenu = new MenuManager();
+    /**
+     * @since 2.0
+     */
+    @Override
+    protected void fillTimeGraphEntryContextMenu(IMenuManager contextMenu) {
         contextMenu.add(new GroupMarker(IWorkbenchActionConstants.GROUP_REORGANIZE));
         contextMenu.add(getSortByNameAction());
         contextMenu.add(getSortByIdAction());
         contextMenu.add(getSortByTimeAction());
-        contextMenu.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
-
-        TreeViewer treeViewer = getTimeGraphCombo().getTreeViewer();
-        Tree tree = treeViewer.getTree();
-        Menu menu = contextMenu.createContextMenu(tree);
-        tree.setMenu(menu);
-        getSite().registerContextMenu(contextMenu, treeViewer);
     }
 
     /**
index 0f5aca1193b61288b69298bc791c5e592e86614e..85a9590948fd3881cc85997023398a9cf56c11d5 100644 (file)
@@ -45,10 +45,13 @@ import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
 import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.GroupMarker;
 import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuListener;
 import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.action.IStatusLineManager;
 import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.MenuManager;
 import org.eclipse.jface.action.Separator;
 import org.eclipse.jface.viewers.AbstractTreeViewer;
 import org.eclipse.jface.viewers.ILabelProvider;
@@ -66,6 +69,7 @@ import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.graphics.RGBA;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Menu;
 import org.eclipse.swt.widgets.Tree;
 import org.eclipse.swt.widgets.TreeColumn;
 import org.eclipse.tracecompass.internal.tmf.ui.Activator;
@@ -109,6 +113,7 @@ import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.MarkerEvent;
 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.TimeGraphEntry;
 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.widgets.Utils.TimeFormat;
 import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IWorkbenchActionConstants;
 
 /**
  * An abstract view all time graph views can inherit
@@ -233,6 +238,12 @@ public abstract class AbstractTimeGraphView extends TmfView implements ITmfTimeA
     /** Flag to indicate to reveal selection */
     private volatile boolean fIsRevealSelection = false;
 
+    /**
+     * Menu Manager for context-sensitive menu for time graph entries.
+     * This will be used on the tree viewer in case of the time graph combo.
+     */
+    private final @NonNull MenuManager fEntryMenuManager = new MenuManager();
+
     // ------------------------------------------------------------------------
     // Classes
     // ------------------------------------------------------------------------
@@ -1251,6 +1262,8 @@ public abstract class AbstractTimeGraphView extends TmfView implements ITmfTimeA
         getSite().setSelectionProvider(fTimeGraphWrapper.getSelectionProvider());
 
         ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE);
+
+        createContextMenu();
     }
 
     @Override
@@ -2095,4 +2108,34 @@ public abstract class AbstractTimeGraphView extends TmfView implements ITmfTimeA
             return fSelection;
         }
     }
+
+    private void createContextMenu() {
+        TimeGraphCombo combo = getTimeGraphCombo();
+        if (combo != null) {
+            fEntryMenuManager.setRemoveAllWhenShown(true);
+            TreeViewer treeViewer = combo.getTreeViewer();
+            Tree tree = treeViewer.getTree();
+            Menu menu = fEntryMenuManager.createContextMenu(tree);
+            tree.setMenu(menu);
+            fEntryMenuManager.addMenuListener(new IMenuListener() {
+                @Override
+                public void menuAboutToShow(IMenuManager manager) {
+                    fillTimeGraphEntryContextMenu(fEntryMenuManager);
+                    fEntryMenuManager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
+                }
+            });
+            getSite().registerContextMenu(fEntryMenuManager, treeViewer);
+        }
+    }
+
+    /**
+     * Fill context menu
+     *
+     * @param menuManager
+     *          a menuManager to fill
+     * @since 2.0
+     */
+    protected void fillTimeGraphEntryContextMenu (@NonNull IMenuManager menuManager) {
+
+    }
 }
This page took 0.031539 seconds and 5 git commands to generate.