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; |
2bdf0193 AM |
26 | import org.eclipse.tracecompass.tmf.core.project.model.TmfTraceType; |
27 | import org.eclipse.tracecompass.tmf.ui.properties.ReadOnlyTextPropertyDescriptor; | |
12c155f5 FC |
28 | import org.eclipse.ui.views.properties.IPropertyDescriptor; |
29 | import org.eclipse.ui.views.properties.IPropertySource2; | |
12c155f5 FC |
30 | |
31 | /** | |
339d539c PT |
32 | * Implementation of trace folder model element representing a trace folder in |
33 | * the project. | |
12c155f5 | 34 | * <p> |
b544077e BH |
35 | * @version 1.0 |
36 | * @author Francois Chouinard | |
12c155f5 FC |
37 | */ |
38 | public class TmfTraceFolder extends TmfProjectModelElement implements IPropertySource2 { | |
39 | ||
40 | // ------------------------------------------------------------------------ | |
41 | // Constants | |
42 | // ------------------------------------------------------------------------ | |
12c155f5 | 43 | |
067cd9de BH |
44 | private static final String INFO_CATEGORY = "Info"; //$NON-NLS-1$ |
45 | private static final String NAME = "name"; //$NON-NLS-1$ | |
46 | private static final String PATH = "path"; //$NON-NLS-1$ | |
47 | private static final String LOCATION = "location"; //$NON-NLS-1$ | |
12c155f5 | 48 | |
067cd9de BH |
49 | private static final ReadOnlyTextPropertyDescriptor NAME_DESCRIPTOR = new ReadOnlyTextPropertyDescriptor(NAME, NAME); |
50 | private static final ReadOnlyTextPropertyDescriptor PATH_DESCRIPTOR = new ReadOnlyTextPropertyDescriptor(PATH, PATH); | |
51 | private static final ReadOnlyTextPropertyDescriptor LOCATION_DESCRIPTOR = new ReadOnlyTextPropertyDescriptor(LOCATION, LOCATION); | |
12c155f5 | 52 | |
067cd9de BH |
53 | private static final IPropertyDescriptor[] DESCRIPTORS = { NAME_DESCRIPTOR, PATH_DESCRIPTOR, |
54 | 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 | /** |
013a5f1c | 67 | * Constructor. |
339d539c | 68 | * Creates folder model element under the project. |
b544077e | 69 | * @param name The name of trace folder. |
013a5f1c | 70 | * @param resource The folder resource. |
b544077e BH |
71 | * @param parent The parent element (project). |
72 | */ | |
12c155f5 FC |
73 | public TmfTraceFolder(String name, IFolder resource, TmfProjectElement parent) { |
74 | super(name, resource, parent); | |
75 | parent.addChild(this); | |
76 | } | |
77 | ||
339d539c PT |
78 | /** |
79 | * Constructor. | |
80 | * Creates folder model element under another folder. | |
81 | * @param name The name of trace folder. | |
82 | * @param resource The folder resource. | |
83 | * @param parent The parent element (folder). | |
339d539c PT |
84 | */ |
85 | public TmfTraceFolder(String name, IFolder resource, TmfTraceFolder parent) { | |
86 | super(name, resource, parent); | |
87 | parent.addChild(this); | |
88 | } | |
89 | ||
12c155f5 FC |
90 | // ------------------------------------------------------------------------ |
91 | // TmfProjectModelElement | |
92 | // ------------------------------------------------------------------------ | |
013a5f1c | 93 | |
12c155f5 FC |
94 | @Override |
95 | public IFolder getResource() { | |
96 | return (IFolder) fResource; | |
97 | } | |
98 | ||
12c155f5 | 99 | @Override |
f537c959 PT |
100 | void refreshChildren() { |
101 | IFolder folder = getResource(); | |
102 | ||
103 | // Get the children from the model | |
104 | Map<String, ITmfProjectModelElement> childrenMap = new HashMap<>(); | |
105 | for (ITmfProjectModelElement element : getChildren()) { | |
106 | childrenMap.put(element.getResource().getName(), element); | |
107 | } | |
108 | ||
109 | try { | |
110 | IResource[] members = folder.members(); | |
111 | for (IResource resource : members) { | |
112 | String name = resource.getName(); | |
339d539c | 113 | boolean isFolder = resource instanceof IFolder && |
4b3b667b | 114 | (TmfTraceType.getTraceTypeId(resource) == null); |
f537c959 | 115 | ITmfProjectModelElement element = childrenMap.get(name); |
339d539c | 116 | if (isFolder && !(element instanceof TmfTraceFolder) && !(element instanceof TmfTraceElement)) { |
a4a116c3 | 117 | if (TmfTraceType.isDirectoryTrace(resource.getLocationURI().getPath())) { |
339d539c PT |
118 | element = new TmfTraceElement(name, resource, this); |
119 | } else { | |
120 | element = new TmfTraceFolder(name, (IFolder) resource, this); | |
121 | } | |
122 | } else if (!isFolder && !(element instanceof TmfTraceElement)) { | |
f537c959 | 123 | element = new TmfTraceElement(name, resource, this); |
339d539c PT |
124 | } else { |
125 | childrenMap.remove(name); | |
f537c959 | 126 | } |
202956f1 AM |
127 | if (element != null) { |
128 | ((TmfProjectModelElement) element).refreshChildren(); | |
129 | } | |
f537c959 PT |
130 | } |
131 | } catch (CoreException e) { | |
132 | } | |
133 | ||
134 | // Cleanup dangling children from the model | |
135 | for (ITmfProjectModelElement danglingChild : childrenMap.values()) { | |
136 | removeChild(danglingChild); | |
137 | } | |
12c155f5 FC |
138 | } |
139 | ||
140 | // ------------------------------------------------------------------------ | |
141 | // Operations | |
142 | // ------------------------------------------------------------------------ | |
11252342 | 143 | |
b544077e | 144 | /** |
339d539c | 145 | * Returns a list of trace elements under the folder element, recursively. |
b544077e BH |
146 | * @return list of trace model elements |
147 | */ | |
12c155f5 FC |
148 | public List<TmfTraceElement> getTraces() { |
149 | List<ITmfProjectModelElement> children = getChildren(); | |
507b1336 | 150 | List<TmfTraceElement> traces = new ArrayList<>(); |
12c155f5 FC |
151 | for (ITmfProjectModelElement child : children) { |
152 | if (child instanceof TmfTraceElement) { | |
153 | traces.add((TmfTraceElement) child); | |
339d539c PT |
154 | } else if (child instanceof TmfTraceFolder) { |
155 | traces.addAll(((TmfTraceFolder) child).getTraces()); | |
12c155f5 FC |
156 | } |
157 | } | |
158 | return traces; | |
159 | } | |
160 | ||
45fc1883 BH |
161 | /** |
162 | * Gets the traces elements under this folder containing the given resources | |
163 | * | |
164 | * @param resources | |
165 | * resources to search for | |
166 | * @return list of trace elements | |
167 | * @since 2.0 | |
168 | */ | |
169 | public @NonNull List<TmfTraceElement> getTraceElements(@NonNull List<IResource> resources) { | |
170 | List<TmfTraceElement> traceElements = new ArrayList<>(); | |
171 | List<TmfTraceElement> children = getTraces(); | |
172 | for (IResource resource : resources) { | |
173 | TmfTraceElement el = children.stream() | |
174 | .filter(traceElement -> | |
175 | ((traceElement != null) && | |
176 | traceElement.getResource().equals(resource))) | |
177 | .findFirst() | |
178 | .orElse(null); | |
179 | ||
180 | if (el != null) { | |
181 | traceElements.add(el); | |
182 | } | |
183 | } | |
184 | return traceElements; | |
185 | } | |
186 | ||
12c155f5 FC |
187 | // ------------------------------------------------------------------------ |
188 | // IPropertySource2 | |
189 | // ------------------------------------------------------------------------ | |
190 | ||
191 | @Override | |
192 | public Object getEditableValue() { | |
193 | return null; | |
194 | } | |
195 | ||
196 | @Override | |
197 | public IPropertyDescriptor[] getPropertyDescriptors() { | |
067cd9de | 198 | return Arrays.copyOf(DESCRIPTORS, DESCRIPTORS.length); |
12c155f5 FC |
199 | } |
200 | ||
201 | @Override | |
202 | public Object getPropertyValue(Object id) { | |
203 | ||
067cd9de | 204 | if (NAME.equals(id)) { |
12c155f5 | 205 | return getName(); |
013a5f1c | 206 | } |
12c155f5 | 207 | |
067cd9de | 208 | if (PATH.equals(id)) { |
12c155f5 | 209 | return getPath().toString(); |
013a5f1c | 210 | } |
12c155f5 | 211 | |
067cd9de | 212 | if (LOCATION.equals(id)) { |
12c155f5 | 213 | return getLocation().toString(); |
013a5f1c | 214 | } |
12c155f5 FC |
215 | |
216 | return null; | |
217 | } | |
218 | ||
219 | @Override | |
220 | public void resetPropertyValue(Object id) { | |
221 | } | |
222 | ||
223 | @Override | |
224 | public void setPropertyValue(Object id, Object value) { | |
225 | } | |
226 | ||
227 | @Override | |
228 | public boolean isPropertyResettable(Object id) { | |
229 | return false; | |
230 | } | |
231 | ||
232 | @Override | |
233 | public boolean isPropertySet(Object id) { | |
234 | return false; | |
235 | } | |
236 | ||
237 | } |