tmf: Support for context-sensitive menu in Time Graph viewers
authorBernd Hufmann <Bernd.Hufmann@ericsson.com>
Thu, 7 Apr 2016 13:06:55 +0000 (09:06 -0400)
committerBernd Hufmann <bernd.hufmann@ericsson.com>
Tue, 12 Apr 2016 14:13:13 +0000 (10:13 -0400)
Up to now, there was a specific context-sensitive menu in the
Resources Flow view using the right mouse button on the namespace.

This commit adds a generic support for context-sensitive menus to the
AbstractTimeGraph views when using Time Graph viewers alone. 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 Resources view have been adjusted to use this
new API

Change-Id: Ic9f3ff08fda27ffabc91d6054fe460b8fc764835
Signed-off-by: Bernd Hufmann <Bernd.Hufmann@ericsson.com>
Reviewed-on: https://git.eclipse.org/r/70140
Reviewed-by: Hudson CI
Reviewed-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
Tested-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/analysis/os/linux/ui/views/resources/ResourcesView.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/timegraph/AbstractTimeGraphView.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/widgets/timegraph/widgets/TimeGraphControl.java

index deb5b62f27955c5c000c1e32ccbfef029ed481d9..e1b2ec4694d02f20f3ff50a0bb51643bbaa1692c 100644 (file)
@@ -25,12 +25,9 @@ import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.swt.events.MenuDetectEvent;
-import org.eclipse.swt.events.MenuDetectListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Menu;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.tracecompass.analysis.os.linux.core.kernel.Attributes;
 import org.eclipse.tracecompass.analysis.os.linux.core.kernel.KernelAnalysisModule;
 import org.eclipse.tracecompass.analysis.os.linux.core.signals.TmfCpuSelectedSignal;
@@ -45,13 +42,11 @@ import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
 import org.eclipse.tracecompass.tmf.core.statesystem.TmfStateSystemAnalysisModule;
 import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
 import org.eclipse.tracecompass.tmf.ui.views.timegraph.AbstractStateSystemTimeGraphView;
-import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.TimeGraphViewer;
 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.ITimeEvent;
 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.ITimeGraphEntry;
 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.NullTimeEvent;
 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.TimeEvent;
 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.TimeGraphEntry;
