Improve Javadoc for TmfEventsViews
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.ui / src / org / eclipse / linuxtools / tmf / ui / views / events / TmfEventsView.java
CommitLineData
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 14package org.eclipse.linuxtools.tmf.ui.views.events;
b0d3496e 15
09d11238
PT
16import java.lang.reflect.Constructor;
17import java.lang.reflect.InvocationTargetException;
18
a01c19b8
BH
19import org.eclipse.core.resources.IMarker;
20import org.eclipse.core.resources.IMarkerDelta;
09d11238 21import org.eclipse.core.resources.IResource;
a01c19b8
BH
22import org.eclipse.core.resources.IResourceChangeEvent;
23import org.eclipse.core.resources.IResourceChangeListener;
24import org.eclipse.core.resources.IResourceDelta;
25import org.eclipse.core.resources.ResourcesPlugin;
09d11238
PT
26import org.eclipse.core.runtime.CoreException;
27import org.eclipse.core.runtime.IConfigurationElement;
28import org.eclipse.core.runtime.InvalidRegistryObjectException;
29import org.eclipse.core.runtime.Platform;
8fd82db5 30import org.eclipse.linuxtools.internal.tmf.ui.Activator;
d34665f9
FC
31import org.eclipse.linuxtools.internal.tmf.ui.parsers.custom.CustomEventsTable;
32import org.eclipse.linuxtools.internal.tmf.ui.parsers.custom.CustomTxtTrace;
33import org.eclipse.linuxtools.internal.tmf.ui.parsers.custom.CustomXmlTrace;
e12ecd30 34import org.eclipse.linuxtools.tmf.core.TmfCommonConstants;
58b21093 35import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;
6c13869b
FC
36import org.eclipse.linuxtools.tmf.core.signal.TmfExperimentDisposedSignal;
37import org.eclipse.linuxtools.tmf.core.signal.TmfExperimentSelectedSignal;
38import org.eclipse.linuxtools.tmf.core.signal.TmfSignalHandler;
09d11238 39import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;
9e0640dc 40import org.eclipse.linuxtools.tmf.core.trace.TmfExperiment;
bfc779a0 41import org.eclipse.linuxtools.tmf.ui.project.model.TmfTraceType;
abfad0aa 42import org.eclipse.linuxtools.tmf.ui.viewers.events.TmfEventsTable;
12c155f5 43import org.eclipse.linuxtools.tmf.ui.views.TmfView;
b0d3496e 44import org.eclipse.swt.widgets.Composite;
a01c19b8 45import org.eclipse.swt.widgets.Display;
09d11238
PT
46import org.eclipse.ui.ide.IGotoMarker;
47import 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 66public 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}
This page took 0.066438 seconds and 5 git commands to generate.