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