1 /*******************************************************************************
2 * Copyright (c) 2012, 2014 Ericsson
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
10 * Bernd Hufmann - Initial API and implementation
11 * Patrick Tasse - Close editors to release resources
12 *******************************************************************************/
14 package org
.eclipse
.linuxtools
.internal
.tmf
.ui
.project
.handlers
;
16 import java
.lang
.reflect
.InvocationTargetException
;
17 import java
.util
.ArrayList
;
18 import java
.util
.Arrays
;
19 import java
.util
.Comparator
;
20 import java
.util
.HashSet
;
21 import java
.util
.Iterator
;
22 import java
.util
.List
;
25 import org
.eclipse
.core
.commands
.AbstractHandler
;
26 import org
.eclipse
.core
.commands
.ExecutionEvent
;
27 import org
.eclipse
.core
.commands
.ExecutionException
;
28 import org
.eclipse
.core
.resources
.IProject
;
29 import org
.eclipse
.core
.resources
.IResource
;
30 import org
.eclipse
.core
.runtime
.CoreException
;
31 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
32 import org
.eclipse
.core
.runtime
.OperationCanceledException
;
33 import org
.eclipse
.core
.runtime
.SubMonitor
;
34 import org
.eclipse
.jface
.dialogs
.MessageDialog
;
35 import org
.eclipse
.jface
.viewers
.ISelection
;
36 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
37 import org
.eclipse
.jface
.window
.Window
;
38 import org
.eclipse
.linuxtools
.internal
.tmf
.ui
.Activator
;
39 import org
.eclipse
.linuxtools
.internal
.tmf
.ui
.project
.dialogs
.SelectSupplementaryResourcesDialog
;
40 import org
.eclipse
.linuxtools
.internal
.tmf
.ui
.project
.operations
.TmfWorkspaceModifyOperation
;
41 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.TmfCommonProjectElement
;
42 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.TmfExperimentElement
;
43 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.TmfTraceElement
;
44 import org
.eclipse
.osgi
.util
.NLS
;
45 import org
.eclipse
.swt
.widgets
.Display
;
46 import org
.eclipse
.ui
.IWorkbenchWindow
;
47 import org
.eclipse
.ui
.PlatformUI
;
48 import org
.eclipse
.ui
.handlers
.HandlerUtil
;
50 import com
.google
.common
.collect
.Multimap
;
51 import com
.google
.common
.collect
.TreeMultimap
;
54 * Handler for Delete Supplementary Files command on trace
56 public class DeleteTraceSupplementaryFilesHandler
extends AbstractHandler
{
58 // ------------------------------------------------------------------------
60 // ------------------------------------------------------------------------
62 private class ElementComparator
implements Comparator
<TmfCommonProjectElement
> {
64 public int compare(TmfCommonProjectElement e1
, TmfCommonProjectElement e2
) {
65 return e1
.getPath().toString().compareTo(e2
.getPath().toString());
69 private class ResourceComparator
implements Comparator
<IResource
> {
71 public int compare(IResource r1
, IResource r2
) {
72 return r1
.getFullPath().toString().compareTo(r2
.getFullPath().toString());
76 // ------------------------------------------------------------------------
78 // ------------------------------------------------------------------------
81 public Object
execute(ExecutionEvent event
) throws ExecutionException
{
83 // Check if we are closing down
84 IWorkbenchWindow window
= PlatformUI
.getWorkbench().getActiveWorkbenchWindow();
90 ISelection selection
= HandlerUtil
.getCurrentSelection(event
);
91 if (!(selection
instanceof IStructuredSelection
)) {
94 final Multimap
<TmfCommonProjectElement
, IResource
> resourceMap
=
95 TreeMultimap
.create(new ElementComparator(), new ResourceComparator());
96 final Iterator
<Object
> iterator
= ((IStructuredSelection
) selection
).iterator();
98 while (iterator
.hasNext()) {
99 Object element
= iterator
.next();
100 if (element
instanceof TmfTraceElement
) {
101 TmfTraceElement trace
= (TmfTraceElement
) element
;
102 // If trace is under an experiment, use the original trace from the traces folder
103 trace
= trace
.getElementUnderTraceFolder();
104 for (IResource resource
: trace
.getSupplementaryResources()) {
105 resourceMap
.put(trace
, resource
);
108 } else if (element
instanceof TmfExperimentElement
) {
109 TmfExperimentElement experiment
= (TmfExperimentElement
) element
;
110 for (IResource resource
: experiment
.getSupplementaryResources()) {
111 resourceMap
.put(experiment
, resource
);
113 for (TmfTraceElement trace
: experiment
.getTraces()) {
114 // If trace is under an experiment, use the original trace from the traces folder
115 trace
= trace
.getElementUnderTraceFolder();
116 for (IResource resource
: trace
.getSupplementaryResources()) {
117 resourceMap
.put(trace
, resource
);
123 final SelectSupplementaryResourcesDialog dialog
=
124 new SelectSupplementaryResourcesDialog(window
.getShell(), resourceMap
);
125 if (dialog
.open() != Window
.OK
) {
129 TmfWorkspaceModifyOperation operation
= new TmfWorkspaceModifyOperation() {
131 public void execute(IProgressMonitor monitor
) throws CoreException
{
133 Set
<IProject
> projectsToRefresh
= new HashSet
<>();
135 // Delete the resources that were selected
136 List
<IResource
> allResourcesToDelete
= Arrays
.asList(dialog
.getResources());
138 SubMonitor subMonitor
= SubMonitor
.convert(monitor
, allResourcesToDelete
.size());
140 for (final TmfCommonProjectElement element
: resourceMap
.keySet()) {
141 if (monitor
.isCanceled()) {
142 throw new OperationCanceledException();
144 List
<IResource
> traceResourcesToDelete
= new ArrayList
<>(resourceMap
.get(element
));
145 traceResourcesToDelete
.retainAll(allResourcesToDelete
);
146 if (!traceResourcesToDelete
.isEmpty()) {
147 subMonitor
.setTaskName(NLS
.bind(Messages
.DeleteSupplementaryFiles_DeletionTask
, element
.getElementPath()));
148 // Delete the selected resources
149 Display
.getDefault().syncExec(new Runnable() {
152 element
.closeEditors();
155 element
.deleteSupplementaryResources(traceResourcesToDelete
.toArray(new IResource
[0]));
156 projectsToRefresh
.add(element
.getProject().getResource());
158 subMonitor
.worked(traceResourcesToDelete
.size());
161 subMonitor
= SubMonitor
.convert(monitor
, projectsToRefresh
.size());
164 Iterator
<IProject
> projectIterator
= projectsToRefresh
.iterator();
165 while (projectIterator
.hasNext()) {
166 if (monitor
.isCanceled()) {
167 throw new OperationCanceledException();
169 IProject project
= projectIterator
.next();
170 subMonitor
.setTaskName(NLS
.bind(Messages
.DeleteSupplementaryFiles_ProjectRefreshTask
, project
.getName()));
172 project
.refreshLocal(IResource
.DEPTH_INFINITE
, null);
173 } catch (CoreException e
) {
174 Activator
.getDefault().logError("Error refreshing project " + project
, e
); //$NON-NLS-1$
176 subMonitor
.worked(1);
182 PlatformUI
.getWorkbench().getProgressService().run(true, true, operation
);
183 } catch (InterruptedException e
) {
185 } catch (InvocationTargetException e
) {
186 MessageDialog
.openError(window
.getShell(), e
.toString(), e
.getTargetException().toString());