Internalize some classes and fix a pile of warnings
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.ui / src / org / eclipse / linuxtools / tmf / ui / editors / TmfEventsEditor.java
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
13 package org.eclipse.linuxtools.tmf.ui.editors;
14
15 import java.lang.reflect.Constructor;
16 import java.lang.reflect.InvocationTargetException;
17 import java.util.List;
18
19 import org.eclipse.core.resources.IFile;
20 import org.eclipse.core.resources.IMarker;
21 import org.eclipse.core.resources.IMarkerDelta;
22 import org.eclipse.core.resources.IResource;
23 import org.eclipse.core.resources.IResourceChangeEvent;
24 import org.eclipse.core.resources.IResourceChangeListener;
25 import org.eclipse.core.resources.IResourceDelta;
26 import org.eclipse.core.resources.ResourcesPlugin;
27 import org.eclipse.core.runtime.CoreException;
28 import org.eclipse.core.runtime.IConfigurationElement;
29 import org.eclipse.core.runtime.IProgressMonitor;
30 import org.eclipse.core.runtime.InvalidRegistryObjectException;
31 import org.eclipse.core.runtime.Platform;
32 import org.eclipse.linuxtools.internal.tmf.ui.Activator;
33 import org.eclipse.linuxtools.internal.tmf.ui.parsers.custom.CustomEventsTable;
34 import org.eclipse.linuxtools.internal.tmf.ui.parsers.custom.CustomTxtTrace;
35 import org.eclipse.linuxtools.internal.tmf.ui.parsers.custom.CustomXmlTrace;
36 import org.eclipse.linuxtools.internal.tmf.ui.project.handlers.Messages;
37 import org.eclipse.linuxtools.tmf.core.TmfCommonConstants;
38 import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;
39 import org.eclipse.linuxtools.tmf.core.event.TmfEvent;
40 import org.eclipse.linuxtools.tmf.core.exceptions.TmfTraceException;
41 import org.eclipse.linuxtools.tmf.core.signal.TmfSignalHandler;
42 import org.eclipse.linuxtools.tmf.core.signal.TmfTraceSelectedSignal;
43 import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;
44 import org.eclipse.linuxtools.tmf.core.trace.TmfExperiment;
45 import org.eclipse.linuxtools.tmf.core.trace.TmfTrace;
46 import org.eclipse.linuxtools.tmf.ui.project.model.ITmfProjectModelElement;
47 import org.eclipse.linuxtools.tmf.ui.project.model.TmfExperimentElement;
48 import org.eclipse.linuxtools.tmf.ui.project.model.TmfNavigatorContentProvider;
49 import org.eclipse.linuxtools.tmf.ui.project.model.TmfProjectElement;
50 import org.eclipse.linuxtools.tmf.ui.project.model.TmfProjectRegistry;
51 import org.eclipse.linuxtools.tmf.ui.project.model.TmfTraceElement;
52 import org.eclipse.linuxtools.tmf.ui.project.model.TmfTraceType;
53 import org.eclipse.linuxtools.tmf.ui.signal.TmfTraceClosedSignal;
54 import org.eclipse.linuxtools.tmf.ui.signal.TmfTraceOpenedSignal;
55 import org.eclipse.linuxtools.tmf.ui.signal.TmfTraceParserUpdatedSignal;
56 import org.eclipse.linuxtools.tmf.ui.viewers.events.TmfEventsTable;
57 import org.eclipse.swt.widgets.Composite;
58 import org.eclipse.swt.widgets.Display;
59 import org.eclipse.ui.IEditorInput;
60 import org.eclipse.ui.IEditorPart;
61 import org.eclipse.ui.IEditorSite;
62 import org.eclipse.ui.IFileEditorInput;
63 import org.eclipse.ui.IPropertyListener;
64 import org.eclipse.ui.IReusableEditor;
65 import org.eclipse.ui.PartInitException;
66 import org.eclipse.ui.ide.IGotoMarker;
67 import org.eclipse.ui.part.FileEditorInput;
68 import org.osgi.framework.Bundle;
69
70 /**
71 * <b><u>TmfEventsEditor</u></b>
72 */
73 public class TmfEventsEditor extends TmfEditor implements ITmfTraceEditor, IReusableEditor, IPropertyListener, IResourceChangeListener {
74
75 public static final String ID = "org.eclipse.linuxtools.tmf.ui.editors.events"; //$NON-NLS-1$
76
77 private TmfEventsTable fEventsTable;
78 private IFile fFile;
79 @SuppressWarnings("rawtypes")
80 private ITmfTrace fTrace;
81 private Composite fParent;
82
83 @Override
84 public void doSave(final IProgressMonitor monitor) {
85 }
86
87 @Override
88 public void doSaveAs() {
89 }
90
91 @SuppressWarnings({ "unchecked", "rawtypes" })
92 @Override
93 public void init(final IEditorSite site, IEditorInput input) throws PartInitException {
94 if (input instanceof TmfEditorInput) {
95 fFile = ((TmfEditorInput) input).getFile();
96 fTrace = ((TmfEditorInput) input).getTrace();
97 input = new FileEditorInput(fFile);
98 } else if (input instanceof IFileEditorInput) {
99 fFile = ((IFileEditorInput) input).getFile();
100 if (fFile == null)
101 throw new PartInitException("Invalid IFileEditorInput: " + input); //$NON-NLS-1$
102 try {
103 final String traceTypeId = fFile.getPersistentProperty(TmfCommonConstants.TRACETYPE);
104 if (traceTypeId == null)
105 throw new PartInitException(Messages.OpenTraceHandler_NoTraceType);
106 if (traceTypeId.equals(TmfExperiment.class.getCanonicalName())) {
107 // Special case: experiment bookmark resource
108 final TmfNavigatorContentProvider ncp = new TmfNavigatorContentProvider();
109 ncp.getChildren(fFile.getProject()); // force the model to be populated
110 final TmfProjectElement project = TmfProjectRegistry.getProject(fFile.getProject());
111 if (project == null)
112 throw new PartInitException(Messages.OpenExperimentHandler_NoTraceType);
113 for (final ITmfProjectModelElement projectElement : project.getExperimentsFolder().getChildren()) {
114 final String traceName = fFile.getParent().getName();
115 if (projectElement.getName().equals(traceName)) {
116 final TmfExperimentElement experimentElement = (TmfExperimentElement) projectElement;
117 // Instantiate the experiment's traces
118 final List<TmfTraceElement> traceEntries = experimentElement.getTraces();
119 final int nbTraces = traceEntries.size();
120 int cacheSize = Integer.MAX_VALUE;
121 final ITmfTrace<?>[] traces = new ITmfTrace[nbTraces];
122 for (int i = 0; i < nbTraces; i++) {
123 final TmfTraceElement traceElement = traceEntries.get(i);
124 final ITmfTrace trace = traceElement.instantiateTrace();
125 final ITmfEvent traceEvent = traceElement.instantiateEvent();
126 if ((trace == null) || (traceEvent == null)) {
127 for (int j = 0; j < i; j++)
128 traces[j].dispose();
129 throw new PartInitException(Messages.OpenExperimentHandler_NoTraceType);
130 }
131 try {
132 trace.initTrace(traceElement.getResource(), traceElement.getLocation().getPath(), traceEvent.getClass());
133 } catch (final TmfTraceException e) {
134 }
135 cacheSize = Math.min(cacheSize, trace.getCacheSize());
136 traces[i] = trace;
137 }
138 final TmfExperiment experiment = new TmfExperiment(ITmfEvent.class, experimentElement.getName(), traces, cacheSize);
139 experiment.setBookmarksFile(fFile);
140 fTrace = experiment;
141 experiment.initTrace(null, null, null);
142 break;
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;
154 // Instantiate the trace
155 final ITmfTrace trace = traceElement.instantiateTrace();
156 final ITmfEvent traceEvent = traceElement.instantiateEvent();
157 if ((trace == null) || (traceEvent == null))
158 throw new PartInitException(Messages.OpenTraceHandler_NoTraceType);
159 try {
160 trace.initTrace(traceElement.getResource(), traceElement.getLocation().getPath(), traceEvent.getClass());
161 } catch (final TmfTraceException e) {
162 }
163 fTrace = trace;
164 break;
165 }
166 }
167 } else {
168 final TmfNavigatorContentProvider ncp = new TmfNavigatorContentProvider();
169 ncp.getChildren(fFile.getProject()); // force the model to be populated
170 final TmfProjectElement project = TmfProjectRegistry.getProject(fFile.getProject());
171 for (final ITmfProjectModelElement projectElement : project.getTracesFolder().getChildren())
172 if (projectElement.getResource().equals(fFile)) {
173 final TmfTraceElement traceElement = (TmfTraceElement) projectElement;
174 // Instantiate the trace
175 final ITmfTrace trace = traceElement.instantiateTrace();
176 final ITmfEvent traceEvent = traceElement.instantiateEvent();
177 if ((trace == null) || (traceEvent == null))
178 throw new PartInitException(Messages.OpenTraceHandler_NoTraceType);
179 try {
180 trace.initTrace(traceElement.getResource(), traceElement.getLocation().getPath(), traceEvent.getClass());
181 } catch (final TmfTraceException e) {
182 }
183 fTrace = trace;
184 break;
185 }
186 }
187 } catch (final InvalidRegistryObjectException e) {
188 Activator.getDefault().logError("Error initializing TmfEventsEditor", e); //$NON-NLS-1$
189 } catch (final CoreException e) {
190 Activator.getDefault().logError("Error initializing TmfEventsEditor", e); //$NON-NLS-1$
191 }
192 } else
193 throw new PartInitException("Invalid IEditorInput: " + input.getClass()); //$NON-NLS-1$
194 if (fTrace == null)
195 throw new PartInitException("Invalid IEditorInput: " + fFile.getName()); //$NON-NLS-1$
196 super.setSite(site);
197 super.setInput(input);
198 }
199
200 @Override
201 public boolean isDirty() {
202 return false;
203 }
204
205 @Override
206 public boolean isSaveAsAllowed() {
207 return false;
208 }
209
210 @Override
211 public void setInput(final IEditorInput input) {
212 super.setInput(input);
213 firePropertyChange(IEditorPart.PROP_INPUT);
214 }
215
216 @Override
217 public void propertyChanged(final Object source, final int propId) {
218 if (propId == IEditorPart.PROP_INPUT) {
219 broadcast(new TmfTraceClosedSignal(this, fTrace));
220 fFile = ((TmfEditorInput) getEditorInput()).getFile();
221 fTrace = ((TmfEditorInput) getEditorInput()).getTrace();
222 super.setInput(new FileEditorInput(fFile));
223 fEventsTable.dispose();
224 if (fTrace != null) {
225 fEventsTable = createEventsTable(fParent, fTrace.getCacheSize());
226 fEventsTable.setTrace(fTrace, true);
227 fEventsTable.refreshBookmarks(fFile);
228 broadcast(new TmfTraceOpenedSignal(this, fTrace, fFile, fEventsTable));
229 } else
230 fEventsTable = new TmfEventsTable(fParent, 0);
231 fParent.layout();
232 }
233 }
234
235 @Override
236 public void createPartControl(final Composite parent) {
237 fParent = parent;
238 if (fTrace != null) {
239 setPartName(fTrace.getName());
240 fEventsTable = createEventsTable(parent, fTrace.getCacheSize());
241 fEventsTable.setTrace(fTrace, true);
242 fEventsTable.refreshBookmarks(fFile);
243 broadcast(new TmfTraceOpenedSignal(this, fTrace, fFile, fEventsTable));
244 } else {
245 setPartName(getEditorInput().getName());
246 fEventsTable = new TmfEventsTable(parent, 0);
247 }
248 addPropertyListener(this);
249 ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE);
250 }
251
252 @Override
253 public void dispose() {
254 ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
255 removePropertyListener(this);
256 if (fTrace != null)
257 broadcast(new TmfTraceClosedSignal(this, fTrace));
258 if (fEventsTable != null)
259 fEventsTable.dispose();
260 super.dispose();
261 }
262
263 protected TmfEventsTable createEventsTable(final Composite parent, final int cacheSize) {
264 TmfEventsTable eventsTable = getEventsTable(parent, cacheSize);
265 if (eventsTable == null)
266 eventsTable = new TmfEventsTable(parent, cacheSize);
267 return eventsTable;
268 }
269
270 private TmfEventsTable getEventsTable(final Composite parent, final int cacheSize) {
271 if (fTrace instanceof TmfExperiment)
272 return getExperimentEventsTable((TmfExperiment<?>) fTrace, parent, cacheSize);
273 TmfEventsTable eventsTable = null;
274 try {
275 if (fTrace.getResource() == null)
276 return null;
277 final String traceType = fTrace.getResource().getPersistentProperty(TmfCommonConstants.TRACETYPE);
278 if (traceType == null)
279 return null;
280 if (traceType.startsWith(CustomTxtTrace.class.getCanonicalName()))
281 return new CustomEventsTable(((CustomTxtTrace) fTrace).getDefinition(), parent, cacheSize);
282 if (traceType.startsWith(CustomXmlTrace.class.getCanonicalName()))
283 return new CustomEventsTable(((CustomXmlTrace) fTrace).getDefinition(), parent, cacheSize);
284 for (final IConfigurationElement ce : TmfTraceType.getTypeElements())
285 if (ce.getAttribute(TmfTraceType.ID_ATTR).equals(traceType)) {
286 final IConfigurationElement[] eventsTableTypeCE = ce.getChildren(TmfTraceType.EVENTS_TABLE_TYPE_ELEM);
287 if (eventsTableTypeCE.length != 1)
288 break;
289 final String eventsTableType = eventsTableTypeCE[0].getAttribute(TmfTraceType.CLASS_ATTR);
290 if ((eventsTableType == null) || (eventsTableType.length() == 0))
291 break;
292 final Bundle bundle = Platform.getBundle(ce.getContributor().getName());
293 final Class<?> c = bundle.loadClass(eventsTableType);
294 final Class<?>[] constructorArgs = new Class[] { Composite.class, int.class };
295 final Constructor<?> constructor = c.getConstructor(constructorArgs);
296 final Object[] args = new Object[] { parent, cacheSize };
297 eventsTable = (TmfEventsTable) constructor.newInstance(args);
298 break;
299 }
300 } catch (final InvalidRegistryObjectException e) {
301 Activator.getDefault().logError("Error getting TmfEventsTable", e); //$NON-NLS-1$
302 } catch (final CoreException e) {
303 Activator.getDefault().logError("Error getting TmfEventsTable", e); //$NON-NLS-1$
304 } catch (final ClassNotFoundException e) {
305 Activator.getDefault().logError("Error getting TmfEventsTable", e); //$NON-NLS-1$
306 } catch (final SecurityException e) {
307 Activator.getDefault().logError("Error getting TmfEventsTable", e); //$NON-NLS-1$
308 } catch (final NoSuchMethodException e) {
309 Activator.getDefault().logError("Error getting TmfEventsTable", e); //$NON-NLS-1$
310 } catch (final IllegalArgumentException e) {
311 Activator.getDefault().logError("Error getting TmfEventsTable", e); //$NON-NLS-1$
312 } catch (final InstantiationException e) {
313 Activator.getDefault().logError("Error getting TmfEventsTable", e); //$NON-NLS-1$
314 } catch (final IllegalAccessException e) {
315 Activator.getDefault().logError("Error getting TmfEventsTable", e); //$NON-NLS-1$
316 } catch (final InvocationTargetException e) {
317 Activator.getDefault().logError("Error getting TmfEventsTable", e); //$NON-NLS-1$
318 }
319 return eventsTable;
320 }
321
322 /**
323 * Get the events table for an experiment.
324 * If all traces in the experiment are of the same type,
325 * use the extension point specified event table
326 * @param experiment the experiment
327 * @param parent the parent Composite
328 * @param cacheSize the event table cache size
329 * @return an events table of the appropriate type
330 */
331 private TmfEventsTable getExperimentEventsTable(final TmfExperiment<?> experiment, final Composite parent, final int cacheSize) {
332 TmfEventsTable eventsTable = null;
333 String commonTraceType = null;
334 try {
335 for (final ITmfTrace<?> trace : experiment.getTraces()) {
336 final IResource resource = trace.getResource();
337 if (resource == null)
338 return null;
339 final String traceType = resource.getPersistentProperty(TmfCommonConstants.TRACETYPE);
340 if ((commonTraceType != null) && !commonTraceType.equals(traceType))
341 return null;
342 commonTraceType = traceType;
343 }
344 if (commonTraceType == null)
345 return null;
346 if (commonTraceType.startsWith(CustomTxtTrace.class.getCanonicalName()))
347 return new CustomEventsTable(((CustomTxtTrace) experiment.getTraces()[0]).getDefinition(), parent, cacheSize);
348 if (commonTraceType.startsWith(CustomXmlTrace.class.getCanonicalName()))
349 return new CustomEventsTable(((CustomXmlTrace) experiment.getTraces()[0]).getDefinition(), parent, cacheSize);
350 for (final IConfigurationElement ce : TmfTraceType.getTypeElements())
351 if (ce.getAttribute(TmfTraceType.ID_ATTR).equals(commonTraceType)) {
352 final IConfigurationElement[] eventsTableTypeCE = ce.getChildren(TmfTraceType.EVENTS_TABLE_TYPE_ELEM);
353 if (eventsTableTypeCE.length != 1)
354 break;
355 final String eventsTableType = eventsTableTypeCE[0].getAttribute(TmfTraceType.CLASS_ATTR);
356 if ((eventsTableType == null) || (eventsTableType.length() == 0))
357 break;
358 final Bundle bundle = Platform.getBundle(ce.getContributor().getName());
359 final Class<?> c = bundle.loadClass(eventsTableType);
360 final Class<?>[] constructorArgs = new Class[] { Composite.class, int.class };
361 final Constructor<?> constructor = c.getConstructor(constructorArgs);
362 final Object[] args = new Object[] { parent, cacheSize };
363 eventsTable = (TmfEventsTable) constructor.newInstance(args);
364 break;
365 }
366 } catch (final CoreException e) {
367 Activator.getDefault().logError("Error getting TmfEventsTable for experiment", e); //$NON-NLS-1$
368 } catch (final InvalidRegistryObjectException e) {
369 Activator.getDefault().logError("Error getting TmfEventsTable for experiment", e); //$NON-NLS-1$
370 } catch (final SecurityException e) {
371 Activator.getDefault().logError("Error getting TmfEventsTable for experiment", e); //$NON-NLS-1$
372 } catch (final IllegalArgumentException e) {
373 Activator.getDefault().logError("Error getting TmfEventsTable for experiment", e); //$NON-NLS-1$
374 } catch (final ClassNotFoundException e) {
375 Activator.getDefault().logError("Error getting TmfEventsTable for experiment", e); //$NON-NLS-1$
376 } catch (final NoSuchMethodException e) {
377 Activator.getDefault().logError("Error getting TmfEventsTable for experiment", e); //$NON-NLS-1$
378 } catch (final InstantiationException e) {
379 Activator.getDefault().logError("Error getting TmfEventsTable for experiment", e); //$NON-NLS-1$
380 } catch (final IllegalAccessException e) {
381 Activator.getDefault().logError("Error getting TmfEventsTable for experiment", e); //$NON-NLS-1$
382 } catch (final InvocationTargetException e) {
383 Activator.getDefault().logError("Error getting TmfEventsTable for experiment", e); //$NON-NLS-1$
384 }
385 return eventsTable;
386 }
387
388 @Override
389 public ITmfTrace<?> getTrace() {
390 return fTrace;
391 }
392
393 @Override
394 public IFile getBookmarksFile() {
395 return fFile;
396 }
397
398 @Override
399 public void setFocus() {
400 fEventsTable.setFocus();
401 if (fTrace != null)
402 broadcast(new TmfTraceSelectedSignal(this, fTrace));
403 }
404
405 @Override
406 @SuppressWarnings("rawtypes")
407 public Object getAdapter(final Class adapter) {
408 if (IGotoMarker.class.equals(adapter))
409 return fEventsTable;
410 return super.getAdapter(adapter);
411 }
412
413 @Override
414 public void resourceChanged(final IResourceChangeEvent event) {
415 for (final IMarkerDelta delta : event.findMarkerDeltas(IMarker.BOOKMARK, false))
416 if (delta.getResource().equals(fFile))
417 if (delta.getKind() == IResourceDelta.REMOVED) {
418 final IMarker bookmark = delta.getMarker();
419 Display.getDefault().asyncExec(new Runnable() {
420 @Override
421 public void run() {
422 fEventsTable.removeBookmark(bookmark);
423 }
424 });
425 } else if (delta.getKind() == IResourceDelta.CHANGED)
426 Display.getDefault().asyncExec(new Runnable() {
427 @Override
428 public void run() {
429 fEventsTable.getTable().refresh();
430 }
431 });
432 }
433
434 // ------------------------------------------------------------------------
435 // Global commands
436 // ------------------------------------------------------------------------
437
438 public void addBookmark() {
439 fEventsTable.addBookmark(fFile);
440 }
441
442
443 // ------------------------------------------------------------------------
444 // Signal handlers
445 // ------------------------------------------------------------------------
446
447 @SuppressWarnings("unchecked")
448 @TmfSignalHandler
449 public void traceParserUpdated(final TmfTraceParserUpdatedSignal signal) {
450 if (signal.getTraceResource().equals(fFile)) {
451 broadcast(new TmfTraceClosedSignal(this, fTrace));
452 try {
453 fTrace.getName();
454 fTrace = null;
455 final String traceTypeId = fFile.getPersistentProperty(TmfCommonConstants.TRACETYPE);
456 if (traceTypeId != null)
457 for (final IConfigurationElement ce : TmfTraceType.getTypeElements())
458 if (traceTypeId.equals(ce.getAttribute(TmfTraceType.ID_ATTR))) {
459 fTrace = (ITmfTrace<?>) ce.createExecutableExtension(TmfTraceType.TRACE_TYPE_ATTR);
460 final ITmfEvent event = (TmfEvent) ce.createExecutableExtension(TmfTraceType.EVENT_TYPE_ATTR);
461 final String path = fFile.getLocationURI().getPath();
462 fTrace.initTrace(null, path, event.getClass());
463 break;
464 }
465 } catch (final InvalidRegistryObjectException e) {
466 Activator.getDefault().logError("Error handling signal TmfTraceParserUpdatedSignal", e); //$NON-NLS-1$
467 } catch (final TmfTraceException e) {
468 Activator.getDefault().logError("Error handling signal TmfTraceParserUpdatedSignal", e); //$NON-NLS-1$
469 } catch (final CoreException e) {
470 Activator.getDefault().logError("Error handling signal TmfTraceParserUpdatedSignal", e); //$NON-NLS-1$
471 }
472 fEventsTable.dispose();
473 if (fTrace != null) {
474 fEventsTable = createEventsTable(fParent, fTrace.getCacheSize());
475 fEventsTable.setTrace(fTrace, true);
476 broadcast(new TmfTraceOpenedSignal(this, fTrace, fFile, fEventsTable));
477 } else
478 fEventsTable = new TmfEventsTable(fParent, 0);
479 fParent.layout();
480 }
481 }
482
483 @TmfSignalHandler
484 public void traceSelected(final TmfTraceSelectedSignal signal) {
485 if ((signal.getSource() != this) && signal.getTrace().equals(fTrace))
486 getSite().getPage().bringToTop(this);
487 }
488
489 }
This page took 0.040701 seconds and 5 git commands to generate.