#5252 Add remove method to manually remove root derivate
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / view / derivate / operation / DeleteDerivateOperation.java
index 5032dde4168c692c542897a6675c5be41ed89a75..a095409820eceac0619944df587cb2a934934863 100644 (file)
@@ -14,15 +14,25 @@ import org.eclipse.core.commands.operations.IUndoContext;
 import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.viewers.TreeNode;
+import org.eclipse.ui.ISaveablePart;
 
 import eu.etaxonomy.cdm.api.service.DeleteResult;
 import eu.etaxonomy.cdm.api.service.IOccurrenceService;
 import eu.etaxonomy.cdm.api.service.config.SpecimenDeleteConfigurator;
+import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
 import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.molecular.Sequence;
+import eu.etaxonomy.cdm.model.molecular.SingleRead;
+import eu.etaxonomy.taxeditor.editor.Messages;
+import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView;
+import eu.etaxonomy.taxeditor.model.AbstractUtility;
 import eu.etaxonomy.taxeditor.model.MessagingUtils;
 import eu.etaxonomy.taxeditor.operation.AbstractPostOperation;
 import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
 import eu.etaxonomy.taxeditor.store.CdmStore;
+import eu.etaxonomy.taxeditor.ui.dialog.deleteConfigurator.DeleteConfiguratorDialog;
 
 /**
  *
@@ -33,65 +43,82 @@ import eu.etaxonomy.taxeditor.store.CdmStore;
 public class DeleteDerivateOperation extends AbstractPostOperation<CdmBase> {
 
     private final SpecimenDeleteConfigurator deleteConfigurator;
+    private final TreeNode treeNode;
 
-    public DeleteDerivateOperation(String label, IUndoContext undoContext, CdmBase element,
+    public DeleteDerivateOperation(String label, IUndoContext undoContext, CdmBase element, TreeNode treeNode,
             IPostOperationEnabled postOperationEnabled) {
-        this(label, undoContext, element, postOperationEnabled, new SpecimenDeleteConfigurator());
+        this(label, undoContext, element, treeNode, postOperationEnabled, new SpecimenDeleteConfigurator());
     }
 
-    public DeleteDerivateOperation(String label, IUndoContext undoContext, CdmBase element,
+    public DeleteDerivateOperation(String label, IUndoContext undoContext, CdmBase element, TreeNode treeNode,
             IPostOperationEnabled postOperationEnabled, SpecimenDeleteConfigurator config) {
         super(label, undoContext, element, postOperationEnabled);
         this.deleteConfigurator = config;
+        this.treeNode = treeNode;
     }
 
 
-    /*
-     * (non-Javadoc)
-     *
-     * @see
-     * org.eclipse.core.commands.operations.AbstractOperation#execute(org.eclipse
-     * .core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
-     */
     /** {@inheritDoc} */
     @Override
     public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-        DeleteResult deleteResult = CdmStore.getService(IOccurrenceService.class).deleteDerivateHierarchy(element, deleteConfigurator);
-        if(!deleteResult.isOk()){
-            String exceptionMessage = "";
-            for(Exception exception:deleteResult.getExceptions()){
-                exceptionMessage += exception.getLocalizedMessage();
+        if(getPostOperationEnabled() instanceof ISaveablePart){
+            String confirmationQuestion = Messages.DeleteDerivateOperation_REALLY_DELETE;
+            if(deleteConfigurator.isDeleteChildren()){
+                confirmationQuestion += Messages.DeleteDerivateOperation_AND_CHILDREN;
             }
-            //TODO: add method to DeleteResult to sum up exceptions
-            MessagingUtils.warningDialog("Deletion failed", this, exceptionMessage);
-            return postExecute(null);
+            confirmationQuestion += "?"; //$NON-NLS-1$
+            if(!DeleteConfiguratorDialog.openConfirmWithConfigurator(deleteConfigurator, null, Messages.DeleteDerivateOperation_CONFIRM, confirmationQuestion)){
+                return Status.CANCEL_STATUS;
+            }
+            if(((ISaveablePart) getPostOperationEnabled()).isDirty()){
+                MessagingUtils.warningDialog(DerivateView.VIEW_HAS_UNSAVED_CHANGES, this, DerivateView.YOU_NEED_TO_SAVE_BEFORE_PERFORMING_THIS_ACTION);
+                return Status.CANCEL_STATUS;
+            }
+        }
+        DeleteResult deleteResult;
+        if(element instanceof SingleRead && treeNode!=null
+                && treeNode.getValue().equals(element)
+                && treeNode.getParent()!=null
+                && treeNode.getParent().getValue() instanceof Sequence){
+            deleteResult = CdmStore.getService(IOccurrenceService.class).deleteSingleRead(((SingleRead)element).getUuid(),
+                    ((Sequence) treeNode.getParent().getValue()).getUuid());
+        } else if(element instanceof Sequence){
+            deleteResult = CdmStore.getService(ISequenceService.class).delete(element.getUuid(), deleteConfigurator);
+        } else {
+            deleteResult = CdmStore.getService(IOccurrenceService.class).deleteDerivateHierarchy(element.getUuid(), deleteConfigurator);
+        }
+        if(deleteResult.isOk()){
+            if(getPostOperationEnabled() instanceof DerivateView){
+                DerivateView derivateView = (DerivateView) getPostOperationEnabled();
+                derivateView.remove(element);
+                //update DerivateView
+                derivateView.getConversationHolder().commit();
+                IStatus returnStatus = postExecute(null);
+                //close if no more items left
+                if(derivateView.getViewer().getTree().getItemCount()<1){
+                    AbstractUtility.close(derivateView);
+                }
+                return returnStatus;
+            }
+        }
+        else{
+            MessagingUtils.warningDialog(Messages.DeleteDerivateOperation_DELETE_FAILED, this, deleteResult.toString());
+            return Status.CANCEL_STATUS;
         }
-        return postExecute(element);
+        return Status.OK_STATUS;
     }
 
-    /*
-     * (non-Javadoc)
-     *
-     * @see
-     * org.eclipse.core.commands.operations.AbstractOperation#redo(org.eclipse
-     * .core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
-     */
     /** {@inheritDoc} */
     @Override
     public IStatus redo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-        return execute(monitor, info);
+        //no redo possible
+        return Status.CANCEL_STATUS ;
     }
 
-    /*
-     * (non-Javadoc)
-     *
-     * @see
-     * org.eclipse.core.commands.operations.AbstractOperation#undo(org.eclipse
-     * .core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
-     */
     /** {@inheritDoc} */
     @Override
     public IStatus undo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-        return postExecute(element);
+        //no undo possible
+        return Status.CANCEL_STATUS;
     }
 }