1 /*******************************************************************************
2 * Copyright (c) 2010, 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 * Francois Chouinard - Initial API and implementation
11 * Bernd Hufmann - Implement getParent()
12 *******************************************************************************/
14 package org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
;
16 import java
.util
.ArrayList
;
17 import java
.util
.HashMap
;
18 import java
.util
.List
;
22 import org
.eclipse
.core
.resources
.IFolder
;
23 import org
.eclipse
.core
.resources
.IProject
;
24 import org
.eclipse
.core
.resources
.IResource
;
25 import org
.eclipse
.core
.runtime
.CoreException
;
26 import org
.eclipse
.jface
.viewers
.Viewer
;
27 import org
.eclipse
.ui
.IMemento
;
28 import org
.eclipse
.ui
.navigator
.ICommonContentExtensionSite
;
29 import org
.eclipse
.ui
.navigator
.IPipelinedTreeContentProvider
;
30 import org
.eclipse
.ui
.navigator
.PipelinedShapeModification
;
31 import org
.eclipse
.ui
.navigator
.PipelinedViewerUpdate
;
34 * The TMF project content provider for the tree viewer in the project explorer view.
37 * @author Francois Chouinard
39 public class TmfNavigatorContentProvider
implements IPipelinedTreeContentProvider
{
41 // ------------------------------------------------------------------------
42 // ICommonContentProvider
43 // ------------------------------------------------------------------------
46 * @see org.eclipse.jface.viewers.ITreeContentProvider#getElements(java.lang.Object)
49 public Object
[] getElements(Object inputElement
) {
55 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
58 public Object
getParent(Object element
) {
59 if (element
instanceof IProject
) {
60 IProject project
= (IProject
) element
;
61 return project
.getParent();
64 if (element
instanceof TmfTraceFolder
) {
65 TmfTraceFolder folder
= (TmfTraceFolder
) element
;
66 // Return the corresponding IProject as parent because from CNF point of view the IProject is the parent.
67 // The IProject is needed e.g. for link with Editor to work correctly.
68 return folder
.getParent().getResource();
71 if (element
instanceof TmfTraceElement
) {
72 TmfTraceElement traceElement
= (TmfTraceElement
) element
;
73 return traceElement
.getParent();
76 if (element
instanceof TmfExperimentFolder
) {
77 TmfExperimentFolder folder
= (TmfExperimentFolder
) element
;
78 // Return the corresponding IProject as parent because from CNF point of view the IProject is the parent.
79 // The IProject is needed e.g. for link with Editor to work correctly.
80 return folder
.getParent().getResource();
83 if (element
instanceof TmfExperimentElement
) {
84 TmfExperimentElement expElement
= (TmfExperimentElement
) element
;
85 return expElement
.getParent();
92 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
95 public boolean hasChildren(Object element
) {
96 if (element
instanceof IProject
) {
97 IProject project
= (IProject
) element
;
98 return project
.isAccessible();
100 if (element
instanceof TmfTraceFolder
) {
101 TmfTraceFolder folder
= (TmfTraceFolder
) element
;
102 return folder
.hasChildren();
104 if (element
instanceof TmfExperimentFolder
) {
105 TmfExperimentFolder folder
= (TmfExperimentFolder
) element
;
106 return folder
.hasChildren();
108 if (element
instanceof TmfExperimentElement
) {
109 TmfExperimentElement folder
= (TmfExperimentElement
) element
;
110 return folder
.hasChildren();
117 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
120 public void dispose() {
125 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
128 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
133 * @see org.eclipse.ui.navigator.IMementoAware#restoreState(org.eclipse.ui.IMemento)
136 public void restoreState(IMemento aMemento
) {
141 * @see org.eclipse.ui.navigator.IMementoAware#saveState(org.eclipse.ui.IMemento)
144 public void saveState(IMemento aMemento
) {
149 * @see org.eclipse.ui.navigator.ICommonContentProvider#init(org.eclipse.ui.navigator.ICommonContentExtensionSite)
152 public void init(ICommonContentExtensionSite aConfig
) {
155 // ------------------------------------------------------------------------
156 // ICommonContentProvider - getChildren()
157 // ------------------------------------------------------------------------
160 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
163 public synchronized Object
[] getChildren(Object parentElement
) {
165 // Tracing project level
166 if (parentElement
instanceof IProject
) {
167 return getProjectChildren((IProject
) parentElement
);
170 // Traces "folder" level
171 if (parentElement
instanceof TmfTraceFolder
) {
172 return getTraceFolderChildren((TmfTraceFolder
) parentElement
);
175 // Experiments "folder" level
176 if (parentElement
instanceof TmfExperimentFolder
) {
177 return getExperimentFolderChildren((TmfExperimentFolder
) parentElement
);
181 if (parentElement
instanceof TmfExperimentElement
) {
182 return getExperimentChildren((TmfExperimentElement
) parentElement
);
185 return new Object
[0];
188 // ------------------------------------------------------------------------
190 // ------------------------------------------------------------------------
191 private Object
[] getProjectChildren(IProject project
) {
192 // The children structure
193 List
<Object
> children
= new ArrayList
<Object
>();
195 // Get the children from the model
196 Map
<String
, ITmfProjectModelElement
> childrenMap
= new HashMap
<String
, ITmfProjectModelElement
>();
197 TmfProjectElement tmfProject
= TmfProjectRegistry
.getProject(project
, true);
198 for (ITmfProjectModelElement element
: tmfProject
.getChildren()) {
199 if (element
instanceof TmfTraceFolder
) {
200 TmfTraceFolder child
= (TmfTraceFolder
) element
;
201 childrenMap
.put(child
.getResource().getName(), child
);
203 if (element
instanceof TmfExperimentFolder
) {
204 TmfExperimentFolder child
= (TmfExperimentFolder
) element
;
205 childrenMap
.put(child
.getResource().getName(), child
);
209 // Add the model folder if the corresponding resource exists and is not
211 IFolder folder
= project
.getFolder(TmfTraceFolder
.TRACE_FOLDER_NAME
);
212 if (folder
!= null) {
213 String name
= folder
.getName();
214 ITmfProjectModelElement element
= childrenMap
.get(name
);
215 if (element
== null) {
216 element
= new TmfTraceFolder(TmfTraceFolder
.TRACE_FOLDER_NAME
, folder
, tmfProject
);
218 children
.add(element
);
219 childrenMap
.remove(name
);
220 getTraceFolderChildren((TmfTraceFolder
) element
);
223 // Add the model folder if the corresponding resource exists and is not
225 folder
= project
.getFolder(TmfExperimentFolder
.EXPER_FOLDER_NAME
);
226 if (folder
!= null) {
227 String name
= folder
.getName();
228 ITmfProjectModelElement element
= childrenMap
.get(name
);
229 if (element
== null) {
230 element
= new TmfExperimentFolder(TmfExperimentFolder
.EXPER_FOLDER_NAME
, folder
, tmfProject
);
232 children
.add(element
);
233 childrenMap
.remove(name
);
234 getExperimentFolderChildren((TmfExperimentFolder
) element
);
237 // Remove the leftovers (what was in the model but removed from the
239 cleanupModel(tmfProject
, childrenMap
);
241 return children
.toArray();
244 private Object
[] getTraceFolderChildren(TmfTraceFolder tmfTraceFolder
) {
245 // The children structure
246 List
<Object
> children
= new ArrayList
<Object
>();
248 // Get the children from the model
249 Map
<String
, ITmfProjectModelElement
> childrenMap
= new HashMap
<String
, ITmfProjectModelElement
>();
250 for (ITmfProjectModelElement element
: tmfTraceFolder
.getChildren()) {
251 if (element
instanceof TmfTraceElement
) {
252 String name
= element
.getResource().getName();
253 childrenMap
.put(name
, element
);
257 IFolder folder
= tmfTraceFolder
.getResource();
259 IResource
[] members
= folder
.members();
260 for (IResource resource
: members
) {
261 String name
= resource
.getName();
262 ITmfProjectModelElement trace
= childrenMap
.get(name
);
264 trace
= new TmfTraceElement(name
, resource
, tmfTraceFolder
);
267 childrenMap
.remove(name
);
269 } catch (CoreException e
) {
272 // Remove the leftovers (what was in the model but removed from the
274 cleanupModel(tmfTraceFolder
, childrenMap
);
276 return children
.toArray();
279 private Object
[] getExperimentFolderChildren(TmfExperimentFolder tmfExperimentFolder
) {
280 // The children structure
281 List
<Object
> children
= new ArrayList
<Object
>();
283 // Get the children from the model
284 Map
<String
, ITmfProjectModelElement
> childrenMap
= new HashMap
<String
, ITmfProjectModelElement
>();
285 for (ITmfProjectModelElement element
: tmfExperimentFolder
.getChildren()) {
286 if (element
instanceof TmfExperimentElement
) {
287 String name
= element
.getResource().getName();
288 childrenMap
.put(name
, element
);
292 IFolder folder
= tmfExperimentFolder
.getResource();
294 IResource
[] members
= folder
.members();
295 for (IResource resource
: members
) {
296 if (resource
instanceof IFolder
) {
297 IFolder expFolder
= (IFolder
) resource
;
298 String name
= resource
.getName();
299 ITmfProjectModelElement experiment
= childrenMap
.get(name
);
300 if (experiment
== null) {
301 experiment
= new TmfExperimentElement(name
, expFolder
, tmfExperimentFolder
);
303 children
.add(experiment
);
304 childrenMap
.remove(name
);
305 getExperimentChildren((TmfExperimentElement
) experiment
);
308 } catch (CoreException e
) {
311 // Remove the leftovers (what was in the model but removed from the
313 cleanupModel(tmfExperimentFolder
, childrenMap
);
315 return children
.toArray();
318 private Object
[] getExperimentChildren(TmfExperimentElement tmfExperiment
) {
319 // The children structure
320 List
<Object
> children
= new ArrayList
<Object
>();
322 // Get the children from the model
323 Map
<String
, ITmfProjectModelElement
> childrenMap
= new HashMap
<String
, ITmfProjectModelElement
>();
324 for (ITmfProjectModelElement element
: tmfExperiment
.getChildren()) {
325 if (element
instanceof TmfTraceElement
) {
326 String name
= element
.getResource().getName();
327 childrenMap
.put(name
, element
);
331 IFolder folder
= tmfExperiment
.getResource();
333 IResource
[] members
= folder
.members();
334 for (IResource resource
: members
) {
335 String name
= resource
.getName();
336 ITmfProjectModelElement trace
= childrenMap
.get(name
);
337 if (trace
== null && !resource
.isHidden()) {
338 // exclude hidden resources (e.g. bookmarks file)
339 trace
= new TmfTraceElement(name
, resource
, tmfExperiment
);
342 childrenMap
.remove(name
);
344 } catch (CoreException e
) {
347 // Remove the leftovers (what was in the model but removed from the
349 cleanupModel(tmfExperiment
, childrenMap
);
351 return children
.toArray();
354 private void cleanupModel(ITmfProjectModelElement parent
, Map
<String
, ITmfProjectModelElement
> danglingChildren
) {
355 if (parent
!= null) {
356 for (ITmfProjectModelElement child
: danglingChildren
.values()) {
357 Map
<String
, ITmfProjectModelElement
> grandChildren
= new HashMap
<String
, ITmfProjectModelElement
>();
358 for (ITmfProjectModelElement element
: child
.getChildren()) {
359 String name
= element
.getResource().getName();
360 grandChildren
.put(name
, element
);
362 cleanupModel(child
, grandChildren
);
363 parent
.removeChild(child
);
368 // ------------------------------------------------------------------------
369 // IPipelinedTreeContentProvider
370 // ------------------------------------------------------------------------
374 * @see org.eclipse.ui.navigator.IPipelinedTreeContentProvider#getPipelinedChildren(java.lang.Object, java.util.Set)
377 public void getPipelinedChildren(Object parent
, Set currentChildren
) {
378 customizeTmfElements(getChildren(parent
), currentChildren
);
383 * @see org.eclipse.ui.navigator.IPipelinedTreeContentProvider#getPipelinedElements(java.lang.Object, java.util.Set)
386 public void getPipelinedElements(Object input
, Set currentElements
) {
387 customizeTmfElements(getElements(input
), currentElements
);
391 * Add/replace the ITmfProjectElement to the list of children
394 * the list returned by getChildren()
396 * the current children
398 private static void customizeTmfElements(Object
[] elements
,
399 Set
<Object
> children
) {
400 if (elements
!= null && children
!= null) {
401 for (Object element
: elements
) {
402 if (element
instanceof ITmfProjectModelElement
) {
403 ITmfProjectModelElement tmfElement
= (ITmfProjectModelElement
) element
;
404 IResource resource
= tmfElement
.getResource();
405 if (resource
!= null) {
406 children
.remove(resource
);
408 children
.add(element
);
410 else if (element
!= null) {
411 children
.add(element
);
419 * @see org.eclipse.ui.navigator.IPipelinedTreeContentProvider#getPipelinedParent(java.lang.Object, java.lang.Object)
422 public Object
getPipelinedParent(Object anObject
, Object aSuggestedParent
) {
423 return aSuggestedParent
;
428 * @see org.eclipse.ui.navigator.IPipelinedTreeContentProvider#interceptAdd(org.eclipse.ui.navigator.PipelinedShapeModification)
431 public PipelinedShapeModification
interceptAdd(PipelinedShapeModification anAddModification
) {
432 return anAddModification
;
437 * @see org.eclipse.ui.navigator.IPipelinedTreeContentProvider#interceptRemove(org.eclipse.ui.navigator.PipelinedShapeModification)
440 public PipelinedShapeModification
interceptRemove(PipelinedShapeModification aRemoveModification
) {
446 * @see org.eclipse.ui.navigator.IPipelinedTreeContentProvider#interceptRefresh(org.eclipse.ui.navigator.PipelinedViewerUpdate)
449 public boolean interceptRefresh(PipelinedViewerUpdate aRefreshSynchronization
) {
455 * @see org.eclipse.ui.navigator.IPipelinedTreeContentProvider#interceptUpdate(org.eclipse.ui.navigator.PipelinedViewerUpdate)
458 public boolean interceptUpdate(PipelinedViewerUpdate anUpdateSynchronization
) {