1 /*******************************************************************************
2 * Copyright (c) 2011, 2012 Ericsson
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 * Mathieu Denis <mathieu.denis@polymtl.ca> - Generalized version based on LTTng
11 * Bernd Hufmann - Updated to use trace reference in TmfEvent and streaming
12 * Mathieu Denis - New request added to update the statistics from the selected time range
13 * Mathieu Denis - Generalization of the view to instantiate a viewer specific to a trace type
15 *******************************************************************************/
17 package org
.eclipse
.linuxtools
.tmf
.ui
.views
.statistics
;
19 import org
.eclipse
.core
.resources
.IResource
;
20 import org
.eclipse
.linuxtools
.tmf
.core
.component
.TmfDataProvider
;
21 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfEndSynchSignal
;
22 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfSignalHandler
;
23 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfStartSynchSignal
;
24 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfTraceClosedSignal
;
25 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfTraceOpenedSignal
;
26 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfTraceRangeUpdatedSignal
;
27 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfTraceSelectedSignal
;
28 import org
.eclipse
.linuxtools
.tmf
.core
.trace
.ITmfTrace
;
29 import org
.eclipse
.linuxtools
.tmf
.core
.trace
.TmfExperiment
;
30 import org
.eclipse
.linuxtools
.tmf
.ui
.editors
.ITmfTraceEditor
;
31 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.TmfTraceType
;
32 import org
.eclipse
.linuxtools
.tmf
.ui
.viewers
.ITmfViewer
;
33 import org
.eclipse
.linuxtools
.tmf
.ui
.viewers
.statistics
.TmfStatisticsViewer
;
34 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.TmfView
;
35 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.tabsview
.TmfViewerFolder
;
36 import org
.eclipse
.swt
.SWT
;
37 import org
.eclipse
.swt
.widgets
.Composite
;
38 import org
.eclipse
.swt
.widgets
.Shell
;
39 import org
.eclipse
.ui
.IEditorPart
;
40 import org
.eclipse
.ui
.PlatformUI
;
43 * The generic Statistics View displays statistics for any kind of traces.
45 * It is implemented according to the MVC pattern. - The model is a
46 * TmfStatisticsTreeNode built by the State Manager. - The view is built with a
47 * TreeViewer. - The controller that keeps model and view synchronized is an
48 * observer of the model.
51 * @author Mathieu Denis
53 public class TmfStatisticsView
extends TmfView
{
56 * The ID corresponds to the package in which this class is embedded.
58 public static final String ID
= "org.eclipse.linuxtools.tmf.ui.views.statistics"; //$NON-NLS-1$
63 public static final String TMF_STATISTICS_VIEW
= "StatisticsView"; //$NON-NLS-1$
66 * The viewer that builds the columns to show the statistics.
70 protected final TmfViewerFolder fStatsViewers
;
73 * Stores a reference to the selected trace.
75 private ITmfTrace fTrace
;
78 * Constructor of a statistics view.
80 * @param viewName The name to give to the view.
82 public TmfStatisticsView(String viewName
) {
85 * Create a fake parent for initialization purpose, than set the parent
86 * as soon as createPartControl is called.
88 Composite temporaryParent
= new Shell();
89 fStatsViewers
= new TmfViewerFolder(temporaryParent
);
93 * Default constructor.
95 public TmfStatisticsView() {
96 this(TMF_STATISTICS_VIEW
);
103 * org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
106 public void createPartControl(Composite parent
) {
107 fStatsViewers
.setParent(parent
);
108 createStatisticsViewers();
110 IEditorPart editor
= PlatformUI
.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
111 if (editor
instanceof ITmfTraceEditor
) {
112 ITmfTrace trace
= ((ITmfTraceEditor
) editor
).getTrace();
114 traceSelected(new TmfTraceSelectedSignal(this, trace
));
122 * @see org.eclipse.linuxtools.tmf.ui.views.TmfView#dispose()
125 public void dispose() {
127 fStatsViewers
.dispose();
131 * Handler called when an trace is opened.
134 * Contains the information about the selection.
138 public void traceOpened(TmfTraceOpenedSignal signal
) {
140 * Dispose the current viewer and adapt the new one to the trace
141 * type of the trace opened
143 fStatsViewers
.clear();
144 // Update the current trace
145 fTrace
= signal
.getTrace();
146 createStatisticsViewers();
147 fStatsViewers
.layout();
151 * Handler called when an trace is selected. Checks if the trace
152 * has changed and requests the selected trace if it has not yet been
156 * Contains the information about the selection.
160 public void traceSelected(TmfTraceSelectedSignal signal
) {
161 // Does not reload the same trace if already opened
162 if (signal
.getTrace() != fTrace
) {
164 * Dispose the current viewer and adapt the new one to the trace
165 * type of the trace selected
167 fStatsViewers
.clear();
168 // Update the current trace
169 fTrace
= signal
.getTrace();
170 createStatisticsViewers();
171 fStatsViewers
.layout();
173 TmfTraceRangeUpdatedSignal updateSignal
= new TmfTraceRangeUpdatedSignal(this, fTrace
, fTrace
.getTimeRange());
175 // Synchronizes the requests to make them coalesced
176 if (fTrace
instanceof TmfDataProvider
) {
177 ((TmfDataProvider
) fTrace
).startSynch(new TmfStartSynchSignal(0));
179 for (ITmfViewer viewer
: fStatsViewers
.getViewers()) {
180 TmfStatisticsViewer statsViewer
= (TmfStatisticsViewer
) viewer
;
181 statsViewer
.sendPartialRequestOnNextUpdate();
182 statsViewer
.traceRangeUpdated(updateSignal
);
184 if (fTrace
instanceof TmfDataProvider
) {
185 ((TmfDataProvider
) fTrace
).endSynch(new TmfEndSynchSignal(0));
189 * If the same trace is reselected, sends a notification to
190 * the viewers to make sure they reload correctly their partial
193 for (ITmfViewer viewer
: fStatsViewers
.getViewers()) {
194 TmfStatisticsViewer statsViewer
= (TmfStatisticsViewer
) viewer
;
195 // Will update the partial event count if needed.
196 statsViewer
.sendPartialRequestOnNextUpdate();
202 * @param signal the incoming signal
206 public void traceClosed(TmfTraceClosedSignal signal
) {
207 if (signal
.getTrace() != fTrace
) {
211 // Clear the internal data
214 // Clear the UI widgets
215 fStatsViewers
.clear(); // Also cancels ongoing requests
216 createStatisticsViewers();
217 fStatsViewers
.layout();
223 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
226 public void setFocus() {
227 fStatsViewers
.setFocus();
231 * Creates the statistics viewers for all traces in an experiment and
232 * populates a viewer folder. Each viewer is placed in a different tab and
233 * the first one is selected automatically.
235 * It uses the extension point that defines the statistics viewer to build
236 * from the trace type. If no viewer is defined, another tab won't be
237 * created, since the global viewer already contains all the basic
238 * statistics. If there is no trace selected, a global statistics viewer will
243 protected void createStatisticsViewers() {
244 // Default style for the tabs that will be created
245 int defaultStyle
= SWT
.NONE
;
247 // The folder composite that will contain the tabs
248 Composite folder
= fStatsViewers
.getParentFolder();
250 // Instantiation of the global viewer
251 TmfStatisticsViewer globalViewer
= getGlobalViewer();
252 if (fTrace
!= null) {
253 if (globalViewer
!= null) {
254 // Shows the name of the trace in the global tab
255 globalViewer
.init(folder
, Messages
.TmfStatisticsView_GlobalTabName
+ " - " + fTrace
.getName(), fTrace
); //$NON-NLS-1$
257 fStatsViewers
.addTab(globalViewer
, Messages
.TmfStatisticsView_GlobalTabName
, defaultStyle
);
260 IResource traceResource
;
262 if (fTrace
instanceof TmfExperiment
) {
263 TmfExperiment experiment
= (TmfExperiment
) fTrace
;
264 traces
= experiment
.getTraces();
266 traces
= new ITmfTrace
[] { fTrace
};
268 // Creates a statistics viewer for each trace.
269 for (ITmfTrace trace
: traces
) {
270 traceName
= trace
.getName();
271 traceResource
= trace
.getResource();
272 TmfStatisticsViewer viewer
= getStatisticsViewer(traceResource
);
274 * Adds a new viewer only if there is one defined for the
275 * selected trace type, since the global tab already contains
276 * all the basic event counts for the trace(s)
278 if (viewer
!= null) {
279 viewer
.init(folder
, traceName
, trace
);
280 fStatsViewers
.addTab(viewer
, viewer
.getName(), defaultStyle
);
284 if (globalViewer
!= null) {
285 // There is no trace selected. Shows an empty global tab
286 globalViewer
.init(folder
, Messages
.TmfStatisticsView_GlobalTabName
, fTrace
);
288 fStatsViewers
.addTab(globalViewer
, Messages
.TmfStatisticsView_GlobalTabName
, defaultStyle
);
290 // Makes the global viewer visible
291 fStatsViewers
.setSelection(0);
295 * Retrieves and instantiates a viewer based on his plug-in definition for a
296 * specific trace type. It is specific to the statistics viewer.
298 * It only calls the 0-parameter constructor without performing any other
299 * initialization on the viewer.
302 * The resource where to find the information about the trace
304 * @return a new statistics viewer based on his plug-in definition, or null
305 * if no statistics definition was found for the trace type.
308 protected static TmfStatisticsViewer
getStatisticsViewer(IResource resource
) {
309 return (TmfStatisticsViewer
) TmfTraceType
.getTraceTypeElement(resource
, TmfTraceType
.STATISTICS_VIEWER_ELEM
);
313 * @return The class to use to instantiate the global statistics viewer
316 protected TmfStatisticsViewer
getGlobalViewer() {
317 return new TmfStatisticsViewer();