Fix HistogramView recounts on range update
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.ui / src / org / eclipse / linuxtools / tmf / ui / editors / TmfEventsEditor.java
CommitLineData
abfad0aa
FC
1/*******************************************************************************\r
2 * Copyright (c) 2010 Ericsson\r
3 * \r
4 * All rights reserved. This program and the accompanying materials are\r
5 * made available under the terms of the Eclipse Public License v1.0 which\r
6 * accompanies this distribution, and is available at\r
7 * http://www.eclipse.org/legal/epl-v10.html\r
8 * \r
9 * Contributors:\r
10 * Patrick Tasse - Initial API and implementation\r
11 *******************************************************************************/\r
12\r
13package org.eclipse.linuxtools.tmf.ui.editors;\r
14\r
12c155f5
FC
15import java.lang.reflect.Constructor;\r
16import java.lang.reflect.InvocationTargetException;\r
17import java.net.URI;\r
18\r
19import org.eclipse.core.resources.IFile;\r
20import org.eclipse.core.resources.IFolder;\r
e2561baf
FC
21import org.eclipse.core.resources.IMarker;\r
22import org.eclipse.core.resources.IMarkerDelta;\r
12c155f5 23import org.eclipse.core.resources.IProject;\r
abfad0aa 24import org.eclipse.core.resources.IResource;\r
e2561baf
FC
25import org.eclipse.core.resources.IResourceChangeEvent;\r
26import org.eclipse.core.resources.IResourceChangeListener;\r
27import org.eclipse.core.resources.IResourceDelta;\r
12c155f5 28import org.eclipse.core.resources.IWorkspaceRoot;\r
e2561baf 29import org.eclipse.core.resources.ResourcesPlugin;\r
abfad0aa 30import org.eclipse.core.runtime.CoreException;\r
12c155f5 31import org.eclipse.core.runtime.IConfigurationElement;\r
abfad0aa 32import org.eclipse.core.runtime.IProgressMonitor;\r
12c155f5
FC
33import org.eclipse.core.runtime.InvalidRegistryObjectException;\r
34import org.eclipse.core.runtime.Path;\r
35import org.eclipse.core.runtime.Platform;\r
36import org.eclipse.core.runtime.Status;\r
37import org.eclipse.core.runtime.preferences.IEclipsePreferences;\r
38import org.eclipse.core.runtime.preferences.InstanceScope;\r
39import org.eclipse.linuxtools.tmf.TmfCorePlugin;\r
abfad0aa 40import org.eclipse.linuxtools.tmf.signal.TmfSignalHandler;\r
abfad0aa
FC
41import org.eclipse.linuxtools.tmf.signal.TmfTraceSelectedSignal;\r
42import org.eclipse.linuxtools.tmf.trace.ITmfTrace;\r
12c155f5
FC
43import org.eclipse.linuxtools.tmf.ui.TmfUiPlugin;\r
44import org.eclipse.linuxtools.tmf.ui.TmfUiPreferenceInitializer;\r
abfad0aa 45import org.eclipse.linuxtools.tmf.ui.parsers.ParserProviderManager;\r
12c155f5
FC
46import org.eclipse.linuxtools.tmf.ui.project.model.TmfTraceElement;\r
47import org.eclipse.linuxtools.tmf.ui.project.model.TmfTraceFolder;\r
46ab8ce3 48import org.eclipse.linuxtools.tmf.ui.signal.TmfTraceClosedSignal;\r
e2561baf 49import org.eclipse.linuxtools.tmf.ui.signal.TmfTraceOpenedSignal;\r
46ab8ce3 50import org.eclipse.linuxtools.tmf.ui.signal.TmfTraceParserUpdatedSignal;\r
abfad0aa 51import org.eclipse.linuxtools.tmf.ui.viewers.events.TmfEventsTable;\r
abfad0aa 52import org.eclipse.swt.widgets.Composite;\r
e2561baf 53import org.eclipse.swt.widgets.Display;\r
abfad0aa
FC
54import org.eclipse.ui.IEditorInput;\r
55import org.eclipse.ui.IEditorPart;\r
56import org.eclipse.ui.IEditorSite;\r
57import org.eclipse.ui.IFileEditorInput;\r
58import org.eclipse.ui.IPropertyListener;\r
59import org.eclipse.ui.IReusableEditor;\r
60import org.eclipse.ui.PartInitException;\r
61import org.eclipse.ui.ide.FileStoreEditorInput;\r
e2561baf 62import org.eclipse.ui.ide.IGotoMarker;\r
12c155f5 63import org.osgi.framework.Bundle;\r
abfad0aa
FC
64\r
65/**\r
66 * <b><u>TmfEventsEditor</u></b>\r
67 */\r
e2561baf 68public class TmfEventsEditor extends TmfEditor implements ITmfTraceEditor, IReusableEditor, IPropertyListener, IResourceChangeListener {\r
abfad0aa 69\r
3b38ea61 70 public static final String ID = "org.eclipse.linuxtools.tmf.ui.editors.events"; //$NON-NLS-1$\r
abfad0aa
FC
71 \r
72 private TmfEventsTable fEventsTable;\r
73 private IResource fResource;\r
12c155f5 74 private ITmfTrace<?> fTrace;\r
abfad0aa
FC
75 private Composite fParent;\r
76\r
77 @Override\r
78 public void doSave(IProgressMonitor monitor) {\r
79 }\r
80\r
81 @Override\r
82 public void doSaveAs() {\r
83 }\r
84\r
85 @Override\r
86 public void init(IEditorSite site, IEditorInput input) throws PartInitException {\r
87 if (input instanceof TmfEditorInput) {\r
88 fResource = ((TmfEditorInput) input).getResource();\r
89 fTrace = ((TmfEditorInput) input).getTrace();\r
90 } else if (input instanceof IFileEditorInput) {\r
91 fResource = ((IFileEditorInput) input).getFile();\r
92 fTrace = ParserProviderManager.getTrace(fResource);\r
93 input = new TmfEditorInput(fResource, fTrace);\r
94 } else if (input instanceof FileStoreEditorInput) {\r
95 try {\r
96 FileStoreEditorInput fileStoreEditorInput = (FileStoreEditorInput) input;\r
12c155f5 97 fResource = createLink(fileStoreEditorInput.getURI());\r
abfad0aa
FC
98 fTrace = ParserProviderManager.getTrace(fResource);\r
99 input = new TmfEditorInput(fResource, fTrace);\r
100 } catch (CoreException e) {\r
101 throw new PartInitException(e.getMessage());\r
102 }\r
103 } else {\r
3b38ea61 104 throw new PartInitException("Invalid IEditorInput: " + input.getClass()); //$NON-NLS-1$\r
abfad0aa
FC
105 }\r
106 if (fTrace == null) {\r
3b38ea61 107 throw new PartInitException("Invalid IEditorInput: " + fResource.getName()); //$NON-NLS-1$\r
abfad0aa
FC
108 }\r
109 super.setSite(site);\r
110 super.setInput(input);\r
111 }\r
112\r
12c155f5
FC
113 ///////////////////////////////////////////////////////////////////////////////\r
114 // FIXME: Duplicated in ManageCustomParsersDialog\r
115 // From the legacy ProjectView\r
116 ///////////////////////////////////////////////////////////////////////////////\r
117\r
118 // ------------------------------------------------------------------------\r
119 // Static methods\r
120 // ------------------------------------------------------------------------\r
121\r
122 static public IFolder getActiveProjectTracesFolder() {\r
123 @SuppressWarnings("deprecation")\r
124 IEclipsePreferences node = new InstanceScope()\r
125 .getNode(TmfUiPlugin.PLUGIN_ID);\r
126 String activeProjectName = node.get(\r
127 TmfUiPreferenceInitializer.ACTIVE_PROJECT_PREFERENCE,\r
128 TmfUiPreferenceInitializer.ACTIVE_PROJECT_DEFAULT);\r
129 IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();\r
130 IProject[] projects = root.getProjects();\r
131 for (IProject project : projects) {\r
132 if (project.isAccessible()\r
133 && project.getName().equals(activeProjectName)) {\r
134 return project.getFolder(TmfTraceFolder.TRACE_FOLDER_NAME);\r
135 }\r
136 }\r
137 return null;\r
138 }\r
139\r
140 static public IFile createLink(URI uri) throws CoreException {\r
141 IFolder folder = getActiveProjectTracesFolder();\r
142 if (folder == null || !folder.exists()) {\r
143 throw new CoreException(new Status(Status.ERROR, TmfUiPlugin.PLUGIN_ID, "No active project set")); //$NON-NLS-1$\r
144 }\r
145 String path = uri.getPath();\r
146 // TODO: support duplicate file names\r
147 IFile file = folder.getFile(path.substring(path\r
148 .lastIndexOf(Path.SEPARATOR)));\r
149 if (!file.exists()) {\r
150 file.createLink(uri, IResource.NONE, null);\r
151 }\r
152 return file;\r
153 }\r
154 ///////////////////////////////////////////////////////////////////////////////\r
155\r
abfad0aa
FC
156 @Override\r
157 public boolean isDirty() {\r
158 return false;\r
159 }\r
160\r
161 @Override\r
162 public boolean isSaveAsAllowed() {\r
163 return false;\r
164 }\r
165\r
166 @Override\r
167 public void setInput(IEditorInput input) {\r
168 super.setInput(input);\r
169 firePropertyChange(IEditorPart.PROP_INPUT);\r
170 }\r
171\r
d4011df2
FC
172 @Override\r
173 public void propertyChanged(Object source, int propId) {\r
abfad0aa
FC
174 if (propId == IEditorPart.PROP_INPUT) {\r
175 broadcast(new TmfTraceClosedSignal(this, fTrace));\r
176 fResource = ((TmfEditorInput) getEditorInput()).getResource();\r
177 fTrace = ((TmfEditorInput) getEditorInput()).getTrace();\r
178 fEventsTable.dispose();\r
179 if (fTrace != null) {\r
180 fEventsTable = createEventsTable(fParent, fTrace.getCacheSize());\r
529ee6a9 181 fEventsTable.setTrace(fTrace, true);\r
e2561baf
FC
182 fEventsTable.refreshBookmarks(fResource);\r
183 broadcast(new TmfTraceOpenedSignal(this, fTrace, fResource, fEventsTable));\r
abfad0aa
FC
184 } else {\r
185 fEventsTable = new TmfEventsTable(fParent, 0);\r
186 }\r
187 fParent.layout();\r
188 }\r
189 }\r
190\r
191 @Override\r
192 public void createPartControl(Composite parent) {\r
193 fParent = parent;\r
194 setPartName(getEditorInput().getName());\r
195 if (fTrace != null) {\r
196 fEventsTable = createEventsTable(parent, fTrace.getCacheSize());\r
529ee6a9 197 fEventsTable.setTrace(fTrace, true);\r
e2561baf
FC
198 fEventsTable.refreshBookmarks(fResource);\r
199 broadcast(new TmfTraceOpenedSignal(this, fTrace, fResource, fEventsTable));\r
abfad0aa
FC
200 } else {\r
201 fEventsTable = new TmfEventsTable(parent, 0);\r
202 }\r
203 addPropertyListener(this);\r
e2561baf 204 ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE);\r
abfad0aa
FC
205 }\r
206\r
207 @Override\r
208 public void dispose() {\r
e2561baf
FC
209 ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);\r
210 removePropertyListener(this);\r
abfad0aa
FC
211 if (fTrace != null) {\r
212 broadcast(new TmfTraceClosedSignal(this, fTrace));\r
213 }\r
214 if (fEventsTable != null) {\r
215 fEventsTable.dispose();\r
216 }\r
217 super.dispose();\r
218 }\r
219\r
220 protected TmfEventsTable createEventsTable(Composite parent, int cacheSize) {\r
12c155f5 221 TmfEventsTable eventsTable = getEventsTable(parent, cacheSize);\r
abfad0aa
FC
222 if (eventsTable == null) {\r
223 eventsTable = new TmfEventsTable(parent, cacheSize);\r
224 }\r
225 return eventsTable;\r
226 }\r
227 \r
12c155f5
FC
228 private TmfEventsTable getEventsTable(Composite parent, int cacheSize) {\r
229 TmfEventsTable eventsTable = null;\r
230 IConfigurationElement[] config = Platform.getExtensionRegistry().getConfigurationElementsFor(TmfCorePlugin.TMF_TRACE_TYPE_ID);\r
231 try {\r
232 String traceType = fResource.getPersistentProperty(TmfTraceElement.TRACETYPE);\r
233 for (IConfigurationElement ce : config) {\r
234 if (ce.getAttribute(TmfTraceElement.ID).equals(traceType)) {\r
235 IConfigurationElement[] eventsTableTypeCE = ce.getChildren(TmfTraceElement.EVENTS_TABLE_TYPE);\r
236 if (eventsTableTypeCE.length != 1) {\r
237 break;\r
238 }\r
239 String eventsTableType = eventsTableTypeCE[0].getAttribute(TmfTraceElement.CLASS);\r
240 if (eventsTableType == null || eventsTableType.length() == 0) {\r
241 break;\r
242 }\r
243 Bundle bundle = Platform.getBundle(ce.getContributor().getName());\r
244 Class<?> c = bundle.loadClass(eventsTableType);\r
245 Class<?>[] constructorArgs = new Class[] { Composite.class, int.class };\r
246 Constructor<?> constructor = c.getConstructor(constructorArgs);\r
247 Object[] args = new Object[] { parent, cacheSize };\r
248 eventsTable = (TmfEventsTable) constructor.newInstance(args);\r
249 break;\r
250 }\r
251 }\r
252 } catch (InvalidRegistryObjectException e) {\r
253 e.printStackTrace();\r
254 } catch (CoreException e) {\r
255 e.printStackTrace();\r
256 } catch (ClassNotFoundException e) {\r
257 e.printStackTrace();\r
258 } catch (SecurityException e) {\r
259 e.printStackTrace();\r
260 } catch (NoSuchMethodException e) {\r
261 e.printStackTrace();\r
262 } catch (IllegalArgumentException e) {\r
263 e.printStackTrace();\r
264 } catch (InstantiationException e) {\r
265 e.printStackTrace();\r
266 } catch (IllegalAccessException e) {\r
267 e.printStackTrace();\r
268 } catch (InvocationTargetException e) {\r
269 e.printStackTrace();\r
270 }\r
271 return eventsTable;\r
272 }\r
273\r
d4011df2 274 @Override\r
12c155f5 275 public ITmfTrace<?> getTrace() {\r
abfad0aa
FC
276 return fTrace;\r
277 }\r
278\r
e2561baf
FC
279 @Override\r
280 public IResource getResource() {\r
281 return fResource;\r
282 }\r
283\r
abfad0aa
FC
284 @Override\r
285 public void setFocus() {\r
286 fEventsTable.setFocus();\r
287 if (fTrace != null) {\r
288 broadcast(new TmfTraceSelectedSignal(this, fTrace));\r
289 }\r
290 }\r
291\r
e2561baf
FC
292 @Override\r
293 @SuppressWarnings("rawtypes")\r
294 public Object getAdapter(Class adapter) {\r
295 if (IGotoMarker.class.equals(adapter)) {\r
296 return fEventsTable;\r
297 }\r
298 return super.getAdapter(adapter);\r
299 }\r
300\r
301 @Override\r
302 public void resourceChanged(IResourceChangeEvent event) {\r
303 for (IMarkerDelta delta : event.findMarkerDeltas(IMarker.BOOKMARK, false)) {\r
304 if (delta.getResource().equals(fResource) && delta.getKind() == IResourceDelta.REMOVED) {\r
305 final IMarker bookmark = delta.getMarker();\r
306 Display.getDefault().asyncExec(new Runnable() {\r
307 @Override\r
308 public void run() {\r
309 fEventsTable.removeBookmark(bookmark);\r
310 }\r
311 });\r
312 }\r
313 }\r
314 }\r
315 \r
316 // ------------------------------------------------------------------------\r
317 // Global commands\r
318 // ------------------------------------------------------------------------\r
319\r
320 public void addBookmark() {\r
321 fEventsTable.addBookmark(fResource);\r
322 }\r
323 \r
324\r
abfad0aa
FC
325 // ------------------------------------------------------------------------\r
326 // Signal handlers\r
327 // ------------------------------------------------------------------------\r
328 \r
329 @TmfSignalHandler\r
330 public void traceParserUpdated(TmfTraceParserUpdatedSignal signal) {\r
331 if (signal.getTraceResource().equals(fResource)) {\r
332 broadcast(new TmfTraceClosedSignal(this, fTrace));\r
333 fTrace = ParserProviderManager.getTrace(fResource);\r
334 fEventsTable.dispose();\r
335 if (fTrace != null) {\r
336 fEventsTable = createEventsTable(fParent, fTrace.getCacheSize());\r
529ee6a9 337 fEventsTable.setTrace(fTrace, true);\r
e2561baf 338 broadcast(new TmfTraceOpenedSignal(this, fTrace, fResource, fEventsTable));\r
abfad0aa
FC
339 } else {\r
340 fEventsTable = new TmfEventsTable(fParent, 0);\r
341 }\r
342 fParent.layout();\r
343 }\r
344 }\r
345\r
346 @TmfSignalHandler\r
347 public void traceSelected(TmfTraceSelectedSignal signal) {\r
348 if (signal.getSource() != this && signal.getTrace().equals(fTrace)) {\r
349 getSite().getPage().bringToTop(this);\r
350 }\r
351 }\r
352\r
353}\r
This page took 0.043467 seconds and 5 git commands to generate.