From 8c684b487407fe5d022263a1d94c58653dbb34fc Mon Sep 17 00:00:00 2001 From: Matthew Khouzam Date: Wed, 16 Mar 2016 14:56:58 -0400 Subject: [PATCH] analysis.ui: Add follow cpu context menu to resources view This generates a TmfCpuSelectectedSignal that can be used by views listening in. Change-Id: Ib7a19b600dfd6be8510b07b4b48cc60e05722833 Signed-off-by: Matthew Khouzam Reviewed-on: https://git.eclipse.org/r/66651 Reviewed-by: Hudson CI --- .../core/signals/TmfCpuSelectedSignal.java | 2 +- .../ui/views/resources/ResourcesView.java | 69 +++++++++++++++++++ .../os/linux/ui/actions/FollowCpuAction.java | 56 +++++++++++++++ .../os/linux/ui/actions/Messages.java | 8 +++ .../linux/ui/actions/UnfollowCpuAction.java | 56 +++++++++++++++ .../os/linux/ui/actions/messages.properties | 2 + .../timegraph/widgets/TimeGraphControl.java | 3 +- 7 files changed, 194 insertions(+), 2 deletions(-) create mode 100644 analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/actions/FollowCpuAction.java create mode 100644 analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/actions/UnfollowCpuAction.java diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/signals/TmfCpuSelectedSignal.java b/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/signals/TmfCpuSelectedSignal.java index 07c5af0b98..b68594f9dc 100644 --- a/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/signals/TmfCpuSelectedSignal.java +++ b/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/signals/TmfCpuSelectedSignal.java @@ -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 */ diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/analysis/os/linux/ui/views/resources/ResourcesView.java b/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/analysis/os/linux/ui/views/resources/ResourcesView.java index f46e6d2d48..6e2df727d3 100644 --- a/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/analysis/os/linux/ui/views/resources/ResourcesView.java +++ b/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/analysis/os/linux/ui/views/resources/ResourcesView.java @@ -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 index 0000000000..d2e0b6ed08 --- /dev/null +++ b/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/actions/FollowCpuAction.java @@ -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(); + } + +} diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/actions/Messages.java b/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/actions/Messages.java index 4a94972656..85278073cc 100644 --- a/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/actions/Messages.java +++ b/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/actions/Messages.java @@ -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 index 0000000000..ef088d0bd0 --- /dev/null +++ b/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/actions/UnfollowCpuAction.java @@ -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(); + } + +} diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/actions/messages.properties b/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/actions/messages.properties index be910b6b96..31104f8d44 100644 --- a/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/actions/messages.properties +++ b/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/actions/messages.properties @@ -8,3 +8,5 @@ ############################################################################### FollowThreadAction_follow=Follow +CpuSelectionAction_followCpu=Follow CPU +CpuSelectionAction_unfollowCpu=Unfollow CPU 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 c0d42d7bd5..9237c72a2c 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 @@ -1278,8 +1278,9 @@ public class TimeGraphControl extends TimeGraphBaseControl * a point in the widget * @return the {@link ITimeGraphEntry} at this point, or null * 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; } -- 2.34.1