flamegraph: Add go to min/max context menus in UI
authorMatthew Khouzam <matthew.khouzam@ericsson.com>
Fri, 12 Aug 2016 19:57:09 +0000 (15:57 -0400)
committerBernd Hufmann <bernd.hufmann@ericsson.com>
Tue, 23 Aug 2016 18:25:13 +0000 (14:25 -0400)
Change-Id: I2e62a0210b18d2d53aa96fd288dcd772244cc497
Signed-off-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
Signed-off-by: Bernd Hufmann <Bernd.Hufmann@ericsson.com>
Reviewed-on: https://git.eclipse.org/r/78994
Reviewed-by: Hudson CI
Reviewed-by: Patrick Tasse <patrick.tasse@gmail.com>
Tested-by: Patrick Tasse <patrick.tasse@gmail.com>
Reviewed-by: Jean-Christian Kouame <jean-christian.kouame@ericsson.com>
Tested-by: Jean-Christian Kouame <jean-christian.kouame@ericsson.com>
analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/flamegraph/FlameGraphView.java
analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/flamegraph/Messages.java
analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/flamegraph/messages.properties

index bed3e4af17cfb108e817bad8306cbe097dd16117..702225b8668ae5ccf2ab74f3d5741525cd96c8b7 100644 (file)
@@ -15,22 +15,38 @@ import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.GroupMarker;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MenuDetectEvent;
+import org.eclipse.swt.events.MenuDetectListener;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Menu;
 import org.eclipse.tracecompass.internal.analysis.timing.core.callgraph.CallGraphAnalysis;
 import org.eclipse.tracecompass.internal.analysis.timing.ui.callgraph.CallGraphAnalysisUI;
+import org.eclipse.tracecompass.segmentstore.core.ISegment;
+import org.eclipse.tracecompass.tmf.core.signal.TmfSelectionRangeUpdatedSignal;
 import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
 import org.eclipse.tracecompass.tmf.core.signal.TmfTraceClosedSignal;
 import org.eclipse.tracecompass.tmf.core.signal.TmfTraceOpenedSignal;
 import org.eclipse.tracecompass.tmf.core.signal.TmfTraceSelectedSignal;
+import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
 import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
 import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils;
 import org.eclipse.tracecompass.tmf.ui.editors.ITmfTraceEditor;
 import org.eclipse.tracecompass.tmf.ui.views.TmfView;
 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.TimeGraphPresentationProvider;
 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.TimeGraphViewer;
+import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.widgets.TimeGraphControl;
 import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchActionConstants;
 
 /**
  * View to display the flame graph .This uses the flameGraphNode tree generated
@@ -53,6 +69,8 @@ public class FlameGraphView extends TmfView {
 
     private ITmfTrace fTrace;
 
+    private final @NonNull MenuManager fEventMenuManager = new MenuManager();
+
     /**
      * Constructor
      */
@@ -75,6 +93,8 @@ public class FlameGraphView extends TmfView {
                 traceSelected(new TmfTraceSelectedSignal(this, trace));
             }
         }
