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