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