+        getSite().setSelectionProvider(fTimeGraphViewer.getSelectionProvider());
+        createTimeEventContextMenu();
     }
 
     /**
@@ -151,4 +171,78 @@ public class FlameGraphView extends TmfView {
         fTimeGraphViewer.setFocus();
     }
 
+    private void createTimeEventContextMenu() {
+        fEventMenuManager.setRemoveAllWhenShown(true);
+        TimeGraphControl timeGraphControl = fTimeGraphViewer.getTimeGraphControl();
+        final Menu timeEventMenu = fEventMenuManager.createContextMenu(timeGraphControl);
+
+        timeGraphControl.addTimeGraphEntryMenuListener(new MenuDetectListener() {
+            @Override
+            public void menuDetected(MenuDetectEvent event) {
+                /*
+                 * The TimeGraphControl will call the TimeGraphEntryMenuListener
+                 * before the TimeEventMenuListener. We need to clear the menu
+                 * for the case the selection was done on the namespace where
+                 * the time event listener below won't be called afterwards.
+                 */
+                timeGraphControl.setMenu(null);
+                event.doit = false;
+            }
+        });
+        timeGraphControl.addTimeEventMenuListener(new MenuDetectListener() {
+            @Override
+            public void menuDetected(MenuDetectEvent event) {
+                Menu menu = timeEventMenu;
+                if (event.data instanceof FlamegraphEvent) {
+                    timeGraphControl.setMenu(menu);
+                    return;
+                }
+                timeGraphControl.setMenu(null);
+                event.doit = false;
+            }
+        });
+
+        fEventMenuManager.addMenuListener(new IMenuListener() {
+            @Override
+            public void menuAboutToShow(IMenuManager manager) {
+                fillTimeEventContextMenu(fEventMenuManager);
+                fEventMenuManager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
+            }
+        });
+        getSite().registerContextMenu(fEventMenuManager, fTimeGraphViewer.getSelectionProvider());
+    }
+
+    /**
+     * Fill context menu
+     *
+     * @param menuManager
+     *          a menuManager to fill
+     */
+    protected void fillTimeEventContextMenu(@NonNull IMenuManager menuManager) {
+        ISelection selection = getSite().getSelectionProvider().getSelection();
+        if (selection instanceof IStructuredSelection) {
+            for (Object object : ((IStructuredSelection) selection).toList()) {
+                if (object instanceof FlamegraphEvent) {
+                    final FlamegraphEvent flamegraphEvent = (FlamegraphEvent) object;
+                    menuManager.add(new Action(Messages.FlameGraphView_GotoMaxDuration) {
+                        @Override
+                        public void run() {
+                            ISegment maxSeg = flamegraphEvent.getStatistics().getMaxSegment();
+                            TmfSelectionRangeUpdatedSignal sig = new TmfSelectionRangeUpdatedSignal(this, TmfTimestamp.fromNanos(maxSeg.getStart()), TmfTimestamp.fromNanos(maxSeg.getEnd()));
+                            broadcast(sig);
+                        }
+                    });
+
+                    menuManager.add(new Action(Messages.FlameGraphView_GotoMinDuration) {
+                        @Override
+                        public void run() {
+                            ISegment minSeg = flamegraphEvent.getStatistics().getMinSegment();
+                            TmfSelectionRangeUpdatedSignal sig = new TmfSelectionRangeUpdatedSignal(this, TmfTimestamp.fromNanos(minSeg.getStart()), TmfTimestamp.fromNanos(minSeg.getEnd()));
+                            broadcast(sig);
+                        }
+                    });
+                }
+            }
+        }
+    }
 }
index f67af9ee0a5c0d015cbe6e7a435e09fc901880e2..c1d249ca998656dd4dc862f558e79d3f1ef1b8f3 100644 (file)
@@ -77,6 +77,14 @@ public class Messages extends NLS {
      * The function's self times
      */
     public static String FlameGraph_SelfTimes;
+    /**
+     * Go to maximum duration
+     */
+    public static String FlameGraphView_GotoMaxDuration;
+    /**
+     * Go to minimum duration
+     */
+    public static String FlameGraphView_GotoMinDuration;
     /**
      * Execution of the callGraph Analysis
      */
index c1a40135d2e1a6c06ef63fba07bc7f68467bf29a..41386dc3bf327c730610864e532370911329efdd 100644 (file)
@@ -21,4 +21,6 @@ FlameGraph_Deviation=Function deviation
 FlameGraph_SelfTimeDeviation=Self time deviation
 FlameGraph_Durations=Durations
 FlameGraph_SelfTimes=Self times
+FlameGraphView_GotoMaxDuration=Go to maximum
+FlameGraphView_GotoMinDuration=Go to minimum
 CallGraphAnalysis_Execution=CallGraphAnalysis execution
This page took 0.032489 seconds and 5 git commands to generate.