Commit | Line | Data |
---|---|---|
b0d3496e | 1 | /******************************************************************************* |
e31e01e8 | 2 | * Copyright (c) 2009, 2010 Ericsson |
02023181 | 3 | * |
b0d3496e ASL |
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 | |
02023181 | 8 | * |
b0d3496e ASL |
9 | * Contributors: |
10 | * Francois Chouinard - Initial API and implementation | |
abfad0aa | 11 | * Patrick Tasse - Factored out events table |
b0d3496e ASL |
12 | *******************************************************************************/ |
13 | ||
12c155f5 | 14 | package org.eclipse.linuxtools.tmf.ui.views.events; |
b0d3496e | 15 | |
09d11238 PT |
16 | import java.lang.reflect.Constructor; |
17 | import java.lang.reflect.InvocationTargetException; | |
18 | ||
a01c19b8 BH |
19 | import org.eclipse.core.resources.IMarker; |
20 | import org.eclipse.core.resources.IMarkerDelta; | |
09d11238 | 21 | import org.eclipse.core.resources.IResource; |
a01c19b8 BH |
22 | import org.eclipse.core.resources.IResourceChangeEvent; |
23 | import org.eclipse.core.resources.IResourceChangeListener; | |
24 | import org.eclipse.core.resources.IResourceDelta; | |
25 | import org.eclipse.core.resources.ResourcesPlugin; | |
09d11238 PT |
26 | import org.eclipse.core.runtime.CoreException; |
27 | import org.eclipse.core.runtime.IConfigurationElement; | |
28 | import org.eclipse.core.runtime.InvalidRegistryObjectException; | |
29 | import org.eclipse.core.runtime.Platform; | |
8fd82db5 | 30 | import org.eclipse.linuxtools.internal.tmf.ui.Activator; |
d34665f9 FC |
31 | import org.eclipse.linuxtools.internal.tmf.ui.parsers.custom.CustomEventsTable; |
32 | import org.eclipse.linuxtools.internal.tmf.ui.parsers.custom.CustomTxtTrace; | |
33 | import org.eclipse.linuxtools.internal.tmf.ui.parsers.custom.CustomXmlTrace; | |
e12ecd30 | 34 | import org.eclipse.linuxtools.tmf.core.TmfCommonConstants; |
58b21093 | 35 | import org.eclipse.linuxtools.tmf.core.event.ITmfEvent; |
6c13869b FC |
36 | import org.eclipse.linuxtools.tmf.core.signal.TmfExperimentDisposedSignal; |
37 | import org.eclipse.linuxtools.tmf.core.signal.TmfExperimentSelectedSignal; | |
38 | import org.eclipse.linuxtools.tmf.core.signal.TmfSignalHandler; | |
09d11238 | 39 | import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace; |
9e0640dc | 40 | import org.eclipse.linuxtools.tmf.core.trace.TmfExperiment; |
bfc779a0 | 41 | import org.eclipse.linuxtools.tmf.ui.project.model.TmfTraceType; |
abfad0aa | 42 | import org.eclipse.linuxtools.tmf.ui.viewers.events.TmfEventsTable; |
12c155f5 | 43 | import org.eclipse.linuxtools.tmf.ui.views.TmfView; |
b0d3496e | 44 | import org.eclipse.swt.widgets.Composite; |
a01c19b8 | 45 | import org.eclipse.swt.widgets.Display; |
09d11238 PT |
46 | import org.eclipse.ui.ide.IGotoMarker; |
47 | import org.osgi.framework.Bundle; | |
b0d3496e ASL |
48 | |
49 | /** | |
00511ef2 | 50 | * The generic TMF Events View. |
b0d3496e | 51 | * <p> |
00511ef2 FC |
52 | * Support for: |
53 | * <ul> | |
54 | * <li>Traces larger than available memory | |
55 | * <li>Searching and Filtering | |
56 | * <li>Customized table viewers (per trace type) | |
57 | * </ul> | |
b0d3496e | 58 | * |
b0d3496e ASL |
59 | * TODO: Handle column selection, sort, ... generically (nothing less...) |
60 | * TODO: Implement hide/display columns | |
00511ef2 FC |
61 | * |
62 | * @version 1.0 | |
63 | * @author Francois Chouinard | |
64 | * @author Patrick Tasse | |
b0d3496e | 65 | */ |
a01c19b8 | 66 | public class TmfEventsView extends TmfView implements IResourceChangeListener { |
b0d3496e | 67 | |
02023181 MK |
68 | /** |
69 | * ID for serializing purposes. | |
70 | */ | |
3b38ea61 | 71 | public static final String ID = "org.eclipse.linuxtools.tmf.ui.views.events"; //$NON-NLS-1$ |
b0d3496e | 72 | |
09d11238 | 73 | private TmfExperiment<?> fExperiment; |
abfad0aa | 74 | private TmfEventsTable fEventsTable; |
529ee6a9 | 75 | private static final int DEFAULT_CACHE_SIZE = 100; |
abfad0aa | 76 | private String fTitlePrefix; |
09d11238 | 77 | private Composite fParent; |
02023181 | 78 | |
e31e01e8 | 79 | // ------------------------------------------------------------------------ |
b0d3496e | 80 | // Constructor |
e31e01e8 | 81 | // ------------------------------------------------------------------------ |
b0d3496e | 82 | |
02023181 MK |
83 | /** |
84 | * Create an events view with a cache size | |
85 | * @param cacheSize not used | |
86 | */ | |
e31e01e8 | 87 | public TmfEventsView(int cacheSize) { |
3b38ea61 | 88 | super("TmfEventsView"); //$NON-NLS-1$ |
b0d3496e ASL |
89 | } |
90 | ||
02023181 MK |
91 | /** |
92 | * Default contructor | |
93 | */ | |
e31e01e8 FC |
94 | public TmfEventsView() { |
95 | this(DEFAULT_CACHE_SIZE); | |
96 | } | |
97 | ||
98 | // ------------------------------------------------------------------------ | |
99 | // ViewPart | |
100 | // ------------------------------------------------------------------------ | |
101 | ||
e31e01e8 | 102 | @Override |
3b38ea61 | 103 | @SuppressWarnings("unchecked") |
b0d3496e | 104 | public void createPartControl(Composite parent) { |
09d11238 | 105 | fParent = parent; |
abfad0aa FC |
106 | |
107 | fTitlePrefix = getTitle(); | |
02023181 | 108 | |
abfad0aa | 109 | // If an experiment is already selected, update the table |
58b21093 | 110 | TmfExperiment<ITmfEvent> experiment = (TmfExperiment<ITmfEvent>) TmfExperiment.getCurrentExperiment(); |
09d11238 | 111 | if (experiment != null) { |
58b21093 | 112 | experimentSelected(new TmfExperimentSelectedSignal<ITmfEvent>(this, experiment)); |
09d11238 PT |
113 | } else { |
114 | fEventsTable = createEventsTable(parent); | |
abfad0aa | 115 | } |
8d2e2848 FC |
116 | } |
117 | ||
abfad0aa FC |
118 | @Override |
119 | public void dispose() { | |
120 | if (fEventsTable != null) { | |
121 | fEventsTable.dispose(); | |
b0d3496e | 122 | } |
abfad0aa FC |
123 | super.dispose(); |
124 | } | |
b0d3496e | 125 | |
09d11238 PT |
126 | /** |
127 | * Get the events table for an experiment. | |
128 | * If all traces in the experiment are of the same type, | |
129 | * use the extension point specified event table | |
130 | * @param parent the parent Composite | |
131 | * @return an events table of the appropriate type | |
132 | */ | |
133 | protected TmfEventsTable createEventsTable(Composite parent) { | |
134 | if (fExperiment == null) { | |
135 | return new TmfEventsTable(parent, DEFAULT_CACHE_SIZE); | |
136 | } | |
20658947 | 137 | int cacheSize = fExperiment.getCacheSize(); |
09d11238 PT |
138 | String commonTraceType = null; |
139 | try { | |
140 | for (ITmfTrace<?> trace : fExperiment.getTraces()) { | |
a1091415 | 141 | IResource resource = trace.getResource(); |
09d11238 PT |
142 | if (resource == null) { |
143 | return new TmfEventsTable(parent, cacheSize); | |
144 | } | |
e12ecd30 | 145 | String traceType = resource.getPersistentProperty(TmfCommonConstants.TRACETYPE); |
02023181 | 146 | if ((commonTraceType != null) && !commonTraceType.equals(traceType)) { |
09d11238 PT |
147 | return new TmfEventsTable(parent, cacheSize); |
148 | } | |
149 | commonTraceType = traceType; | |
150 | } | |
151 | if (commonTraceType == null) { | |
152 | return new TmfEventsTable(parent, cacheSize); | |
153 | } | |
154 | if (commonTraceType.startsWith(CustomTxtTrace.class.getCanonicalName())) { | |
155 | return new CustomEventsTable(((CustomTxtTrace) fExperiment.getTraces()[0]).getDefinition(), parent, cacheSize); | |
156 | } | |
157 | if (commonTraceType.startsWith(CustomXmlTrace.class.getCanonicalName())) { | |
158 | return new CustomEventsTable(((CustomXmlTrace) fExperiment.getTraces()[0]).getDefinition(), parent, cacheSize); | |
159 | } | |
160 | for (IConfigurationElement ce : TmfTraceType.getTypeElements()) { | |
161 | if (ce.getAttribute(TmfTraceType.ID_ATTR).equals(commonTraceType)) { | |
162 | IConfigurationElement[] eventsTableTypeCE = ce.getChildren(TmfTraceType.EVENTS_TABLE_TYPE_ELEM); | |
163 | if (eventsTableTypeCE.length != 1) { | |
164 | break; | |
165 | } | |
166 | String eventsTableType = eventsTableTypeCE[0].getAttribute(TmfTraceType.CLASS_ATTR); | |
02023181 | 167 | if ((eventsTableType == null) || (eventsTableType.length() == 0)) { |
09d11238 PT |
168 | break; |
169 | } | |
170 | Bundle bundle = Platform.getBundle(ce.getContributor().getName()); | |
171 | Class<?> c = bundle.loadClass(eventsTableType); | |
172 | Class<?>[] constructorArgs = new Class[] { Composite.class, int.class }; | |
173 | Constructor<?> constructor = c.getConstructor(constructorArgs); | |
174 | Object[] args = new Object[] { parent, cacheSize }; | |
175 | return (TmfEventsTable) constructor.newInstance(args); | |
176 | } | |
177 | } | |
178 | } catch (CoreException e) { | |
8fd82db5 | 179 | Activator.getDefault().logError("Error creating events table", e); //$NON-NLS-1$ |
09d11238 | 180 | } catch (InvalidRegistryObjectException e) { |
8fd82db5 | 181 | Activator.getDefault().logError("Error creating events table", e); //$NON-NLS-1$ |
09d11238 | 182 | } catch (SecurityException e) { |
8fd82db5 | 183 | Activator.getDefault().logError("Error creating events table", e); //$NON-NLS-1$ |
09d11238 | 184 | } catch (IllegalArgumentException e) { |
8fd82db5 | 185 | Activator.getDefault().logError("Error creating events table", e); //$NON-NLS-1$ |
09d11238 | 186 | } catch (ClassNotFoundException e) { |
8fd82db5 | 187 | Activator.getDefault().logError("Error creating events table", e); //$NON-NLS-1$ |
09d11238 | 188 | } catch (NoSuchMethodException e) { |
8fd82db5 | 189 | Activator.getDefault().logError("Error creating events table", e); //$NON-NLS-1$ |
09d11238 | 190 | } catch (InstantiationException e) { |
8fd82db5 | 191 | Activator.getDefault().logError("Error creating events table", e); //$NON-NLS-1$ |
09d11238 | 192 | } catch (IllegalAccessException e) { |
8fd82db5 | 193 | Activator.getDefault().logError("Error creating events table", e); //$NON-NLS-1$ |
09d11238 | 194 | } catch (InvocationTargetException e) { |
8fd82db5 | 195 | Activator.getDefault().logError("Error creating events table", e); //$NON-NLS-1$ |
09d11238 | 196 | } |
abfad0aa FC |
197 | return new TmfEventsTable(parent, cacheSize); |
198 | } | |
b0d3496e ASL |
199 | |
200 | /* (non-Javadoc) | |
201 | * @see org.eclipse.ui.part.WorkbenchPart#setFocus() | |
202 | */ | |
203 | @Override | |
204 | public void setFocus() { | |
abfad0aa | 205 | fEventsTable.setFocus(); |
b0d3496e ASL |
206 | } |
207 | ||
09d11238 PT |
208 | /* (non-Javadoc) |
209 | * @see org.eclipse.ui.part.WorkbenchPart#getAdapter(java.lang.Class) | |
210 | */ | |
211 | @SuppressWarnings("rawtypes") | |
212 | @Override | |
213 | public Object getAdapter(Class adapter) { | |
214 | if (IGotoMarker.class.equals(adapter)) { | |
215 | return fEventsTable; | |
216 | } | |
217 | return super.getAdapter(adapter); | |
218 | } | |
219 | ||
8d2e2848 FC |
220 | /* (non-Javadoc) |
221 | * @see java.lang.Object#toString() | |
222 | */ | |
223 | @Override | |
3b38ea61 | 224 | @SuppressWarnings("nls") |
8d2e2848 FC |
225 | public String toString() { |
226 | return "[TmfEventsView]"; | |
227 | } | |
228 | ||
abfad0aa | 229 | // ------------------------------------------------------------------------ |
b0d3496e | 230 | // Signal handlers |
e31e01e8 | 231 | // ------------------------------------------------------------------------ |
02023181 MK |
232 | |
233 | /** | |
234 | * ExperimentSelected, a callback called when the TmfSignal "TmfExperimentSelectedSignal" is sent. | |
235 | * @param signal the signal that triggered the callback | |
236 | */ | |
e31e01e8 | 237 | @SuppressWarnings("unchecked") |
abfad0aa | 238 | @TmfSignalHandler |
58b21093 | 239 | public void experimentSelected(TmfExperimentSelectedSignal<ITmfEvent> signal) { |
abfad0aa | 240 | // Update the trace reference |
58b21093 | 241 | TmfExperiment<ITmfEvent> exp = (TmfExperiment<ITmfEvent>) signal.getExperiment(); |
8e31f2d2 | 242 | if (!exp.equals(fExperiment)) { |
09d11238 | 243 | fExperiment = exp; |
8e31f2d2 FC |
244 | setPartName(fTitlePrefix + " - " + fExperiment.getName()); //$NON-NLS-1$ |
245 | if (fEventsTable != null) { | |
09d11238 | 246 | fEventsTable.dispose(); |
8e31f2d2 | 247 | } |
09d11238 PT |
248 | fEventsTable = createEventsTable(fParent); |
249 | fEventsTable.setTrace(fExperiment, false); | |
a1091415 | 250 | fEventsTable.refreshBookmarks(fExperiment.getBookmarksFile()); |
a01c19b8 BH |
251 | if (fExperiment.getBookmarksFile() != null) { |
252 | ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE); | |
253 | } | |
09d11238 | 254 | fParent.layout(); |
abfad0aa | 255 | } |
cb866e08 | 256 | } |
9aae0442 | 257 | |
02023181 MK |
258 | /** |
259 | * Experiment disposed, a callback called when the TmfSignal "TmfExperimentDisposedSignal" is sent. | |
260 | * @param signal the signal that triggered the callback | |
261 | */ | |
8e31f2d2 FC |
262 | @SuppressWarnings("unchecked") |
263 | @TmfSignalHandler | |
58b21093 | 264 | public void experimentDisposed(TmfExperimentDisposedSignal<ITmfEvent> signal) { |
8e31f2d2 | 265 | // Clear the trace reference |
58b21093 | 266 | TmfExperiment<ITmfEvent> experiment = (TmfExperiment<ITmfEvent>) signal.getExperiment(); |
8e31f2d2 FC |
267 | if (experiment.equals(fExperiment)) { |
268 | fEventsTable.setTrace(null, false); | |
8e31f2d2 | 269 | |
8fd82db5 | 270 | Activator.getDefault().getWorkbench().getWorkbenchWindows()[0].getShell().getDisplay().syncExec(new Runnable() { |
09d11238 PT |
271 | @Override |
272 | public void run() { | |
273 | setPartName(fTitlePrefix); | |
274 | } | |
275 | }); | |
a01c19b8 BH |
276 | |
277 | if ((fExperiment != null) && (fExperiment.getBookmarksFile() != null)) { | |
278 | ResourcesPlugin.getWorkspace().removeResourceChangeListener(this); | |
279 | } | |
280 | ||
09d11238 | 281 | } |
8e31f2d2 FC |
282 | } |
283 | ||
a01c19b8 BH |
284 | @Override |
285 | public void resourceChanged(final IResourceChangeEvent event) { | |
02023181 | 286 | if ((fExperiment == null) || (fExperiment.getBookmarksFile() == null)) { |
a01c19b8 BH |
287 | return; |
288 | } | |
289 | ||
02023181 MK |
290 | for (final IMarkerDelta delta : event.findMarkerDeltas(IMarker.BOOKMARK, false)) { |
291 | if (delta.getResource().equals(fExperiment.getBookmarksFile())) { | |
a01c19b8 BH |
292 | if (delta.getKind() == IResourceDelta.REMOVED) { |
293 | final IMarker bookmark = delta.getMarker(); | |
294 | Display.getDefault().asyncExec(new Runnable() { | |
295 | @Override | |
296 | public void run() { | |
297 | fEventsTable.removeBookmark(bookmark); | |
298 | } | |
299 | }); | |
02023181 | 300 | } else if (delta.getKind() == IResourceDelta.CHANGED) { |
a01c19b8 BH |
301 | Display.getDefault().asyncExec(new Runnable() { |
302 | @Override | |
303 | public void run() { | |
304 | fEventsTable.getTable().refresh(); | |
305 | } | |
306 | }); | |
02023181 MK |
307 | } |
308 | } | |
309 | } | |
a01c19b8 | 310 | } |
e6a4cf1b | 311 | } |