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