Fix copyright notice
[deliverable/tracecompass.git] / org.eclipse.linuxtools.lttng.ui / src / org / eclipse / linuxtools / lttng / ui / views / resources / ResourcesView.java
1 /*******************************************************************************
2 * Copyright (c) 2009, 2010 Ericsson
3 *
4 * All rights reserved. This program and the accompanying materials are made
5 * 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 * Alvaro Sanchez-Leon - Initial implementation
11 * Michel Dagenais (michel.dagenais@polymtl.ca) - Reference C implementation, used with permission
12 *******************************************************************************/
13 package org.eclipse.linuxtools.lttng.ui.views.resources;
14
15 import org.eclipse.jface.action.Action;
16 import org.eclipse.jface.action.IMenuListener;
17 import org.eclipse.jface.action.IMenuManager;
18 import org.eclipse.jface.action.IToolBarManager;
19 import org.eclipse.jface.action.MenuManager;
20 import org.eclipse.jface.action.Separator;
21 import org.eclipse.linuxtools.lttng.control.LttngCoreProviderFactory;
22 import org.eclipse.linuxtools.lttng.request.ILttngSyntEventRequest;
23 import org.eclipse.linuxtools.lttng.state.evProcessor.ITransEventProcessor;
24 import org.eclipse.linuxtools.lttng.ui.TraceDebug;
25 import org.eclipse.linuxtools.lttng.ui.model.trange.ItemContainer;
26 import org.eclipse.linuxtools.lttng.ui.model.trange.TimeRangeViewerProvider;
27 import org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView;
28 import org.eclipse.linuxtools.lttng.ui.views.common.ParamsUpdater;
29 import org.eclipse.linuxtools.lttng.ui.views.resources.evProcessor.ResourcesEventToHandlerFactory;
30 import org.eclipse.linuxtools.lttng.ui.views.resources.model.ResourceModelFactory;
31 import org.eclipse.linuxtools.tmf.event.TmfEvent;
32 import org.eclipse.linuxtools.tmf.event.TmfTimeRange;
33 import org.eclipse.linuxtools.tmf.experiment.TmfExperiment;
34 import org.eclipse.linuxtools.tmf.request.ITmfDataRequest.ExecutionType;
35 import org.eclipse.linuxtools.tmf.signal.TmfExperimentSelectedSignal;
36 import org.eclipse.linuxtools.tmf.signal.TmfRangeSynchSignal;
37 import org.eclipse.linuxtools.tmf.signal.TmfSignalHandler;
38 import org.eclipse.linuxtools.tmf.signal.TmfTimeSynchSignal;
39 import org.eclipse.linuxtools.tmf.ui.viewers.TmfViewerFactory;
40 import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.ITmfTimeScaleSelectionListener;
41 import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.ITmfTimeSelectionListener;
42 import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.TmfTimeScaleSelectionEvent;
43 import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.TmfTimeSelectionEvent;
44 import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.ITmfTimeAnalysisEntry;
45 import org.eclipse.swt.SWT;
46 import org.eclipse.swt.layout.FillLayout;
47 import org.eclipse.swt.widgets.Composite;
48 import org.eclipse.swt.widgets.Display;
49 import org.eclipse.swt.widgets.Menu;
50 import org.eclipse.ui.IActionBars;
51 import org.eclipse.ui.IWorkbenchActionConstants;
52 import org.eclipse.ui.PlatformUI;
53 import org.eclipse.ui.plugin.AbstractUIPlugin;
54
55 /**
56 * @author alvaro
57 *
58 */
59 public class ResourcesView extends AbsTimeUpdateView implements
60 ITmfTimeSelectionListener, ITmfTimeScaleSelectionListener {
61
62 // ========================================================================
63 // Data
64 // ========================================================================
65 public static final String ID = "org.eclipse.linuxtools.lttng.ui.views.resources"; //$NON-NLS-1$
66
67 // private int totalNumItems = 0;
68 // Actions
69 private Action resetScale;
70 private Action nextEvent;
71 private Action prevEvent;
72 private Action nextTrace;
73 private Action prevTrace;
74 private Action showLegend;
75 private Action filterTraces;
76 private Action zoomIn;
77 private Action zoomOut;
78 private Action zoomFilter;
79 private Composite top;
80
81 // private static SimpleDateFormat stimeformat = new SimpleDateFormat(
82 // "yy/MM/dd HH:mm:ss");
83
84 // private TraceModelImplFactory fact;
85
86 // ========================================================================
87 // Constructor
88 // ========================================================================
89
90 /**
91 * The constructor.
92 */
93 public ResourcesView() {
94 super(ID);
95 }
96
97 // ========================================================================
98 // Methods
99 // ========================================================================
100
101 /**
102 * This is a callback that will allow us to create the viewer and initialize
103 * it.
104 */
105 @Override
106 public void createPartControl(Composite parent) {
107 top = new Composite(parent, SWT.BORDER);
108
109 top.setLayout(new FillLayout());
110 tsfviewer = TmfViewerFactory.createViewer(top, new TimeRangeViewerProvider(getParamsUpdater()));
111
112 tsfviewer.addWidgetSelectionListner(this);
113 tsfviewer.addWidgetTimeScaleSelectionListner(this);
114
115 // Traces shall not be grouped to allow synchronisation
116 tsfviewer.groupTraces(true);
117 tsfviewer.setAcceptSelectionAPIcalls(true);
118
119 // Viewer to notify selection to this class
120 // This class will synchronise selections with table.
121 // tsfviewer.addWidgetSelectionListner(this);
122 // tsfviewer.addWidgetTimeScaleSelectionListner(this);
123
124 // Create the help context id for the viewer's control
125 // TODO: Associate with help system
126 PlatformUI.getWorkbench().getHelpSystem().setHelp(
127 tsfviewer.getControl(),
128 "org.eclipse.linuxtools.lttng.ui.views.resource.view"); //$NON-NLS-1$
129
130 makeActions();
131 hookContextMenu();
132 contributeToActionBars();
133
134 // // Read relevant values
135 // int timeSpaceWidth = tsfviewer.getTimeSpace();
136 // if (timeSpaceWidth < 0) {
137 // timeSpaceWidth = -timeSpaceWidth;
138 // }
139
140 TmfExperiment<?> experiment = TmfExperiment.getCurrentExperiment();
141 if (experiment != null) {
142 TmfTimeRange experimentTRange = experiment.getTimeRange();
143 if (experimentTRange != null) {
144 long time0 = experimentTRange.getStartTime().getValue();
145 long time1 = experimentTRange.getEndTime().getValue();
146 ParamsUpdater paramUpdater = getParamsUpdater();
147 paramUpdater.update(time0, time1); // , timeSpaceWidth);
148 }
149 // send the initial request and obtained the adjusted time used
150 TmfTimeRange adjustedTimeRange = initialExperimentDataRequest(this, experimentTRange);
151
152 // initialize widget time boundaries and filtering parameters
153 ModelUpdateInit(experimentTRange, adjustedTimeRange, this);
154 } else {
155 TraceDebug.debug("No selected experiment information available"); //$NON-NLS-1$
156 }
157 }
158
159 private void hookContextMenu() {
160 MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
161 menuMgr.setRemoveAllWhenShown(true);
162 menuMgr.addMenuListener(new IMenuListener() {
163 @Override
164 public void menuAboutToShow(IMenuManager manager) {
165 ResourcesView.this.fillContextMenu(manager);
166 }
167 });
168
169 Menu menu = menuMgr.createContextMenu(tsfviewer.getControl());
170 tsfviewer.getControl().setMenu(menu);
171 getSite()
172 .registerContextMenu(menuMgr, tsfviewer.getSelectionProvider());
173 }
174
175 private void contributeToActionBars() {
176 IActionBars bars = getViewSite().getActionBars();
177 fillLocalPullDown(bars.getMenuManager());
178 fillLocalToolBar(bars.getToolBarManager());
179 }
180
181 private void fillLocalPullDown(IMenuManager manager) {
182 manager.add(new Separator());
183 // manager.add(showLegend);
184 manager.add(new Separator());
185 manager.add(resetScale);
186 manager.add(nextEvent);
187 manager.add(prevEvent);
188 manager.add(nextTrace);
189 manager.add(prevTrace);
190 // manager.add(filterTraces);
191 manager.add(zoomIn);
192 manager.add(zoomOut);
193 manager.add(zoomFilter);
194 manager.add(new Separator());
195 }
196
197 private void fillContextMenu(IMenuManager manager) {
198 // manager.add(showLegend);
199 manager.add(new Separator());
200 manager.add(resetScale);
201 manager.add(nextEvent);
202 manager.add(prevEvent);
203 manager.add(nextTrace);
204 manager.add(prevTrace);
205 // manager.add(showLegend);
206 // manager.add(filterTraces);
207 manager.add(zoomIn);
208 manager.add(zoomOut);
209 manager.add(zoomFilter);
210 manager.add(new Separator());
211 manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
212 }
213
214 private void fillLocalToolBar(IToolBarManager manager) {
215 // manager.add(showLegend);
216 manager.add(new Separator());
217 manager.add(resetScale);
218 manager.add(nextEvent);
219 manager.add(prevEvent);
220 manager.add(nextTrace);
221 manager.add(prevTrace);
222 // manager.add(filterTraces);
223 manager.add(zoomIn);
224 manager.add(zoomOut);
225 manager.add(zoomFilter);
226 manager.add(new Separator());
227 }
228
229 private void makeActions() {
230 // action4
231 resetScale = new Action() {
232 @Override
233 public void run() {
234 if (tsfviewer != null) {
235 tsfviewer.resetStartFinishTime();
236 }
237
238 }
239 };
240 resetScale.setText(Messages.getString("ResourcesView.Action.Reset")); //$NON-NLS-1$
241 resetScale.setToolTipText(Messages.getString("ResourcesView.Action.Reset.ToolTip")); //$NON-NLS-1$
242 resetScale.setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(
243 Messages.getString("ResourcesView.tmf.UI"), "icons/elcl16/home_nav.gif")); //$NON-NLS-1$ //$NON-NLS-2$
244
245 // action5
246 nextEvent = new Action() {
247 @Override
248 public void run() {
249 if (tsfviewer != null) {
250 tsfviewer.selectNextEvent();
251 }
252 }
253 };
254 nextEvent.setText(Messages.getString("ResourcesView.Action.NextEvent")); //$NON-NLS-1$
255 nextEvent.setToolTipText(Messages.getString("ResourcesView.Action.NextEvent.Tooltip")); //$NON-NLS-1$
256 nextEvent.setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(
257 Messages.getString("ResourcesView.tmf.UI"), "icons/elcl16/next_event.gif")); //$NON-NLS-1$//$NON-NLS-2$
258
259 // action6
260 prevEvent = new Action() {
261 @Override
262 public void run() {
263 if (tsfviewer != null) {
264 tsfviewer.selectPrevEvent();
265 }
266 }
267 };
268 prevEvent.setText(Messages.getString("ResourcesView.Action.PrevEvent")); //$NON-NLS-1$
269 prevEvent.setToolTipText(Messages.getString("ResourcesView.Action.PrevEvent.Tooltip")); //$NON-NLS-1$
270 prevEvent.setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(
271 Messages.getString("ResourcesView.tmf.UI"), "icons/elcl16/prev_event.gif")); //$NON-NLS-1$//$NON-NLS-2$
272
273 // action7
274 nextTrace = new Action() {
275 @Override
276 public void run() {
277 if (tsfviewer != null) {
278 tsfviewer.selectNextTrace();
279 }
280 }
281 };
282 nextTrace.setText(Messages.getString("ResourcesView.Action.NextResource")); //$NON-NLS-1$
283 nextTrace.setToolTipText(Messages.getString("ResourcesView.Action.NextResource.ToolTip")); //$NON-NLS-1$
284 nextTrace.setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(
285 Messages.getString("ResourcesView.tmf.UI"), "icons/elcl16/next_item.gif")); //$NON-NLS-1$//$NON-NLS-2$
286
287 // action8
288 prevTrace = new Action() {
289 @Override
290 public void run() {
291 if (tsfviewer != null) {
292 tsfviewer.selectPrevTrace();
293 }
294 }
295 };
296 prevTrace.setText(Messages.getString("ResourcesView.Action.PreviousResource")); //$NON-NLS-1$
297 prevTrace.setToolTipText(Messages.getString("ResourcesView.Action.PreviousResource.Tooltip")); //$NON-NLS-1$
298 prevTrace.setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(
299 Messages.getString("ResourcesView.tmf.UI"), "icons/elcl16/prev_item.gif")); //$NON-NLS-1$//$NON-NLS-2$
300
301 // action9
302 showLegend = new Action() {
303 @Override
304 public void run() {
305 if (tsfviewer != null) {
306 tsfviewer.showLegend();
307 }
308 }
309 };
310 showLegend.setText(Messages.getString("ResourcesView.Action.Legend")); //$NON-NLS-1$
311 showLegend.setToolTipText(Messages.getString("ResourcesView.Action.Legend.ToolTip")); //$NON-NLS-1$
312
313 // action10
314 filterTraces = new Action() {
315 @Override
316 public void run() {
317 if (tsfviewer != null) {
318 tsfviewer.filterTraces();
319 }
320 }
321 };
322 filterTraces.setText(Messages.getString("ResourcesView.Action.Filter")); //$NON-NLS-1$
323 filterTraces.setToolTipText(Messages.getString("ResourcesView.Action.Filter.ToolTip")); //$NON-NLS-1$
324 filterTraces.setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(
325 Messages.getString("ResourcesView.tmf.UI"), "icons/elcl16/filter_items.gif")); //$NON-NLS-1$//$NON-NLS-2$
326
327 // action10
328 zoomIn = new Action() {
329 @Override
330 public void run() {
331 if (tsfviewer != null) {
332 tsfviewer.zoomIn();
333 }
334 }
335 };
336 zoomIn.setText(Messages.getString("ResourcesView.Action.ZoomIn")); //$NON-NLS-1$
337 zoomIn.setToolTipText(Messages.getString("ResourcesView.Action.ZoomIn.Tooltip")); //$NON-NLS-1$
338 zoomIn.setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(
339 Messages.getString("ResourcesView.tmf.UI"), "icons/elcl16/zoomin_nav.gif")); //$NON-NLS-1$//$NON-NLS-2$
340
341 // action10
342 zoomOut = new Action() {
343 @Override
344 public void run() {
345 if (tsfviewer != null) {
346 tsfviewer.zoomOut();
347 }
348 }
349 };
350 zoomOut.setText(Messages.getString("ResourcesView.Action.ZoomOut")); //$NON-NLS-1$
351 zoomOut.setToolTipText(Messages.getString("ResourcesView.Action.ZoomOut.tooltip")); //$NON-NLS-1$
352 zoomOut.setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(
353 Messages.getString("ResourcesView.tmf.UI"), "icons/elcl16/zoomout_nav.gif")); //$NON-NLS-1$//$NON-NLS-2$
354
355 // zoomFilter
356 zoomFilter = new Action() {
357 @Override
358 public void run() {
359 // Nothing to do, however the selection status is needed by the
360 // application
361 }
362 };
363
364 zoomFilter.setText(Messages.getString("ResourcesView.Action.ZoomFilter")); //$NON-NLS-1$
365 zoomFilter.setToolTipText(Messages.getString("ResourcesView.Action.ZoomFilter.tooltip")); //$NON-NLS-1$
366 zoomFilter.setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(
367 Messages.getString("ResourcesView.tmf.UI"), "icons/elcl16/filter_items.gif")); //$NON-NLS-1$//$NON-NLS-2$
368 zoomFilter.setChecked(false);
369
370 // PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_ELCL_SYNCED);
371 }
372
373 /**
374 * Passing the focus request to the viewer's control.
375 */
376 @Override
377 public void setFocus() {
378 tsfviewer.getControl().setFocus();
379 }
380
381 /*
382 * (non-Javadoc)
383 *
384 * @see org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView#
385 * tsfTmProcessSelEvent
386 * (org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.TmfTimeSelectionEvent
387 * )
388 */
389 @Override
390 public void tsfTmProcessSelEvent(TmfTimeSelectionEvent event) {
391 // common implementation
392 super.tsfTmProcessSelEvent(event);
393 }
394
395 /*
396 * (non-Javadoc)
397 *
398 * @seeorg.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.
399 * ITmfTimeScaleSelectionListener
400 * #tsfTmProcessTimeScaleEvent(org.eclipse.linuxtools
401 * .tmf.ui.viewers.timeAnalysis.TmfTimeScaleSelectionEvent)
402 */
403 @Override
404 public void tsfTmProcessTimeScaleEvent(TmfTimeScaleSelectionEvent event) {
405 super.tsfTmProcessTimeScaleEvent(event);
406 }
407
408 /*
409 * (non-Javadoc)
410 *
411 * @see
412 * org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView#displayModel
413 * (org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.
414 * ITmfTimeAnalysisEntry[], long, long, boolean, long, long,
415 * java.lang.Object)
416 */
417 @Override
418 public void displayModel(final ITmfTimeAnalysisEntry[] items, final long startBoundTime,
419 final long endBoundTime, final boolean updateTimeBounds, final long startVisibleWindow,
420 final long endVisibleWindow, final Object source) {
421
422 // Return if disposed
423 if ((tsfviewer == null) || (tsfviewer.getControl().isDisposed())) return;
424
425 Display display = tsfviewer.getControl().getDisplay();
426 display.asyncExec(new Runnable() {
427 @Override
428 public void run() {
429 if ((tsfviewer != null) && (!tsfviewer.getControl().isDisposed())) {
430 tsfviewer.display(items, startBoundTime, endBoundTime, updateTimeBounds);
431 // validate visible boundaries
432 if (startVisibleWindow > -1 && endVisibleWindow > -1) {
433 tsfviewer.setSelectVisTimeWindow(startVisibleWindow, endVisibleWindow, source);
434 }
435 tsfviewer.resizeControls();
436 }
437 }
438 });
439 }
440
441 @Override
442 public void dispose() {
443 // dispose parent resources
444 super.dispose();
445
446 tsfviewer.removeWidgetSelectionListner(this);
447 tsfviewer.removeWidgetTimeScaleSelectionListner(this);
448 tsfviewer = null;
449 }
450
451 /**
452 * Registers as listener of time selection from other tmf views
453 *
454 * @param signal
455 */
456 @Override
457 @TmfSignalHandler
458 public void synchToTime(TmfTimeSynchSignal signal) {
459 super.synchToTime(signal);
460 }
461
462 /**
463 * Annotation Registers as listener of time range selection from other views
464 * The implementation handles the entry of the signal.
465 *
466 * @param signal
467 */
468 @TmfSignalHandler
469 public void synchToTimeRange(TmfRangeSynchSignal signal) {
470 if (zoomFilter != null) {
471 synchToTimeRange(signal, zoomFilter.isChecked());
472 }
473 }
474
475 @Override
476 public void modelIncomplete(ILttngSyntEventRequest request) {
477 // Nothing to do
478 // The data will be refreshed on the next request
479 }
480
481 /*
482 * (non-Javadoc)
483 *
484 * @see org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView#
485 * getEventProcessor()
486 */
487 @Override
488 public ITransEventProcessor getEventProcessor() {
489 return ResourcesEventToHandlerFactory.getInstance();
490 }
491
492 /**
493 * @param signal
494 */
495 @TmfSignalHandler
496 public void experimentSelected(TmfExperimentSelectedSignal<? extends TmfEvent> signal) {
497 if (signal != null) {
498 TmfTimeRange experimentTRange = signal.getExperiment().getTimeRange();
499
500 // prepare time intervals in widget
501 ModelUpdateInit(experimentTRange, experimentTRange, signal.getSource());
502
503 // request initial data
504 initialExperimentDataRequest(signal.getSource(), experimentTRange);
505 }
506 }
507
508 /**
509 * @param source
510 * @param experimentTRange
511 * @return Adjusted time window used for the request (smaller window to
512 * initialize view)
513 */
514 private TmfTimeRange initialExperimentDataRequest(Object source, TmfTimeRange experimentTRange) {
515 // Adjust the initial time window to a shorter interval to allow
516 // user to select the interesting area based on the perspective
517 TmfTimeRange initTimeWindow = getInitTRange(experimentTRange);
518
519 dataRequest(initTimeWindow, experimentTRange, true, ExecutionType.FOREGROUND);
520 if (TraceDebug.isDEBUG()) {
521 TraceDebug.debug("Initialization request time range is: " + initTimeWindow.getStartTime().toString() + "-" //$NON-NLS-1$ //$NON-NLS-2$
522 + initTimeWindow.getEndTime().toString());
523 }
524
525 return initTimeWindow;
526 }
527
528 /*
529 * (non-Javadoc)
530 *
531 * @see org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView#
532 * getParamsUpdater()
533 */
534 @Override
535 protected ParamsUpdater getParamsUpdater() {
536 return ResourceModelFactory.getParamsUpdater();
537 }
538
539 /*
540 * (non-Javadoc)
541 *
542 * @see org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView#
543 * getItemContainer()
544 */
545 @Override
546 protected ItemContainer<?> getItemContainer() {
547 return ResourceModelFactory.getResourceContainer();
548 }
549
550 /*
551 * (non-Javadoc)
552 * @see org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView#getProviderId()
553 */
554 @Override
555 protected int getProviderId() {
556 return LttngCoreProviderFactory.RESOURCE_LTTNG_SYTH_EVENT_PROVIDER;
557 }
558 }
This page took 0.054247 seconds and 6 git commands to generate.