lttng: Move plugins to their own sub-directory
[deliverable/tracecompass.git] / org.eclipse.tracecompass.analysis.os.linux.ui / src / org / eclipse / tracecompass / analysis / os / linux / ui / views / cpuusage / CpuUsageView.java
CommitLineData
dffc234f 1/*******************************************************************************
ed902a2b 2 * Copyright (c) 2014, 2015 École Polytechnique de Montréal
dffc234f
GB
3 *
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
8 *
9 * Contributors:
10 * Geneviève Bastien - Initial API and implementation
11 *******************************************************************************/
12
e363eae1 13package org.eclipse.tracecompass.analysis.os.linux.ui.views.cpuusage;
dffc234f 14
e9a0d1cb
GB
15import org.eclipse.jface.viewers.ISelection;
16import org.eclipse.jface.viewers.ISelectionChangedListener;
17import org.eclipse.jface.viewers.IStructuredSelection;
18import org.eclipse.jface.viewers.SelectionChangedEvent;
dffc234f
GB
19import org.eclipse.swt.SWT;
20import org.eclipse.swt.custom.SashForm;
54404589
MAL
21import org.eclipse.swt.events.ControlAdapter;
22import org.eclipse.swt.events.ControlEvent;
23import org.eclipse.swt.events.PaintEvent;
24import org.eclipse.swt.events.PaintListener;
25import org.eclipse.swt.layout.GridData;
26import org.eclipse.swt.layout.GridLayout;
dffc234f 27import org.eclipse.swt.widgets.Composite;
54404589
MAL
28import org.eclipse.swt.widgets.Control;
29import org.eclipse.swt.widgets.Event;
30import org.eclipse.swt.widgets.Listener;
31import org.eclipse.swt.widgets.Sash;
32import org.eclipse.tracecompass.tmf.core.signal.TmfSignalManager;
2bdf0193
AM
33import org.eclipse.tracecompass.tmf.core.signal.TmfTraceSelectedSignal;
34import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
21852dfa 35import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
54404589
MAL
36import org.eclipse.tracecompass.tmf.ui.signal.TmfTimeViewAlignmentInfo;
37import org.eclipse.tracecompass.tmf.ui.signal.TmfTimeViewAlignmentSignal;
38import org.eclipse.tracecompass.tmf.ui.views.ITmfTimeAligned;
2bdf0193 39import org.eclipse.tracecompass.tmf.ui.views.TmfView;
dffc234f
GB
40
41/**
42 * CPU usage view. It contains 2 viewers: one tree viewer showing all the
43 * threads who were on the CPU in the time range, and one XY chart viewer
44 * plotting the total time spent on CPU and the time of the threads selected in
45 * the tree viewer.
46 *
47 * @author Geneviève Bastien
48 */
54404589 49public class CpuUsageView extends TmfView implements ITmfTimeAligned {
dffc234f
GB
50
51 /** ID string */
e363eae1 52 public static final String ID = "org.eclipse.tracecompass.analysis.os.linux.views.cpuusage"; //$NON-NLS-1$
dffc234f 53
59387be3
BH
54 private static final int[] DEFAULT_WEIGHTS = {1, 3};
55
3df2eabe 56 private CpuUsageComposite fTreeViewer = null;
e9a0d1cb 57 private CpuUsageXYViewer fXYViewer = null;
3df2eabe 58
54404589
MAL
59 private SashForm fSashForm;
60 private Listener fSashDragListener;
61 /** A composite that allows us to add margins */
62 private Composite fXYViewerContainer;
63
dffc234f
GB
64 /**
65 * Constructor
66 */
67 public CpuUsageView() {
68 super(Messages.CpuUsageView_Title);
69 }
70
71 @Override
72 public void createPartControl(Composite parent) {
54404589
MAL
73 super.createPartControl(parent);
74
75 fSashForm = new SashForm(parent, SWT.NONE);
dffc234f 76
54404589 77 fTreeViewer = new CpuUsageComposite(fSashForm);
dffc234f 78
54404589
MAL
79 fXYViewerContainer = new Composite(fSashForm, SWT.NONE);
80 GridLayout layout = new GridLayout();
81 layout.marginHeight = 0;
82 layout.marginWidth = 0;
83 fXYViewerContainer.setLayout(layout);
dffc234f
GB
84
85 /* Build the XY chart part of the view */
54404589 86 fXYViewer = new CpuUsageXYViewer(fXYViewerContainer);
637a4019 87 fXYViewer.setSendTimeAlignSignals(true);
54404589 88 fXYViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
e9a0d1cb
GB
89
90 /* Add selection listener to tree viewer */
91 fTreeViewer.addSelectionChangeListener(new ISelectionChangedListener() {
92 @Override
93 public void selectionChanged(SelectionChangedEvent event) {
94 ISelection selection = event.getSelection();
95 if (selection instanceof IStructuredSelection) {
96 Object structSelection = ((IStructuredSelection) selection).getFirstElement();
97 if (structSelection instanceof CpuUsageEntry) {
98 CpuUsageEntry entry = (CpuUsageEntry) structSelection;
99 fTreeViewer.setSelectedThread(entry.getTid());
100 fXYViewer.setSelectedThread(Long.valueOf(entry.getTid()));
101 }
102 }
103 }
104 });
dffc234f 105
dffc234f 106 /* Initialize the viewers with the currently selected trace */
21852dfa 107 ITmfTrace trace = TmfTraceManager.getInstance().getActiveTrace();
dffc234f
GB
108 if (trace != null) {
109 TmfTraceSelectedSignal signal = new TmfTraceSelectedSignal(this, trace);
3df2eabe
BH
110 fTreeViewer.traceSelected(signal);
111 fXYViewer.traceSelected(signal);
dffc234f 112 }
54404589
MAL
113 fTreeViewer.getControl().addControlListener(new ControlAdapter() {
114 @Override
115 public void controlResized(ControlEvent e) {
116 super.controlResized(e);
117 }
118 });
dffc234f 119
54404589
MAL
120 fXYViewer.getControl().addPaintListener(new PaintListener() {
121 @Override
122 public void paintControl(PaintEvent e) {
123 // Sashes in a SashForm are being created on layout so add the
124 // drag listener here
125 if (fSashDragListener == null) {
126 for (Control control : fSashForm.getChildren()) {
127 if (control instanceof Sash) {
128 fSashDragListener = new Listener() {
129
130 @Override
131 public void handleEvent(Event event) {
132 TmfSignalManager.dispatchSignal(new TmfTimeViewAlignmentSignal(fSashForm, getTimeViewAlignmentInfo()));
133 }
134 };
135 control.removePaintListener(this);
136 control.addListener(SWT.Selection, fSashDragListener);
137 // There should be only one sash
138 break;
139 }
140 }
141 }
142 }
143 });
59387be3
BH
144
145 fSashForm.setWeights(DEFAULT_WEIGHTS);
dffc234f
GB
146 }
147
148 @Override
149 public void setFocus() {
abf7b9b0 150 fXYViewer.getControl().setFocus();
dffc234f
GB
151 }
152
3df2eabe
BH
153 @Override
154 public void dispose() {
155 super.dispose();
156 if (fTreeViewer != null) {
157 fTreeViewer.dispose();
158 }
159 if (fXYViewer != null) {
160 fXYViewer.dispose();
161 }
162 }
163
54404589
MAL
164 /**
165 * @since 1.0
166 */
167 @Override
168 public TmfTimeViewAlignmentInfo getTimeViewAlignmentInfo() {
169 if (fSashForm == null) {
170 return null;
171 }
172
173 return new TmfTimeViewAlignmentInfo(fSashForm.getShell(), fSashForm.toDisplay(0, 0), getTimeAxisOffset());
174 }
175
176 private int getTimeAxisOffset() {
2e23a015 177 return fTreeViewer.getControl().getSize().x + fSashForm.getSashWidth() + fXYViewer.getPointAreaOffset();
54404589
MAL
178 }
179
180 /**
181 * @since 1.0
182 */
183 @Override
184 public int getAvailableWidth(int requestedOffset) {
185 int pointAreaWidth = fXYViewer.getPointAreaWidth();
186 int curTimeAxisOffset = getTimeAxisOffset();
187 if (pointAreaWidth <= 0) {
188 pointAreaWidth = fSashForm.getBounds().width - curTimeAxisOffset;
189 }
190 // TODO this is just an approximation that assumes that the end will be at the same position but that can change for a different data range/scaling
191 int endOffset = curTimeAxisOffset + pointAreaWidth;
192 GridLayout layout = (GridLayout) fXYViewerContainer.getLayout();
193 int endOffsetWithoutMargin = endOffset + layout.marginRight;
194 int availableWidth = endOffsetWithoutMargin - requestedOffset;
195 availableWidth = Math.min(fSashForm.getBounds().width, Math.max(0, availableWidth));
196 return availableWidth;
197 }
198
199 /**
200 * @since 1.0
201 */
202 @Override
203 public void performAlign(int offset, int width) {
54404589 204 int total = fSashForm.getBounds().width;
c34ab48a
PT
205 int plotAreaOffset = fXYViewer.getPointAreaOffset();
206 int width1 = Math.max(0, offset - plotAreaOffset - fSashForm.getSashWidth());
207 int width2 = Math.max(0, total - width1 - fSashForm.getSashWidth());
54404589
MAL
208 fSashForm.setWeights(new int[] { width1, width2 });
209 fSashForm.layout();
210
211 Composite composite = fXYViewerContainer;
212 GridLayout layout = (GridLayout) composite.getLayout();
213 int timeAxisWidth = getAvailableWidth(offset);
214 int marginSize = timeAxisWidth - width;
215 layout.marginRight = Math.max(0, marginSize);
216 composite.layout();
217 }
dffc234f 218}
This page took 0.062932 seconds and 5 git commands to generate.