tmf: add progress feedback to delete traces execution
authorBernd Hufmann <Bernd.Hufmann@ericsson.com>
Fri, 18 Jul 2014 12:14:49 +0000 (08:14 -0400)
committerBernd Hufmann <bernd.hufmann@ericsson.com>
Mon, 21 Jul 2014 19:52:04 +0000 (15:52 -0400)
Change-Id: Ifcd73c85192c3aef9c94decc541d35ff561e3280
Signed-off-by: Bernd Hufmann <Bernd.Hufmann@ericsson.com>
Reviewed-on: https://git.eclipse.org/r/30122
Tested-by: Hudson CI
Reviewed-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
Tested-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
Reviewed-by: Bernd Hufmann <bernd.hufmann@ericsson.com>
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/internal/tmf/ui/project/handlers/DeleteTraceHandler.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/internal/tmf/ui/project/handlers/Messages.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/internal/tmf/ui/project/handlers/messages.properties

index c8a1490787a9ae804475d1aa206b52186807fc1c..2e5c52c7f78b93c4f4194c8864cbc32dba320e1f 100644 (file)
 
 package org.eclipse.linuxtools.internal.tmf.ui.project.handlers;
 
+import java.lang.reflect.InvocationTargetException;
 import java.util.Iterator;
 
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.ISelectionProvider;
 import org.eclipse.jface.viewers.TreeSelection;
@@ -106,28 +115,90 @@ public class DeleteTraceHandler extends AbstractHandler {
             return null;
         }
 
-        Iterator<Object> iterator = fSelection.iterator();
-        while (iterator.hasNext()) {
-            Object element = iterator.next();
-            if (element instanceof TmfTraceElement) {
-                final TmfTraceElement trace = (TmfTraceElement) element;
-                try {
-                    trace.delete(null);
-                } catch (final CoreException e) {
-                    Display.getDefault().asyncExec(new Runnable() {
-                        @Override
-                        public void run() {
-                            final MessageBox mb = new MessageBox(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
-                            mb.setText(Messages.DeleteTraceHandler_Error + ' ' + trace.getName());
-                            mb.setMessage(e.getMessage());
-                            mb.open();
+        final Iterator<Object> iterator = fSelection.iterator();
+        final int nbTraces = fSelection.size();
+
+        SelectTraceOperation operation = new SelectTraceOperation() {
+            @Override
+            public void execute(IProgressMonitor monitor) throws CoreException {
+                SubMonitor subMonitor = SubMonitor.convert(monitor, nbTraces);
+
+                while (iterator.hasNext()) {
+                    if (monitor.isCanceled()) {
+                        throw new OperationCanceledException();
+                    }
+                    Object element = iterator.next();
+                    if (element instanceof TmfTraceElement) {
+                        final TmfTraceElement trace = (TmfTraceElement) element;
+                        subMonitor.setTaskName(Messages.DeleteTraceHandler_TaskName + " " + trace.getElementPath()); //$NON-NLS-1$
+                        try {
+                            trace.delete(null);
+                        } catch (final CoreException e) {
+                            Display.getDefault().asyncExec(new Runnable() {
+                                @Override
+                                public void run() {
+                                    final MessageBox mb = new MessageBox(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
+                                    mb.setText(Messages.DeleteTraceHandler_Error + ' ' + trace.getName());
+                                    mb.setMessage(e.getMessage());
+                                    mb.open();
+                                }
+                            });
+                            Activator.getDefault().logError("Error deleting trace: " + trace.getName(), e); //$NON-NLS-1$
                         }
-                    });
-                    Activator.getDefault().logError("Error deleting trace: " + trace.getName(), e); //$NON-NLS-1$
+                    }
+                    subMonitor.setTaskName(""); //$NON-NLS-1$
+                    subMonitor.worked(1);
                 }
+           }
+        };
+
+        try {
+            PlatformUI.getWorkbench().getProgressService().run(true, true, operation);
+        } catch (InterruptedException e) {
+            return null;
+        } catch (InvocationTargetException e) {
+            MessageDialog.openError(window.getShell(), e.toString(), e.getTargetException().toString());
+            return null;
+        }
+        return null;
+    }
+
+    private abstract class SelectTraceOperation implements IRunnableWithProgress {
+        @Override
+        public synchronized final void run(IProgressMonitor monitor)
+                throws InvocationTargetException, InterruptedException {
+            final InvocationTargetException[] iteHolder = new InvocationTargetException[1];
+            try {
+                IWorkspaceRunnable workspaceRunnable = new IWorkspaceRunnable() {
+                    @Override
+                    public void run(IProgressMonitor pm) throws CoreException {
+                        try {
+                            execute(pm);
+                        } catch (InvocationTargetException e) {
+                            // Pass it outside the workspace runnable
+                            iteHolder[0] = e;
+                        } catch (InterruptedException e) {
+                            // Re-throw as OperationCanceledException, which will be
+                            // caught and re-thrown as InterruptedException below.
+                            throw new OperationCanceledException(e.getMessage());
+                        }
+                        // CoreException and OperationCanceledException are propagated
+                    }
+                };
+
+                IWorkspace workspace = ResourcesPlugin.getWorkspace();
+                workspace.run(workspaceRunnable, workspace.getRoot(), IWorkspace.AVOID_UPDATE, monitor);
+            } catch (CoreException e) {
+                throw new InvocationTargetException(e);
+            } catch (OperationCanceledException e) {
+                throw new InterruptedException(e.getMessage());
+            }
+            // Re-throw the InvocationTargetException, if any occurred
+            if (iteHolder[0] != null) {
+                throw iteHolder[0];
             }
         }
 
-        return null;
+        protected abstract void execute(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException;
     }
-}
+}
\ No newline at end of file
index 706a4682ad580c73b06a16e8510737ea11b0687e..8d2e0f4346cfaa2f72ab87287d7f2530a862124d 100644 (file)
@@ -29,6 +29,7 @@ public class Messages extends NLS {
     public static String DeleteDialog_Title;
     public static String DeleteTraceHandler_Message;
     public static String DeleteTraceHandler_Error;
+    public static String DeleteTraceHandler_TaskName;
     public static String DeleteExperimentHandler_Message;
     public static String DeleteExperimentHandler_Error;
     public static String DeleteFolderHandler_Message;
index 9aa4322460b8a6a259e8f36fb1c57dd5545cc81e..4d680f09c4a179c39a1378b0345e8eaab762e411 100644 (file)
@@ -14,6 +14,7 @@
 DeleteDialog_Title = Confirm Delete
 DeleteTraceHandler_Message = Are you sure you want to delete this trace?
 DeleteTraceHandler_Error = Error deleting trace
+DeleteTraceHandler_TaskName = Removing trace
 DeleteExperimentHandler_Message = Are you sure you want to delete this experiment?
 DeleteExperimentHandler_Error = Error deleting experiment
 DeleteFolderHandler_Message = Are you sure you want to delete this folder?
This page took 0.036297 seconds and 5 git commands to generate.