Merge branch 'release/5.19.0'
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / EditorUtil.java
index 016fb61fbf52d8e6672dc7f2468f62802316855b..9b9bd9f1a36c7a409220204083a7fb91d4e085f2 100644 (file)
@@ -6,10 +6,11 @@
  * The contents of this file are subject to the Mozilla Public License Version 1.1
  * See LICENSE.TXT at the top of this package for the full license terms.
  */
-
 package eu.etaxonomy.taxeditor.editor;
 
 import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
 import java.util.UUID;
 
 import org.eclipse.core.commands.ExecutionEvent;
@@ -30,6 +31,7 @@ import org.eclipse.ui.IEditorPart;
 import org.eclipse.ui.handlers.HandlerUtil;
 
 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
+import eu.etaxonomy.cdm.model.description.DescriptiveDataSet;
 import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
 import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
@@ -37,6 +39,9 @@ import eu.etaxonomy.cdm.model.taxon.Synonym;
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
 import eu.etaxonomy.cdm.model.taxon.TaxonNode;
 import eu.etaxonomy.cdm.persistence.dto.TaxonNodeDto;
+import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache;
+import eu.etaxonomy.taxeditor.bulkeditor.e4.BulkEditorE4;
+import eu.etaxonomy.taxeditor.bulkeditor.input.TaxonEditorInput;
 import eu.etaxonomy.taxeditor.editor.descriptiveDataSet.DescriptiveDataSetEditor;
 import eu.etaxonomy.taxeditor.editor.descriptiveDataSet.matrix.CharacterMatrixPart;
 import eu.etaxonomy.taxeditor.editor.e4.TaxonEditorInputE4;
@@ -50,19 +55,25 @@ import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView;
 import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateViewEditorInput;
 import eu.etaxonomy.taxeditor.model.AbstractUtility;
 import eu.etaxonomy.taxeditor.model.MessagingUtils;
+import eu.etaxonomy.taxeditor.security.RequiredPermissions;
+import eu.etaxonomy.taxeditor.store.CdmStore;
 import eu.etaxonomy.taxeditor.workbench.WorkbenchUtility;
