Remove bookmarks file on drag&drop trace copy.
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.ui / src / org / eclipse / linuxtools / internal / tmf / ui / project / handlers / DropAdapterAssistant.java
CommitLineData
828e5592
PT
1/*******************************************************************************
2* Copyright (c) 2012 Ericsson
3 *
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
8 *
9 * Contributors:
10 * Patrick Tasse - Initial API and implementation
11 *******************************************************************************/
12
d34665f9 13package org.eclipse.linuxtools.internal.tmf.ui.project.handlers;
828e5592
PT
14
15import java.io.File;
16import java.lang.reflect.InvocationTargetException;
17import java.util.LinkedList;
18import java.util.List;
19import java.util.Map;
20
21import org.eclipse.core.resources.IFile;
22import org.eclipse.core.resources.IFolder;
23import org.eclipse.core.resources.IProject;
24import org.eclipse.core.resources.IResource;
25import org.eclipse.core.resources.IWorkspace;
26import org.eclipse.core.resources.ResourcesPlugin;
27import org.eclipse.core.runtime.CoreException;
28import org.eclipse.core.runtime.IPath;
29import org.eclipse.core.runtime.IStatus;
30import org.eclipse.core.runtime.NullProgressMonitor;
31import org.eclipse.core.runtime.Path;
32import org.eclipse.core.runtime.QualifiedName;
33import org.eclipse.core.runtime.Status;
34import org.eclipse.jface.viewers.IStructuredSelection;
fedfc72a 35import org.eclipse.linuxtools.tmf.core.trace.TmfTrace;
828e5592
PT
36import org.eclipse.linuxtools.tmf.ui.project.model.ITmfProjectModelElement;
37import org.eclipse.linuxtools.tmf.ui.project.model.TmfExperimentElement;
38import org.eclipse.linuxtools.tmf.ui.project.model.TmfProjectElement;
39import org.eclipse.linuxtools.tmf.ui.project.model.TmfProjectRegistry;
40import org.eclipse.linuxtools.tmf.ui.project.model.TmfTraceElement;
41import org.eclipse.linuxtools.tmf.ui.project.model.TmfTraceFolder;
42import org.eclipse.swt.dnd.DND;
43import org.eclipse.swt.dnd.DropTargetEvent;
44import org.eclipse.swt.dnd.FileTransfer;
45import org.eclipse.swt.dnd.TransferData;
46import org.eclipse.swt.widgets.MessageBox;
47import org.eclipse.ui.PlatformUI;
48import org.eclipse.ui.dialogs.IOverwriteQuery;
49import org.eclipse.ui.navigator.CommonDropAdapter;
50import org.eclipse.ui.navigator.CommonDropAdapterAssistant;
51import org.eclipse.ui.wizards.datatransfer.FileSystemStructureProvider;
52import org.eclipse.ui.wizards.datatransfer.ImportOperation;
53
54/**
55 * Drop adapter assistant for project explorer
56 */
57public class DropAdapterAssistant extends CommonDropAdapterAssistant {
58
59 /**
60 * Default constructor
61 */
62 public DropAdapterAssistant() {
63 }
64
65 /* (non-Javadoc)
66 * @see org.eclipse.ui.navigator.CommonDropAdapterAssistant#isSupportedType(org.eclipse.swt.dnd.TransferData)
67 */
68 @Override
69 public boolean isSupportedType(TransferData aTransferType) {
70 return super.isSupportedType(aTransferType) || FileTransfer.getInstance().isSupportedType(aTransferType);
71 }
72
73 /* (non-Javadoc)
74 * @see org.eclipse.ui.navigator.CommonDropAdapterAssistant#validateDrop(java.lang.Object, int, org.eclipse.swt.dnd.TransferData)
75 */
76 @Override
77 public IStatus validateDrop(Object target, int operation, TransferData transferType) {
78 if (target instanceof TmfTraceFolder) {
79 getCommonDropAdapter().overrideOperation(DND.DROP_COPY);
80 return Status.OK_STATUS;
81 }
82 if (target instanceof TmfExperimentElement) {
83 getCommonDropAdapter().overrideOperation(DND.DROP_LINK);
84 return Status.OK_STATUS;
85 }
86 if (target instanceof TmfTraceElement) {
87 ITmfProjectModelElement parent = ((TmfTraceElement) target).getParent();
88 if (parent instanceof TmfTraceFolder) {
89 getCommonDropAdapter().overrideOperation(DND.DROP_COPY);
90 return Status.OK_STATUS;
91 }
92 if (parent instanceof TmfExperimentElement) {
93 getCommonDropAdapter().overrideOperation(DND.DROP_LINK);
94 return Status.OK_STATUS;
95 }
96 }
97 if (target instanceof IProject) {
98 getCommonDropAdapter().overrideOperation(DND.DROP_COPY);
99 return Status.OK_STATUS;
100 }
101 return Status.CANCEL_STATUS;
102 }
103
104 /* (non-Javadoc)
105 * @see org.eclipse.ui.navigator.CommonDropAdapterAssistant#handleDrop(org.eclipse.ui.navigator.CommonDropAdapter, org.eclipse.swt.dnd.DropTargetEvent, java.lang.Object)
106 */
107 @Override
108 public IStatus handleDrop(CommonDropAdapter aDropAdapter, DropTargetEvent aDropTargetEvent, Object aTarget) {
109 boolean ok = false;
110
111 // If target is a trace, use its parent (either trace folder or experiment)
112 if (aTarget instanceof TmfTraceElement) {
113 aTarget = ((TmfTraceElement) aTarget).getParent();
114 }
115
116 // If target is a project, use its trace folder
117 if (aTarget instanceof IProject) {
118 TmfProjectElement projectElement = TmfProjectRegistry.getProject((IProject) aTarget);
119 if (projectElement != null) {
120 aTarget = projectElement.getTracesFolder();
121 }
122 }
123
124 if (aDropTargetEvent.data instanceof IStructuredSelection) {
125 IStructuredSelection selection = (IStructuredSelection) aDropTargetEvent.data;
126 for (Object source : selection.toArray()) {
127 if (source instanceof IResource) {
128 // If source resource is a trace, use the trace element
129 IResource sourceResource = (IResource) source;
130 TmfProjectElement projectElement = TmfProjectRegistry.getProject(sourceResource.getProject());
131 if (projectElement != null && projectElement.getTracesFolder() != null) {
132 for (TmfTraceElement trace : projectElement.getTracesFolder().getTraces()) {
133 if (trace.getResource().equals(sourceResource)) {
134 source = trace;
135 break;
136 }
137 }
138 }
139 }
140 if (source instanceof TmfTraceElement) {
141 TmfTraceElement sourceTrace = (TmfTraceElement) source;
142 // If source trace is under an experiment, use the original trace from the traces folder
143 if (sourceTrace.getParent() instanceof TmfExperimentElement) {
144 for (TmfTraceElement trace : sourceTrace.getProject().getTracesFolder().getTraces()) {
145 if (trace.getName().equals(sourceTrace.getName())) {
146 sourceTrace = trace;
147 break;
148 }
149 }
150 }
151 IResource sourceResource = sourceTrace.getResource();
152 if (aTarget instanceof TmfExperimentElement) {
153 TmfExperimentElement targetExperiment = (TmfExperimentElement) aTarget;
154 ok |= drop(sourceResource, targetExperiment);
155 } else if (aTarget instanceof TmfTraceFolder) {
156 TmfTraceFolder traceFolder = (TmfTraceFolder) aTarget;
157 ok |= drop(sourceResource, traceFolder);
158 }
159 } else if (source instanceof IResource) {
160 IResource sourceResource = (IResource) source;
161 if (sourceResource.getType() != IResource.FILE && sourceResource.getType() != IResource.FOLDER) {
162 continue;
163 }
164 if (aTarget instanceof TmfExperimentElement) {
165 TmfExperimentElement targetExperiment = (TmfExperimentElement) aTarget;
166 ok |= drop(sourceResource, targetExperiment);
167 } else if (aTarget instanceof TmfTraceFolder) {
168 TmfTraceFolder traceFolder = (TmfTraceFolder) aTarget;
169 ok |= drop(sourceResource, traceFolder);
170 }
171 }
172 }
173 } else if (aDropTargetEvent.data instanceof String[]) {
174 String[] sources = (String[]) aDropTargetEvent.data;
175 for (String source : sources) {
176 Path path = new Path(source);
177 if (aTarget instanceof TmfExperimentElement) {
178 TmfExperimentElement targetExperiment = (TmfExperimentElement) aTarget;
179 ok |= drop(path, targetExperiment);
180 } else if (aTarget instanceof TmfTraceFolder) {
181 TmfTraceFolder traceFolder = (TmfTraceFolder) aTarget;
182 ok |= drop(path, traceFolder);
183 }
184 }
185 }
186 return (ok ? Status.OK_STATUS : Status.CANCEL_STATUS);
187 }
188
189 /**
190 * Drop a trace by copying a resource in a target experiment
191 *
192 * @param sourceResource the source resource
193 * @param targetExperiment the target experiment
194 * @return true if successful
195 */
196 private boolean drop(IResource sourceResource, TmfExperimentElement targetExperiment) {
197 boolean doit = true;
198 TmfProjectElement projectElement = TmfProjectRegistry.getProject(sourceResource.getProject());
199 for (TmfTraceElement trace : targetExperiment.getTraces()) {
200 if (trace.getName().equals(sourceResource.getName())) {
201 doit = false;
202 break;
203 }
204 }
205 if (doit && !targetExperiment.getProject().equals(projectElement)) {
206 for (TmfTraceElement trace : targetExperiment.getProject().getTracesFolder().getTraces()) {
207 if (trace.getName().equals(sourceResource.getName())) {
208 doit = false;
209 break;
210 }
211 }
212 if (doit) {
213 try {
214 IPath destination = targetExperiment.getProject().getTracesFolder().getResource().getFullPath().addTrailingSeparator().append(sourceResource.getName());
215 sourceResource.copy(destination, false, null);
fedfc72a 216 cleanupBookmarks(destination);
828e5592
PT
217 // use the copied resource for the experiment
218 if (sourceResource.getType() == IResource.FILE) {
219 sourceResource = targetExperiment.getProject().getTracesFolder().getResource().getFile(sourceResource.getName());
220 } else if (sourceResource.getType() == IResource.FOLDER) {
221 sourceResource = targetExperiment.getProject().getTracesFolder().getResource().getFolder(sourceResource.getName());
222 }
223 } catch (CoreException e) {
224 doit = false;
225 displayException(e);
226 }
227 }
228 }
229 if (doit) {
230 if (sourceResource != null && sourceResource.exists()) {
231 createLink(targetExperiment.getResource(), sourceResource);
232 return true;
233 }
234 }
235 return false;
236 }
237
238 /**
239 * Drop a trace by copying a resource in a trace folder
240 *
241 * @param sourceResource the source resource
242 * @param traceFolder the target trace folder
243 * @return true if successful
244 */
245 private boolean drop(IResource sourceResource, TmfTraceFolder traceFolder) {
246 boolean doit = true;
247 for (TmfTraceElement trace : traceFolder.getTraces()) {
248 if (trace.getName().equals(sourceResource.getName())) {
249 doit = false;
250 break;
251 }
252 }
253 if (doit) {
254 try {
255 IPath destination = traceFolder.getResource().getFullPath().addTrailingSeparator().append(sourceResource.getName());
256 sourceResource.copy(destination, false, null);
fedfc72a 257 cleanupBookmarks(destination);
828e5592
PT
258 return true;
259 } catch (CoreException e) {
260 displayException(e);
261 }
262 }
263 return false;
264 }
265
266 /**
267 * Drop a trace by importing a path in a target experiment
268 *
269 * @param path the source path
270 * @param targetExperiment the target experiment
271 * @return true if successful
272 */
273 private boolean drop(Path path, TmfExperimentElement targetExperiment) {
274 boolean doit = true;
275 for (TmfTraceElement trace : targetExperiment.getTraces()) {
276 if (trace.getName().equals(path.lastSegment())) {
277 doit = false;
278 break;
279 }
280 }
281 if (doit && !path.toString().startsWith(targetExperiment.getProject().getResource().getLocation().toString())) {
282 for (TmfTraceElement trace : targetExperiment.getProject().getTracesFolder().getTraces()) {
283 if (trace.getName().equals(path.lastSegment())) {
284 doit = false;
285 break;
286 }
287 }
288 if (doit) {
289 importTrace(targetExperiment.getProject().getTracesFolder().getResource(), path);
290 // use the imported trace for the experiment
291 path = new Path(targetExperiment.getProject().getTracesFolder().getResource().getFile(path.lastSegment()).getLocation().toString());
292 }
293 }
294 if (doit) {
295 IResource resource = null;
296 File file = new File(path.toString());
297 if (file.exists() && file.isFile()) {
298 resource = targetExperiment.getProject().getTracesFolder().getResource().getFile(path.lastSegment());
299 } else if (file.exists() && file.isDirectory()) {
300 resource = targetExperiment.getProject().getTracesFolder().getResource().getFolder(path.lastSegment());
301 }
302 if (resource != null && resource.exists()) {
303 createLink(targetExperiment.getResource(), resource);
304 return true;
305 }
306 }
307 return false;
308 }
309
310 /**
311 * Drop a trace by importing a path in a trace folder
312 *
313 * @param path the source path
314 * @param traceFolder the target trace folder
315 * @return true if successful
316 */
317 private boolean drop(Path path, TmfTraceFolder traceFolder) {
318 boolean doit = true;
319 for (TmfTraceElement trace : traceFolder.getTraces()) {
320 if (trace.getName().equals(path.lastSegment())) {
321 doit = false;
322 break;
323 }
324 }
325 if (doit) {
326 importTrace(traceFolder.getResource(), path);
327 return true;
328 }
329 return false;
330 }
331
332 /**
333 * Import a trace to the trace folder
334 *
335 * @param resource the trace folder resource
336 * @param path the path to the trace to import
337 */
338 private void importTrace(IFolder resource, Path path) {
339 IPath containerPath = resource.getFullPath();
340 File file = new File(path.toString());
341 File source = file.getParentFile();
342 IOverwriteQuery overwriteImplementor = new IOverwriteQuery() {
343 @Override
344 public String queryOverwrite(String pathString) {
345 return IOverwriteQuery.NO_ALL;
346 }
347 };
348 List<File> filesToImport = new LinkedList<File>();
349 filesToImport.add(file);
350 ImportOperation operation = new ImportOperation(
351 containerPath,
352 source,
353 FileSystemStructureProvider.INSTANCE,
354 overwriteImplementor,
355 filesToImport);
356 operation.setCreateContainerStructure(false);
357 try {
358 operation.run(new NullProgressMonitor());
359 } catch (InvocationTargetException e) {
360 displayException(e);
361 } catch (InterruptedException e) {
362 displayException(e);
363 }
364 }
fedfc72a 365
828e5592
PT
366 /**
367 * Create a link to the actual trace and set the trace type
368 *
369 * @param parentFolder the parent folder
370 * @param resource the resource
371 */
372 private void createLink(IFolder parentFolder, IResource resource) {
373 IPath location = resource.getLocation();
374 IWorkspace workspace = ResourcesPlugin.getWorkspace();
375 try {
376 Map<QualifiedName, String> properties = resource.getPersistentProperties();
377 String bundleName = properties.get(TmfTraceElement.TRACEBUNDLE);
378 String traceType = properties.get(TmfTraceElement.TRACETYPE);
379 String iconUrl = properties.get(TmfTraceElement.TRACEICON);
380
381 if (resource instanceof IFolder) {
382 IFolder folder = parentFolder.getFolder(resource.getName());
383 if (workspace.validateLinkLocation(folder, location).isOK()) {
384 folder.createLink(location, IResource.REPLACE, null);
385 setProperties(folder, bundleName, traceType, iconUrl);
386
387 } else {
388 System.out.println("Invalid Trace Location"); //$NON-NLS-1$
389 }
390 } else {
391 IFile file = parentFolder.getFile(resource.getName());
392 if (workspace.validateLinkLocation(file, location).isOK()) {
393 file.createLink(location, IResource.REPLACE, null);
394 setProperties(file, bundleName, traceType, iconUrl);
395 } else {
396 System.out.println("Invalid Trace Location"); //$NON-NLS-1$
397 }
398 }
399 } catch (CoreException e) {
400 displayException(e);
401 }
402 }
403
fedfc72a
PT
404 /**
405 * Cleanup bookmarks file in copied trace
406 */
407 private void cleanupBookmarks(IPath path) {
408 IFolder folder = ResourcesPlugin.getWorkspace().getRoot().getFolder(path);
409 if (folder.exists()) {
410 try {
411 for (IResource member : folder.members()) {
412 if (TmfTrace.class.getCanonicalName().equals(member.getPersistentProperty(TmfTraceElement.TRACETYPE))) {
413 member.delete(true, null);
414 }
415 }
416 } catch (CoreException e) {
417 displayException(e);
418 }
419 }
420 }
421
828e5592
PT
422 /**
423 * Set the trace persistent properties
424 *
425 * @param resource the trace resource
426 * @param bundleName the bundle name
427 * @param traceType the trace type
428 * @param iconUrl the icon URL
429 * @throws CoreException
430 */
431 private void setProperties(IResource resource, String bundleName, String traceType, String iconUrl) throws CoreException {
432 resource.setPersistentProperty(TmfTraceElement.TRACEBUNDLE, bundleName);
433 resource.setPersistentProperty(TmfTraceElement.TRACETYPE, traceType);
434 resource.setPersistentProperty(TmfTraceElement.TRACEICON, iconUrl);
435 }
436
437 /**
438 * Display an exception in a message box
439 *
440 * @param e the exception
441 */
442 private void displayException(Exception e) {
443 MessageBox mb = new MessageBox(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
444 mb.setText(e.getClass().getName());
445 mb.setMessage(e.getMessage());
446 mb.open();
447 }
448
449}
This page took 0.043487 seconds and 5 git commands to generate.