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