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