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
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;
}
}
+ @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) {
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;
+ }
+ }
+
}
--- /dev/null
+/*******************************************************************************
+ * 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();
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * 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();
+ }
+
+}