1 /*******************************************************************************
2 * Copyright (c) 2010, 2013 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 public Object
[] getElements(Object inputElement
) {
51 public Object
getParent(Object element
) {
52 if (element
instanceof IProject
) {
53 IProject project
= (IProject
) element
;
54 return project
.getParent();
57 if (element
instanceof TmfTraceFolder
) {
58 TmfTraceFolder folder
= (TmfTraceFolder
) element
;
59 // Return the corresponding IProject as parent because from CNF point of view the IProject is the parent.
60 // The IProject is needed e.g. for link with Editor to work correctly.
61 return folder
.getParent().getResource();
64 if (element
instanceof TmfTraceElement
) {
65 TmfTraceElement traceElement
= (TmfTraceElement
) element
;
66 return traceElement
.getParent();
69 if (element
instanceof TmfExperimentFolder
) {
70 TmfExperimentFolder folder
= (TmfExperimentFolder
) element
;
71 // Return the corresponding IProject as parent because from CNF point of view the IProject is the parent.
72 // The IProject is needed e.g. for link with Editor to work correctly.
73 return folder
.getParent().getResource();
76 if (element
instanceof TmfExperimentElement
) {
77 TmfExperimentElement expElement
= (TmfExperimentElement
) element
;
78 return expElement
.getParent();
84 public boolean hasChildren(Object element
) {
85 if (element
instanceof IProject
) {
86 IProject project
= (IProject
) element
;
87 return project
.isAccessible();
89 if (element
instanceof TmfTraceFolder
) {
90 TmfTraceFolder folder
= (TmfTraceFolder
) element
;
91 return folder
.hasChildren();
93 if (element
instanceof TmfExperimentFolder
) {
94 TmfExperimentFolder folder
= (TmfExperimentFolder
) element
;
95 return folder
.hasChildren();
97 if (element
instanceof TmfExperimentElement
) {
98 TmfExperimentElement folder
= (TmfExperimentElement
) element
;
99 return folder
.hasChildren();
105 public void dispose() {
109 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
113 public void restoreState(IMemento aMemento
) {
117 public void saveState(IMemento aMemento
) {
121 public void init(ICommonContentExtensionSite aConfig
) {
124 // ------------------------------------------------------------------------
125 // ICommonContentProvider - getChildren()
126 // ------------------------------------------------------------------------
129 public synchronized Object
[] getChildren(Object parentElement
) {
131 // Tracing project level
132 if (parentElement
instanceof IProject
) {
133 return getProjectChildren((IProject
) parentElement
);
136 // Traces "folder" level
137 if (parentElement
instanceof TmfTraceFolder
) {
138 return getTraceFolderChildren((TmfTraceFolder
) parentElement
);
141 // Experiments "folder" level
142 if (parentElement
instanceof TmfExperimentFolder
) {
143 return getExperimentFolderChildren((TmfExperimentFolder
) parentElement
);
147 if (parentElement
instanceof TmfExperimentElement
) {
148 return getExperimentChildren((TmfExperimentElement
) parentElement
);
151 return new Object
[0];
154 // ------------------------------------------------------------------------
156 // ------------------------------------------------------------------------
158 private Object
[] getProjectChildren(IProject project
) {
159 // The children structure
160 List
<Object
> children
= new ArrayList
<Object
>();
162 // Get the children from the model
163 Map
<String
, ITmfProjectModelElement
> childrenMap
= new HashMap
<String
, ITmfProjectModelElement
>();
164 TmfProjectElement tmfProject
= TmfProjectRegistry
.getProject(project
, true);
165 for (ITmfProjectModelElement element
: tmfProject
.getChildren()) {
166 if (element
instanceof TmfTraceFolder
) {
167 TmfTraceFolder child
= (TmfTraceFolder
) element
;
168 childrenMap
.put(child
.getResource().getName(), child
);
170 if (element
instanceof TmfExperimentFolder
) {
171 TmfExperimentFolder child
= (TmfExperimentFolder
) element
;
172 childrenMap
.put(child
.getResource().getName(), child
);
176 // Add the model folder if the corresponding resource exists and is not
178 IFolder folder
= project
.getFolder(TmfTraceFolder
.TRACE_FOLDER_NAME
);
179 if (folder
!= null) {
180 String name
= folder
.getName();
181 ITmfProjectModelElement element
= childrenMap
.get(name
);
182 if (element
== null) {
183 element
= new TmfTraceFolder(TmfTraceFolder
.TRACE_FOLDER_NAME
, folder
, tmfProject
);
185 children
.add(element
);
186 childrenMap
.remove(name
);
187 getTraceFolderChildren((TmfTraceFolder
) element
);
190 // Add the model folder if the corresponding resource exists and is not
192 folder
= project
.getFolder(TmfExperimentFolder
.EXPER_FOLDER_NAME
);
193 if (folder
!= null) {
194 String name
= folder
.getName();
195 ITmfProjectModelElement element
= childrenMap
.get(name
);
196 if (element
== null) {
197 element
= new TmfExperimentFolder(TmfExperimentFolder
.EXPER_FOLDER_NAME
, folder
, tmfProject
);
199 children
.add(element
);
200 childrenMap
.remove(name
);
201 getExperimentFolderChildren((TmfExperimentFolder
) element
);
204 // Remove the leftovers (what was in the model but removed from the
206 cleanupModel(tmfProject
, childrenMap
);
208 return children
.toArray();
211 private Object
[] getTraceFolderChildren(TmfTraceFolder tmfTraceFolder
) {
212 // The children structure
213 List
<Object
> children
= new ArrayList
<Object
>();
215 // Get the children from the model
216 Map
<String
, ITmfProjectModelElement
> childrenMap
= new HashMap
<String
, ITmfProjectModelElement
>();
217 for (ITmfProjectModelElement element
: tmfTraceFolder
.getChildren()) {
218 if (element
instanceof TmfTraceElement
) {
219 String name
= element
.getResource().getName();
220 childrenMap
.put(name
, element
);
224 IFolder folder
= tmfTraceFolder
.getResource();
226 IResource
[] members
= folder
.members();
227 for (IResource resource
: members
) {
228 String name
= resource
.getName();
229 ITmfProjectModelElement trace
= childrenMap
.get(name
);
231 trace
= new TmfTraceElement(name
, resource
, tmfTraceFolder
);
234 childrenMap
.remove(name
);
236 } catch (CoreException e
) {
239 // Remove the leftovers (what was in the model but removed from the
241 cleanupModel(tmfTraceFolder
, childrenMap
);
243 return children
.toArray();
246 private Object
[] getExperimentFolderChildren(TmfExperimentFolder tmfExperimentFolder
) {
247 // The children structure
248 List
<Object
> children
= new ArrayList
<Object
>();
250 // Get the children from the model
251 Map
<String
, ITmfProjectModelElement
> childrenMap
= new HashMap
<String
, ITmfProjectModelElement
>();
252 for (ITmfProjectModelElement element
: tmfExperimentFolder
.getChildren()) {
253 if (element
instanceof TmfExperimentElement
) {
254 String name
= element
.getResource().getName();
255 childrenMap
.put(name
, element
);
259 IFolder folder
= tmfExperimentFolder
.getResource();
261 IResource
[] members
= folder
.members();
262 for (IResource resource
: members
) {
263 if (resource
instanceof IFolder
) {
264 IFolder expFolder
= (IFolder
) resource
;
265 String name
= resource
.getName();
266 ITmfProjectModelElement experiment
= childrenMap
.get(name
);
267 if (experiment
== null) {
268 experiment
= new TmfExperimentElement(name
, expFolder
, tmfExperimentFolder
);
270 children
.add(experiment
);
271 childrenMap
.remove(name
);
272 getExperimentChildren((TmfExperimentElement
) experiment
);
275 } catch (CoreException e
) {
278 // Remove the leftovers (what was in the model but removed from the
280 cleanupModel(tmfExperimentFolder
, childrenMap
);
282 return children
.toArray();
285 private Object
[] getExperimentChildren(TmfExperimentElement tmfExperiment
) {
286 // The children structure
287 List
<Object
> children
= new ArrayList
<Object
>();
289 // Get the children from the model
290 Map
<String
, ITmfProjectModelElement
> childrenMap
= new HashMap
<String
, ITmfProjectModelElement
>();
291 for (ITmfProjectModelElement element
: tmfExperiment
.getChildren()) {
292 if (element
instanceof TmfTraceElement
) {
293 String name
= element
.getResource().getName();
294 childrenMap
.put(name
, element
);
298 IFolder folder
= tmfExperiment
.getResource();
300 IResource
[] members
= folder
.members();
301 for (IResource resource
: members
) {
302 String name
= resource
.getName();
303 ITmfProjectModelElement trace
= childrenMap
.get(name
);
304 if (trace
== null && !resource
.isHidden()) {
305 // exclude hidden resources (e.g. bookmarks file)
306 trace
= new TmfTraceElement(name
, resource
, tmfExperiment
);
309 childrenMap
.remove(name
);
311 } catch (CoreException e
) {
314 // Remove the leftovers (what was in the model but removed from the
316 cleanupModel(tmfExperiment
, childrenMap
);
318 return children
.toArray();
321 private void cleanupModel(ITmfProjectModelElement parent
, Map
<String
, ITmfProjectModelElement
> danglingChildren
) {
322 if (parent
!= null) {
323 for (ITmfProjectModelElement child
: danglingChildren
.values()) {
324 Map
<String
, ITmfProjectModelElement
> grandChildren
= new HashMap
<String
, ITmfProjectModelElement
>();
325 for (ITmfProjectModelElement element
: child
.getChildren()) {
326 String name
= element
.getResource().getName();
327 grandChildren
.put(name
, element
);
329 cleanupModel(child
, grandChildren
);
330 parent
.removeChild(child
);
335 // ------------------------------------------------------------------------
336 // IPipelinedTreeContentProvider
337 // ------------------------------------------------------------------------
340 public void getPipelinedChildren(Object parent
, Set currentChildren
) {
341 customizeTmfElements(getChildren(parent
), currentChildren
);
345 public void getPipelinedElements(Object input
, Set currentElements
) {
346 customizeTmfElements(getElements(input
), currentElements
);
350 * Add/replace the ITmfProjectElement to the list of children
353 * the list returned by getChildren()
355 * the current children
357 private static void customizeTmfElements(Object
[] elements
,
358 Set
<Object
> children
) {
359 if (elements
!= null && children
!= null) {
360 for (Object element
: elements
) {
361 if (element
instanceof ITmfProjectModelElement
) {
362 ITmfProjectModelElement tmfElement
= (ITmfProjectModelElement
) element
;
363 IResource resource
= tmfElement
.getResource();
364 if (resource
!= null) {
365 children
.remove(resource
);
367 children
.add(element
);
369 else if (element
!= null) {
370 children
.add(element
);
377 public Object
getPipelinedParent(Object anObject
, Object aSuggestedParent
) {
378 return aSuggestedParent
;
382 public PipelinedShapeModification
interceptAdd(PipelinedShapeModification anAddModification
) {
383 return anAddModification
;
387 public PipelinedShapeModification
interceptRemove(PipelinedShapeModification aRemoveModification
) {
392 public boolean interceptRefresh(PipelinedViewerUpdate aRefreshSynchronization
) {
397 public boolean interceptUpdate(PipelinedViewerUpdate anUpdateSynchronization
) {