1 /*******************************************************************************
2 * Copyright (c) 2011, 2014 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 * Patrick Tasse - Add support for folder elements
12 *******************************************************************************/
14 package org
.eclipse
.tracecompass
.tmf
.ui
.project
.model
;
16 import java
.util
.ArrayList
;
17 import java
.util
.Arrays
;
18 import java
.util
.HashMap
;
19 import java
.util
.List
;
22 import org
.eclipse
.core
.resources
.IFolder
;
23 import org
.eclipse
.core
.resources
.IResource
;
24 import org
.eclipse
.core
.runtime
.CoreException
;
25 import org
.eclipse
.jdt
.annotation
.NonNull
;
26 import org
.eclipse
.swt
.graphics
.Image
;
27 import org
.eclipse
.tracecompass
.tmf
.core
.project
.model
.TmfTraceType
;
28 import org
.eclipse
.tracecompass
.tmf
.ui
.properties
.ReadOnlyTextPropertyDescriptor
;
29 import org
.eclipse
.ui
.views
.properties
.IPropertyDescriptor
;
30 import org
.eclipse
.ui
.views
.properties
.IPropertySource2
;
33 * Implementation of trace folder model element representing a trace folder in
37 * @author Francois Chouinard
39 public class TmfTraceFolder
extends TmfProjectModelElement
implements IPropertySource2
{
41 // ------------------------------------------------------------------------
43 // ------------------------------------------------------------------------
45 private static final String INFO_CATEGORY
= "Info"; //$NON-NLS-1$
46 private static final String NAME
= "name"; //$NON-NLS-1$
47 private static final String PATH
= "path"; //$NON-NLS-1$
48 private static final String LOCATION
= "location"; //$NON-NLS-1$
50 private static final ReadOnlyTextPropertyDescriptor NAME_DESCRIPTOR
= new ReadOnlyTextPropertyDescriptor(NAME
, NAME
);
51 private static final ReadOnlyTextPropertyDescriptor PATH_DESCRIPTOR
= new ReadOnlyTextPropertyDescriptor(PATH
, PATH
);
52 private static final ReadOnlyTextPropertyDescriptor LOCATION_DESCRIPTOR
= new ReadOnlyTextPropertyDescriptor(LOCATION
, LOCATION
);
54 private static final IPropertyDescriptor
[] DESCRIPTORS
= { NAME_DESCRIPTOR
, PATH_DESCRIPTOR
, LOCATION_DESCRIPTOR
};
57 NAME_DESCRIPTOR
.setCategory(INFO_CATEGORY
);
58 PATH_DESCRIPTOR
.setCategory(INFO_CATEGORY
);
59 LOCATION_DESCRIPTOR
.setCategory(INFO_CATEGORY
);
62 // ------------------------------------------------------------------------
64 // ------------------------------------------------------------------------
67 * Constructor. Creates folder model element under the project.
70 * The name of trace folder.
72 * The folder resource.
74 * The parent element (project).
76 public TmfTraceFolder(String name
, IFolder resource
, TmfProjectElement parent
) {
77 super(name
, resource
, parent
);
81 * Constructor. Creates folder model element under another folder.
84 * The name of trace folder.
86 * The folder resource.
88 * The parent element (folder).
90 public TmfTraceFolder(String name
, IFolder resource
, TmfTraceFolder parent
) {
91 super(name
, resource
, parent
);
94 // ------------------------------------------------------------------------
95 // TmfProjectModelElement
96 // ------------------------------------------------------------------------
99 public IFolder
getResource() {
100 return (IFolder
) super.getResource();
107 protected void refreshChildren() {
108 IFolder folder
= getResource();
110 // Get the children from the model
111 Map
<String
, ITmfProjectModelElement
> childrenMap
= new HashMap
<>();
112 for (ITmfProjectModelElement element
: getChildren()) {
113 childrenMap
.put(element
.getResource().getName(), element
);
117 IResource
[] members
= folder
.members();
118 for (IResource resource
: members
) {
119 String name
= resource
.getName();
120 boolean isFolder
= resource
instanceof IFolder
&&
121 (TmfTraceType
.getTraceTypeId(resource
) == null);
122 ITmfProjectModelElement element
= childrenMap
.get(name
);
123 if (isFolder
&& !(element
instanceof TmfTraceFolder
) && !(element
instanceof TmfTraceElement
)) {
124 if (TmfTraceType
.isDirectoryTrace(resource
.getLocationURI().getPath())) {
125 element
= new TmfTraceElement(name
, resource
, this);
127 element
= new TmfTraceFolder(name
, (IFolder
) resource
, this);
130 } else if (!isFolder
&& !(element
instanceof TmfTraceElement
)) {
131 element
= new TmfTraceElement(name
, resource
, this);
134 childrenMap
.remove(name
);
136 if (element
!= null) {
137 ((TmfProjectModelElement
) element
).refreshChildren();
140 } catch (CoreException e
) {
143 // Cleanup dangling children from the model
144 for (ITmfProjectModelElement danglingChild
: childrenMap
.values()) {
145 removeChild(danglingChild
);
153 public Image
getIcon() {
154 return TmfProjectModelIcons
.FOLDER_ICON
;
161 public String
getLabelText() {
162 int nbTraces
= getTraces().size();
164 return (getName() + " [" + nbTraces
+ ']'); //$NON-NLS-1$
169 // ------------------------------------------------------------------------
171 // ------------------------------------------------------------------------
174 * Returns a list of trace elements under the folder element, recursively.
175 * @return list of trace model elements
177 public List
<TmfTraceElement
> getTraces() {
178 List
<ITmfProjectModelElement
> children
= getChildren();
179 List
<TmfTraceElement
> traces
= new ArrayList
<>();
180 for (ITmfProjectModelElement child
: children
) {
181 if (child
instanceof TmfTraceElement
) {
182 traces
.add((TmfTraceElement
) child
);
183 } else if (child
instanceof TmfTraceFolder
) {
184 traces
.addAll(((TmfTraceFolder
) child
).getTraces());
191 * Gets the traces elements under this folder containing the given resources
194 * resources to search for
195 * @return list of trace elements
198 public @NonNull List
<TmfTraceElement
> getTraceElements(@NonNull List
<IResource
> resources
) {
199 List
<TmfTraceElement
> traceElements
= new ArrayList
<>();
200 List
<TmfTraceElement
> children
= getTraces();
201 for (IResource resource
: resources
) {
202 TmfTraceElement el
= children
.stream()
203 .filter(traceElement
->
204 ((traceElement
!= null) &&
205 traceElement
.getResource().equals(resource
)))
210 traceElements
.add(el
);
213 return traceElements
;
216 // ------------------------------------------------------------------------
218 // ------------------------------------------------------------------------
221 public Object
getEditableValue() {
226 public IPropertyDescriptor
[] getPropertyDescriptors() {
227 return Arrays
.copyOf(DESCRIPTORS
, DESCRIPTORS
.length
);
231 public Object
getPropertyValue(Object id
) {
233 if (NAME
.equals(id
)) {
237 if (PATH
.equals(id
)) {
238 return getPath().toString();
241 if (LOCATION
.equals(id
)) {
242 return getLocation().toString();
249 public void resetPropertyValue(Object id
) {
253 public void setPropertyValue(Object id
, Object value
) {
257 public boolean isPropertyResettable(Object id
) {
262 public boolean isPropertySet(Object id
) {