1 /*******************************************************************************
2 * Copyright (c) 2009, 2014 Ericsson, École Polytechnique de Montréal
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 * Francois Chouinard - Initial API and implementation
11 * Patrick Tasse - Close editors to release resources
12 * Geneviève Bastien - Moved the delete code to element model's classes
13 * Marc-Andre Laperle - Merged DeleteTraceHandler and DeleteFolderHandler
14 *******************************************************************************/
16 package org
.eclipse
.linuxtools
.internal
.tmf
.ui
.project
.handlers
;
18 import java
.lang
.reflect
.InvocationTargetException
;
19 import java
.util
.Iterator
;
21 import org
.eclipse
.core
.commands
.AbstractHandler
;
22 import org
.eclipse
.core
.commands
.ExecutionEvent
;
23 import org
.eclipse
.core
.commands
.ExecutionException
;
24 import org
.eclipse
.core
.resources
.IResource
;
25 import org
.eclipse
.core
.resources
.IResourceVisitor
;
26 import org
.eclipse
.core
.runtime
.CoreException
;
27 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
28 import org
.eclipse
.core
.runtime
.OperationCanceledException
;
29 import org
.eclipse
.core
.runtime
.SubMonitor
;
30 import org
.eclipse
.core
.runtime
.SubProgressMonitor
;
31 import org
.eclipse
.jface
.dialogs
.MessageDialog
;
32 import org
.eclipse
.jface
.viewers
.ISelection
;
33 import org
.eclipse
.jface
.viewers
.ISelectionProvider
;
34 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
35 import org
.eclipse
.jface
.viewers
.TreeSelection
;
36 import org
.eclipse
.linuxtools
.internal
.tmf
.ui
.Activator
;
37 import org
.eclipse
.linuxtools
.internal
.tmf
.ui
.project
.operations
.TmfWorkspaceModifyOperation
;
38 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.TmfExperimentElement
;
39 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.TmfTraceElement
;
40 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.TmfTraceFolder
;
41 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.TmfTracesFolder
;
42 import org
.eclipse
.swt
.SWT
;
43 import org
.eclipse
.swt
.widgets
.Display
;
44 import org
.eclipse
.swt
.widgets
.MessageBox
;
45 import org
.eclipse
.swt
.widgets
.Shell
;
46 import org
.eclipse
.ui
.IWorkbenchPage
;
47 import org
.eclipse
.ui
.IWorkbenchPart
;
48 import org
.eclipse
.ui
.IWorkbenchWindow
;
49 import org
.eclipse
.ui
.PlatformUI
;
50 import org
.eclipse
.ui
.handlers
.HandlerUtil
;
53 * An handler for deletion of both traces and trace folders. It allows mixing
54 * both types of elements.
56 public class DeleteTraceFolderElementHandler
extends AbstractHandler
{
58 private TreeSelection fSelection
= null;
60 private enum DeleteType
{
62 * Only trace folders are selected.
66 * Only traces are selected.
70 * A mix of different elements are selected.
74 * Only Traces (top trace folders) are selected.
78 * Only Traces under experiments are selected.
80 REMOVE_TRACES_FROM_EXPERIMENT
83 // ------------------------------------------------------------------------
85 // ------------------------------------------------------------------------
88 public boolean isEnabled() {
90 // Check if we are closing down
91 IWorkbenchWindow window
= PlatformUI
.getWorkbench().getActiveWorkbenchWindow();
97 IWorkbenchPage page
= PlatformUI
.getWorkbench().getActiveWorkbenchWindow().getActivePage();
98 IWorkbenchPart part
= page
.getActivePart();
102 ISelectionProvider selectionProvider
= part
.getSite().getSelectionProvider();
103 if (selectionProvider
== null) {
106 ISelection selection
= selectionProvider
.getSelection();
108 // Make sure selection contains only traces and trace folders
110 if (selection
instanceof TreeSelection
) {
111 fSelection
= (TreeSelection
) selection
;
112 Iterator
<Object
> iterator
= fSelection
.iterator();
113 while (iterator
.hasNext()) {
114 Object element
= iterator
.next();
115 if (!(element
instanceof TmfTraceElement
) && !(element
instanceof TmfTraceFolder
)) {
121 // If we get here, either nothing is selected or everything is a trace or folder
122 return !selection
.isEmpty();
125 // ------------------------------------------------------------------------
127 // ------------------------------------------------------------------------
129 private static DeleteType
getDeleteType(ISelection selection
) {
130 int numTracesFolder
= 0;
131 int numTraceFolder
= 0;
133 int numTracesUnderExperiment
= 0;
135 @SuppressWarnings("rawtypes")
136 Iterator iterator
= ((IStructuredSelection
) selection
).iterator();
137 while (iterator
.hasNext()) {
138 Object next
= iterator
.next();
139 if ((next
instanceof TmfTracesFolder
)) {
141 } else if (next
instanceof TmfTraceFolder
) {
143 } else if (next
instanceof TmfTraceElement
) {
144 TmfTraceElement traceElement
= (TmfTraceElement
) next
;
145 if (traceElement
.getParent() instanceof TmfExperimentElement
) {
146 numTracesUnderExperiment
++;
153 int total
= numTraceFolder
+ numTracesFolder
+ numTracesUnderExperiment
+ numTraces
;
155 if (numTracesFolder
== total
) {
156 return DeleteType
.CLEAR_TRACES_FOLDER
;
159 if (numTraceFolder
== total
) {
160 return DeleteType
.DELETE_TRACE_FOLDERS
;
163 if (numTraces
== total
) {
164 return DeleteType
.DELETE_TRACES
;
167 if (numTracesUnderExperiment
== total
) {
168 return DeleteType
.REMOVE_TRACES_FROM_EXPERIMENT
;
171 return DeleteType
.DELETE_GENERIC
;
174 private static String
getTitle(final DeleteType deleteType
) {
179 case DELETE_TRACE_FOLDERS
:
180 return Messages
.DeleteDialog_Title
;
181 case CLEAR_TRACES_FOLDER
:
182 return Messages
.ClearDialog_Title
;
183 case REMOVE_TRACES_FROM_EXPERIMENT
:
184 return Messages
.RemoveDialog_Title
;
186 throw new IllegalArgumentException();
190 private static String
getMessage(DeleteType deleteType
) {
194 return Messages
.DeleteTraceHandlerGeneric_Message
;
196 return Messages
.DeleteTraceHandler_Message
;
197 case CLEAR_TRACES_FOLDER
:
198 return Messages
.DeleteFolderHandlerClear_Message
;
199 case DELETE_TRACE_FOLDERS
:
200 return Messages
.DeleteFolderHandler_Message
;
201 case REMOVE_TRACES_FROM_EXPERIMENT
:
202 return Messages
.RemoveTraceFromExperimentHandler_Message
;
204 throw new IllegalArgumentException();
208 private static String
getTraceErrorMessage(DeleteType deleteType
) {
209 return deleteType
== DeleteType
.REMOVE_TRACES_FROM_EXPERIMENT ? Messages
.RemoveTraceFromExperimentHandler_Error
: Messages
.DeleteFolderHandler_Error
;
212 private static String
getFolderErrorMessage(DeleteType deleteType
) {
213 return deleteType
== DeleteType
.CLEAR_TRACES_FOLDER ? Messages
.DeleteFolderHandlerClear_Error
: Messages
.DeleteFolderHandler_Error
;
216 private static String
getTraceTaskName(DeleteType deleteType
) {
217 return deleteType
== DeleteType
.REMOVE_TRACES_FROM_EXPERIMENT ? Messages
.RemoveTraceFromExperimentHandler_TaskName
: Messages
.DeleteFolderHandler_TaskName
;
220 private static String
getTraceFolderTaskName(DeleteType deleteType
) {
221 return deleteType
== DeleteType
.CLEAR_TRACES_FOLDER ? Messages
.DeleteFolderHandlerClear_TaskName
: Messages
.DeleteFolderHandler_TaskName
;
225 public Object
execute(ExecutionEvent event
) throws ExecutionException
{
227 // Check if we are closing down
228 IWorkbenchWindow window
= PlatformUI
.getWorkbench().getActiveWorkbenchWindow();
229 if (window
== null) {
234 ISelection selection
= HandlerUtil
.getCurrentSelection(event
);
235 if (!(selection
instanceof IStructuredSelection
)) {
238 final DeleteType deleteType
= getDeleteType(selection
);
240 // Confirm the operation
241 Shell shell
= window
.getShell();
242 MessageBox confirmOperation
= new MessageBox(shell
, SWT
.ICON_QUESTION
| SWT
.CANCEL
| SWT
.OK
);
243 confirmOperation
.setText(getTitle(deleteType
));
244 confirmOperation
.setMessage(getMessage(deleteType
));
245 if (confirmOperation
.open() != SWT
.OK
) {
249 final Iterator
<Object
> iterator
= fSelection
.iterator();
250 final int nbElements
= fSelection
.size();
252 TmfWorkspaceModifyOperation operation
= new TmfWorkspaceModifyOperation() {
254 public void execute(IProgressMonitor monitor
) throws CoreException
{
255 SubMonitor subMonitor
= SubMonitor
.convert(monitor
, nbElements
);
257 while (iterator
.hasNext()) {
258 if (monitor
.isCanceled()) {
259 throw new OperationCanceledException();
261 Object element
= iterator
.next();
262 SubProgressMonitor elementSubMonitor
= new SubProgressMonitor(subMonitor
, 1);
263 if (element
instanceof TmfTraceElement
) {
264 final TmfTraceElement trace
= (TmfTraceElement
) element
;
265 if (!trace
.getResource().exists()) {
268 subMonitor
.setTaskName(getTraceTaskName(deleteType
) + " " + trace
.getElementPath()); //$NON-NLS-1$
270 SubMonitor deleteSubMonitor
= SubMonitor
.convert(elementSubMonitor
, 1);
271 trace
.delete(deleteSubMonitor
);
272 } catch (final CoreException e
) {
273 Display
.getDefault().asyncExec(new Runnable() {
276 final MessageBox mb
= new MessageBox(PlatformUI
.getWorkbench().getActiveWorkbenchWindow().getShell());
277 mb
.setText(getTraceErrorMessage(deleteType
) + ' ' + trace
.getName());
278 mb
.setMessage(e
.getMessage());
282 Activator
.getDefault().logError(getTraceErrorMessage(deleteType
) + trace
.getName(), e
);
284 } else if (element
instanceof TmfTraceFolder
) {
285 final TmfTraceFolder folder
= (TmfTraceFolder
) element
;
286 final IResource resource
= folder
.getResource();
287 if (!resource
.exists()) {
291 subMonitor
.setTaskName(getTraceFolderTaskName(deleteType
) + " " + folder
.getPath()); //$NON-NLS-1$
294 // delete all traces under this folder
295 SubMonitor childrenSubMonitor
= SubMonitor
.convert(elementSubMonitor
, folder
.getTraces().size() + 1);
296 for (TmfTraceElement traceElement
: folder
.getTraces()) {
297 SubProgressMonitor deleteSubMonitor
= new SubProgressMonitor(childrenSubMonitor
, 1);
298 traceElement
.delete(deleteSubMonitor
);
301 // Finally, delete the folder. For the Traces
302 // folder, we only delete the children since the
303 // folder should always be there.
304 final SubProgressMonitor deleteSubMonitor
= new SubProgressMonitor(subMonitor
, 1);
305 if (folder
instanceof TmfTracesFolder
) {
306 resource
.accept(new IResourceVisitor() {
308 public boolean visit(IResource visitedResource
) throws CoreException
{
309 if (visitedResource
!= resource
) {
310 visitedResource
.delete(true, deleteSubMonitor
);
314 }, IResource
.DEPTH_ONE
, 0);
316 resource
.delete(true, deleteSubMonitor
);
318 childrenSubMonitor
.done();
319 } catch (final CoreException e
) {
320 Display
.getDefault().asyncExec(new Runnable() {
323 final MessageBox mb
= new MessageBox(PlatformUI
.getWorkbench().getActiveWorkbenchWindow().getShell());
324 mb
.setText(getFolderErrorMessage(deleteType
) + ' ' + folder
.getName());
325 mb
.setMessage(e
.getMessage());
329 Activator
.getDefault().logError(getFolderErrorMessage(deleteType
) + folder
.getName(), e
);
332 subMonitor
.setTaskName(""); //$NON-NLS-1$
333 elementSubMonitor
.done();
339 PlatformUI
.getWorkbench().getProgressService().run(true, true, operation
);
340 } catch (InterruptedException e
) {
342 } catch (InvocationTargetException e
) {
343 MessageDialog
.openError(window
.getShell(), e
.toString(), e
.getTargetException().toString());