Commit | Line | Data |
---|---|---|
12c155f5 | 1 | /******************************************************************************* |
60ae41e1 | 2 | * Copyright (c) 2011, 2014 Ericsson |
013a5f1c | 3 | * |
12c155f5 FC |
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 | |
013a5f1c | 8 | * |
12c155f5 FC |
9 | * Contributors: |
10 | * Francois Chouinard - Initial API and implementation | |
339d539c | 11 | * Patrick Tasse - Add support for folder elements |
12c155f5 FC |
12 | *******************************************************************************/ |
13 | ||
2bdf0193 | 14 | package org.eclipse.tracecompass.tmf.ui.project.model; |
12c155f5 FC |
15 | |
16 | import java.util.ArrayList; | |
5a5c2fc7 | 17 | import java.util.Arrays; |
f537c959 | 18 | import java.util.HashMap; |
12c155f5 | 19 | import java.util.List; |
f537c959 | 20 | import java.util.Map; |
12c155f5 FC |
21 | |
22 | import org.eclipse.core.resources.IFolder; | |
f537c959 PT |
23 | import org.eclipse.core.resources.IResource; |
24 | import org.eclipse.core.runtime.CoreException; | |
45fc1883 | 25 | import org.eclipse.jdt.annotation.NonNull; |
dff70ccd | 26 | import org.eclipse.swt.graphics.Image; |
2bdf0193 AM |
27 | import org.eclipse.tracecompass.tmf.core.project.model.TmfTraceType; |
28 | import org.eclipse.tracecompass.tmf.ui.properties.ReadOnlyTextPropertyDescriptor; | |
12c155f5 FC |
29 | import org.eclipse.ui.views.properties.IPropertyDescriptor; |
30 | import org.eclipse.ui.views.properties.IPropertySource2; | |
12c155f5 FC |
31 | |
32 | /** | |
339d539c PT |
33 | * Implementation of trace folder model element representing a trace folder in |
34 | * the project. | |
12c155f5 | 35 | * <p> |
b544077e BH |
36 | * @version 1.0 |
37 | * @author Francois Chouinard | |
12c155f5 FC |
38 | */ |
39 | public class TmfTraceFolder extends TmfProjectModelElement implements IPropertySource2 { | |
40 | ||
41 | // ------------------------------------------------------------------------ | |
42 | // Constants | |
43 | // ------------------------------------------------------------------------ | |
12c155f5 | 44 | |
067cd9de BH |
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$ | |
12c155f5 | 49 | |
067cd9de BH |
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); | |
12c155f5 | 53 | |
b3e4798c | 54 | private static final IPropertyDescriptor[] DESCRIPTORS = { NAME_DESCRIPTOR, PATH_DESCRIPTOR, LOCATION_DESCRIPTOR }; |
12c155f5 FC |
55 | |
56 | static { | |
067cd9de BH |
57 | NAME_DESCRIPTOR.setCategory(INFO_CATEGORY); |
58 | PATH_DESCRIPTOR.setCategory(INFO_CATEGORY); | |
59 | LOCATION_DESCRIPTOR.setCategory(INFO_CATEGORY); | |
12c155f5 FC |
60 | } |
61 | ||
62 | // ------------------------------------------------------------------------ | |
63 | // Constructor | |
64 | // ------------------------------------------------------------------------ | |
339d539c | 65 | |
b544077e | 66 | /** |
b3e4798c AM |
67 | * Constructor. Creates folder model element under the project. |
68 | * | |
69 | * @param name | |
70 | * The name of trace folder. | |
71 | * @param resource | |
72 | * The folder resource. | |
73 | * @param parent | |
74 | * The parent element (project). | |
b544077e | 75 | */ |
12c155f5 FC |
76 | public TmfTraceFolder(String name, IFolder resource, TmfProjectElement parent) { |
77 | super(name, resource, parent); | |
12c155f5 FC |
78 | } |
79 | ||
339d539c | 80 | /** |
b3e4798c AM |
81 | * Constructor. Creates folder model element under another folder. |
82 | * | |
83 | * @param name | |
84 | * The name of trace folder. | |
85 | * @param resource | |
86 | * The folder resource. | |
87 | * @param parent | |
88 | * The parent element (folder). | |
339d539c PT |
89 | */ |
90 | public TmfTraceFolder(String name, IFolder resource, TmfTraceFolder parent) { | |
91 | super(name, resource, parent); | |
339d539c PT |
92 | } |
93 | ||
12c155f5 FC |
94 | // ------------------------------------------------------------------------ |
95 | // TmfProjectModelElement | |
96 | // ------------------------------------------------------------------------ | |
013a5f1c | 97 | |
12c155f5 FC |
98 | @Override |
99 | public IFolder getResource() { | |
b3e4798c | 100 | return (IFolder) super.getResource(); |
12c155f5 FC |
101 | } |
102 | ||
b3e4798c AM |
103 | /** |
104 | * @since 2.0 | |
105 | */ | |
12c155f5 | 106 | @Override |
b3e4798c | 107 | protected void refreshChildren() { |
f537c959 PT |
108 | IFolder folder = getResource(); |
109 | ||
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); | |
114 | } | |
115 | ||
116 | try { | |
117 | IResource[] members = folder.members(); | |
118 | for (IResource resource : members) { | |
119 | String name = resource.getName(); | |
339d539c | 120 | boolean isFolder = resource instanceof IFolder && |
4b3b667b | 121 | (TmfTraceType.getTraceTypeId(resource) == null); |
f537c959 | 122 | ITmfProjectModelElement element = childrenMap.get(name); |
339d539c | 123 | if (isFolder && !(element instanceof TmfTraceFolder) && !(element instanceof TmfTraceElement)) { |
a4a116c3 | 124 | if (TmfTraceType.isDirectoryTrace(resource.getLocationURI().getPath())) { |
339d539c PT |
125 | element = new TmfTraceElement(name, resource, this); |
126 | } else { | |
127 | element = new TmfTraceFolder(name, (IFolder) resource, this); | |
128 | } | |
b3e4798c | 129 | addChild(element); |
339d539c | 130 | } else if (!isFolder && !(element instanceof TmfTraceElement)) { |
f537c959 | 131 | element = new TmfTraceElement(name, resource, this); |
b3e4798c | 132 | addChild(element); |
339d539c PT |
133 | } else { |
134 | childrenMap.remove(name); | |
f537c959 | 135 | } |
202956f1 AM |
136 | if (element != null) { |
137 | ((TmfProjectModelElement) element).refreshChildren(); | |
138 | } | |
f537c959 PT |
139 | } |
140 | } catch (CoreException e) { | |
141 | } | |
142 | ||
143 | // Cleanup dangling children from the model | |
144 | for (ITmfProjectModelElement danglingChild : childrenMap.values()) { | |
145 | removeChild(danglingChild); | |
146 | } | |
12c155f5 FC |
147 | } |
148 | ||
dff70ccd AM |
149 | /** |
150 | * @since 2.0 | |
151 | */ | |
152 | @Override | |
153 | public Image getIcon() { | |
154 | return TmfProjectModelIcons.FOLDER_ICON; | |
155 | } | |
156 | ||
157 | /** | |
158 | * @since 2.0 | |
159 | */ | |
160 | @Override | |
161 | public String getLabelText() { | |
162 | int nbTraces = getTraces().size(); | |
163 | if (nbTraces > 0) { | |
164 | return (getName() + " [" + nbTraces + ']'); //$NON-NLS-1$ | |
165 | } | |
166 | return getName(); | |
167 | } | |
168 | ||
12c155f5 FC |
169 | // ------------------------------------------------------------------------ |
170 | // Operations | |
171 | // ------------------------------------------------------------------------ | |
11252342 | 172 | |
b544077e | 173 | /** |
339d539c | 174 | * Returns a list of trace elements under the folder element, recursively. |
b544077e BH |
175 | * @return list of trace model elements |
176 | */ | |
12c155f5 FC |
177 | public List<TmfTraceElement> getTraces() { |
178 | List<ITmfProjectModelElement> children = getChildren(); | |
507b1336 | 179 | List<TmfTraceElement> traces = new ArrayList<>(); |
12c155f5 FC |
180 | for (ITmfProjectModelElement child : children) { |
181 | if (child instanceof TmfTraceElement) { | |
182 | traces.add((TmfTraceElement) child); | |
339d539c PT |
183 | } else if (child instanceof TmfTraceFolder) { |
184 | traces.addAll(((TmfTraceFolder) child).getTraces()); | |
12c155f5 FC |
185 | } |
186 | } | |
187 | return traces; | |
188 | } | |
189 | ||
45fc1883 BH |
190 | /** |
191 | * Gets the traces elements under this folder containing the given resources | |
192 | * | |
193 | * @param resources | |
194 | * resources to search for | |
195 | * @return list of trace elements | |
196 | * @since 2.0 | |
197 | */ | |
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))) | |
206 | .findFirst() | |
207 | .orElse(null); | |
208 | ||
209 | if (el != null) { | |
210 | traceElements.add(el); | |
211 | } | |
212 | } | |
213 | return traceElements; | |
214 | } | |
215 | ||
12c155f5 FC |
216 | // ------------------------------------------------------------------------ |
217 | // IPropertySource2 | |
218 | // ------------------------------------------------------------------------ | |
219 | ||
220 | @Override | |
221 | public Object getEditableValue() { | |
222 | return null; | |
223 | } | |
224 | ||
225 | @Override | |
226 | public IPropertyDescriptor[] getPropertyDescriptors() { | |
067cd9de | 227 | return Arrays.copyOf(DESCRIPTORS, DESCRIPTORS.length); |
12c155f5 FC |
228 | } |
229 | ||
230 | @Override | |
231 | public Object getPropertyValue(Object id) { | |
232 | ||
067cd9de | 233 | if (NAME.equals(id)) { |
12c155f5 | 234 | return getName(); |
013a5f1c | 235 | } |
12c155f5 | 236 | |
067cd9de | 237 | if (PATH.equals(id)) { |
12c155f5 | 238 | return getPath().toString(); |
013a5f1c | 239 | } |
12c155f5 | 240 | |
067cd9de | 241 | if (LOCATION.equals(id)) { |
12c155f5 | 242 | return getLocation().toString(); |
013a5f1c | 243 | } |
12c155f5 FC |
244 | |
245 | return null; | |
246 | } | |
247 | ||
248 | @Override | |
249 | public void resetPropertyValue(Object id) { | |
250 | } | |
251 | ||
252 | @Override | |
253 | public void setPropertyValue(Object id, Object value) { | |
254 | } | |
255 | ||
256 | @Override | |
257 | public boolean isPropertyResettable(Object id) { | |
258 | return false; | |
259 | } | |
260 | ||
261 | @Override | |
262 | public boolean isPropertySet(Object id) { | |
263 | return false; | |
264 | } | |
265 | ||
266 | } |