1 /*******************************************************************************
2 * Copyright (c) 2009, 2010 Ericsson
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
10 * Francois Chouinard - Initial API and implementation
11 * Patrick Tasse - Factored out events table
12 *******************************************************************************/
14 package org
.eclipse
.linuxtools
.tmf
.ui
.views
.events
;
16 import java
.lang
.reflect
.Constructor
;
17 import java
.lang
.reflect
.InvocationTargetException
;
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
;
50 * The generic TMF Events View.
54 * <li>Traces larger than available memory
55 * <li>Searching and Filtering
56 * <li>Customized table viewers (per trace type)
59 * TODO: Handle column selection, sort, ... generically (nothing less...)
60 * TODO: Implement hide/display columns
63 * @author Francois Chouinard
64 * @author Patrick Tasse
66 public class TmfEventsView
extends TmfView
implements IResourceChangeListener
{
69 * ID for serializing purposes.
71 public static final String ID
= "org.eclipse.linuxtools.tmf.ui.views.events"; //$NON-NLS-1$
73 private TmfExperiment
<?
> fExperiment
;
74 private TmfEventsTable fEventsTable
;
75 private static final int DEFAULT_CACHE_SIZE
= 100;
76 private String fTitlePrefix
;
77 private Composite fParent
;
79 // ------------------------------------------------------------------------
81 // ------------------------------------------------------------------------
84 * Create an events view with a cache size
85 * @param cacheSize not used
87 public TmfEventsView(int cacheSize
) {
88 super("TmfEventsView"); //$NON-NLS-1$
94 public TmfEventsView() {
95 this(DEFAULT_CACHE_SIZE
);
98 // ------------------------------------------------------------------------
100 // ------------------------------------------------------------------------
103 @SuppressWarnings("unchecked")
104 public void createPartControl(Composite parent
) {
107 fTitlePrefix
= getTitle();
109 // If an experiment is already selected, update the table
110 TmfExperiment
<ITmfEvent
> experiment
= (TmfExperiment
<ITmfEvent
>) TmfExperiment
.getCurrentExperiment();
111 if (experiment
!= null) {
112 experimentSelected(new TmfExperimentSelectedSignal
<ITmfEvent
>(this, experiment
));
114 fEventsTable
= createEventsTable(parent
);
119 public void dispose() {
120 if (fEventsTable
!= null) {
121 fEventsTable
.dispose();
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
133 protected TmfEventsTable
createEventsTable(Composite parent
) {
134 if (fExperiment
== null) {
135 return new TmfEventsTable(parent
, DEFAULT_CACHE_SIZE
);
137 int cacheSize
= fExperiment
.getCacheSize();
138 String commonTraceType
= null;
140 for (ITmfTrace
<?
> trace
: fExperiment
.getTraces()) {
141 IResource resource
= trace
.getResource();
142 if (resource
== null) {
143 return new TmfEventsTable(parent
, cacheSize
);
145 String traceType
= resource
.getPersistentProperty(TmfCommonConstants
.TRACETYPE
);
146 if ((commonTraceType
!= null) && !commonTraceType
.equals(traceType
)) {
147 return new TmfEventsTable(parent
, cacheSize
);
149 commonTraceType
= traceType
;
151 if (commonTraceType
== null) {
152 return new TmfEventsTable(parent
, cacheSize
);
154 if (commonTraceType
.startsWith(CustomTxtTrace
.class.getCanonicalName())) {
155 return new CustomEventsTable(((CustomTxtTrace
) fExperiment
.getTraces()[0]).getDefinition(), parent
, cacheSize
);
157 if (commonTraceType
.startsWith(CustomXmlTrace
.class.getCanonicalName())) {
158 return new CustomEventsTable(((CustomXmlTrace
) fExperiment
.getTraces()[0]).getDefinition(), parent
, cacheSize
);
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) {
166 String eventsTableType
= eventsTableTypeCE
[0].getAttribute(TmfTraceType
.CLASS_ATTR
);
167 if ((eventsTableType
== null) || (eventsTableType
.length() == 0)) {
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
);
178 } catch (CoreException e
) {
179 Activator
.getDefault().logError("Error creating events table", e
); //$NON-NLS-1$
180 } catch (InvalidRegistryObjectException e
) {
181 Activator
.getDefault().logError("Error creating events table", e
); //$NON-NLS-1$
182 } catch (SecurityException e
) {
183 Activator
.getDefault().logError("Error creating events table", e
); //$NON-NLS-1$
184 } catch (IllegalArgumentException e
) {
185 Activator
.getDefault().logError("Error creating events table", e
); //$NON-NLS-1$
186 } catch (ClassNotFoundException e
) {
187 Activator
.getDefault().logError("Error creating events table", e
); //$NON-NLS-1$
188 } catch (NoSuchMethodException e
) {
189 Activator
.getDefault().logError("Error creating events table", e
); //$NON-NLS-1$
190 } catch (InstantiationException e
) {
191 Activator
.getDefault().logError("Error creating events table", e
); //$NON-NLS-1$
192 } catch (IllegalAccessException e
) {
193 Activator
.getDefault().logError("Error creating events table", e
); //$NON-NLS-1$
194 } catch (InvocationTargetException e
) {
195 Activator
.getDefault().logError("Error creating events table", e
); //$NON-NLS-1$
197 return new TmfEventsTable(parent
, cacheSize
);
201 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
204 public void setFocus() {
205 fEventsTable
.setFocus();
209 * @see org.eclipse.ui.part.WorkbenchPart#getAdapter(java.lang.Class)
211 @SuppressWarnings("rawtypes")
213 public Object
getAdapter(Class adapter
) {
214 if (IGotoMarker
.class.equals(adapter
)) {
217 return super.getAdapter(adapter
);
221 * @see java.lang.Object#toString()
224 @SuppressWarnings("nls")
225 public String
toString() {
226 return "[TmfEventsView]";
229 // ------------------------------------------------------------------------
231 // ------------------------------------------------------------------------
234 * ExperimentSelected, a callback called when the TmfSignal "TmfExperimentSelectedSignal" is sent.
235 * @param signal the signal that triggered the callback
237 @SuppressWarnings("unchecked")
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
)) {
244 setPartName(fTitlePrefix
+ " - " + fExperiment
.getName()); //$NON-NLS-1$
245 if (fEventsTable
!= null) {
246 fEventsTable
.dispose();
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
);
259 * Experiment disposed, a callback called when the TmfSignal "TmfExperimentDisposedSignal" is sent.
260 * @param signal the signal that triggered the callback
262 @SuppressWarnings("unchecked")
264 public void experimentDisposed(TmfExperimentDisposedSignal
<ITmfEvent
> signal
) {
265 // Clear the trace reference
266 TmfExperiment
<ITmfEvent
> experiment
= (TmfExperiment
<ITmfEvent
>) signal
.getExperiment();
267 if (experiment
.equals(fExperiment
)) {
268 fEventsTable
.setTrace(null, false);
270 Activator
.getDefault().getWorkbench().getWorkbenchWindows()[0].getShell().getDisplay().syncExec(new Runnable() {
273 setPartName(fTitlePrefix
);
277 if ((fExperiment
!= null) && (fExperiment
.getBookmarksFile() != null)) {
278 ResourcesPlugin
.getWorkspace().removeResourceChangeListener(this);
285 public void resourceChanged(final IResourceChangeEvent event
) {
286 if ((fExperiment
== null) || (fExperiment
.getBookmarksFile() == null)) {
290 for (final IMarkerDelta delta
: event
.findMarkerDeltas(IMarker
.BOOKMARK
, false)) {
291 if (delta
.getResource().equals(fExperiment
.getBookmarksFile())) {
292 if (delta
.getKind() == IResourceDelta
.REMOVED
) {
293 final IMarker bookmark
= delta
.getMarker();
294 Display
.getDefault().asyncExec(new Runnable() {
297 fEventsTable
.removeBookmark(bookmark
);
300 } else if (delta
.getKind() == IResourceDelta
.CHANGED
) {
301 Display
.getDefault().asyncExec(new Runnable() {
304 fEventsTable
.getTable().refresh();