+import eu.etaxonomy.taxeditor.workbench.part.IE4SavablePart;
 
 /**
  * Utility for the editor package
  *
  * @author n.hoffmann
  * @created 20.01.2009
- * @version 1.0
  */
 public class EditorUtil extends AbstractUtility {
 
     private static final String NAME_EDITOR_ID = "eu.etaxonomy.taxeditor.editor.name.e4.TaxonNameEditorE4";
 
+    private static boolean factsVisible = true;
+
+    private static boolean mediaVisible = true;
+
     public static void openDescriptiveDataSetEditor(UUID descriptiveDataSetUuid, EModelService modelService, EPartService partService, MApplication application){
         Collection<MPart> parts = partService.getParts();
         for (MPart part : parts) {
@@ -93,12 +104,41 @@ public class EditorUtil extends AbstractUtility {
         editor.init(descriptiveDataSetUuid, true);
     }
 
-    public static void openDistributionEditor(UUID parentTaxonUuid, EModelService modelService, EPartService partService, MApplication application){
+    public static void openDistributionEditor(UuidAndTitleCache parentUuidAndTitleCache, EModelService modelService, EPartService partService, MApplication application){
+        Collection<MPart> parts = partService.getParts();
+        String partId = AppModelId.PARTDESCRIPTOR_EU_ETAXONOMY_TAXEDITOR_EDITOR_VIEW_CHECKLIST_E4_DISTRIBUTIONEDITORPART;
+        checkAndCloseFactsAndMediaParts(partService);
+        MPart part = showPart(partId, modelService, partService, application);
+        DistributionEditorPart editor = (DistributionEditorPart) part.getObject();
+        editor.init(parentUuidAndTitleCache);
+    }
+
+    public static void openDistributionEditor(List<UuidAndTitleCache> parentTaxonUuidList, EModelService modelService, EPartService partService, MApplication application){
         Collection<MPart> parts = partService.getParts();
         String partId = AppModelId.PARTDESCRIPTOR_EU_ETAXONOMY_TAXEDITOR_EDITOR_VIEW_CHECKLIST_E4_DISTRIBUTIONEDITORPART;
+        checkAndCloseFactsAndMediaParts(partService);
         MPart part = showPart(partId, modelService, partService, application);
         DistributionEditorPart editor = (DistributionEditorPart) part.getObject();
-        editor.init(parentTaxonUuid);
+        editor.init(parentTaxonUuidList);
+    }
+
+    public static void checkAndCloseFactsAndMediaParts(EPartService partService) {
+        String partIdFactualData = AppModelId.PARTDESCRIPTOR_EU_ETAXONOMY_TAXEDITOR_EDITOR_VIEW_DESCRIPTIVE_E4_FACTUALDATAPARTE4;
+        String partIdMedia = AppModelId.PARTDESCRIPTOR_EU_ETAXONOMY_TAXEDITOR_EDITOR_VIEW_MEDIA_E4_MEDIAVIEWPARTE4;
+        MPart part1 = partService.findPart(AppModelId.PARTDESCRIPTOR_EU_ETAXONOMY_TAXEDITOR_EDITOR_VIEW_DESCRIPTIVE_E4_FACTUALDATAPARTE4);
+        if (factsVisible || (part1!=null && part1.getWidget() != null && partService.isPartVisible(part1))){
+            factsVisible = true;
+        }else{
+            factsVisible = false;
+        }
+        part1 = partService.findPart(AppModelId.PARTDESCRIPTOR_EU_ETAXONOMY_TAXEDITOR_EDITOR_VIEW_MEDIA_E4_MEDIAVIEWPARTE4);
+        if (mediaVisible || (part1!=null && part1.getWidget() != null && partService.isPartVisible(part1))){
+            mediaVisible = true;
+        }else{
+            mediaVisible = false;
+        }
+        closePart(partIdMedia, partService);
+        closePart(partIdFactualData, partService);
     }
 
 
@@ -133,7 +173,21 @@ public class EditorUtil extends AbstractUtility {
         if(editorAreaPartStack!=null){
             editorAreaPartStack.getChildren().add(part);
         }
+
         return partService.showPart(part, PartState.ACTIVATE);
+
+    }
+
+    public static MPart showPart(String partId, EModelService modelService, EPartService partService){
+        MPart part = partService.findPart(partId);
+        if(part==null || modelService.getPartDescriptor(partId).isAllowMultiple()){
+            part = partService.createPart(partId);
+            partService.activate(part);
+        }else{
+            partService.activate(part);
+        }
+
+       return part;
     }
 
        public static void openTaxonNodeE4(UUID taxonNodeUuid, EModelService modelService, EPartService partService, MApplication application) {
@@ -157,9 +211,18 @@ public class EditorUtil extends AbstractUtility {
 
     private static void openNameEditor_internal(TaxonEditorInputE4 input, EModelService modelService, EPartService partService, MApplication application) {
         TaxonBase taxonBase = input.getTaxon();
+        TaxonNode node = input.getTaxonNode();
         if(taxonBase==null){
             return;
         }
+        boolean hasPermission = false;
+//        if (node != null){
+            hasPermission = CdmStore.currentAuthentiationHasPermission(node, RequiredPermissions.TAXON_EDIT);
+//        }
+//        if (!hasPermission){
+//            MessagingUtils.warningDialog(Messages.EditorUtil_MISSING_PERMISSION, TaxonEditorInputE4.class, Messages.EditorUtil_MISSING_PERMISSION_MESSAGE);
+//            return;
+//        }
         if (taxonBase.isOrphaned()) {
             if(taxonBase.isInstanceOf(Synonym.class)){
                 MessagingUtils.warningDialog(Messages.EditorUtil_ORPHAN_ACCEPTED_TAXON, TaxonEditorInputE4.class, Messages.EditorUtil_ORPHAN_ACCEPTED_TAXON_MESSAGE);
@@ -187,11 +250,36 @@ public class EditorUtil extends AbstractUtility {
         MPart part = showPart(NAME_EDITOR_ID, modelService, partService, application);
 
         TaxonNameEditorE4 editor = (TaxonNameEditorE4) part.getObject();
+//        editor.setDisabled();
         editor.init(input);
+//        editor.setEnabled();
+        editor.setFocus();
+        if (factsVisible){
+            showFacts(modelService, partService);
+            factsVisible = false;
+        }
+
+        if (mediaVisible){
+            showMedia(modelService, partService);
+            mediaVisible = false;
+        }
+    }
+
+    public static void showMedia(EModelService modelService, EPartService partService) {
+        String partIdFactualData = AppModelId.PARTDESCRIPTOR_EU_ETAXONOMY_TAXEDITOR_EDITOR_VIEW_MEDIA_E4_MEDIAVIEWPARTE4;
+        showPart(partIdFactualData, modelService, partService);
+
+    }
+
+    public static void showFacts(EModelService modelService, EPartService partService) {
+        String partIdFactualData = AppModelId.PARTDESCRIPTOR_EU_ETAXONOMY_TAXEDITOR_EDITOR_VIEW_DESCRIPTIVE_E4_FACTUALDATAPARTE4;
+        showPart(partIdFactualData, modelService, partService);
+
     }
 
-    public static MPart checkForChanges(UUID taxonUUID, EPartService partService ){
+    public static Collection<MPart> checkForChanges(UUID taxonUUID, EPartService partService ){
         Collection<MPart> parts = partService.getParts();
+        Collection<MPart> dirtyParts = new HashSet();
         //check if part is already opened
         boolean isDirty = false;
         for (MPart part : parts) {
@@ -199,13 +287,39 @@ public class EditorUtil extends AbstractUtility {
                     && ((TaxonNameEditorE4) part.getObject()).getTaxon()!=null
                     && ((TaxonNameEditorE4) part.getObject()).getTaxon().getUuid().equals(taxonUUID)){
                 if (part.isDirty()){
-                    return part;
+                    dirtyParts.add(part);
                 }
 
                 break;
+            }else if (taxonUUID == null){
+                if (part.isDirty()){
+                    dirtyParts.add(part);
+                }
             }
         }
-        return null;
+        return dirtyParts;
+    }
+
+    public static Collection<IE4SavablePart> checkForTaxonChanges(UUID taxonUUID, EPartService partService ){
+        Collection<MPart> parts = partService.getParts();
+        Collection<IE4SavablePart> dirtyParts = new HashSet<>();
+        //check if part is already opened
+        for (MPart part : parts) {
+            if(part.getObject() instanceof TaxonNameEditorE4
+                    && ((TaxonNameEditorE4) part.getObject()).getTaxon()!=null
+                    && ((TaxonNameEditorE4) part.getObject()).getTaxon().getUuid().equals(taxonUUID)){
+                if (part.isDirty()){
+                    dirtyParts.add((IE4SavablePart) part);
+                }
+
+                break;
+            }else if (taxonUUID == null){
+                if (part.isDirty() && (part.getObject() instanceof TaxonNameEditorE4 || (part.getObject() instanceof BulkEditorE4 && ((BulkEditorE4)part.getObject()).getEditorInput() instanceof TaxonEditorInput))){
+                    dirtyParts.add((IE4SavablePart) part.getObject());
+                }
+            }
+        }
+        return dirtyParts;
     }
 
        /**
@@ -238,7 +352,23 @@ public class EditorUtil extends AbstractUtility {
                return IOperationHistory.GLOBAL_UNDO_CONTEXT;
        }
 
-       /**
+       public static boolean isFactsVisible() {
+        return factsVisible;
+    }
+
+    public static void setFactsVisible(boolean factsVisible) {
+        EditorUtil.factsVisible = factsVisible;
+    }
+
+    public static boolean isMediaVisible() {
+        return mediaVisible;
+    }
+
+    public static void setMediaVisible(boolean mediaVisible) {
+        EditorUtil.mediaVisible = mediaVisible;
+    }
+
+    /**
         * <p>
         * forceUserSave
         * </p>
@@ -265,7 +395,7 @@ public class EditorUtil extends AbstractUtility {
                return true;
        }
 
-       public static boolean forceUserSaveE4Editor(TaxonNameEditorE4 editor, Shell shell) {
+       public static boolean forceUserSaveE4Editor(IE4SavablePart editor, Shell shell) {
            if (editor.isDirty()) {
 
                boolean doSave = MessageDialog
@@ -370,14 +500,64 @@ public class EditorUtil extends AbstractUtility {
         }
     }
 
+    public static void closeObsoleteEditorWithChildren(TaxonNodeDto taxonNode, EPartService partService){
+        String treeIndex = taxonNode.getTreeIndex();
+        Collection<MPart> parts = partService.getParts();
+        for (MPart part : parts) {
+            Object object = part.getObject();
+            if(object instanceof TaxonNameEditorE4){
+                TaxonNameEditorE4 taxonEditor = (TaxonNameEditorE4)object;
+                TaxonNode node = taxonEditor.getEditorInput().getTaxonNode();
+                if (node.treeIndex()!= null){
+                    if(node.treeIndex().startsWith(treeIndex)){
+                        if (part.isDirty()){
+                            forceUserSaveE4Editor(taxonEditor, getShell());
+                        }
+                        partService.hidePart(part);
+                    }
+                }else{
+                    logger.debug("The taxonnode of taxon " + node.getTaxon().getTitleCache() + " uuid: " + node.getUuid() + " has no treeindex");;
+                }
+            }
+        }
+    }
+
+    public static void closeObsoleteDescriptiveDatasetEditor(UUID datasetUuid, EPartService partService){
+
+        Collection<MPart> parts = partService.getParts();
+        for (MPart part : parts) {
+            Object object = part.getObject();
+            if(object instanceof DescriptiveDataSetEditor){
+                DescriptiveDataSetEditor editor = (DescriptiveDataSetEditor)object;
+                DescriptiveDataSet descDataSet = editor.getDescriptiveDataSet();
+                if(descDataSet.getUuid().equals(datasetUuid)){
+                    if (part.isDirty()){
+                        forceUserSaveE4Editor(editor, getShell());
+                    }
+                    partService.hidePart(part);
+                }
+
+            }
+        }
+    }
+
+    public static void closePart(String partID, EPartService partService){
+
+        Collection<MPart> parts = partService.getParts();
+        for (MPart part : parts) {
+            String elementId = part.getElementId();
+            if (elementId.equals(partID)){
+                partService.hidePart(part);
+            }
+        }
+    }
+
     public static void updateEditor(TaxonNode taxonNode, TaxonNameEditorE4 editor){
         String treeIndex = taxonNode.treeIndex();
         TaxonNode node = editor.getEditorInput().getTaxonNode();
         if(node.treeIndex().equals(treeIndex)){
                TaxonEditorInputE4 input = TaxonEditorInputE4.NewInstance(node.getUuid());
                editor.init(input);
-
-
         }
     }
-}
+}
\ No newline at end of file