tmf: Update Javadoc throughout tmf.ui
[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 /** Event View's ID */
69 public static final String ID = "org.eclipse.linuxtools.tmf.ui.views.events"; //$NON-NLS-1$
70
71 private TmfExperiment<?> fExperiment;
72 private TmfEventsTable fEventsTable;
73 private static final int DEFAULT_CACHE_SIZE = 100;
74 private String fTitlePrefix;
75 private Composite fParent;
76
77 // ------------------------------------------------------------------------
78 // Constructor
79 // ------------------------------------------------------------------------
80
81 /**
82 * Create an events view with a cache size
83 * @param cacheSize not used
84 */
85 public TmfEventsView(int cacheSize) {
86 super("TmfEventsView"); //$NON-NLS-1$
87 }
88
89 /**
90 * Default constructor, with a default cache size
91 */
92 public TmfEventsView() {
93 this(DEFAULT_CACHE_SIZE);
94 }
95
96 // ------------------------------------------------------------------------
97 // ViewPart
98 // ------------------------------------------------------------------------
99
100 @Override
101 @SuppressWarnings("unchecked")
102 public void createPartControl(Composite parent) {
103 fParent = parent;
104
105 fTitlePrefix = getTitle();
106
107 // If an experiment is already selected, update the table
108 TmfExperiment<ITmfEvent> experiment = (TmfExperiment<ITmfEvent>) TmfExperiment.getCurrentExperiment();
109 if (experiment != null) {
110 experimentSelected(new TmfExperimentSelectedSignal<ITmfEvent>(this, experiment));
111 } else {
112 fEventsTable = createEventsTable(parent);
113 }
114 }
115
116 @Override
117 public void dispose() {
118 if (fEventsTable != null) {
119 fEventsTable.dispose();
120 }
121 super.dispose();
122 }
123
124 /**
125 * Get the events table for an experiment.
126 * If all traces in the experiment are of the same type,
127 * use the extension point specified event table
128 * @param parent the parent Composite
129 * @return an events table of the appropriate type
130 */
131 protected TmfEventsTable createEventsTable(Composite parent) {
132 if (fExperiment == null) {
133 return new TmfEventsTable(parent, DEFAULT_CACHE_SIZE);
134 }
135 int cacheSize = fExperiment.getCacheSize();
136 String commonTraceType = null;
137 try {
138 for (ITmfTrace<?> trace : fExperiment.getTraces()) {
139 IResource resource = trace.getResource();
140 if (resource == null) {
141 return new TmfEventsTable(parent, cacheSize);
142 }
143 String traceType = resource.getPersistentProperty(TmfCommonConstants.TRACETYPE);
144 if ((commonTraceType != null) && !commonTraceType.equals(traceType)) {
145 return new TmfEventsTable(parent, cacheSize);
146 }
147 commonTraceType = traceType;
148 }
149 if (commonTraceType == null) {
150 return new TmfEventsTable(parent, cacheSize);
151 }
152 if (commonTraceType.startsWith(CustomTxtTrace.class.getCanonicalName())) {
153 return new CustomEventsTable(((CustomTxtTrace) fExperiment.getTraces()[0]).getDefinition(), parent, cacheSize);
154 }
155 if (commonTraceType.startsWith(CustomXmlTrace.class.getCanonicalName())) {
156 return new CustomEventsTable(((CustomXmlTrace) fExperiment.getTraces()[0]).getDefinition(), parent, cacheSize);
157 }
158 for (IConfigurationElement ce : TmfTraceType.getTypeElements()) {
159 if (ce.getAttribute(TmfTraceType.ID_ATTR).equals(commonTraceType)) {
160 IConfigurationElement[] eventsTableTypeCE = ce.getChildren(TmfTraceType.EVENTS_TABLE_TYPE_ELEM);
161 if (eventsTableTypeCE.length != 1) {
162 break;
163 }
164 String eventsTableType = eventsTableTypeCE[0].getAttribute(TmfTraceType.CLASS_ATTR);
165 if ((eventsTableType == null) || (eventsTableType.length() == 0)) {
166 break;
167 }
168 Bundle bundle = Platform.getBundle(ce.getContributor().getName());
169 Class<?> c = bundle.loadClass(eventsTableType);
170 Class<?>[] constructorArgs = new Class[] { Composite.class, int.class };
171 Constructor<?> constructor = c.getConstructor(constructorArgs);
172 Object[] args = new Object[] { parent, cacheSize };
173 return (TmfEventsTable) constructor.newInstance(args);
174 }
175 }
176 } catch (CoreException e) {
177 Activator.getDefault().logError("Error creating events table", e); //$NON-NLS-1$
178 } catch (InvalidRegistryObjectException e) {
179 Activator.getDefault().logError("Error creating events table", e); //$NON-NLS-1$
180 } catch (SecurityException e) {
181 Activator.getDefault().logError("Error creating events table", e); //$NON-NLS-1$
182 } catch (IllegalArgumentException e) {
183 Activator.getDefault().logError("Error creating events table", e); //$NON-NLS-1$
184 } catch (ClassNotFoundException e) {
185 Activator.getDefault().logError("Error creating events table", e); //$NON-NLS-1$
186 } catch (NoSuchMethodException e) {
187 Activator.getDefault().logError("Error creating events table", e); //$NON-NLS-1$
188 } catch (InstantiationException e) {
189 Activator.getDefault().logError("Error creating events table", e); //$NON-NLS-1$
190 } catch (IllegalAccessException e) {
191 Activator.getDefault().logError("Error creating events table", e); //$NON-NLS-1$
192 } catch (InvocationTargetException e) {
193 Activator.getDefault().logError("Error creating events table", e); //$NON-NLS-1$
194 }
195 return new TmfEventsTable(parent, cacheSize);
196 }
197
198 /* (non-Javadoc)
199 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
200 */
201 @Override
202 public void setFocus() {
203 fEventsTable.setFocus();
204 }
205
206 /* (non-Javadoc)
207 * @see org.eclipse.ui.part.WorkbenchPart#getAdapter(java.lang.Class)
208 */
209 @SuppressWarnings("rawtypes")
210 @Override
211 public Object getAdapter(Class adapter) {
212 if (IGotoMarker.class.equals(adapter)) {
213 return fEventsTable;
214 }
215 return super.getAdapter(adapter);
216 }
217
218 /* (non-Javadoc)
219 * @see java.lang.Object#toString()
220 */
221 @Override
222 @SuppressWarnings("nls")
223 public String toString() {
224 return "[TmfEventsView]";
225 }
226
227 // ------------------------------------------------------------------------
228 // Signal handlers
229 // ------------------------------------------------------------------------
230
231 /**
232 * Handler for the experiment selected signal.
233 *
234 * @param signal
235 * The incoming signal
236 */
237 @SuppressWarnings("unchecked")
238 @TmfSignalHandler
239 public void experimentSelected(TmfExperimentSelectedSignal<ITmfEvent> signal) {
240 // Update the trace reference
241 TmfExperiment<ITmfEvent> exp = (TmfExperiment<ITmfEvent>) signal.getExperiment();
242 if (!exp.equals(fExperiment)) {
243 fExperiment = exp;
244 setPartName(fTitlePrefix + " - " + fExperiment.getName()); //$NON-NLS-1$
245 if (fEventsTable != null) {
246 fEventsTable.dispose();
247 }
248 fEventsTable = createEventsTable(fParent);
249 fEventsTable.setTrace(fExperiment, false);
250 fEventsTable.refreshBookmarks(fExperiment.getBookmarksFile());
251 if (fExperiment.getBookmarksFile() != null) {
252 ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE);
253 }
254 fParent.layout();
255 }
256 }
257
258 /**
259 * Handler for the experiment disposed signal.
260 *
261 * @param signal
262 * The incoming signal
263 */
264 @SuppressWarnings("unchecked")
265 @TmfSignalHandler
266 public void experimentDisposed(TmfExperimentDisposedSignal<ITmfEvent> signal) {
267 // Clear the trace reference
268 TmfExperiment<ITmfEvent> experiment = (TmfExperiment<ITmfEvent>) signal.getExperiment();
269 if (experiment.equals(fExperiment)) {
270 fEventsTable.setTrace(null, false);
271
272 Activator.getDefault().getWorkbench().getWorkbenchWindows()[0].getShell().getDisplay().syncExec(new Runnable() {
273 @Override
274 public void run() {
275 setPartName(fTitlePrefix);
276 }
277 });
278
279 if ((fExperiment != null) && (fExperiment.getBookmarksFile() != null)) {
280 ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
281 }
282
283 }
284 }
285
286 @Override
287 public void resourceChanged(final IResourceChangeEvent event) {
288 if ((fExperiment == null) || (fExperiment.getBookmarksFile() == null)) {
289 return;
290 }
291
292 for (final IMarkerDelta delta : event.findMarkerDeltas(IMarker.BOOKMARK, false)) {
293 if (delta.getResource().equals(fExperiment.getBookmarksFile())) {
294 if (delta.getKind() == IResourceDelta.REMOVED) {
295 final IMarker bookmark = delta.getMarker();
296 Display.getDefault().asyncExec(new Runnable() {
297 @Override
298 public void run() {
299 fEventsTable.removeBookmark(bookmark);
300 }
301 });
302 } else if (delta.getKind() == IResourceDelta.CHANGED) {
303 Display.getDefault().asyncExec(new Runnable() {
304 @Override
305 public void run() {
306 fEventsTable.getTable().refresh();
307 }
308 });
309 }
310 }
311 }
312 }
313 }
This page took 0.038273 seconds and 5 git commands to generate.