analysis.ui: Add follow cpu context menu to resources view
authorMatthew Khouzam <matthew.khouzam@ericsson.com>
Wed, 16 Mar 2016 18:56:58 +0000 (14:56 -0400)
committerMatthew Khouzam <matthew.khouzam@ericsson.com>
Mon, 11 Apr 2016 13:57:29 +0000 (09:57 -0400)
This generates a TmfCpuSelectectedSignal that can be used by views listening in.

Change-Id: Ib7a19b600dfd6be8510b07b4b48cc60e05722833
Signed-off-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
Reviewed-on: https://git.eclipse.org/r/66651
Reviewed-by: Hudson CI
analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/signals/TmfCpuSelectedSignal.java
analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/analysis/os/linux/ui/views/resources/ResourcesView.java
analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/actions/FollowCpuAction.java [new file with mode: 0644]
analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/actions/Messages.java
analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/actions/UnfollowCpuAction.java [new file with mode: 0644]
analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/actions/messages.properties
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/widgets/timegraph/widgets/TimeGraphControl.java

index 07c5af0b98109dbbacbe157c924a24f04c37de39..b68594f9dc5e31ca8f05d0c72169c2086d2fb801 100644 (file)
@@ -28,7 +28,7 @@ public class TmfCpuSelectedSignal extends TmfTraceModelSignal {
      * @param source
      *            the source
      * @param core
-     *            the core number
+     *            the core number, -1 for all
      * @param trace
      *            the current trace that the cpu belongs to
      */
index f46e6d2d48d4a14a49816b7ccf9cb97c7ee83469..6e2df727d3f6f4f85e44163477c2cca51a30fc65 100644 (file)
@@ -27,19 +27,31 @@ import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
 import org.eclipse.tracecompass.analysis.os.linux.core.kernel.Attributes;
 import org.eclipse.tracecompass.analysis.os.linux.core.kernel.KernelAnalysisModule;
+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.tracecompass.analysis.os.linux.core.signals.TmfCpuSelectedSignal;
 import org.eclipse.tracecompass.analysis.os.linux.ui.views.resources.ResourcesEntry.Type;
 import org.eclipse.tracecompass.internal.analysis.os.linux.ui.Messages;
+import org.eclipse.tracecompass.internal.analysis.os.linux.ui.actions.FollowCpuAction;
+import org.eclipse.tracecompass.internal.analysis.os.linux.ui.actions.UnfollowCpuAction;
 import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem;
 import org.eclipse.tracecompass.statesystem.core.exceptions.AttributeNotFoundException;
 import org.eclipse.tracecompass.statesystem.core.interval.ITmfStateInterval;
+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
@@ -55,6 +67,10 @@ 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
     private static final long BUILD_UPDATE_TIMEOUT = 500;
 
@@ -87,6 +103,43 @@ 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().addMenuDetectListener(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()));
+                            }
+                        }
+                    }
+                }
+            }
+        });
+    }
+
     private static class ResourcesFilterLabelProvider extends TreeLabelProvider {
         @Override
         public String getColumnText(Object element, int columnIndex) {
@@ -396,4 +449,20 @@ public class ResourcesView extends AbstractStateSystemTimeGraphView {
         return eventList;
     }
 
+    /**
+     * Signal handler for a cpu selected signal.
+     *
+     * @param signal
+     *            the cpu selected signal
+     * @since 2.0
+     */
+    @TmfSignalHandler
+    public void listenToCpu(TmfCpuSelectedSignal signal) {
+        if (signal.getCore() >= 0) {
+            fCurrentCpu = signal.getCore();
+        } else {
+            fCurrentCpu = -1;
+        }
+    }
+
 }
diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/actions/FollowCpuAction.java b/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/actions/FollowCpuAction.java
new file mode 100644 (file)
index 0000000..d2e0b6e
--- /dev/null
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+
+package org.eclipse.tracecompass.internal.analysis.os.linux.ui.actions;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jface.action.Action;
+import org.eclipse.tracecompass.analysis.os.linux.core.signals.TmfCpuSelectedSignal;
+import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
+import org.eclipse.tracecompass.tmf.ui.views.TmfView;
+
+/**
+ * CPU Selection Action
+ *
+ * @author Matthew Khouzam
+ */
+public class FollowCpuAction extends Action {
+
+    private final @NonNull TmfView fView;
+    private final int fCpu;
+    private final @NonNull ITmfTrace fTrace;
+
+    /**
+     * Contructor
+     *
+     * @param view
+     *            the view to send a signal
+     * @param cpu
+     *            the cpu number
+     * @param trace
+     *            the trace
+     */
+    public FollowCpuAction(@NonNull TmfView view, int cpu, @NonNull ITmfTrace trace) {
+        fView = view;
+        fCpu = cpu;
+        fTrace = trace;
+    }
+
+    @Override
+    public String getText() {
+        return Messages.CpuSelectionAction_followCpu + ' ' + fCpu;
+    }
+
+    @Override
+    public void run() {
+        fView.broadcast(new TmfCpuSelectedSignal(fView, fCpu, fTrace));
+        super.run();
+    }
+
+}
index 4a9497265671a7619cfac55c23d3f53cfb681e08..85278073ccb7f9bd8915517363abd5bd6c9277ce 100644 (file)
@@ -22,6 +22,14 @@ public class Messages extends NLS {
      * Follow message
      */
     public static String FollowThreadAction_follow;
+    /**
+     * Follow CPU message
+     */
+    public static String CpuSelectionAction_followCpu;
+    /**
+     * Stop following CPU
+     */
+    public static String CpuSelectionAction_unfollowCpu;
     static {
         // initialize resource bundle
         NLS.initializeMessages(BUNDLE_NAME, Messages.class);
diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/actions/UnfollowCpuAction.java b/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/actions/UnfollowCpuAction.java
new file mode 100644 (file)
index 0000000..ef088d0
--- /dev/null
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+
+package org.eclipse.tracecompass.internal.analysis.os.linux.ui.actions;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jface.action.Action;
+import org.eclipse.tracecompass.analysis.os.linux.core.signals.TmfCpuSelectedSignal;
+import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
+import org.eclipse.tracecompass.tmf.ui.views.TmfView;
+
+/**
+ * CPU Selection Action
+ *
+ * @author Matthew Khouzam
+ */
+public class UnfollowCpuAction extends Action {
+
+    private final @NonNull TmfView fView;
+    private final int fCpu;
+    private final @NonNull ITmfTrace fTrace;
+
+    /**
+     * Contructor
+     *
+     * @param view
+     *            the view to send a signal
+     * @param cpu
+     *            the cpu number
+     * @param trace
+     *            the trace
+     */
+    public UnfollowCpuAction(@NonNull TmfView view, int cpu, @NonNull ITmfTrace trace) {
+        fView = view;
+        fCpu = cpu;
+        fTrace = trace;
+    }
+
+    @Override
+    public String getText() {
+        return Messages.CpuSelectionAction_unfollowCpu;
+    }
+
+    @Override
+    public void run() {
+        fView.broadcast(new TmfCpuSelectedSignal(fView, -fCpu - 1, fTrace));
+        super.run();
+    }
+
+}
index c0d42d7bd595cf49c8246172bf5e0fcabfc10f24..9237c72a2cf373be54d1eaf3debfbc6373e9d259 100644 (file)
@@ -1278,8 +1278,9 @@ public class TimeGraphControl extends TimeGraphBaseControl
      *            a point in the widget
      * @return the {@link ITimeGraphEntry} at this point, or <code>null</code>
      *         if none.
+     * @since 2.0
      */
-    protected ITimeGraphEntry getEntry(Point pt) {
+    public ITimeGraphEntry getEntry(Point pt) {
         int idx = getItemIndexAtY(pt.y);
         return idx >= 0 ? fItemData.fExpandedItems[idx].fEntry : null;
     }
This page took 0.030377 seconds and 5 git commands to generate.