1 /*******************************************************************************
2 * Copyright (c) 2014, 2016 École Polytechnique de Montréal and others
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * Geneviève Bastien - Initial API and implementation
11 *******************************************************************************/
13 package org
.eclipse
.tracecompass
.analysis
.os
.linux
.ui
.views
.cpuusage
;
15 import org
.eclipse
.jdt
.annotation
.Nullable
;
16 import org
.eclipse
.jface
.viewers
.ISelection
;
17 import org
.eclipse
.jface
.viewers
.ISelectionChangedListener
;
18 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
19 import org
.eclipse
.jface
.viewers
.SelectionChangedEvent
;
20 import org
.eclipse
.swt
.events
.ControlAdapter
;
21 import org
.eclipse
.swt
.events
.ControlEvent
;
22 import org
.eclipse
.swt
.widgets
.Composite
;
23 import org
.eclipse
.tracecompass
.analysis
.os
.linux
.core
.signals
.TmfCpuSelectedSignal
;
24 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfSignalHandler
;
25 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfTraceSelectedSignal
;
26 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.ITmfTrace
;
27 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.TmfTraceManager
;
28 import org
.eclipse
.tracecompass
.tmf
.ui
.viewers
.TmfViewer
;
29 import org
.eclipse
.tracecompass
.tmf
.ui
.viewers
.xycharts
.TmfXYChartViewer
;
30 import org
.eclipse
.tracecompass
.tmf
.ui
.views
.TmfChartView
;
33 * CPU usage view. It contains 2 viewers: one tree viewer showing all the
34 * threads who were on the CPU in the time range, and one XY chart viewer
35 * plotting the total time spent on CPU and the time of the threads selected in
38 * @author Geneviève Bastien
40 public class CpuUsageView
extends TmfChartView
{
43 public static final String ID
= "org.eclipse.tracecompass.analysis.os.linux.views.cpuusage"; //$NON-NLS-1$
45 private @Nullable CpuUsageComposite fTreeViewer
= null;
46 private @Nullable CpuUsageXYViewer fXYViewer
= null;
51 public CpuUsageView() {
52 super(Messages
.CpuUsageView_Title
);
56 public void createPartControl(Composite parent
) {
57 super.createPartControl(parent
);
59 /* Initialize the viewers with the currently selected trace */
60 ITmfTrace trace
= TmfTraceManager
.getInstance().getActiveTrace();
62 TmfTraceSelectedSignal signal
= new TmfTraceSelectedSignal(this, trace
);
63 if (fTreeViewer
!= null) {
64 fTreeViewer
.traceSelected(signal
);
66 if (fXYViewer
!= null) {
67 fXYViewer
.traceSelected(signal
);
73 protected TmfXYChartViewer
createChartViewer(Composite parent
) {
74 CpuUsageXYViewer viewer
= new CpuUsageXYViewer(parent
);
75 viewer
.setSendTimeAlignSignals(true);
81 public TmfViewer
createLeftChildViewer(Composite parent
) {
82 final CpuUsageComposite viewer
= new CpuUsageComposite(parent
);
84 /* Add selection listener to tree viewer */
85 viewer
.addSelectionChangeListener(new ISelectionChangedListener() {
87 public void selectionChanged(SelectionChangedEvent event
) {
88 ISelection selection
= event
.getSelection();
89 if (selection
instanceof IStructuredSelection
) {
90 Object structSelection
= ((IStructuredSelection
) selection
).getFirstElement();
91 if (structSelection
instanceof CpuUsageEntry
) {
92 CpuUsageEntry entry
= (CpuUsageEntry
) structSelection
;
93 if (fTreeViewer
!= null) {
94 fTreeViewer
.setSelectedThread(entry
.getTid());
96 if (fXYViewer
!= null) {
97 fXYViewer
.setSelectedThread(Long
.valueOf(entry
.getTid()));
104 viewer
.getControl().addControlListener(new ControlAdapter() {
106 public void controlResized(ControlEvent e
) {
107 super.controlResized(e
);
111 fTreeViewer
= viewer
;
116 public void setFocus() {
117 if (fXYViewer
!= null) {
118 fXYViewer
.getControl().setFocus();
123 * Signal handler for when a cpu is selected
126 * the cpu being selected
130 public void cpuSelect(TmfCpuSelectedSignal signal
) {
131 final @Nullable CpuUsageXYViewer xyViewer
= fXYViewer
;
132 final @Nullable CpuUsageComposite treeViewer
= fTreeViewer
;
133 if (xyViewer
!= null && treeViewer
!= null) {
134 int core
= signal
.getCore();
136 xyViewer
.addCpu(core
);
137 treeViewer
.addCpu(core
);
140 treeViewer
.clearCpu();