Support for live sessions using LTTng MI (2.6)
[deliverable/tracecompass.git] / org.eclipse.tracecompass.tmf.ui / src / org / eclipse / tracecompass / tmf / ui / editors / TmfEventsEditor.java
CommitLineData
6151d86c 1/*******************************************************************************
50a41a0d 2 * Copyright (c) 2010, 2014 Ericsson, École Polytechnique de Montréal
6151d86c
PT
3 *
4 * All rights reserved. This program and the accompanying materials are
5 * made 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 * Patrick Tasse - Initial API and implementation
50a41a0d 11 * Geneviève Bastien - Experiment instantiated with experiment type
6151d86c
PT
12 *******************************************************************************/
13
2bdf0193 14package org.eclipse.tracecompass.tmf.ui.editors;
6151d86c 15
fa62dc1d
BH
16import java.util.List;
17
6151d86c
PT
18import org.eclipse.core.resources.IFile;
19import org.eclipse.core.resources.IMarker;
20import org.eclipse.core.resources.IMarkerDelta;
21import org.eclipse.core.resources.IResource;
22import org.eclipse.core.resources.IResourceChangeEvent;
23import org.eclipse.core.resources.IResourceChangeListener;
24import org.eclipse.core.resources.IResourceDelta;
25import org.eclipse.core.resources.ResourcesPlugin;
26import org.eclipse.core.runtime.CoreException;
6151d86c
PT
27import org.eclipse.core.runtime.IProgressMonitor;
28import org.eclipse.core.runtime.InvalidRegistryObjectException;
93bfd50a 29import org.eclipse.core.runtime.ListenerList;
99d7adc6
AM
30import org.eclipse.jdt.annotation.NonNull;
31import org.eclipse.jdt.annotation.Nullable;
3f43dc48 32import org.eclipse.jface.action.IStatusLineManager;
93bfd50a
PT
33import org.eclipse.jface.util.SafeRunnable;
34import org.eclipse.jface.viewers.ISelection;
35import org.eclipse.jface.viewers.ISelectionChangedListener;
36import org.eclipse.jface.viewers.ISelectionProvider;
37import org.eclipse.jface.viewers.SelectionChangedEvent;
38import org.eclipse.jface.viewers.StructuredSelection;
6151d86c
PT
39import org.eclipse.swt.widgets.Composite;
40import org.eclipse.swt.widgets.Display;
2bdf0193
AM
41import org.eclipse.tracecompass.internal.tmf.ui.Activator;
42import org.eclipse.tracecompass.tmf.core.TmfCommonConstants;
b04903a2 43import org.eclipse.tracecompass.tmf.core.event.aspect.ITmfEventAspect;
2bdf0193
AM
44import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
45import org.eclipse.tracecompass.tmf.core.signal.TmfTimestampFormatUpdateSignal;
46import org.eclipse.tracecompass.tmf.core.signal.TmfTraceClosedSignal;
47import org.eclipse.tracecompass.tmf.core.signal.TmfTraceOpenedSignal;
48import org.eclipse.tracecompass.tmf.core.signal.TmfTraceSelectedSignal;
49import org.eclipse.tracecompass.tmf.core.trace.ITmfContext;
50import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
2bdf0193 51import org.eclipse.tracecompass.tmf.core.trace.TmfTrace;
5c5fa260 52import org.eclipse.tracecompass.tmf.core.trace.experiment.TmfExperiment;
2bdf0193
AM
53import org.eclipse.tracecompass.tmf.ui.project.model.Messages;
54import org.eclipse.tracecompass.tmf.ui.project.model.TmfExperimentElement;
55import org.eclipse.tracecompass.tmf.ui.project.model.TmfOpenTraceHelper;
56import org.eclipse.tracecompass.tmf.ui.project.model.TmfProjectElement;
57import org.eclipse.tracecompass.tmf.ui.project.model.TmfProjectRegistry;
58import org.eclipse.tracecompass.tmf.ui.project.model.TmfTraceElement;
59import org.eclipse.tracecompass.tmf.ui.project.model.TmfTraceTypeUIUtils;
60import org.eclipse.tracecompass.tmf.ui.viewers.events.TmfEventsTable;
6151d86c
PT
61import org.eclipse.ui.IEditorInput;
62import org.eclipse.ui.IEditorPart;
63import org.eclipse.ui.IEditorSite;
64import org.eclipse.ui.IFileEditorInput;
faa38350 65import org.eclipse.ui.IPartListener;
6151d86c
PT
66import org.eclipse.ui.IPropertyListener;
67import org.eclipse.ui.IReusableEditor;
faa38350 68import org.eclipse.ui.IWorkbenchPart;
6151d86c
PT
69import org.eclipse.ui.PartInitException;
70import org.eclipse.ui.ide.IGotoMarker;
71import org.eclipse.ui.part.FileEditorInput;
93bfd50a 72import org.eclipse.ui.views.properties.IPropertySheetPage;
6151d86c 73
de34c0b1
AM
74import com.google.common.collect.ImmutableSet;
75import com.google.common.collect.Iterables;
76
6151d86c
PT
77/**
78 * Editor for TMF events
79 *
80 * @version 1.0
81 * @author Patrick Tasse
faa38350 82 * @since 2.0
6151d86c 83 */
eb271b88 84public class TmfEventsEditor extends TmfEditor implements ITmfTraceEditor, IReusableEditor, IPropertyListener, IResourceChangeListener, ISelectionProvider, ISelectionChangedListener, IPartListener, IGotoMarker {
6151d86c
PT
85
86 /** ID for this class */
87 public static final String ID = "org.eclipse.linuxtools.tmf.ui.editors.events"; //$NON-NLS-1$
88
89 private TmfEventsTable fEventsTable;
90 private IFile fFile;
91 private ITmfTrace fTrace;
92 private Composite fParent;
93bfd50a 93 private ListenerList fSelectionChangedListeners = new ListenerList();
81fe3479 94 private boolean fTraceSelected;
eb271b88 95 private IMarker fPendingGotoMarker;
6151d86c
PT
96
97 @Override
98 public void doSave(final IProgressMonitor monitor) {
99 }
100
101 @Override
102 public void doSaveAs() {
103 }
104
6151d86c
PT
105 @Override
106 public void init(final IEditorSite site, IEditorInput input) throws PartInitException {
faa38350 107 IFileEditorInput fileEditorInput;
6151d86c
PT
108 if (input instanceof TmfEditorInput) {
109 fFile = ((TmfEditorInput) input).getFile();
110 fTrace = ((TmfEditorInput) input).getTrace();
faa38350
PT
111 /* change the input to a FileEditorInput to allow open handlers to find this editor */
112 fileEditorInput = new FileEditorInput(fFile);
6151d86c 113 } else if (input instanceof IFileEditorInput) {
faa38350
PT
114 fileEditorInput = (IFileEditorInput) input;
115 fFile = fileEditorInput.getFile();
116 if (fFile == null) {
117 throw new PartInitException("Invalid IFileEditorInput: " + fileEditorInput); //$NON-NLS-1$
6151d86c
PT
118 }
119 try {
120 final String traceTypeId = fFile.getPersistentProperty(TmfCommonConstants.TRACETYPE);
121 if (traceTypeId == null) {
67c53011 122 throw new PartInitException(Messages.TmfOpenTraceHelper_NoTraceType);
6151d86c
PT
123 }
124 if (traceTypeId.equals(TmfExperiment.class.getCanonicalName())) {
125 // Special case: experiment bookmark resource
f537c959 126 final TmfProjectElement project = TmfProjectRegistry.getProject(fFile.getProject(), true);
6151d86c 127 if (project == null) {
67c53011 128 throw new PartInitException(Messages.TmfOpenTraceHelper_NoTraceType);
6151d86c 129 }
339d539c
PT
130 for (final TmfExperimentElement experimentElement : project.getExperimentsFolder().getExperiments()) {
131 if (experimentElement.getResource().equals(fFile.getParent())) {
eb271b88
PT
132 setPartName(experimentElement.getName());
133 super.setSite(site);
134 super.setInput(fileEditorInput);
9d2e08b9 135 TmfOpenTraceHelper.reopenTraceFromElement(experimentElement, this);
eb271b88 136 return;
6151d86c
PT
137 }
138 }
139 } else if (traceTypeId.equals(TmfTrace.class.getCanonicalName())) {
140 // Special case: trace bookmark resource
f537c959 141 final TmfProjectElement project = TmfProjectRegistry.getProject(fFile.getProject(), true);
339d539c
PT
142 for (final TmfTraceElement traceElement : project.getTracesFolder().getTraces()) {
143 if (traceElement.getResource().equals(fFile.getParent())) {
eb271b88
PT
144 setPartName(traceElement.getName());
145 super.setSite(site);
146 super.setInput(fileEditorInput);
147 TmfOpenTraceHelper.reopenTraceFromElement(traceElement, this);
148 return;
6151d86c
PT
149 }
150 }
151 } else {
f537c959 152 final TmfProjectElement project = TmfProjectRegistry.getProject(fFile.getProject(), true);
339d539c
PT
153 for (final TmfTraceElement traceElement : project.getTracesFolder().getTraces()) {
154 if (traceElement.getResource().equals(fFile)) {
eb271b88
PT
155 setPartName(traceElement.getName());
156 super.setSite(site);
157 super.setInput(fileEditorInput);
158 TmfOpenTraceHelper.reopenTraceFromElement(traceElement, this);
159 return;
6151d86c
PT
160 }
161 }
162 }
faa38350
PT
163 } catch (final PartInitException e) {
164 throw e;
6151d86c
PT
165 } catch (final InvalidRegistryObjectException e) {
166 Activator.getDefault().logError("Error initializing TmfEventsEditor", e); //$NON-NLS-1$
167 } catch (final CoreException e) {
168 Activator.getDefault().logError("Error initializing TmfEventsEditor", e); //$NON-NLS-1$
169 }
faa38350 170 } else {
6151d86c
PT
171 throw new PartInitException("Invalid IEditorInput: " + input.getClass()); //$NON-NLS-1$
172 }
faa38350 173 if (fTrace == null) {
6151d86c
PT
174 throw new PartInitException("Invalid IEditorInput: " + fFile.getName()); //$NON-NLS-1$
175 }
176 super.setSite(site);
faa38350 177 super.setInput(fileEditorInput);
6151d86c
PT
178 }
179
180 @Override
181 public boolean isDirty() {
182 return false;
183 }
184
185 @Override
186 public boolean isSaveAsAllowed() {
187 return false;
188 }
189
190 @Override
191 public void setInput(final IEditorInput input) {
192 super.setInput(input);
193 firePropertyChange(IEditorPart.PROP_INPUT);
194 }
195
196 @Override
197 public void propertyChanged(final Object source, final int propId) {
faa38350 198 if (propId == IEditorPart.PROP_INPUT && getEditorInput() instanceof TmfEditorInput) {
1cf25311
PT
199 if (fTrace != null) {
200 broadcast(new TmfTraceClosedSignal(this, fTrace));
201 }
7e81f48c 202 fTraceSelected = false;
6151d86c
PT
203 fFile = ((TmfEditorInput) getEditorInput()).getFile();
204 fTrace = ((TmfEditorInput) getEditorInput()).getTrace();
faa38350 205 /* change the input to a FileEditorInput to allow open handlers to find this editor */
6151d86c
PT
206 super.setInput(new FileEditorInput(fFile));
207 fEventsTable.dispose();
208 if (fTrace != null) {
eb271b88 209 setPartName(fTrace.getName());
6151d86c 210 fEventsTable = createEventsTable(fParent, fTrace.getCacheSize());
93bfd50a 211 fEventsTable.addSelectionChangedListener(this);
6151d86c
PT
212 fEventsTable.setTrace(fTrace, true);
213 fEventsTable.refreshBookmarks(fFile);
eb271b88
PT
214 if (fPendingGotoMarker != null) {
215 fEventsTable.gotoMarker(fPendingGotoMarker);
216 fPendingGotoMarker = null;
217 }
c4352ddc
PT
218
219 /* ensure start time is set */
220 final ITmfContext context = fTrace.seekEvent(0);
221 fTrace.getNext(context);
222 context.dispose();
223
faa38350 224 broadcast(new TmfTraceOpenedSignal(this, fTrace, fFile));
6151d86c 225 } else {
eb271b88 226 setPartName(getEditorInput().getName());
6151d86c 227 fEventsTable = new TmfEventsTable(fParent, 0);
93bfd50a 228 fEventsTable.addSelectionChangedListener(this);
6151d86c
PT
229 }
230 fParent.layout();
231 }
232 }
233
234 @Override
235 public void createPartControl(final Composite parent) {
236 fParent = parent;
237 if (fTrace != null) {
238 setPartName(fTrace.getName());
239 fEventsTable = createEventsTable(parent, fTrace.getCacheSize());
93bfd50a 240 fEventsTable.addSelectionChangedListener(this);
6151d86c
PT
241 fEventsTable.setTrace(fTrace, true);
242 fEventsTable.refreshBookmarks(fFile);
d7ee91bb
PT
243
244 /* ensure start time is set */
245 final ITmfContext context = fTrace.seekEvent(0);
246 fTrace.getNext(context);
247 context.dispose();
248
faa38350 249 broadcast(new TmfTraceOpenedSignal(this, fTrace, fFile));
6151d86c 250 } else {
6151d86c 251 fEventsTable = new TmfEventsTable(parent, 0);
93bfd50a 252 fEventsTable.addSelectionChangedListener(this);
6151d86c 253 }
3f43dc48
PT
254 IStatusLineManager statusLineManager = getEditorSite().getActionBars().getStatusLineManager();
255 fEventsTable.setStatusLineManager(statusLineManager);
6151d86c
PT
256 addPropertyListener(this);
257 ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE);
93bfd50a
PT
258 // we need to wrap the ISelectionProvider interface in the editor because
259 // the events table can be replaced later while the selection changed listener
260 // is only added once by the platform to the selection provider set here
261 getSite().setSelectionProvider(this);
faa38350 262 getSite().getPage().addPartListener(this);
6151d86c
PT
263 }
264
265 @Override
266 public void dispose() {
faa38350
PT
267 if (getSite() != null) {
268 getSite().getPage().removePartListener(this);
269 }
6151d86c
PT
270 ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
271 removePropertyListener(this);
272 if (fTrace != null) {
273 broadcast(new TmfTraceClosedSignal(this, fTrace));
274 }
275 if (fEventsTable != null) {
276 fEventsTable.dispose();
277 }
278 super.dispose();
279 }
280
faa38350 281 /**
99d7adc6 282 * Create the event table
faa38350 283 *
99d7adc6
AM
284 * @param parent
285 * The parent composite
286 * @param cacheSize
287 * The cache size
288 * @return The event table instance
faa38350 289 */
99d7adc6 290 protected @NonNull TmfEventsTable createEventsTable(final Composite parent, final int cacheSize) {
de34c0b1
AM
291 ITmfTrace trace = fTrace;
292
293 /*
294 * Check if the trace (or experiment type) defines a specific event
295 * table in its extension point.
296 */
297 TmfEventsTable table = TmfTraceTypeUIUtils.getEventTable(trace, parent, cacheSize);
298 if (table != null) {
299 return table;
300 }
301
302 /*
303 * Use the aspects defined by the trace type (or each trace type in an
304 * experiment) to build a table consisting of these.
305 */
306 Iterable<ITmfEventAspect> aspects = getTraceAspects(trace);
307 if (Iterables.isEmpty(aspects)) {
308 /* Couldn't find any event aspects, use a default table */
309 return new TmfEventsTable(parent, cacheSize);
310 }
311 return new TmfEventsTable(parent, cacheSize, aspects);
6151d86c
PT
312 }
313
99d7adc6
AM
314 /**
315 * Get the event table for the given trace. It will be of the type defined
316 * by the extension point if applicable, else it will be a default table
317 * with the extension-point-defined columns (if any).
318 *
319 * @param trace
320 * The event table is for this trace
321 * @param parent
322 * The parent composite of the table
323 * @param cacheSize
324 * The cache size to use
325 * @return The event table for the trace
326 */
de34c0b1 327 private static @NonNull Iterable<ITmfEventAspect> getTraceAspects(ITmfTrace trace) {
99d7adc6 328 if (trace instanceof TmfExperiment) {
de34c0b1 329 return getExperimentAspects((TmfExperiment) trace);
99d7adc6 330 }
de34c0b1 331 return trace.getEventAspects();
6151d86c
PT
332 }
333
334 /**
335 * Get the events table for an experiment. If all traces in the experiment
99d7adc6
AM
336 * are of the same type, use the same behavior as if it was one trace of
337 * that type.
6151d86c
PT
338 *
339 * @param experiment
340 * the experiment
341 * @param parent
342 * the parent Composite
343 * @param cacheSize
344 * the event table cache size
99d7adc6 345 * @return An event table of the appropriate type
6151d86c 346 */
de34c0b1
AM
347 private static @NonNull Iterable<ITmfEventAspect> getExperimentAspects(
348 final TmfExperiment experiment) {
fa62dc1d 349 List<ITmfTrace> traces = experiment.getTraces();
de34c0b1
AM
350 ImmutableSet.Builder<ITmfEventAspect> builder = new ImmutableSet.Builder<>();
351
352 /* For experiments, we'll add a "trace name" aspect/column */
353 builder.add(ITmfEventAspect.BaseAspects.TRACE_NAME);
99d7adc6
AM
354
355 String commonTraceType = getCommonTraceType(experiment);
356 if (commonTraceType != null) {
357 /*
358 * All the traces in this experiment are of the same type, let's
359 * just use the normal table for that type.
360 */
fa62dc1d 361 builder.addAll(traces.get(0).getEventAspects());
99d7adc6 362
de34c0b1
AM
363 } else {
364 /*
365 * There are different trace types in the experiment, so we are
366 * definitely using a TmfEventsTable. Aggregate the columns from all
367 * trace types.
368 */
369 for (ITmfTrace trace : traces) {
370 Iterable<ITmfEventAspect> traceAspects = trace.getEventAspects();
371 builder.addAll(traceAspects);
99d7adc6
AM
372 }
373 }
374
de34c0b1
AM
375 @SuppressWarnings("null")
376 @NonNull Iterable<ITmfEventAspect> ret = builder.build();
377 return ret;
99d7adc6
AM
378 }
379
380 /**
381 * Check if an experiment contains traces of all the same type. If so,
382 * returns this type as a String. If not, returns null.
383 *
384 * @param experiment
385 * The experiment
386 * @return The common trace type if there is one, or 'null' if there are
387 * different types.
388 */
389 private static @Nullable String getCommonTraceType(TmfExperiment experiment) {
6151d86c
PT
390 String commonTraceType = null;
391 try {
392 for (final ITmfTrace trace : experiment.getTraces()) {
393 final IResource resource = trace.getResource();
394 if (resource == null) {
395 return null;
396 }
99d7adc6 397
6151d86c
PT
398 final String traceType = resource.getPersistentProperty(TmfCommonConstants.TRACETYPE);
399 if ((commonTraceType != null) && !commonTraceType.equals(traceType)) {
400 return null;
401 }
402 commonTraceType = traceType;
403 }
99d7adc6
AM
404 } catch (CoreException e) {
405 /*
406 * One of the traces didn't advertise its type, we can't infer
407 * anything.
408 */
409 return null;
6151d86c 410 }
99d7adc6 411 return commonTraceType;
6151d86c
PT
412 }
413
414 @Override
415 public ITmfTrace getTrace() {
416 return fTrace;
417 }
418
6151d86c
PT
419 @Override
420 public void setFocus() {
421 fEventsTable.setFocus();
6151d86c
PT
422 }
423
424 @Override
425 public Object getAdapter(final Class adapter) {
426 if (IGotoMarker.class.equals(adapter)) {
eb271b88
PT
427 if (fTrace == null || fEventsTable == null) {
428 return this;
429 }
6151d86c 430 return fEventsTable;
93bfd50a 431 } else if (IPropertySheetPage.class.equals(adapter)) {
faa38350 432 return new UnsortedPropertySheetPage();
6151d86c
PT
433 }
434 return super.getAdapter(adapter);
435 }
436
eb271b88
PT
437 /**
438 * @since 2.1
439 */
440 @Override
441 public void gotoMarker(IMarker marker) {
442 if (fTrace == null || fEventsTable == null) {
443 fPendingGotoMarker = marker;
444 } else {
445 fEventsTable.gotoMarker(marker);
446 }
447 }
448
6151d86c
PT
449 @Override
450 public void resourceChanged(final IResourceChangeEvent event) {
451 for (final IMarkerDelta delta : event.findMarkerDeltas(IMarker.BOOKMARK, false)) {
452 if (delta.getResource().equals(fFile)) {
453 if (delta.getKind() == IResourceDelta.REMOVED) {
454 final IMarker bookmark = delta.getMarker();
455 Display.getDefault().asyncExec(new Runnable() {
456 @Override
457 public void run() {
458 fEventsTable.removeBookmark(bookmark);
459 }
460 });
461 } else if (delta.getKind() == IResourceDelta.CHANGED) {
462 Display.getDefault().asyncExec(new Runnable() {
463 @Override
464 public void run() {
465 fEventsTable.getTable().refresh();
466 }
467 });
468 }
469 }
470 }
471 }
472
93bfd50a
PT
473 // ------------------------------------------------------------------------
474 // ISelectionProvider
475 // ------------------------------------------------------------------------
476
93bfd50a
PT
477 /**
478 * @since 2.0
479 */
480 @Override
481 public void addSelectionChangedListener(ISelectionChangedListener listener) {
482 fSelectionChangedListeners.add(listener);
483 }
484
93bfd50a
PT
485 /**
486 * @since 2.0
487 */
488 @Override
489 public ISelection getSelection() {
490 if (fEventsTable == null) {
491 return StructuredSelection.EMPTY;
492 }
493 return fEventsTable.getSelection();
494 }
495
93bfd50a
PT
496 /**
497 * @since 2.0
498 */
499 @Override
500 public void removeSelectionChangedListener(ISelectionChangedListener listener) {
501 fSelectionChangedListeners.remove(listener);
502 }
503
93bfd50a
PT
504 /**
505 * @since 2.0
506 */
507 @Override
508 public void setSelection(ISelection selection) {
509 // not implemented
510 }
511
512 /**
513 * Notifies any selection changed listeners that the viewer's selection has changed.
514 * Only listeners registered at the time this method is called are notified.
515 *
516 * @param event a selection changed event
517 *
518 * @see ISelectionChangedListener#selectionChanged
519 * @since 2.0
520 */
521 protected void fireSelectionChanged(final SelectionChangedEvent event) {
522 Object[] listeners = fSelectionChangedListeners.getListeners();
523 for (int i = 0; i < listeners.length; ++i) {
524 final ISelectionChangedListener l = (ISelectionChangedListener) listeners[i];
525 SafeRunnable.run(new SafeRunnable() {
526 @Override
527 public void run() {
528 l.selectionChanged(event);
529 }
530 });
531 }
532 }
533
534 // ------------------------------------------------------------------------
535 // ISelectionChangedListener
536 // ------------------------------------------------------------------------
537
93bfd50a
PT
538 /**
539 * @since 2.0
540 */
541 @Override
542 public void selectionChanged(SelectionChangedEvent event) {
543 fireSelectionChanged(event);
544 }
545
faa38350
PT
546 // ------------------------------------------------------------------------
547 // IPartListener
548 // ------------------------------------------------------------------------
549
faa38350
PT
550 /**
551 * @since 2.0
552 */
553 @Override
554 public void partActivated(IWorkbenchPart part) {
555 if (part == this && fTrace != null) {
81fe3479
PT
556 if (fTraceSelected) {
557 return;
558 }
559 fTraceSelected = true;
faa38350
PT
560 broadcast(new TmfTraceSelectedSignal(this, fTrace));
561 }
562 }
563
faa38350
PT
564 /**
565 * @since 2.0
566 */
567 @Override
568 public void partBroughtToTop(IWorkbenchPart part) {
81fe3479
PT
569 if (part == this && fTrace != null) {
570 if (fTraceSelected) {
571 return;
572 }
573 fTraceSelected = true;
574 broadcast(new TmfTraceSelectedSignal(this, fTrace));
575 }
faa38350
PT
576 }
577
faa38350
PT
578 /**
579 * @since 2.0
580 */
581 @Override
582 public void partClosed(IWorkbenchPart part) {
583 }
584
faa38350
PT
585 /**
586 * @since 2.0
587 */
588 @Override
589 public void partDeactivated(IWorkbenchPart part) {
590 }
591
faa38350
PT
592 /**
593 * @since 2.0
594 */
595 @Override
596 public void partOpened(IWorkbenchPart part) {
597 }
598
6151d86c
PT
599 // ------------------------------------------------------------------------
600 // Global commands
601 // ------------------------------------------------------------------------
602
603 /**
604 * Add a bookmark
605 */
606 public void addBookmark() {
607 fEventsTable.addBookmark(fFile);
608 }
609
610
611 // ------------------------------------------------------------------------
612 // Signal handlers
613 // ------------------------------------------------------------------------
614
615 /**
faa38350 616 * Handler for the Trace Selected signal
6151d86c
PT
617 *
618 * @param signal The incoming signal
619 */
620 @TmfSignalHandler
faa38350 621 public void traceSelected(final TmfTraceSelectedSignal signal) {
81fe3479
PT
622 if ((signal.getSource() != this)) {
623 if (signal.getTrace().equals(fTrace)) {
624 getSite().getPage().bringToTop(this);
625 } else {
626 fTraceSelected = false;
627 }
6151d86c
PT
628 }
629 }
630
631 /**
faa38350 632 * Update the display to use the updated timestamp format
6151d86c 633 *
faa38350
PT
634 * @param signal the incoming signal
635 * @since 2.0
6151d86c
PT
636 */
637 @TmfSignalHandler
faa38350 638 public void timestampFormatUpdated(TmfTimestampFormatUpdateSignal signal) {
c1cd9635
MAL
639 if (fEventsTable != null) {
640 fEventsTable.refresh();
641 }
6151d86c
PT
642 }
643
644}
This page took 0.088213 seconds and 5 git commands to generate.