tmf: Use tabs in statistics view for each traces
[deliverable/tracecompass.git] / org.eclipse.linuxtools.lttng.ui / src / org / eclipse / linuxtools / internal / lttng / ui / views / latency / LatencyView.java
CommitLineData
fbd124dd
BH
1/*******************************************************************************\r
2 * Copyright (c) 2010, 2011 Ericsson\r
0c32e4c5 3 *\r
fbd124dd
BH
4 * All rights reserved. This program and the accompanying materials are\r
5 * made available under the terms of the Eclipse Public License v1.0 which\r
6 * accompanies this distribution, and is available at\r
7 * http://www.eclipse.org/legal/epl-v10.html\r
0c32e4c5 8 *\r
fbd124dd
BH
9 * Contributors:\r
10 * Philippe Sawicki (INF4990.A2010@gmail.com) - Initial API and implementation\r
11 * Mathieu Denis (mathieu.denis55@gmail.com) - Refactored code\r
12 * Bernd Hufmann - Adapted to new model-view-controller design\r
13 *******************************************************************************/\r
638eac44 14package org.eclipse.linuxtools.internal.lttng.ui.views.latency;\r
fbd124dd
BH
15\r
16import org.eclipse.jface.action.Action;\r
17import org.eclipse.jface.action.IMenuManager;\r
18import org.eclipse.jface.action.IToolBarManager;\r
19import org.eclipse.jface.action.Separator;\r
5945cec9 20import org.eclipse.linuxtools.internal.lttng.core.event.LttngEvent;\r
638eac44
FC
21import org.eclipse.linuxtools.internal.lttng.ui.views.latency.dialogs.AddDialog;\r
22import org.eclipse.linuxtools.internal.lttng.ui.views.latency.dialogs.DeleteDialog;\r
23import org.eclipse.linuxtools.internal.lttng.ui.views.latency.dialogs.ListDialog;\r
24import org.eclipse.linuxtools.internal.lttng.ui.views.latency.model.Config;\r
25import org.eclipse.linuxtools.internal.lttng.ui.views.latency.model.IGraphModelListener;\r
26import org.eclipse.linuxtools.internal.lttng.ui.views.latency.model.LatencyController;\r
27import org.eclipse.linuxtools.internal.lttng.ui.views.latency.model.LatencyGraphModel;\r
dfee01ae 28import org.eclipse.linuxtools.tmf.core.event.ITmfTimestamp;\r
fbd124dd
BH
29import org.eclipse.linuxtools.tmf.core.event.TmfTimeRange;\r
30import org.eclipse.linuxtools.tmf.core.event.TmfTimestamp;\r
fbd124dd 31import org.eclipse.linuxtools.tmf.core.request.ITmfDataRequest.ExecutionType;\r
dfee01ae 32import org.eclipse.linuxtools.tmf.core.request.TmfEventRequest;\r
fbd124dd
BH
33import org.eclipse.linuxtools.tmf.core.signal.TmfExperimentDisposedSignal;\r
34import org.eclipse.linuxtools.tmf.core.signal.TmfExperimentRangeUpdatedSignal;\r
35import org.eclipse.linuxtools.tmf.core.signal.TmfExperimentSelectedSignal;\r
36import org.eclipse.linuxtools.tmf.core.signal.TmfRangeSynchSignal;\r
37import org.eclipse.linuxtools.tmf.core.signal.TmfSignalHandler;\r
38import org.eclipse.linuxtools.tmf.core.signal.TmfTimeSynchSignal;\r
9e0640dc 39import org.eclipse.linuxtools.tmf.core.trace.TmfExperiment;\r
fbd124dd
BH
40import org.eclipse.linuxtools.tmf.ui.views.TmfView;\r
41import org.eclipse.swt.SWT;\r
42import org.eclipse.swt.events.ControlEvent;\r
43import org.eclipse.swt.events.ControlListener;\r
44import org.eclipse.swt.layout.FillLayout;\r
45import org.eclipse.swt.widgets.Composite;\r
46import org.eclipse.ui.IActionBars;\r
47import org.eclipse.ui.plugin.AbstractUIPlugin;\r
48\r
49/**\r
50 * <b><u>LatencyView</u></b>\r
51 * <p>\r
52 * TmfView displaying the latency views (i.e. the two latency charts).\r
0c32e4c5 53 *\r
fbd124dd
BH
54 * @author Philippe Sawicki\r
55 */\r
56public class LatencyView extends TmfView implements IGraphModelListener {\r
57\r
58 // ------------------------------------------------------------------------\r
59 // Attributes\r
60 // ------------------------------------------------------------------------\r
0c32e4c5 61\r
fbd124dd 62 // The initial window span (in nanoseconds)\r
1cceddbe 63 public static final long INITIAL_WINDOW_SPAN = (1L * 100 * 1000 * 1000); // .1sec\r
fbd124dd
BH
64\r
65 /**\r
66 * The view's unique ID.\r
67 */\r
68 public static final String ID = "org.eclipse.linuxtools.lttng.ui.views.latency.LatencyView"; //$NON-NLS-1$\r
69\r
70 /**\r
71 * A reference to the currently selected experiment.\r
72 */\r
0c32e4c5 73 protected TmfExperiment fExperiment = null;\r
fbd124dd
BH
74\r
75 /**\r
76 * Parent composite.\r
77 */\r
78 protected Composite fParent;\r
79\r
80 /**\r
81 * Graph view.\r
82 */\r
83 protected GraphViewer fGraphViewer;\r
0c32e4c5 84\r
fbd124dd
BH
85 /**\r
86 * Histogram view.\r
87 */\r
88 protected HistogramViewer fHistogramViewer;\r
89\r
90 /**\r
91 * Action executed when the user wants to see the list of matching events.\r
92 */\r
93 protected Action fListMatchingEvents;\r
0c32e4c5 94\r
fbd124dd
BH
95 /**\r
96 * Action executed when the user wants to add matching events.\r
97 */\r
98 protected Action fAddMatchingEvents;\r
0c32e4c5 99\r
fbd124dd
BH
100 /**\r
101 * Action executed when the user wants to delete matching events.\r
102 */\r
103 protected Action fDeleteMatchingEvents;\r
0c32e4c5 104\r
fbd124dd
BH
105 /**\r
106 * Action executed when the user wants to increase the width of the histogram bars.\r
107 */\r
108 protected Action fIncreaseBarWidth;\r
0c32e4c5 109\r
fbd124dd
BH
110 /**\r
111 * Action executed when the user wants to decrease the width of the histogram bars.\r
112 */\r
113 protected Action fDecreaseBarWidth;\r
114\r
115 /**\r
116 * The current histogram window time range.\r
117 */\r
118 protected TmfTimeRange fTimeRange = null;\r
119\r
120 /**\r
121 * Controller of the latency model which is responsible to retrieve data from the trace\r
122 */\r
123 final private LatencyController fController;\r
124\r
125 /**\r
126 * Flag to notify that TimeSyncSignal was received and is being processed.\r
127 */\r
128 private boolean fSyncSignalReceived = false;\r
129\r
130 // ------------------------------------------------------------------------\r
131 // Constructor\r
132 // ------------------------------------------------------------------------\r
133\r
134 /**\r
135 * Constructor.\r
136 */\r
137 public LatencyView() {\r
138 super(Messages.LatencyView_ViewName);\r
139 fController = LatencyController.getInstance();\r
140 }\r
141\r
142 // ------------------------------------------------------------------------\r
143 // Operations\r
144 // ------------------------------------------------------------------------\r
0c32e4c5 145\r
fbd124dd
BH
146 /**\r
147 * Create the UI controls of this view.\r
0c32e4c5 148 *\r
fbd124dd
BH
149 * @param parent\r
150 * The composite parent of this view.\r
151 */\r
152 @Override\r
153 public void createPartControl(Composite parent) {\r
154 // Save the parent\r
155 fParent = parent;\r
156\r
157 makeActions();\r
158 contributeToActionBars();\r
159\r
160 // Add a control listener to handle the view resize events (to redraw the canvas)\r
161 fParent.addControlListener(new ControlListener() {\r
162 @Override\r
163 public void controlMoved(ControlEvent event) {\r
164 fHistogramViewer.clearBackground();\r
165 fGraphViewer.clearBackground();\r
166 fController.handleCompleted();\r
167 }\r
168\r
169 @Override\r
170 public void controlResized(ControlEvent event) {\r
171 fHistogramViewer.clearBackground();\r
172 fGraphViewer.clearBackground();\r
173 fController.handleCompleted();\r
174 }\r
175 });\r
176\r
177 // ///////////////////////////////////////////////////////////////////////////////////\r
178 // Layout for the whole view, other elements will be in a child composite of this one\r
179 // Contains :\r
180 // Composite layoutSelectionWindow\r
181 // Composite layoutTimesSpinner\r
182 // Composite layoutExperimentHistogram\r
183 // ///////////////////////////////////////////////////////////////////////////////////\r
184 Composite layoutFullView = new Composite(fParent, SWT.FILL);\r
185 FillLayout gridFullView = new FillLayout();\r
186 gridFullView.marginHeight = 0;\r
187 gridFullView.marginWidth = 0;\r
188 layoutFullView.setLayout(gridFullView);\r
189\r
190 // Create the graph views\r
191 fGraphViewer = new GraphViewer(layoutFullView, SWT.DOUBLE_BUFFERED);\r
192 fGraphViewer.setDrawLabelEachNTicks(2);\r
193 fGraphViewer.setGraphTitle(Messages.LatencyView_Graphs_Graph_Title);\r
194 fGraphViewer.setXAxisLabel(Messages.LatencyView_Graphs_Graph_XAxisLabel, 40);\r
195 fGraphViewer.setYAxisLabel(Messages.LatencyView_Graphs_Graph_YAxisLabel);\r
196\r
197 fHistogramViewer = new HistogramViewer(layoutFullView, SWT.DOUBLE_BUFFERED);\r
198 fHistogramViewer.setDrawLabelEachNTicks(2);\r
199 fHistogramViewer.setGraphTitle(Messages.LatencyView_Graphs_Histogram_Title);\r
200 fHistogramViewer.setXAxisLabel(Messages.LatencyView_Graphs_Histogram_XAxisLabel, 55);\r
201 fHistogramViewer.setYAxisLabel(Messages.LatencyView_Graphs_Histogram_YAxisLabel);\r
202\r
203 fController.registerModel(fGraphViewer.getModel());\r
204 fController.registerModel(fHistogramViewer.getModel());\r
0c32e4c5 205\r
fbd124dd 206 ((LatencyGraphModel)fGraphViewer.getModel()).addGraphModelListener(this);\r
0c32e4c5
AM
207\r
208 TmfExperiment experiment = TmfExperiment.getCurrentExperiment();\r
fbd124dd
BH
209 if (experiment != null) {\r
210\r
211 TmfTimeRange experimentTRange = experiment.getTimeRange();\r
212\r
c6023803 213 if (!experimentTRange.equals(TmfTimeRange.NULL_RANGE)) {\r
0c32e4c5 214 TmfExperimentSelectedSignal signal = new TmfExperimentSelectedSignal(this, experiment);\r
fbd124dd
BH
215 experimentSelected(signal);\r
216 }\r
217 }\r
218 }\r
219\r
fb5cad3d
PT
220 /* (non-Javadoc)\r
221 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()\r
222 */\r
223 @Override\r
224 public void setFocus() {\r
225 fGraphViewer.setFocus();\r
226 }\r
227\r
fbd124dd
BH
228 @SuppressWarnings("nls")\r
229 @Override\r
230 public String toString() {\r
231 return "["+ Messages.LatencyView_ViewName+"]";\r
232 }\r
233\r
234 // ------------------------------------------------------------------------\r
235 // Signal handlers\r
236 // ------------------------------------------------------------------------\r
237\r
fbd124dd 238 @TmfSignalHandler\r
0c32e4c5 239 public void experimentSelected(TmfExperimentSelectedSignal signal) {\r
fbd124dd
BH
240 // Clear the views\r
241 fGraphViewer.clear();\r
242 fHistogramViewer.clear();\r
243\r
244 if (fParent != null) {\r
245 // Update the trace reference\r
0c32e4c5 246 fExperiment = signal.getExperiment();\r
fbd124dd 247\r
a4115405 248 fTimeRange = TmfTimeRange.NULL_RANGE;\r
fbd124dd
BH
249 TmfTimeRange experimentTRange = fExperiment.getTimeRange();\r
250\r
a4115405 251 if (!experimentTRange.equals(TmfTimeRange.NULL_RANGE)) {\r
0c32e4c5 252 fTimeRange = new TmfTimeRange(experimentTRange.getStartTime(),\r
fbd124dd
BH
253 new TmfTimestamp(experimentTRange.getStartTime().getValue() + INITIAL_WINDOW_SPAN, experimentTRange.getStartTime().getScale(), experimentTRange.getStartTime().getPrecision()));\r
254 fController.refreshModels(fExperiment, fTimeRange);\r
255 }\r
256 }\r
0c32e4c5 257 }\r
fbd124dd
BH
258 @TmfSignalHandler\r
259 public void experimentRangeUpdated(TmfExperimentRangeUpdatedSignal signal) {\r
c6023803 260 if (fTimeRange.equals(TmfTimeRange.NULL_RANGE) && signal.getExperiment().equals(fExperiment)) {\r
fbd124dd
BH
261 TmfTimeRange experimentTRange = signal.getRange();\r
262\r
c6023803 263 if (!experimentTRange.equals(TmfTimeRange.NULL_RANGE)) {\r
0c32e4c5 264 fTimeRange = new TmfTimeRange(experimentTRange.getStartTime(),\r
fbd124dd
BH
265 new TmfTimestamp(experimentTRange.getStartTime().getValue() + INITIAL_WINDOW_SPAN, experimentTRange.getStartTime().getScale(), experimentTRange.getStartTime().getPrecision()));\r
266 fController.refreshModels(fExperiment, fTimeRange);\r
267 }\r
268 }\r
269 }\r
0c32e4c5 270\r
fbd124dd 271 @TmfSignalHandler\r
0c32e4c5 272 public void experimentDisposed(TmfExperimentDisposedSignal signal) {\r
828e5592
PT
273 if (signal.getExperiment() != fExperiment) {\r
274 return;\r
275 }\r
a4115405 276 fTimeRange = TmfTimeRange.NULL_RANGE;\r
fbd124dd
BH
277 fExperiment = null;\r
278 fController.clear();\r
279 }\r
280\r
281 /**\r
282 * Called when the LatencyView is closed: disposes of the canvas and unregisters models from views.\r
283 */\r
284 @Override\r
285 public void dispose() {\r
286 fController.dispose();\r
287 fController.deregisterModel(fGraphViewer.getModel());\r
288 fController.deregisterModel(fHistogramViewer.getModel());\r
289 ((LatencyGraphModel)fGraphViewer.getModel()).removeGraphModelListener(this);\r
290\r
291 fGraphViewer.dispose();\r
292 fHistogramViewer.dispose();\r
293\r
294 super.dispose();\r
295 }\r
296\r
297 /**\r
298 * Method called when synchronization is active and that the user select an event.\r
0c32e4c5 299 *\r
fbd124dd 300 * The models will be updated with the new current selected time.\r
0c32e4c5 301 *\r
fbd124dd
BH
302 * @param signal\r
303 * Signal received from the framework. Contain the event.\r
304 */\r
305 @TmfSignalHandler\r
306 public void currentTimeUpdated(TmfTimeSynchSignal signal) {\r
307 if (signal.getSource() != this) {\r
308 fSyncSignalReceived = true;\r
309 fController.setCurrentEventTime(signal.getCurrentTime().getValue());\r
310 fSyncSignalReceived = false;\r
311 }\r
312 }\r
313\r
314 /**\r
315 * Method called when synchronization is active and that the user changed the current time range.\r
316\r
317 * The models will be updated with the new time range.\r
0c32e4c5 318 *\r
fbd124dd
BH
319 * @param signal\r
320 * Signal received from the framework. Contain the new time range.\r
321 */\r
322 @TmfSignalHandler\r
323 public void synchToTimeRange(TmfRangeSynchSignal signal) {\r
324 if (signal.getSource() != this) {\r
325 // Erase the graph views\r
326 fGraphViewer.clear();\r
327 fHistogramViewer.clear();\r
0c32e4c5 328\r
dfee01ae 329 ITmfTimestamp startTime = signal.getCurrentRange().getStartTime();\r
330 ITmfTimestamp endTime = signal.getCurrentRange().getEndTime();\r
fbd124dd
BH
331 fTimeRange = new TmfTimeRange(startTime, endTime);\r
332\r
333 fController.refreshModels(fExperiment, fTimeRange);\r
334 }\r
335 }\r
0c32e4c5 336\r
fbd124dd
BH
337 /*\r
338 * (non-Javadoc)\r
339 * @see org.eclipse.linuxtools.lttng.ui.views.latency.model.IGraphModelListener#graphModelUpdated()\r
340 */\r
341 @Override\r
342 public void graphModelUpdated() {\r
343 // Nothing to do - update of viewers will be done in the viewers\r
344 }\r
345\r
346 /*\r
347 * (non-Javadoc)\r
348 * @see org.eclipse.linuxtools.lttng.ui.views.latency.model.IGraphModelListener#currentEventUpdated(long)\r
349 */\r
350 @Override\r
351 public void currentEventUpdated(final long currentEventTime) {\r
0c32e4c5 352 if (fExperiment != null &&\r
fbd124dd
BH
353 !fSyncSignalReceived && // Don't broadcast the current time that was received just before with a time sync signal\r
354 currentEventTime != Config.INVALID_EVENT_TIME) {\r
355\r
0c32e4c5 356 // Queue update in the event request queue\r
a4115405 357 TmfTimeRange timeRange = new TmfTimeRange(new TmfTimestamp(currentEventTime, Config.TIME_SCALE), TmfTimestamp.BIG_CRUNCH);\r
0c32e4c5 358 TmfEventRequest request = new TmfEventRequest(LttngEvent.class, timeRange, 0, 1, ExecutionType.FOREGROUND) {\r
fbd124dd
BH
359 @Override\r
360 public void handleCompleted() {\r
361 broadcast(new TmfTimeSynchSignal(this, new TmfTimestamp(currentEventTime, Config.TIME_SCALE)));\r
362 }\r
363 };\r
364 fExperiment.sendRequest(request);\r
365 }\r
366 }\r
0c32e4c5 367\r
fbd124dd
BH
368 // ------------------------------------------------------------------------\r
369 // Helper functions\r
370 // ------------------------------------------------------------------------\r
0c32e4c5 371\r
fbd124dd
BH
372 /**\r
373 * Fills the local pull down menu.\r
374 * @param manager\r
375 * The menu manager.\r
376 */\r
377 private void fillLocalPullDown(IMenuManager manager) {\r
378 manager.add(new Separator());\r
379 manager.add(fIncreaseBarWidth);\r
380 manager.add(fDecreaseBarWidth);\r
381 manager.add(new Separator());\r
382 manager.add(fListMatchingEvents);\r
383 manager.add(fAddMatchingEvents);\r
384 manager.add(fDeleteMatchingEvents);\r
385 manager.add(new Separator());\r
386 }\r
387\r
388 /**\r
389 * Fills the local toolbar.\r
390 * @param manager\r
391 * The toolbar manager\r
392 */\r
393 private void fillLocalToolBar(IToolBarManager manager) {\r
394 manager.add(new Separator());\r
395 manager.add(fIncreaseBarWidth);\r
396 manager.add(fDecreaseBarWidth);\r
397 manager.add(new Separator());\r
398 manager.add(fListMatchingEvents);\r
399 manager.add(fAddMatchingEvents);\r
400 manager.add(fDeleteMatchingEvents);\r
401 manager.add(new Separator());\r
402 }\r
403\r
404 /**\r
405 * Creates the actions required by the dialog events.\r
406 */\r
407 private void makeActions() {\r
408 // Increase the histogram bar width\r
409 fIncreaseBarWidth = new Action() {\r
410 @Override\r
411 public void run() {\r
412 fHistogramViewer.increaseBarWidth();\r
413 fGraphViewer.increaseBarWidth();\r
414 }\r
415 };\r
416 String tooltipText = Messages.LatencyView_Action_IncreaseBarWidth_Tooltip;\r
417 fIncreaseBarWidth.setText(tooltipText);\r
418 fIncreaseBarWidth.setToolTipText(tooltipText);\r
419 fIncreaseBarWidth.setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(Messages.LatencyView_tmf_UI, "icons/elcl16/increasebar_button.gif")); //$NON-NLS-1$\r
420\r
421 // Decrease the histogram bar width\r
422 fDecreaseBarWidth = new Action() {\r
423 @Override\r
424 public void run() {\r
425 fHistogramViewer.decreaseBarWidth();\r
426 fGraphViewer.decreaseBarWidth();\r
427 }\r
428 };\r
429 tooltipText = Messages.LatencyView_Action_DecreaseBarWidth_Tooltip;\r
430 fDecreaseBarWidth.setText(tooltipText);\r
431 fDecreaseBarWidth.setToolTipText(tooltipText);\r
432 fDecreaseBarWidth.setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(Messages.LatencyView_tmf_UI, "icons/elcl16/decreasebar_button.gif")); //$NON-NLS-1$\r
433\r
434 // List matching events dialog\r
435 fListMatchingEvents = new Action() {\r
436 @Override\r
437 public void run() {\r
438 ListDialog listDialog = new ListDialog(fParent.getShell(), Messages.LatencyView_Dialogs_ListEvents_Title, Messages.LatencyView_Dialogs_ListEvents_Message);\r
439 listDialog.create();\r
440 listDialog.open();\r
441 }\r
442 };\r
443 tooltipText = Messages.LatencyView_Action_ListEvents_Tooltip;\r
444 fListMatchingEvents.setText(tooltipText);\r
445 fListMatchingEvents.setToolTipText(tooltipText);\r
446 fListMatchingEvents.setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(Messages.LatencyView_tmf_UI, "icons/eview16/events_view.gif")); //$NON-NLS-1$\r
447\r
448 // Add matching events dialog\r
449 fAddMatchingEvents = new Action() {\r
450 @Override\r
451 public void run() {\r
452 AddDialog addDialog = new AddDialog(fParent.getShell(), Messages.LatencyView_Dialogs_AddEvents_Title, Messages.LatencyView_Dialogs_AddEvents_Message);\r
453 addDialog.create();\r
454 addDialog.open();\r
455 }\r
456 };\r
457 tooltipText = Messages.LatencyView_Action_AddEvents_Tooltip;\r
458 fAddMatchingEvents.setText(tooltipText);\r
459 fAddMatchingEvents.setToolTipText(tooltipText);\r
460 fAddMatchingEvents.setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(Messages.LatencyView_tmf_UI, "icons/elcl16/add_button.gif")); //$NON-NLS-1$\r
461\r
462 // Remove matching events dialog\r
463 fDeleteMatchingEvents = new Action() {\r
464 @Override\r
465 public void run() {\r
466 DeleteDialog deleteDialog = new DeleteDialog(fParent.getShell(), Messages.LatencyView_Dialogs_DeleteEvents_Title,\r
467 Messages.LatencyView_Dialogs_DeleteEvents_Message);\r
468 deleteDialog.create();\r
469 deleteDialog.open();\r
470 }\r
471 };\r
472 tooltipText = Messages.LatencyView_Action_DeleteEvents_Tooltip;\r
473 fDeleteMatchingEvents.setText(tooltipText);\r
474 fDeleteMatchingEvents.setToolTipText(tooltipText);\r
475 fDeleteMatchingEvents.setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(Messages.LatencyView_tmf_UI, "icons/elcl16/delete_button.gif")); //$NON-NLS-1$\r
476 }\r
477\r
478 /**\r
479 * Build the toolbar and menu by adding action buttons for dialogs.\r
480 */\r
481 private void contributeToActionBars() {\r
482 IActionBars bars = getViewSite().getActionBars();\r
483 fillLocalPullDown(bars.getMenuManager());\r
484 fillLocalToolBar(bars.getToolBarManager());\r
485 }\r
828e5592 486}
This page took 0.052189 seconds and 5 git commands to generate.