Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/project/handlers/DeleteTraceFolderElementHandler.java')
-rw-r--r--tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/project/handlers/DeleteTraceFolderElementHandler.java349
1 files changed, 349 insertions, 0 deletions
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/project/handlers/DeleteTraceFolderElementHandler.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/project/handlers/DeleteTraceFolderElementHandler.java
new file mode 100644
index 0000000000..22a5211b1e
--- /dev/null
+++ b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/project/handlers/DeleteTraceFolderElementHandler.java
@@ -0,0 +1,349 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2014 Ericsson, École Polytechnique de Montréal
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Francois Chouinard - Initial API and implementation
+ * Patrick Tasse - Close editors to release resources
+ * Geneviève Bastien - Moved the delete code to element model's classes
+ * Marc-Andre Laperle - Merged DeleteTraceHandler and DeleteFolderHandler
+ *******************************************************************************/
+
+package org.eclipse.tracecompass.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.IResource;
+import org.eclipse.core.resources.IResourceVisitor;
+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.core.runtime.SubProgressMonitor;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.MessageBox;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.tracecompass.internal.tmf.ui.Activator;
+import org.eclipse.tracecompass.internal.tmf.ui.project.operations.TmfWorkspaceModifyOperation;
+import org.eclipse.tracecompass.tmf.ui.project.model.TmfExperimentElement;
+import org.eclipse.tracecompass.tmf.ui.project.model.TmfTraceElement;
+import org.eclipse.tracecompass.tmf.ui.project.model.TmfTraceFolder;
+import org.eclipse.tracecompass.tmf.ui.project.model.TmfTracesFolder;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * An handler for deletion of both traces and trace folders. It allows mixing
+ * both types of elements.
+ */
+public class DeleteTraceFolderElementHandler extends AbstractHandler {
+
+ private TreeSelection fSelection = null;
+
+ private enum DeleteType {
+ /**
+ * Only trace folders are selected.
+ */
+ DELETE_TRACE_FOLDERS,
+ /**
+ * Only traces are selected.
+ */
+ DELETE_TRACES,
+ /**
+ * A mix of different elements are selected.
+ */
+ DELETE_GENERIC,
+ /**
+ * Only Traces (top trace folders) are selected.
+ */
+ CLEAR_TRACES_FOLDER,
+ /**
+ * Only Traces under experiments are selected.
+ */
+ REMOVE_TRACES_FROM_EXPERIMENT
+ }
+
+ // ------------------------------------------------------------------------
+ // Validation
+ // ------------------------------------------------------------------------
+
+ @Override
+ public boolean isEnabled() {
+
+ // Check if we are closing down
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window == null) {
+ return false;
+ }
+
+ // Get the selection
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ IWorkbenchPart part = page.getActivePart();
+ if (part == null) {
+ return false;
+ }
+ ISelectionProvider selectionProvider = part.getSite().getSelectionProvider();
+ if (selectionProvider == null) {
+ return false;
+ }
+ ISelection selection = selectionProvider.getSelection();
+
+ // Make sure selection contains only traces and trace folders
+ fSelection = null;
+ if (selection instanceof TreeSelection) {
+ fSelection = (TreeSelection) selection;
+ Iterator<Object> iterator = fSelection.iterator();
+ while (iterator.hasNext()) {
+ Object element = iterator.next();
+ if (!(element instanceof TmfTraceElement) && !(element instanceof TmfTraceFolder)) {
+ return false;
+ }
+ }
+ }
+
+ // If we get here, either nothing is selected or everything is a trace or folder
+ return !selection.isEmpty();
+ }
+
+ // ------------------------------------------------------------------------
+ // Execution
+ // ------------------------------------------------------------------------
+
+ private static DeleteType getDeleteType(ISelection selection) {
+ int numTracesFolder = 0;
+ int numTraceFolder = 0;
+ int numTraces = 0;
+ int numTracesUnderExperiment = 0;
+
+ @SuppressWarnings("rawtypes")
+ Iterator iterator = ((IStructuredSelection) selection).iterator();
+ while (iterator.hasNext()) {
+ Object next = iterator.next();
+ if ((next instanceof TmfTracesFolder)) {
+ numTracesFolder++;
+ } else if (next instanceof TmfTraceFolder) {
+ numTraceFolder++;
+ } else if (next instanceof TmfTraceElement) {
+ TmfTraceElement traceElement = (TmfTraceElement) next;
+ if (traceElement.getParent() instanceof TmfExperimentElement) {
+ numTracesUnderExperiment++;
+ } else {
+ numTraces++;
+ }
+ }
+ }
+
+ int total = numTraceFolder + numTracesFolder + numTracesUnderExperiment + numTraces;
+
+ if (numTracesFolder == total) {
+ return DeleteType.CLEAR_TRACES_FOLDER;
+ }
+
+ if (numTraceFolder == total) {
+ return DeleteType.DELETE_TRACE_FOLDERS;
+ }
+
+ if (numTraces == total) {
+ return DeleteType.DELETE_TRACES;
+ }
+
+ if (numTracesUnderExperiment == total) {
+ return DeleteType.REMOVE_TRACES_FROM_EXPERIMENT;
+ }
+
+ return DeleteType.DELETE_GENERIC;
+ }
+
+ private static String getTitle(final DeleteType deleteType) {
+ switch (deleteType)
+ {
+ case DELETE_GENERIC:
+ case DELETE_TRACES:
+ case DELETE_TRACE_FOLDERS:
+ return Messages.DeleteDialog_Title;
+ case CLEAR_TRACES_FOLDER:
+ return Messages.ClearDialog_Title;
+ case REMOVE_TRACES_FROM_EXPERIMENT:
+ return Messages.RemoveDialog_Title;
+ default:
+ throw new IllegalArgumentException();
+ }
+ }
+
+ private static String getMessage(DeleteType deleteType) {
+ switch (deleteType)
+ {
+ case DELETE_GENERIC:
+ return Messages.DeleteTraceHandlerGeneric_Message;
+ case DELETE_TRACES:
+ return Messages.DeleteTraceHandler_Message;
+ case CLEAR_TRACES_FOLDER:
+ return Messages.DeleteFolderHandlerClear_Message;
+ case DELETE_TRACE_FOLDERS:
+ return Messages.DeleteFolderHandler_Message;
+ case REMOVE_TRACES_FROM_EXPERIMENT:
+ return Messages.RemoveTraceFromExperimentHandler_Message;
+ default:
+ throw new IllegalArgumentException();
+ }
+ }
+
+ private static String getTraceErrorMessage(DeleteType deleteType) {
+ return deleteType == DeleteType.REMOVE_TRACES_FROM_EXPERIMENT ? Messages.RemoveTraceFromExperimentHandler_Error : Messages.DeleteFolderHandler_Error;
+ }
+
+ private static String getFolderErrorMessage(DeleteType deleteType) {
+ return deleteType == DeleteType.CLEAR_TRACES_FOLDER ? Messages.DeleteFolderHandlerClear_Error : Messages.DeleteFolderHandler_Error;
+ }
+
+ private static String getTraceTaskName(DeleteType deleteType) {
+ return deleteType == DeleteType.REMOVE_TRACES_FROM_EXPERIMENT ? Messages.RemoveTraceFromExperimentHandler_TaskName : Messages.DeleteFolderHandler_TaskName;
+ }
+
+ private static String getTraceFolderTaskName(DeleteType deleteType) {
+ return deleteType == DeleteType.CLEAR_TRACES_FOLDER ? Messages.DeleteFolderHandlerClear_TaskName : Messages.DeleteFolderHandler_TaskName;
+ }
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+
+ // Check if we are closing down
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window == null) {
+ return null;
+ }
+
+ // Get the selection
+ ISelection selection = HandlerUtil.getCurrentSelection(event);
+ if (!(selection instanceof IStructuredSelection)) {
+ return null;
+ }
+ final DeleteType deleteType = getDeleteType(selection);
+
+ // Confirm the operation
+ Shell shell = window.getShell();
+ MessageBox confirmOperation = new MessageBox(shell, SWT.ICON_QUESTION | SWT.CANCEL | SWT.OK);
+ confirmOperation.setText(getTitle(deleteType));
+ confirmOperation.setMessage(getMessage(deleteType));
+ if (confirmOperation.open() != SWT.OK) {
+ return null;
+ }
+
+ final Iterator<Object> iterator = fSelection.iterator();
+ final int nbElements = fSelection.size();
+
+ TmfWorkspaceModifyOperation operation = new TmfWorkspaceModifyOperation() {
+ @Override
+ public void execute(IProgressMonitor monitor) throws CoreException {
+ SubMonitor subMonitor = SubMonitor.convert(monitor, nbElements);
+
+ while (iterator.hasNext()) {
+ if (monitor.isCanceled()) {
+ throw new OperationCanceledException();
+ }
+ Object element = iterator.next();
+ SubProgressMonitor elementSubMonitor = new SubProgressMonitor(subMonitor, 1);
+ if (element instanceof TmfTraceElement) {
+ final TmfTraceElement trace = (TmfTraceElement) element;
+ if (!trace.getResource().exists()) {
+ continue;
+ }
+ subMonitor.setTaskName(getTraceTaskName(deleteType) + " " + trace.getElementPath()); //$NON-NLS-1$
+ try {
+ SubMonitor deleteSubMonitor = SubMonitor.convert(elementSubMonitor, 1);
+ trace.delete(deleteSubMonitor);
+ } catch (final CoreException e) {
+ Display.getDefault().asyncExec(new Runnable() {
+ @Override
+ public void run() {
+ final MessageBox mb = new MessageBox(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
+ mb.setText(getTraceErrorMessage(deleteType) + ' ' + trace.getName());
+ mb.setMessage(e.getMessage());
+ mb.open();
+ }
+ });
+ Activator.getDefault().logError(getTraceErrorMessage(deleteType) + trace.getName(), e);
+ }
+ } else if (element instanceof TmfTraceFolder) {
+ final TmfTraceFolder folder = (TmfTraceFolder) element;
+ final IResource resource = folder.getResource();
+ if (!resource.exists()) {
+ continue;
+ }
+
+ subMonitor.setTaskName(getTraceFolderTaskName(deleteType) + " " + folder.getPath()); //$NON-NLS-1$
+
+ try {
+ // delete all traces under this folder
+ SubMonitor childrenSubMonitor = SubMonitor.convert(elementSubMonitor, folder.getTraces().size() + 1);
+ for (TmfTraceElement traceElement : folder.getTraces()) {
+ SubProgressMonitor deleteSubMonitor = new SubProgressMonitor(childrenSubMonitor, 1);
+ traceElement.delete(deleteSubMonitor);
+ }
+
+ // Finally, delete the folder. For the Traces
+ // folder, we only delete the children since the
+ // folder should always be there.
+ final SubProgressMonitor deleteSubMonitor = new SubProgressMonitor(subMonitor, 1);
+ if (folder instanceof TmfTracesFolder) {
+ resource.accept(new IResourceVisitor() {
+ @Override
+ public boolean visit(IResource visitedResource) throws CoreException {
+ if (visitedResource != resource) {
+ visitedResource.delete(true, deleteSubMonitor);
+ }
+ return true;
+ }
+ }, IResource.DEPTH_ONE, 0);
+ } else {
+ resource.delete(true, deleteSubMonitor);
+ }
+ childrenSubMonitor.done();
+ } catch (final CoreException e) {
+ Display.getDefault().asyncExec(new Runnable() {
+ @Override
+ public void run() {
+ final MessageBox mb = new MessageBox(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
+ mb.setText(getFolderErrorMessage(deleteType) + ' ' + folder.getName());
+ mb.setMessage(e.getMessage());
+ mb.open();
+ }
+ });
+ Activator.getDefault().logError(getFolderErrorMessage(deleteType) + folder.getName(), e);
+ }
+ }
+ subMonitor.setTaskName(""); //$NON-NLS-1$
+ elementSubMonitor.done();
+ }
+ }
+ };
+
+ 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;
+ }
+
+} \ No newline at end of file

Back to the top