analysis: Move plugins to their own sub-directory
[deliverable/tracecompass.git] / org.eclipse.tracecompass.tmf.ui / src / org / eclipse / tracecompass / tmf / ui / project / model / TmfProjectModelElement.java
CommitLineData
12c155f5 1/*******************************************************************************
60ae41e1 2 * Copyright (c) 2010, 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
b544077e 11 * Bernd Hufmann - Added supplementary files/folder handling
f537c959 12 * Patrick Tasse - Refactor resource change listener
12c155f5
FC
13 *******************************************************************************/
14
2bdf0193 15package org.eclipse.tracecompass.tmf.ui.project.model;
12c155f5 16
89730b51 17import java.io.File;
12c155f5 18import java.net.URI;
12c155f5 19import java.util.List;
9e619b5e 20import java.util.concurrent.CopyOnWriteArrayList;
12c155f5 21
e12ecd30
BH
22import org.eclipse.core.resources.IFolder;
23import org.eclipse.core.resources.IProject;
12c155f5 24import org.eclipse.core.resources.IResource;
e12ecd30 25import org.eclipse.core.runtime.CoreException;
12c155f5 26import org.eclipse.core.runtime.IPath;
e12ecd30 27import org.eclipse.core.runtime.NullProgressMonitor;
f537c959 28import org.eclipse.swt.widgets.Display;
2bdf0193
AM
29import org.eclipse.tracecompass.internal.tmf.ui.Activator;
30import org.eclipse.tracecompass.tmf.core.TmfCommonConstants;
f537c959
PT
31import org.eclipse.ui.IViewPart;
32import org.eclipse.ui.IViewReference;
33import org.eclipse.ui.IWorkbench;
34import org.eclipse.ui.IWorkbenchPage;
35import org.eclipse.ui.IWorkbenchWindow;
36import org.eclipse.ui.PlatformUI;
37import org.eclipse.ui.navigator.CommonNavigator;
38import org.eclipse.ui.navigator.CommonViewer;
12c155f5
FC
39
40/**
013a5f1c
AM
41 * The implementation of the base TMF project model element. It provides default implementation
42 * of the <code>ITmfProjectModelElement</code> interface.
12c155f5 43 * <p>
b544077e
BH
44 * @version 1.0
45 * @author Francois Chouinard
12c155f5 46 */
f537c959 47public abstract class TmfProjectModelElement implements ITmfProjectModelElement {
12c155f5
FC
48
49 // ------------------------------------------------------------------------
50 // Attributes
51 // ------------------------------------------------------------------------
52
53 private final String fName;
b544077e
BH
54 /**
55 * The project model element resource.
56 */
12c155f5 57 protected final IResource fResource;
b544077e
BH
58 /**
59 * The project model resource location (URI)
60 */
12c155f5 61 protected final URI fLocation;
b544077e
BH
62 /**
63 * The project model path of a resource.
64 */
12c155f5
FC
65 protected final IPath fPath;
66 private final ITmfProjectModelElement fParent;
b544077e
BH
67 /**
68 * The list of children elements.
69 */
12c155f5
FC
70 protected final List<ITmfProjectModelElement> fChildren;
71
72 // ------------------------------------------------------------------------
73 // Constructor
74 // ------------------------------------------------------------------------
b544077e
BH
75 /**
76 * Constructor.
013a5f1c 77 *
b544077e
BH
78 * Creates a base project model element.
79 * @param name The name of the element.
80 * @param resource The element resource.
81 * @param parent The parent model element.
82 */
12c155f5
FC
83 protected TmfProjectModelElement(String name, IResource resource, ITmfProjectModelElement parent) {
84 fName = name;
85 fResource = resource;
86 fPath = resource.getFullPath();
89730b51 87 fLocation = new File(resource.getLocationURI()).toURI();
12c155f5 88 fParent = parent;
9e619b5e 89 fChildren = new CopyOnWriteArrayList<>();
c4c81d91
PT
90 }
91
12c155f5
FC
92 // ------------------------------------------------------------------------
93 // ITmfProjectModelElement
94 // ------------------------------------------------------------------------
11252342 95
12c155f5
FC
96 @Override
97 public String getName() {
98 return fName;
99 }
11252342 100
12c155f5
FC
101 @Override
102 public IResource getResource() {
103 return fResource;
104 }
11252342 105
12c155f5
FC
106 @Override
107 public IPath getPath() {
108 return fPath;
109 }
11252342 110
12c155f5
FC
111 @Override
112 public URI getLocation() {
113 return fLocation;
114 }
11252342 115
339d539c
PT
116 @Override
117 public TmfProjectElement getProject() {
118 return fParent.getProject();
119 }
120
12c155f5
FC
121 @Override
122 public ITmfProjectModelElement getParent() {
123 return fParent;
124 }
11252342 125
12c155f5
FC
126 @Override
127 public boolean hasChildren() {
128 return fChildren.size() > 0;
129 }
11252342 130
12c155f5
FC
131 @Override
132 public List<ITmfProjectModelElement> getChildren() {
133 return fChildren;
134 }
11252342 135
12c155f5
FC
136 @Override
137 public void addChild(ITmfProjectModelElement child) {
138 fChildren.add(child);
139 }
11252342 140
12c155f5
FC
141 @Override
142 public void removeChild(ITmfProjectModelElement child) {
143 fChildren.remove(child);
12c155f5 144 }
11252342 145
12c155f5
FC
146 @Override
147 public void refresh() {
f537c959
PT
148 // make sure the model is updated in the current thread
149 refreshChildren();
150
151 Display.getDefault().asyncExec(new Runnable(){
152 @Override
153 public void run() {
154 IWorkbench wb = PlatformUI.getWorkbench();
155 IWorkbenchWindow wbWindow = wb.getActiveWorkbenchWindow();
156 if (wbWindow == null) {
157 return;
158 }
159 IWorkbenchPage activePage = wbWindow.getActivePage();
160 if (activePage == null) {
161 return;
162 }
163
164 for (IViewReference viewReference : activePage.getViewReferences()) {
165 IViewPart viewPart = viewReference.getView(false);
166 if (viewPart instanceof CommonNavigator) {
167 CommonViewer commonViewer = ((CommonNavigator) viewPart).getCommonViewer();
168 Object element = TmfProjectModelElement.this;
169 if (element instanceof TmfProjectElement) {
170 // for the project element the viewer uses the IProject resource
171 element = getResource();
172 }
173 commonViewer.refresh(element);
174 }
175 }
176 }});
12c155f5
FC
177 }
178
179 // ------------------------------------------------------------------------
180 // Object
181 // ------------------------------------------------------------------------
11252342 182
6e85c58d
FC
183 @Override
184 public int hashCode() {
185 final int prime = 31;
186 int result = 1;
6e85c58d 187 result = prime * result + ((fPath == null) ? 0 : fPath.hashCode());
6e85c58d
FC
188 return result;
189 }
11252342 190
12c155f5
FC
191 @Override
192 public boolean equals(Object other) {
013a5f1c 193 if (this == other) {
12c155f5 194 return true;
013a5f1c
AM
195 }
196 if (other == null) {
6e85c58d 197 return false;
013a5f1c
AM
198 }
199 if (!(other instanceof TmfProjectModelElement)) {
12c155f5 200 return false;
013a5f1c 201 }
6e85c58d 202 TmfProjectModelElement element = (TmfProjectModelElement) other;
81fe3479 203 return element.fPath.equals(fPath);
12c155f5 204 }
013a5f1c 205
f537c959
PT
206 // ------------------------------------------------------------------------
207 // Operations
208 // ------------------------------------------------------------------------
209
210 /**
211 * Refresh the children of this model element, adding new children and
212 * removing dangling children as necessary. The remaining children should
213 * also refresh their own children sub-tree.
214 */
215 void refreshChildren() {
216 // Sub-classes may override this method as needed
217 }
218
e12ecd30 219 /**
339d539c
PT
220 * Returns the trace specific supplementary folder under the project's
221 * supplementary folder. The returned folder and its parent folders may not
222 * exist.
013a5f1c 223 *
339d539c
PT
224 * @param supplFolderPath
225 * folder path relative to the project's supplementary folder
226 * @return the trace specific supplementary folder
e12ecd30 227 */
339d539c
PT
228 public IFolder getTraceSupplementaryFolder(String supplFolderPath) {
229 TmfProjectElement project = getProject();
230 IProject projectResource = project.getResource();
231 IFolder supplFolderParent = projectResource.getFolder(TmfCommonConstants.TRACE_SUPPLEMENTARY_FOLDER_NAME);
232 IFolder folder = supplFolderParent.getFolder(supplFolderPath);
233 return folder;
e12ecd30
BH
234 }
235
236 /**
339d539c
PT
237 * Returns the trace specific supplementary folder under the project's
238 * supplementary folder. Its parent folders will be created if they don't
239 * exist. If createFolder is true, the returned folder will be created,
240 * otherwise it may not exist.
013a5f1c 241 *
339d539c
PT
242 * @param supplFolderPath
243 * folder path relative to the project's supplementary folder
244 * @param createFolder
245 * if true, the returned folder will be created
246 * @return the trace specific supplementary folder
e12ecd30 247 */
339d539c
PT
248 public IFolder prepareTraceSupplementaryFolder(String supplFolderPath, boolean createFolder) {
249 IFolder folder = getTraceSupplementaryFolder(supplFolderPath);
250 try {
251 if (createFolder) {
252 TraceUtils.createFolder(folder, new NullProgressMonitor());
253 } else {
254 TraceUtils.createFolder((IFolder) folder.getParent(), new NullProgressMonitor());
e12ecd30 255 }
339d539c
PT
256 } catch (CoreException e) {
257 Activator.getDefault().logError("Error creating supplementary folder " + folder.getFullPath(), e); //$NON-NLS-1$
e12ecd30 258 }
339d539c 259 return folder;
e12ecd30 260 }
ceacc1e3
PT
261
262 @Override
263 public String toString() {
264 return getClass().getSimpleName() + '(' + getPath() + ')';
265 }
266
12c155f5 267}
This page took 0.103877 seconds and 5 git commands to generate.