1 /*******************************************************************************
2 * Copyright (c) 2012 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
.util
.List
;
17 import org
.eclipse
.core
.resources
.IFile
;
18 import org
.eclipse
.core
.resources
.IMarker
;
19 import org
.eclipse
.core
.runtime
.CoreException
;
20 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
21 import org
.eclipse
.core
.runtime
.InvalidRegistryObjectException
;
22 import org
.eclipse
.linuxtools
.internal
.tmf
.ui
.Activator
;
23 import org
.eclipse
.linuxtools
.internal
.tmf
.ui
.project
.handlers
.Messages
;
24 import org
.eclipse
.linuxtools
.tmf
.core
.TmfCommonConstants
;
25 import org
.eclipse
.linuxtools
.tmf
.core
.event
.ITmfEvent
;
26 import org
.eclipse
.linuxtools
.tmf
.core
.exceptions
.TmfTraceException
;
27 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfExperimentSelectedSignal
;
28 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfSignalManager
;
29 import org
.eclipse
.linuxtools
.tmf
.core
.trace
.ITmfTrace
;
30 import org
.eclipse
.linuxtools
.tmf
.core
.trace
.TmfExperiment
;
31 import org
.eclipse
.linuxtools
.tmf
.core
.trace
.TmfTrace
;
32 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.ITmfProjectModelElement
;
33 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.TmfExperimentElement
;
34 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.TmfNavigatorContentProvider
;
35 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.TmfProjectElement
;
36 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.TmfProjectRegistry
;
37 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.TmfTraceElement
;
38 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.events
.TmfEventsView
;
39 import org
.eclipse
.swt
.widgets
.Composite
;
40 import org
.eclipse
.swt
.widgets
.Display
;
41 import org
.eclipse
.ui
.IEditorInput
;
42 import org
.eclipse
.ui
.IEditorSite
;
43 import org
.eclipse
.ui
.IFileEditorInput
;
44 import org
.eclipse
.ui
.IViewPart
;
45 import org
.eclipse
.ui
.IWorkbenchPage
;
46 import org
.eclipse
.ui
.PartInitException
;
47 import org
.eclipse
.ui
.ide
.IGotoMarker
;
48 import org
.eclipse
.ui
.part
.EditorPart
;
52 * This editor is used to open a trace in the Events view
53 * and set the trace as the current experiment.
54 * It intercepts the IGotoMarker adapter and dispatches
55 * the handling to the Events view' events table.
56 * The editor then closes itself and hides the
57 * editor area if no other editor is open.
60 public class EventsViewEditor
extends TmfEditor
{
65 public static final String ID
= "org.eclipse.linuxtools.tmf.ui.editors.eventsView"; //$NON-NLS-1$
68 @SuppressWarnings("rawtypes")
69 private ITmfTrace fTrace
;
70 private IMarker fGotoMarker
;
71 private boolean fEditorAreaVisible
;
75 * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
78 public void doSave(final IProgressMonitor monitor
) {
82 public void doSaveAs() {
87 * @see org.eclipse.ui.part.EditorPart#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
89 @SuppressWarnings({ "unchecked", "rawtypes" })
91 public void init(final IEditorSite site
, IEditorInput input
) throws PartInitException
{
92 fEditorAreaVisible
= site
.getPage().isEditorAreaVisible();
93 if (input
instanceof TmfEditorInput
) {
94 fFile
= ((TmfEditorInput
) input
).getFile();
95 fTrace
= ((TmfEditorInput
) input
).getTrace();
96 } else if (input
instanceof IFileEditorInput
) {
97 fFile
= ((IFileEditorInput
) input
).getFile();
99 throw new PartInitException("Invalid IFileEditorInput: " + input
); //$NON-NLS-1$
100 final TmfExperiment currentExperiment
= TmfExperiment
.getCurrentExperiment();
101 if ((currentExperiment
!= null) && fFile
.equals(currentExperiment
.getBookmarksFile())) {
102 fTrace
= currentExperiment
;
104 super.setInput(input
);
108 final String traceTypeId
= fFile
.getPersistentProperty(TmfCommonConstants
.TRACETYPE
);
109 if (traceTypeId
== null)
110 throw new PartInitException(Messages
.OpenTraceHandler_NoTraceType
);
111 if (traceTypeId
.equals(TmfExperiment
.class.getCanonicalName())) {
112 // Special case: experiment bookmark resource
113 final TmfNavigatorContentProvider ncp
= new TmfNavigatorContentProvider();
114 ncp
.getChildren(fFile
.getProject()); // force the model to be populated
115 final TmfProjectElement project
= TmfProjectRegistry
.getProject(fFile
.getProject());
117 throw new PartInitException(Messages
.OpenExperimentHandler_NoTraceType
);
118 for (final ITmfProjectModelElement projectElement
: project
.getExperimentsFolder().getChildren()) {
119 final String traceName
= fFile
.getParent().getName();
120 if (projectElement
.getName().equals(traceName
)) {
121 final TmfExperimentElement experimentElement
= (TmfExperimentElement
) projectElement
;
122 // Instantiate the experiment's traces
123 final List
<TmfTraceElement
> traceEntries
= experimentElement
.getTraces();
124 final int nbTraces
= traceEntries
.size();
125 int cacheSize
= Integer
.MAX_VALUE
;
126 final ITmfTrace
<?
>[] traces
= new ITmfTrace
[nbTraces
];
127 for (int i
= 0; i
< nbTraces
; i
++) {
128 final TmfTraceElement traceElement
= traceEntries
.get(i
);
129 final ITmfTrace trace
= traceElement
.instantiateTrace();
130 final ITmfEvent traceEvent
= traceElement
.instantiateEvent();
131 if ((trace
== null) || (traceEvent
== null)) {
132 for (int j
= 0; j
< i
; j
++)
134 throw new PartInitException(Messages
.OpenExperimentHandler_NoTraceType
);
137 trace
.initTrace(traceElement
.getResource(), traceElement
.getLocation().getPath(), traceEvent
.getClass());
138 } catch (final TmfTraceException e
) {
140 cacheSize
= Math
.min(cacheSize
, trace
.getCacheSize());
143 final TmfExperiment experiment
= new TmfExperiment(ITmfEvent
.class, experimentElement
.getName(), traces
, cacheSize
);
144 experiment
.setBookmarksFile(fFile
);
146 TmfExperiment
.setCurrentExperiment(experiment
);
147 TmfSignalManager
.dispatchSignal(new TmfExperimentSelectedSignal(this, experiment
));
151 } else if (traceTypeId
.equals(TmfTrace
.class.getCanonicalName())) {
152 // Special case: trace bookmark resource
153 final TmfNavigatorContentProvider ncp
= new TmfNavigatorContentProvider();
154 ncp
.getChildren(fFile
.getProject()); // force the model to be populated
155 final TmfProjectElement project
= TmfProjectRegistry
.getProject(fFile
.getProject());
156 for (final ITmfProjectModelElement projectElement
: project
.getTracesFolder().getChildren()) {
157 final String traceName
= fFile
.getParent().getName();
158 if (projectElement
.getName().equals(traceName
)) {
159 final TmfTraceElement traceElement
= (TmfTraceElement
) projectElement
;
160 // Instantiate the experiment trace
161 final ITmfTrace trace
= traceElement
.instantiateTrace();
162 final ITmfEvent traceEvent
= traceElement
.instantiateEvent();
163 if ((trace
== null) || (traceEvent
== null))
164 throw new PartInitException(Messages
.OpenTraceHandler_NoTraceType
);
166 trace
.initTrace(traceElement
.getResource(), traceElement
.getLocation().getPath(), traceEvent
.getClass());
167 } catch (final TmfTraceException e
) {
169 final ITmfTrace
[] traces
= new ITmfTrace
[] { trace
};
170 final TmfExperiment experiment
= new TmfExperiment(traceEvent
.getClass(), traceElement
.getName(), traces
, trace
.getCacheSize());
171 experiment
.setBookmarksFile(fFile
);
173 TmfExperiment
.setCurrentExperiment(experiment
);
174 TmfSignalManager
.dispatchSignal(new TmfExperimentSelectedSignal(this, experiment
));
179 final TmfNavigatorContentProvider ncp
= new TmfNavigatorContentProvider();
180 ncp
.getChildren(fFile
.getProject()); // force the model to be populated
181 final TmfProjectElement project
= TmfProjectRegistry
.getProject(fFile
.getProject());
182 for (final ITmfProjectModelElement projectElement
: project
.getTracesFolder().getChildren())
183 if (projectElement
.getResource().equals(fFile
)) {
184 final TmfTraceElement traceElement
= (TmfTraceElement
) projectElement
;
185 // Instantiate the experiment trace
186 final ITmfTrace trace
= traceElement
.instantiateTrace();
187 final ITmfEvent traceEvent
= traceElement
.instantiateEvent();
188 if ((trace
== null) || (traceEvent
== null))
189 throw new PartInitException(Messages
.OpenTraceHandler_NoTraceType
);
191 trace
.initTrace(traceElement
.getResource(), traceElement
.getLocation().getPath(), traceEvent
.getClass());
192 } catch (final TmfTraceException e
) {
194 final ITmfTrace
[] traces
= new ITmfTrace
[] { trace
};
195 final TmfExperiment experiment
= new TmfExperiment(traceEvent
.getClass(), traceElement
.getName(), traces
, trace
.getCacheSize());
196 experiment
.setBookmarksFile(fFile
);
198 TmfExperiment
.setCurrentExperiment(experiment
);
199 TmfSignalManager
.dispatchSignal(new TmfExperimentSelectedSignal(this, experiment
));
203 } catch (final InvalidRegistryObjectException e
) {
204 Activator
.getDefault().logError("Error initializing EventsViewEditor", e
); //$NON-NLS-1$
205 } catch (final CoreException e
) {
206 Activator
.getDefault().logError("Error initializing EventsViewEditor", e
); //$NON-NLS-1$
208 input
= new TmfEditorInput(fFile
, fTrace
);
210 throw new PartInitException("Invalid IEditorInput: " + input
.getClass()); //$NON-NLS-1$
212 throw new PartInitException("Invalid IEditorInput: " + fFile
.getName()); //$NON-NLS-1$
214 super.setInput(input
);
219 * @see org.eclipse.ui.part.EditorPart#isDirty()
222 public boolean isDirty() {
228 * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
231 public boolean isSaveAsAllowed() {
237 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
240 public void createPartControl(final Composite parent
) {
241 setPartName(getEditorInput().getName());
246 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
249 public void setFocus() {
250 Display
.getDefault().asyncExec(new Runnable() {
253 final EditorPart editorPart
= EventsViewEditor
.this;
254 final IWorkbenchPage page
= editorPart
.getEditorSite().getPage();
255 page
.closeEditor(editorPart
, false);
256 if (page
.getEditorReferences().length
== 0)
257 page
.setEditorAreaVisible(fEditorAreaVisible
);
259 final IViewPart viewPart
= page
.showView(TmfEventsView
.ID
);
260 if (fGotoMarker
!= null) {
261 final IGotoMarker adapter
= (IGotoMarker
) viewPart
.getAdapter(IGotoMarker
.class);
263 adapter
.gotoMarker(fGotoMarker
);
265 } catch (final PartInitException e
) {
266 Activator
.getDefault().logError("Error setting focus", e
); //$NON-NLS-1$
273 * @see org.eclipse.ui.part.WorkbenchPart#getAdapter(java.lang.Class)
275 @SuppressWarnings("rawtypes")
277 public Object
getAdapter(final Class adapter
) {
278 if (IGotoMarker
.class.equals(adapter
))
279 return new IGotoMarker() {
281 public void gotoMarker(final IMarker marker
) {
282 fGotoMarker
= marker
;
285 return super.getAdapter(adapter
);