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