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