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