1 /*******************************************************************************
2 * Copyright (c) 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 * Patrick Tasse - Initial API and implementation
11 *******************************************************************************/
13 package org
.eclipse
.linuxtools
.tmf
.ui
.editors
;
15 import java
.io
.FileNotFoundException
;
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
.IProgressMonitor
;
29 import org
.eclipse
.core
.runtime
.InvalidRegistryObjectException
;
30 import org
.eclipse
.core
.runtime
.Platform
;
31 import org
.eclipse
.linuxtools
.tmf
.core
.event
.TmfEvent
;
32 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfSignalHandler
;
33 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfTraceSelectedSignal
;
34 import org
.eclipse
.linuxtools
.tmf
.core
.trace
.ITmfTrace
;
35 import org
.eclipse
.linuxtools
.tmf
.core
.util
.TmfTraceType
;
36 import org
.eclipse
.linuxtools
.tmf
.ui
.parsers
.custom
.CustomEventsTable
;
37 import org
.eclipse
.linuxtools
.tmf
.ui
.parsers
.custom
.CustomTxtTrace
;
38 import org
.eclipse
.linuxtools
.tmf
.ui
.parsers
.custom
.CustomXmlTrace
;
39 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.TmfTraceElement
;
40 import org
.eclipse
.linuxtools
.tmf
.ui
.signal
.TmfTraceClosedSignal
;
41 import org
.eclipse
.linuxtools
.tmf
.ui
.signal
.TmfTraceOpenedSignal
;
42 import org
.eclipse
.linuxtools
.tmf
.ui
.signal
.TmfTraceParserUpdatedSignal
;
43 import org
.eclipse
.linuxtools
.tmf
.ui
.viewers
.events
.TmfEventsTable
;
44 import org
.eclipse
.swt
.widgets
.Composite
;
45 import org
.eclipse
.swt
.widgets
.Display
;
46 import org
.eclipse
.ui
.IEditorInput
;
47 import org
.eclipse
.ui
.IEditorPart
;
48 import org
.eclipse
.ui
.IEditorSite
;
49 import org
.eclipse
.ui
.IFileEditorInput
;
50 import org
.eclipse
.ui
.IPropertyListener
;
51 import org
.eclipse
.ui
.IReusableEditor
;
52 import org
.eclipse
.ui
.PartInitException
;
53 import org
.eclipse
.ui
.ide
.IGotoMarker
;
54 import org
.osgi
.framework
.Bundle
;
57 * <b><u>TmfEventsEditor</u></b>
59 public class TmfEventsEditor
extends TmfEditor
implements ITmfTraceEditor
, IReusableEditor
, IPropertyListener
, IResourceChangeListener
{
61 public static final String ID
= "org.eclipse.linuxtools.tmf.ui.editors.events"; //$NON-NLS-1$
63 private TmfEventsTable fEventsTable
;
64 private IResource fResource
;
65 @SuppressWarnings("rawtypes")
66 private ITmfTrace fTrace
;
67 private Composite fParent
;
70 public void doSave(IProgressMonitor monitor
) {
74 public void doSaveAs() {
77 @SuppressWarnings("unchecked")
79 public void init(IEditorSite site
, IEditorInput input
) throws PartInitException
{
80 if (input
instanceof TmfEditorInput
) {
81 fResource
= ((TmfEditorInput
) input
).getResource();
82 fTrace
= ((TmfEditorInput
) input
).getTrace();
83 } else if (input
instanceof IFileEditorInput
) {
84 fResource
= ((IFileEditorInput
) input
).getFile();
86 String traceTypeId
= fResource
.getPersistentProperty(TmfTraceElement
.TRACETYPE
);
87 if (traceTypeId
!= null) {
88 for (IConfigurationElement ce
: TmfTraceType
.getTypeElements()) {
89 if (traceTypeId
.equals(ce
.getAttribute(TmfTraceType
.ID_ATTR
))) {
90 fTrace
= (ITmfTrace
<?
>) ce
.createExecutableExtension(TmfTraceType
.TRACE_TYPE_ATTR
);
91 TmfEvent event
= (TmfEvent
) ce
.createExecutableExtension(TmfTraceType
.EVENT_TYPE_ATTR
);
92 String path
= fResource
.getLocation().toOSString();
93 fTrace
.initTrace(path
, event
.getClass(), true);
98 } catch (InvalidRegistryObjectException e
) {
100 } catch (FileNotFoundException e
) {
102 } catch (CoreException e
) {
105 input
= new TmfEditorInput(fResource
, fTrace
);
107 throw new PartInitException("Invalid IEditorInput: " + input
.getClass()); //$NON-NLS-1$
109 if (fTrace
== null) {
110 throw new PartInitException("Invalid IEditorInput: " + fResource
.getName()); //$NON-NLS-1$
113 super.setInput(input
);
117 public boolean isDirty() {
122 public boolean isSaveAsAllowed() {
127 public void setInput(IEditorInput input
) {
128 super.setInput(input
);
129 firePropertyChange(IEditorPart
.PROP_INPUT
);
133 public void propertyChanged(Object source
, int propId
) {
134 if (propId
== IEditorPart
.PROP_INPUT
) {
135 broadcast(new TmfTraceClosedSignal(this, fTrace
));
136 fResource
= ((TmfEditorInput
) getEditorInput()).getResource();
137 fTrace
= ((TmfEditorInput
) getEditorInput()).getTrace();
138 fEventsTable
.dispose();
139 if (fTrace
!= null) {
140 fEventsTable
= createEventsTable(fParent
, fTrace
.getCacheSize());
141 fEventsTable
.setTrace(fTrace
, true);
142 fEventsTable
.refreshBookmarks(fResource
);
143 broadcast(new TmfTraceOpenedSignal(this, fTrace
, fResource
, fEventsTable
));
145 fEventsTable
= new TmfEventsTable(fParent
, 0);
152 public void createPartControl(Composite parent
) {
154 setPartName(getEditorInput().getName());
155 if (fTrace
!= null) {
156 fEventsTable
= createEventsTable(parent
, fTrace
.getCacheSize());
157 fEventsTable
.setTrace(fTrace
, true);
158 fEventsTable
.refreshBookmarks(fResource
);
159 broadcast(new TmfTraceOpenedSignal(this, fTrace
, fResource
, fEventsTable
));
161 fEventsTable
= new TmfEventsTable(parent
, 0);
163 addPropertyListener(this);
164 ResourcesPlugin
.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent
.POST_CHANGE
);
168 public void dispose() {
169 ResourcesPlugin
.getWorkspace().removeResourceChangeListener(this);
170 removePropertyListener(this);
171 if (fTrace
!= null) {
172 broadcast(new TmfTraceClosedSignal(this, fTrace
));
174 if (fEventsTable
!= null) {
175 fEventsTable
.dispose();
180 protected TmfEventsTable
createEventsTable(Composite parent
, int cacheSize
) {
181 TmfEventsTable eventsTable
= getEventsTable(parent
, cacheSize
);
182 if (eventsTable
== null) {
183 eventsTable
= new TmfEventsTable(parent
, cacheSize
);
188 private TmfEventsTable
getEventsTable(Composite parent
, int cacheSize
) {
189 TmfEventsTable eventsTable
= null;
191 String traceType
= fResource
.getPersistentProperty(TmfTraceElement
.TRACETYPE
);
192 if (traceType
.startsWith(CustomTxtTrace
.class.getCanonicalName())) {
193 return new CustomEventsTable(((CustomTxtTrace
) fTrace
).getDefinition(), parent
, cacheSize
);
195 if (traceType
.startsWith(CustomXmlTrace
.class.getCanonicalName())) {
196 return new CustomEventsTable(((CustomXmlTrace
) fTrace
).getDefinition(), parent
, cacheSize
);
198 for (IConfigurationElement ce
: TmfTraceType
.getTypeElements()) {
199 if (ce
.getAttribute(TmfTraceType
.ID_ATTR
).equals(traceType
)) {
200 IConfigurationElement
[] eventsTableTypeCE
= ce
.getChildren(TmfTraceType
.EVENTS_TABLE_TYPE_ELEM
);
201 if (eventsTableTypeCE
.length
!= 1) {
204 String eventsTableType
= eventsTableTypeCE
[0].getAttribute(TmfTraceType
.CLASS_ATTR
);
205 if (eventsTableType
== null || eventsTableType
.length() == 0) {
208 Bundle bundle
= Platform
.getBundle(ce
.getContributor().getName());
209 Class
<?
> c
= bundle
.loadClass(eventsTableType
);
210 Class
<?
>[] constructorArgs
= new Class
[] { Composite
.class, int.class };
211 Constructor
<?
> constructor
= c
.getConstructor(constructorArgs
);
212 Object
[] args
= new Object
[] { parent
, cacheSize
};
213 eventsTable
= (TmfEventsTable
) constructor
.newInstance(args
);
217 } catch (InvalidRegistryObjectException e
) {
219 } catch (CoreException e
) {
221 } catch (ClassNotFoundException e
) {
223 } catch (SecurityException e
) {
225 } catch (NoSuchMethodException e
) {
227 } catch (IllegalArgumentException e
) {
229 } catch (InstantiationException e
) {
231 } catch (IllegalAccessException e
) {
233 } catch (InvocationTargetException e
) {
240 public ITmfTrace
<?
> getTrace() {
245 public IResource
getResource() {
250 public void setFocus() {
251 fEventsTable
.setFocus();
252 if (fTrace
!= null) {
253 broadcast(new TmfTraceSelectedSignal(this, fTrace
));
258 @SuppressWarnings("rawtypes")
259 public Object
getAdapter(Class adapter
) {
260 if (IGotoMarker
.class.equals(adapter
)) {
263 return super.getAdapter(adapter
);
267 public void resourceChanged(IResourceChangeEvent event
) {
268 for (IMarkerDelta delta
: event
.findMarkerDeltas(IMarker
.BOOKMARK
, false)) {
269 if (delta
.getResource().equals(fResource
) && delta
.getKind() == IResourceDelta
.REMOVED
) {
270 final IMarker bookmark
= delta
.getMarker();
271 Display
.getDefault().asyncExec(new Runnable() {
274 fEventsTable
.removeBookmark(bookmark
);
281 // ------------------------------------------------------------------------
283 // ------------------------------------------------------------------------
285 public void addBookmark() {
286 fEventsTable
.addBookmark(fResource
);
290 // ------------------------------------------------------------------------
292 // ------------------------------------------------------------------------
294 @SuppressWarnings("unchecked")
296 public void traceParserUpdated(TmfTraceParserUpdatedSignal signal
) {
297 if (signal
.getTraceResource().equals(fResource
)) {
298 broadcast(new TmfTraceClosedSignal(this, fTrace
));
301 String traceTypeId
= fResource
.getPersistentProperty(TmfTraceElement
.TRACETYPE
);
302 if (traceTypeId
!= null) {
303 for (IConfigurationElement ce
: TmfTraceType
.getTypeElements()) {
304 if (traceTypeId
.equals(ce
.getAttribute(TmfTraceType
.ID_ATTR
))) {
305 fTrace
= (ITmfTrace
<?
>) ce
.createExecutableExtension(TmfTraceType
.TRACE_TYPE_ATTR
);
306 TmfEvent event
= (TmfEvent
) ce
.createExecutableExtension(TmfTraceType
.EVENT_TYPE_ATTR
);
307 String path
= fResource
.getLocation().toOSString();
308 fTrace
.initTrace(path
, event
.getClass(), true);
313 } catch (InvalidRegistryObjectException e
) {
315 } catch (FileNotFoundException e
) {
317 } catch (CoreException e
) {
320 fEventsTable
.dispose();
321 if (fTrace
!= null) {
322 fEventsTable
= createEventsTable(fParent
, fTrace
.getCacheSize());
323 fEventsTable
.setTrace(fTrace
, true);
324 broadcast(new TmfTraceOpenedSignal(this, fTrace
, fResource
, fEventsTable
));
326 fEventsTable
= new TmfEventsTable(fParent
, 0);
333 public void traceSelected(TmfTraceSelectedSignal signal
) {
334 if (signal
.getSource() != this && signal
.getTrace().equals(fTrace
)) {
335 getSite().getPage().bringToTop(this);