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