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