-import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.widgets.TimeGraphControl;
 
 /**
  * Main implementation for the LTTng 2.0 kernel Resource view
@@ -67,8 +62,6 @@ public class ResourcesView extends AbstractStateSystemTimeGraphView {
             Messages.ResourcesView_stateTypeName
     };
 
-    private MenuManager fMenuMgr = new MenuManager();
-
     private int fCurrentCpu = -1;
 
     // Timeout between updates in the build thread in ms
@@ -103,41 +96,26 @@ public class ResourcesView extends AbstractStateSystemTimeGraphView {
         }
     }
 
-    @Override
-    public void createPartControl(Composite parent) {
-        super.createPartControl(parent);
-        createContextMenu();
-    }
 
-    private void createContextMenu() {
-        fMenuMgr = new MenuManager();
-        final TimeGraphViewer timeGraphViewer = getTimeGraphViewer();
-        Menu menu = fMenuMgr.createContextMenu(timeGraphViewer.getTimeGraphControl());
-        timeGraphViewer.getTimeGraphControl().setMenu(menu);
-        getTimeGraphViewer().getTimeGraphControl().addTimeGraphEntryMenuListener(new MenuDetectListener() {
-            @Override
-            public void menuDetected(MenuDetectEvent event) {
-                fMenuMgr.removeAll();
-                final TimeGraphControl timeGraphControl = ResourcesView.this.getTimeGraphViewer().getTimeGraphControl();
-                Point point = timeGraphControl.toControl(event.x, event.y);
-                // this is super important, it makes zoom still work. Do not try
-                // to extend to the time graph area.
-                if (point.x < timeGraphViewer.getNameSpace()) {
-                    ITimeGraphEntry item = timeGraphControl.getEntry(point);
-
-                    if (item instanceof ResourcesEntry) {
-                        ResourcesEntry resourcesEntry = (ResourcesEntry) item;
-                        if (resourcesEntry.getType().equals(ResourcesEntry.Type.CPU)) {
-                            if (fCurrentCpu >= 0) {
-                                fMenuMgr.add(new UnfollowCpuAction(ResourcesView.this, resourcesEntry.getId(), resourcesEntry.getTrace()));
-                            } else {
-                                fMenuMgr.add(new FollowCpuAction(ResourcesView.this, resourcesEntry.getId(), resourcesEntry.getTrace()));
-                            }
-                        }
+    /**
+     * @since 2.0
+     */
+    @Override
+    protected void fillTimeGraphEntryContextMenu(@NonNull IMenuManager menuManager) {
+        ISelection selection = getSite().getSelectionProvider().getSelection();
+        if (selection instanceof IStructuredSelection) {
+            IStructuredSelection sSel = (IStructuredSelection) selection;
+            if (sSel.getFirstElement() instanceof ResourcesEntry) {
+                ResourcesEntry resourcesEntry = (ResourcesEntry) sSel.getFirstElement();
+                if (resourcesEntry.getType().equals(ResourcesEntry.Type.CPU)) {
+                    if (fCurrentCpu >= 0) {
+                        menuManager.add(new UnfollowCpuAction(ResourcesView.this, resourcesEntry.getId(), resourcesEntry.getTrace()));
+                    } else {
+                        menuManager.add(new FollowCpuAction(ResourcesView.this, resourcesEntry.getId(), resourcesEntry.getTrace()));
                     }
                 }
             }
-        });
+        }
     }
 
     private static class ResourcesFilterLabelProvider extends TreeLabelProvider {
index 85a9590948fd3881cc85997023398a9cf56c11d5..01a0b1c5cedfec22596d2deddfa16f5bb532406d 100644 (file)
@@ -63,9 +63,12 @@ import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.jface.viewers.ViewerFilter;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MenuDetectEvent;
+import org.eclipse.swt.events.MenuDetectListener;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.graphics.RGBA;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Display;
@@ -111,6 +114,7 @@ import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.ITimeEvent;
 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.ITimeGraphEntry;
 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.TimeGraphControl;
 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.widgets.Utils.TimeFormat;
 import org.eclipse.ui.IActionBars;
 import org.eclipse.ui.IWorkbenchActionConstants;
@@ -240,7 +244,8 @@ public abstract class AbstractTimeGraphView extends TmfView implements ITmfTimeA
 
     /**
      * 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.
+     * This will be used on the tree viewer in case of the time graph combo
+     * or the on the namespace in case of a single time graph viewer.
      */
     private final @NonNull MenuManager fEntryMenuManager = new MenuManager();
 
@@ -2111,21 +2116,42 @@ public abstract class AbstractTimeGraphView extends TmfView implements ITmfTimeA
 
     private void createContextMenu() {
         TimeGraphCombo combo = getTimeGraphCombo();
+        fEntryMenuManager.setRemoveAllWhenShown(true);
         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() {
+        } else {
+            TimeGraphControl timeGraphControl = getTimeGraphViewer().getTimeGraphControl();
+            final Menu entryMenu = fEntryMenuManager.createContextMenu(timeGraphControl);
+            timeGraphControl.addTimeGraphEntryMenuListener(new MenuDetectListener() {
                 @Override
-                public void menuAboutToShow(IMenuManager manager) {
-                    fillTimeGraphEntryContextMenu(fEntryMenuManager);
-                    fEntryMenuManager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
+                public void menuDetected(MenuDetectEvent event) {
+                    Point p = timeGraphControl.toControl(event.x, event.y);
+                    /*
+                     * The TimeGraphControl will call the TimeGraphEntryMenuListener
+                     * before the TimeEventMenuListener. If the event is
+                     * triggered on the namespace then show the menu else
+                     * clear the menu.
+                     */
+                    if (p.x < getTimeGraphViewer().getNameSpace()) {
+                        timeGraphControl.setMenu(entryMenu);
+                    } else {
+                        timeGraphControl.setMenu(null);
+                        event.doit = false;
+                    }
                 }
             });
-            getSite().registerContextMenu(fEntryMenuManager, treeViewer);
         }
+        fEntryMenuManager.addMenuListener(new IMenuListener() {
+            @Override
+            public void menuAboutToShow(IMenuManager manager) {
+               fillTimeGraphEntryContextMenu(fEntryMenuManager);
+                fEntryMenuManager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
+            }
+        });
+        getSite().registerContextMenu(fEntryMenuManager, fTimeGraphWrapper.getSelectionProvider());
     }
 
     /**
index 31cb7d1df7cff96afdb2d22f60a658c10e95bdd2..067f6ece0ea8127639a1dfb6cd2180dcb5701107 100644 (file)
@@ -727,10 +727,9 @@ public class TimeGraphControl extends TimeGraphBaseControl
         if (null != trace && null != fTimeProvider) {
             long selectedTime = fTimeProvider.getSelectionBegin();
             ITimeEvent event = Utils.findEvent(trace, selectedTime, 0);
+            sel.add(trace);
             if (event != null) {
                 sel.add(event);
-            } else {
-                sel.add(trace);
             }
         }
         return sel;
@@ -3214,24 +3213,29 @@ public class TimeGraphControl extends TimeGraphBaseControl
             e.doit = true;
             Item item = fItemData.fExpandedItems[idx];
             ITimeGraphEntry entry = item.fEntry;
+
+            /* Send menu event for the time graph entry */
+            e.doit = true;
+            e.data = entry;
+            fireMenuEventOnTimeGraphEntry(e);
+            Menu menu = getMenu();
+            if (e.doit && (menu != null)) {
+                menu.setVisible(true);
+            }
+
+            /* Send menu event for time event */
             if (entry.hasTimeEvents()) {
                 ITimeEvent event = Utils.findEvent(entry, getTimeAtX(p.x), 2);
                 if (event != null) {
+                    e.doit = true;
                     e.data = event;
                     fireMenuEventOnTimeEvent(e);
-                    Menu menu = getMenu();
+                    menu = getMenu();
                     if (e.doit && (menu != null)) {
                         menu.setVisible(true);
                     }
-                    return;
                 }
             }
-            e.data = entry;
-            fireMenuEventOnTimeGraphEntry(e);
-            Menu menu = getMenu();
-            if (e.doit && (menu != null)) {
-                menu.setVisible(true);
-            }
         }
     }
 
This page took 0.029549 seconds and 5 git commands to generate.