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