cleanup and remove generics from Identifier class
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / view / e4 / details / DetailsViewerE4.java
index 7be1d784d9a77036e9b33e204aa2973ff78201d7..e919b5ea0d7e6be1e1830232c05643e1cdc5dbe5 100755 (executable)
@@ -6,9 +6,10 @@
  * 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.view.e4.details;
 
+import java.util.Collection;
+import java.util.EnumSet;
 import java.util.HashSet;
 import java.util.Set;
 
@@ -21,17 +22,15 @@ import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.TreeNode;
 import org.eclipse.swt.SWT;
+import org.springframework.security.core.GrantedAuthority;
 
 import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade;
 import eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeNotSupportedException;
 import eu.etaxonomy.cdm.ext.occurrence.gbif.GbifResponse;
-import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
 import eu.etaxonomy.cdm.model.agent.Person;
 import eu.etaxonomy.cdm.model.agent.Team;
 import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
-import eu.etaxonomy.cdm.model.common.Group;
 import eu.etaxonomy.cdm.model.common.Marker;
-import eu.etaxonomy.cdm.model.common.User;
 import eu.etaxonomy.cdm.model.description.CategoricalData;
 import eu.etaxonomy.cdm.model.description.Character;
 import eu.etaxonomy.cdm.model.description.DescriptionBase;
@@ -49,15 +48,24 @@ import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
 import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
 import eu.etaxonomy.cdm.model.occurrence.MediaSpecimen;
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
+import eu.etaxonomy.cdm.model.permission.CRUD;
+import eu.etaxonomy.cdm.model.permission.Group;
+import eu.etaxonomy.cdm.model.permission.User;
 import eu.etaxonomy.cdm.model.reference.Reference;
+import eu.etaxonomy.cdm.model.taxon.Synonym;
+import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
+import eu.etaxonomy.cdm.model.taxon.TaxonNode;
 import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;
 import eu.etaxonomy.cdm.model.term.DefinedTermBase;
-import eu.etaxonomy.cdm.model.term.FeatureNode;
-import eu.etaxonomy.cdm.model.term.FeatureTree;
+import eu.etaxonomy.cdm.model.term.TermNode;
+import eu.etaxonomy.cdm.model.term.TermTree;
+import eu.etaxonomy.cdm.model.term.TermType;
 import eu.etaxonomy.cdm.model.term.TermVocabulary;
+import eu.etaxonomy.cdm.persistence.dto.TermNodeDto;
+import eu.etaxonomy.cdm.persistence.dto.TermTreeDto;
 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
-import eu.etaxonomy.taxeditor.editor.IDistributionEditor;
+import eu.etaxonomy.taxeditor.editor.IDistributionEditorPart;
 import eu.etaxonomy.taxeditor.event.WorkbenchEventConstants;
 import eu.etaxonomy.taxeditor.l10n.Messages;
 import eu.etaxonomy.taxeditor.model.AbstractUtility;
@@ -67,14 +75,18 @@ import eu.etaxonomy.taxeditor.model.MessagingUtils;
 import eu.etaxonomy.taxeditor.model.PolytomousKeyRelationship;
 import eu.etaxonomy.taxeditor.preference.NameDetailsConfigurator;
 import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
+import eu.etaxonomy.taxeditor.store.CdmStore;
 import eu.etaxonomy.taxeditor.store.StoreUtil;
 import eu.etaxonomy.taxeditor.store.UsageTermCollection;
+import eu.etaxonomy.taxeditor.termtree.e4.ICharacterEditor;
+import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
 import eu.etaxonomy.taxeditor.ui.element.RootElement;
 import eu.etaxonomy.taxeditor.ui.section.agent.PersonDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.agent.TeamDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.agent.TeamOrPersonBaseDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.common.ReferencedEntityDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.description.DescriptionDetailSection;
+import eu.etaxonomy.taxeditor.ui.section.description.DescriptionElementDetailElement;
 import eu.etaxonomy.taxeditor.ui.section.description.DescriptionElementDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.description.DescriptionElementMediaSection;
 import eu.etaxonomy.taxeditor.ui.section.description.DescriptionElementSourceSection;
@@ -82,10 +94,14 @@ import eu.etaxonomy.taxeditor.ui.section.description.DescriptionSourceSection;
 import eu.etaxonomy.taxeditor.ui.section.description.MediaDetailsSection;
 import eu.etaxonomy.taxeditor.ui.section.description.NaturalLanguageSection;
 import eu.etaxonomy.taxeditor.ui.section.description.ScopeSection;
+import eu.etaxonomy.taxeditor.ui.section.description.detail.DistributionDetailElement;
 import eu.etaxonomy.taxeditor.ui.section.feature.CharacterDetailSection;
+import eu.etaxonomy.taxeditor.ui.section.feature.CharacterNodeDetailSection;
+import eu.etaxonomy.taxeditor.ui.section.feature.CharacterNodeDtoDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.feature.FeatureDistributionDetailSection;
-import eu.etaxonomy.taxeditor.ui.section.feature.FeatureNodeDetailSection;
-import eu.etaxonomy.taxeditor.ui.section.feature.FeatureTreeDetailSection;
+import eu.etaxonomy.taxeditor.ui.section.feature.TermNodeDetailSection;
+import eu.etaxonomy.taxeditor.ui.section.feature.TermTreeDetailSection;
+import eu.etaxonomy.taxeditor.ui.section.feature.TermTreeDetailSectionForNode;
 import eu.etaxonomy.taxeditor.ui.section.grantedAuthority.GrantedAuthorityDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.group.GroupDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.group.MemberDetailSection;
@@ -94,7 +110,6 @@ import eu.etaxonomy.taxeditor.ui.section.key.PolytomousKeyNodeDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.name.NameRelationshipDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.name.NomenclaturalStatusSection;
 import eu.etaxonomy.taxeditor.ui.section.name.NonViralNameDetailSection;
-import eu.etaxonomy.taxeditor.ui.section.name.ProtologueSection;
 import eu.etaxonomy.taxeditor.ui.section.name.TypeDesignationSection;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.DerivedUnitBaseDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.DerivedUnitGeneralDetailSection;
@@ -128,10 +143,10 @@ import eu.etaxonomy.taxeditor.ui.section.userecords.UseRecordDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.vocabulary.DefinedTermDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.vocabulary.TermMediaSection;
 import eu.etaxonomy.taxeditor.ui.section.vocabulary.TermVocabularyDetailSection;
+import eu.etaxonomy.taxeditor.view.detail.CdmSectionPart;
 import eu.etaxonomy.taxeditor.view.e4.AbstractCdmDataViewerE4;
 
 /**
- *
  * The DetailsViewer handles the content of the details view (
  * {@link DetailsPartE4}).<br>
  * Depending on the type of the selected element the section of the details view
@@ -139,12 +154,12 @@ import eu.etaxonomy.taxeditor.view.e4.AbstractCdmDataViewerE4;
  *
  * @author pplitzner
  * @date 18.07.2017
- *
  */
 public class DetailsViewerE4 extends AbstractCdmDataViewerE4 {
 
     private ISelection selection;
     private boolean detailsEnabled = true;
+    private Object activePart;
 
     public boolean isDetailsEnabled() {
                return detailsEnabled;
@@ -155,11 +170,7 @@ public class DetailsViewerE4 extends AbstractCdmDataViewerE4 {
        }
 
        public void setInput(Object input, Object activePart) {
-        if (activePart instanceof IDistributionEditor){
-            detailsEnabled = false;
-        }else{
-            detailsEnabled = true;
-        }
+           this.activePart = activePart;
         setInput(input);
 
     }
@@ -177,17 +188,15 @@ public class DetailsViewerE4 extends AbstractCdmDataViewerE4 {
         if(input instanceof GbifResponse){
             input = ((GbifResponse) input).getDerivedUnitFacade();
         }
-        if(input instanceof FeatureNode
-                && HibernateProxyHelper.isInstanceOf(((FeatureNode) input).getTerm(), Character.class)){
-            input = HibernateProxyHelper.deproxy(((FeatureNode) input).getTerm(), Character.class);
-        }
-        if (input !=null && input.getClass().equals(DerivedUnit.class)) {
+        if (input instanceof MediaSpecimen && !(this.activePart.getClass().getSimpleName().equals("BulkEditorE4"))){
+            //do nothing
+        }else if (input instanceof DerivedUnit) {
             DerivedUnit derivedUnit = (DerivedUnit)input;
             try {
                 input = DerivedUnitFacade.NewInstance(derivedUnit,
                         PreferencesUtil.getDerivedUnitConfigurator());
             } catch (DerivedUnitFacadeNotSupportedException e) {
-                //                MessagingUtils.error(getClass(), e); //nothing should happen, later on the Details View will show an according information that it is not possible to open this data
+                                MessagingUtils.error(getClass(), e); //nothing should happen, later on the Details View will show an according information that it is not possible to open this data
             }
         }
         else if(input instanceof FieldUnit){
@@ -217,7 +226,6 @@ public class DetailsViewerE4 extends AbstractCdmDataViewerE4 {
         }
     }
 
-    /** {@inheritDoc} */
     @Override
     protected void showParts() {
         // FIXME (CM) : Need to clean out this code.
@@ -231,7 +239,7 @@ public class DetailsViewerE4 extends AbstractCdmDataViewerE4 {
         }
         destroySections();
         if (input instanceof TaxonBase) {
-            if(((TaxonBase) input).getName()==null){
+            if(((TaxonBase<?>) input).getName()==null){
                 createEmptySection(Messages.DetailsViewerE4_TAXON_HAS_NO_NAME, rootElement);
             }
             else{
@@ -295,16 +303,15 @@ public class DetailsViewerE4 extends AbstractCdmDataViewerE4 {
             if (isUseDescription == true && input instanceof CategoricalData) {
                 createUseRecordSection(rootElement);
             } else {
-                createDescriptionElementSection(rootElement);
+                createDescriptionElementSection(rootElement, activePart);
             }
 
         } else if (input instanceof Media) {
             createMediaElementSection(rootElement);
-
         }
         //FIXME hack to show more informative message to the user when
         //DerivedUnit has more than one FieldUnit #4363
-        else if (input.getClass().equals(DerivedUnit.class)) {
+        else if (input instanceof DerivedUnit && !(input instanceof MediaSpecimen)) {
             DerivedUnit derivedUnit = (DerivedUnit)input;
             try {
                 input = DerivedUnitFacade.NewInstance(derivedUnit,
@@ -314,28 +321,40 @@ public class DetailsViewerE4 extends AbstractCdmDataViewerE4 {
             }
         }
         else if (input instanceof DerivedUnitFacade) {
-            if(((DerivedUnitFacade) input).getType()==SpecimenOrObservationType.FieldUnit){
-                if(((DerivedUnitFacade) input).innerFieldUnit()==null){
+            DerivedUnitFacade facade = (DerivedUnitFacade) input;
+            if(facade.getType() == SpecimenOrObservationType.FieldUnit){
+                if(facade.innerFieldUnit() == null){
                     MessagingUtils.error(DetailsViewerE4.class, "FieldUnit of facade is null", null); //$NON-NLS-1$
                 }
                 else{
                     createFieldUnitSection(rootElement);
                 }
             }
-            else if(((DerivedUnitFacade) input).getType()==SpecimenOrObservationType.PreservedSpecimen){
-                if(((DerivedUnitFacade) input).innerDerivedUnit()==null){
+            else if(facade.getType() == SpecimenOrObservationType.PreservedSpecimen){
+                if(facade.innerDerivedUnit() == null){
                     MessagingUtils.error(DetailsViewerE4.class, "DerivedUnit of facade is null", null); //$NON-NLS-1$
                 }
                 else{
                     createDerivedUnitBaseElementSection(rootElement);
                 }
             }
-            else if(((DerivedUnitFacade) input).getType()==SpecimenOrObservationType.TissueSample){
+            else if(facade.getType() == SpecimenOrObservationType.TissueSample){
                 //TissueSample should only be created by using it's own class
                 //in future using only one class with different SpecimenOrObservationTypes is desired
                 createTissueSampleSection(rootElement);
             }
-            else{
+            else if(facade.getType()==SpecimenOrObservationType.DnaSample){
+
+                if(facade.innerDerivedUnit().getRecordBasis()==SpecimenOrObservationType.TissueSample){
+                    //this case seems to be very unlikely as innerDerivedUnit has almost always the same type
+                    createTissueSampleSection(rootElement);
+                }
+                else if(facade.innerDerivedUnit().getRecordBasis()==SpecimenOrObservationType.DnaSample){
+                    createDnaSampleSection(rootElement);
+                }
+            }else if (facade.innerDerivedUnit() instanceof MediaSpecimen){
+                createEmptySection("Image specimen not supported by specimen list editor", rootElement);
+            }else{
                 createDerivedUnitBaseElementSection(rootElement);
             }
         } else if (input instanceof DnaSample){
@@ -358,12 +377,30 @@ public class DetailsViewerE4 extends AbstractCdmDataViewerE4 {
         else if (input instanceof FeatureNodeContainer) {
             createFeatureDistributionSection(rootElement);
 
-        } else if (input instanceof FeatureNode) {
-            createFeatureNodeSection(rootElement);
+        } else if (input instanceof TermNode) {
+            TermType type= ((TermNode<?>) input).getTermType();
+            if(type.equals(TermType.Character) ){
+                createCharacterNodeSection(rootElement);
+            }
+            else if(type.equals(TermType.Feature)){
+                createFeatureNodeSection(rootElement);
+            }
 
-        } else if (input instanceof FeatureTree) {
+        } else if (input instanceof TermTree) {
             createFeatureTreeSection(rootElement);
 
+        }  else if (input instanceof TermNodeDto) {
+            TermType type= ((TermNodeDto) input).getTerm().getTermType();
+            if(type.equals(TermType.Character) && activePart instanceof ICharacterEditor){
+                createCharacterNodeDtoSection(rootElement);
+            }
+            else if(type.equals(TermType.Feature) || type.equals(TermType.Character)){
+                createFeatureNodeSection(rootElement);
+            }
+
+        } else if (input instanceof TermTreeDto) {
+            createFeatureTreeSectionForDto(rootElement);
+
         } else if (input instanceof Character) {
             createCharacterSection(rootElement);
 
@@ -374,7 +411,7 @@ public class DetailsViewerE4 extends AbstractCdmDataViewerE4 {
         } else if (input instanceof Group) {
             createGroupSection(rootElement);
         } else if (input instanceof TaxonRelationship && ((TaxonRelationship)input).getType()!=null
-                && (((TaxonRelationship)input).getType().isAnyMisappliedName() || ((TaxonRelationship)input).getType().isAnySynonym() || ((TaxonRelationship)input).getType().isMisappliedNameOrInvalidDesignation())){
+                && (((TaxonRelationship)input).getType().isAnyMisappliedName() || ((TaxonRelationship)input).getType().isAnySynonym() || ((TaxonRelationship)input).getType().isMisappliedName())){
             createMisappliedNameSection(rootElement);
         }else if (input instanceof TaxonRelationship ) {
             createTaxonRelationshipSection(rootElement);
@@ -395,7 +432,6 @@ public class DetailsViewerE4 extends AbstractCdmDataViewerE4 {
             createEmptySection(null, rootElement);
         }
         layout();
-
     }
 
     private void createGroupSection(RootElement parent) {
@@ -408,38 +444,75 @@ public class DetailsViewerE4 extends AbstractCdmDataViewerE4 {
         addPart(grantedAuthorityDetailSection);
     }
 
-    /** {@inheritDoc} */
     @Override
     public ISelection getSelection() {
         return selection;
     }
 
-    /** {@inheritDoc} */
     @Override
     public void setSelection(ISelection selection, boolean reveal) {
 
         this.selection = selection;
-
         if(this.selection!=null){
             SelectionChangedEvent selectionChangedEvent = new SelectionChangedEvent(this, selection);
             fireSelectionChanged(selectionChangedEvent);
         }
-
     }
 
     private void createTaxonSections(RootElement parent) {
         NameDetailsConfigurator config = PreferencesUtil.getPreferredNameDetailsConfiguration();
+        EnumSet<CRUD> requiredCrud;
+        if(getInput() == null || StoreUtil.getCdmEntity(getInput()).getId() == 0) {
+            // new entity, not yet saved
+            requiredCrud = EnumSet.of(CRUD.CREATE);
+        } else {
+            requiredCrud = EnumSet.of(CRUD.UPDATE);
+        }
+        boolean hasPermission = CdmStore.currentAuthentiationHasPermission(StoreUtil.getCdmEntity(getInput()), requiredCrud);
+        if (hasPermission){
+            // check for subtree permissions as well.
+            TaxonBase<?> taxonBase = (TaxonBase<?>)getInput();
+            Taxon acceptedTaxon = null;
+            if (taxonBase instanceof Taxon){
+                acceptedTaxon = (Taxon)taxonBase;
+            }else{
+                acceptedTaxon = ((Synonym)taxonBase).getAcceptedTaxon();
+            }
+            if (acceptedTaxon != null){ //needs discussion if synonyms without accepted taxon should never be filtered by subtree permission(current implementation). See also #8849
+                Set<TaxonNode> nodes = acceptedTaxon.getTaxonNodes();
+                for (TaxonNode node: nodes){
+                    hasPermission &= CdmStore.currentAuthentiationHasPermission(node, requiredCrud);
+                    if (!hasPermission){
+                        //check whether there are explicit TaxonNode rights
+                        boolean taxonnodePermissionExists = false;
+                        Collection<? extends GrantedAuthority> authorities = CdmStore.getCurrentAuthentiation().getAuthorities();
+                        for (GrantedAuthority grantedAuthority: authorities){
+                            if (grantedAuthority.getAuthority().startsWith("TAXONNODE")){
+                                taxonnodePermissionExists = true;
+                            }
+                        }
+                        if (!taxonnodePermissionExists){
+                            hasPermission = true;
+                        }
+                    }
+                }
+            }
+        }
+        detailsEnabled = hasPermission;
         ParsingMessagesSection parsingMessagesSection = formFactory.createParsingMessagesSection(getConversationHolder(), parent, this,
                 StoreUtil.getSectionStyle(ParsingMessagesSection.class, getInput().getClass().getCanonicalName(), true));
-        if (!config.isSimpleDetailsViewActivated()){
+        if (config == null){
             TaxonBaseDetailSection taxonBaseDetailSection = formFactory.createTaxonBaseDetailSection(getConversationHolder(), parent, this,
                     StoreUtil.getSectionStyle(TaxonBaseDetailSection.class, getInput().getClass().getCanonicalName(), true));
             formFactory.createHorizontalSeparator(parent, SWT.BORDER);
+          //  boolean hasPermission = CdmStore.currentAuthentiationHasPermission(getInput(), Operation.UPDATE);
+            taxonBaseDetailSection.setEnabled(detailsEnabled);
             addPart(taxonBaseDetailSection);
         }else{
             if (config.isTaxonSectionActivated()){
                 TaxonBaseDetailSection taxonBaseDetailSection = formFactory.createTaxonBaseDetailSection(getConversationHolder(), parent, this,
                         StoreUtil.getSectionStyle(TaxonBaseDetailSection.class, getInput().getClass().getCanonicalName(), true));
+                taxonBaseDetailSection.setEnabled(detailsEnabled);
                 formFactory.createHorizontalSeparator(parent, SWT.BORDER);
                 addPart(taxonBaseDetailSection);
             }
@@ -448,43 +521,46 @@ public class DetailsViewerE4 extends AbstractCdmDataViewerE4 {
                 .createNonViralNameDetailSection(getConversationHolder(), parent, this, true,
                         StoreUtil.getSectionStyle(NonViralNameDetailSection.class, getInput().getClass().getCanonicalName(), true));
         formFactory.createHorizontalSeparator(parent, SWT.BORDER);
-        if (!config.isSimpleDetailsViewActivated() || (config.isSimpleDetailsViewActivated() && config.isNomenclaturalReferenceSectionActivated())){
+        nonViralNameSection.setEnabled(detailsEnabled);
+        if (config == null || config.isNomenclaturalReferenceSectionActivated()){
             NomenclaturalReferenceDetailSection referenceDetailSection = formFactory.createNomenclaturalReferenceDetailSection(getConversationHolder(), parent, this,
                     StoreUtil.getSectionStyle(NomenclaturalReferenceDetailSection.class, getInput().getClass().getCanonicalName(), true));
+            referenceDetailSection.setEnabled(detailsEnabled);
             formFactory.createHorizontalSeparator(parent, SWT.BORDER);
             addPart(referenceDetailSection);
 
         }
-        if ( !config.isSimpleDetailsViewActivated() || (config.isSimpleDetailsViewActivated() && config.isNomenclaturalStatusSectionActivated())){
+        if ( config == null || config.isNomenclaturalStatusSectionActivated()){
             NomenclaturalStatusSection nomenclaturalStatusSection = formFactory.createNomenclaturalStatusSection(getConversationHolder(), parent,
                     StoreUtil.getSectionStyle(NomenclaturalStatusSection.class, getInput().getClass().getCanonicalName(), true));
+            nomenclaturalStatusSection.setEnabled(detailsEnabled);
             formFactory.createHorizontalSeparator(parent, SWT.BORDER);
             addPart(nomenclaturalStatusSection);
         }
 
-        if ( !config.isSimpleDetailsViewActivated() || (config.isSimpleDetailsViewActivated() && config.isProtologueActivated())){
-            ProtologueSection protologSection = formFactory.createProtologueSection(getConversationHolder(), parent, StoreUtil.getSectionStyle(ProtologueSection.class, getInput().getClass().getCanonicalName()));
-            formFactory.createHorizontalSeparator(parent, SWT.BORDER);
-            addPart(protologSection);
-        }
+//        if ( config == null || config.isProtologueActivated()){
+//            ProtologueSection protologSection = formFactory.createProtologueSection(getConversationHolder(), parent, StoreUtil.getSectionStyle(ProtologueSection.class, getInput().getClass().getCanonicalName()));
+//            protologSection.setEnabled(detailsEnabled);
+//            formFactory.createHorizontalSeparator(parent, SWT.BORDER);
+//            addPart(protologSection);
+//        }
 
-        if (!config.isSimpleDetailsViewActivated() || (config.isSimpleDetailsViewActivated() && config.isTypeDesignationSectionActivated())){
+        if (config == null || config.isTypeDesignationSectionActivated()){
             TypeDesignationSection typeDesignationSection = formFactory.createTypeDesignationSection(getConversationHolder(), parent, StoreUtil.getSectionStyle(TypeDesignationSection.class, getInput().getClass().getCanonicalName()));
+            typeDesignationSection.setEnabled(detailsEnabled);
             formFactory.createHorizontalSeparator(parent, SWT.BORDER);
             addPart(typeDesignationSection);
         }
 
-        if (!config.isSimpleDetailsViewActivated() || (config.isSimpleDetailsViewActivated() &&config.isNameRelationsSectionActivated())){
+        if (config == null || config.isNameRelationsSectionActivated()){
             NameRelationshipDetailSection nameRelationshipSection = formFactory.createNameRelationshipDetailSection(getConversationHolder(), parent, StoreUtil.getSectionStyle(NameRelationshipDetailSection.class, getInput().getClass().getCanonicalName()));
+            nameRelationshipSection.setEnabled(detailsEnabled);
             formFactory.createHorizontalSeparator(parent, SWT.BORDER);
             addPart(nameRelationshipSection);
         }
 
-
         addPart(parsingMessagesSection);
-
         addPart(nonViralNameSection);
-
     }
 
     private void createNameSections(RootElement parent) {
@@ -505,18 +581,17 @@ public class DetailsViewerE4 extends AbstractCdmDataViewerE4 {
         addPart(nomenclaturalStatusSection);
         addPart(referenceDetailSection);
 
-        ProtologueSection protologSection = formFactory.createProtologueSection(getConversationHolder(), parent, StoreUtil.getSectionStyle(ProtologueSection.class, getInput().getClass().getCanonicalName()));
-        formFactory.createHorizontalSeparator(parent, SWT.BORDER);
+//        ProtologueSection protologSection = formFactory.createProtologueSection(getConversationHolder(), parent, StoreUtil.getSectionStyle(ProtologueSection.class, getInput().getClass().getCanonicalName()));
+//        formFactory.createHorizontalSeparator(parent, SWT.BORDER);
 
         TypeDesignationSection typeDesignationSection = formFactory.createTypeDesignationSection(getConversationHolder(), parent, StoreUtil.getSectionStyle(TypeDesignationSection.class, getInput().getClass().getCanonicalName()));
         formFactory.createHorizontalSeparator(parent, SWT.BORDER);
 
         NameRelationshipDetailSection nameRelationshipSection = formFactory.createNameRelationshipDetailSection(getConversationHolder(), parent, StoreUtil.getSectionStyle(NameRelationshipDetailSection.class, getInput().getClass().getCanonicalName()));
         formFactory.createHorizontalSeparator(parent, SWT.BORDER);
-        addPart(protologSection);
+//        addPart(protologSection);
         addPart(typeDesignationSection);
         addPart(nameRelationshipSection);
-
     }
 
     private void createReferenceSections(RootElement parent) {
@@ -544,14 +619,24 @@ public class DetailsViewerE4 extends AbstractCdmDataViewerE4 {
     }
 
     private void createDescriptionElementSection(RootElement parent) {
+        createDescriptionElementSection(parent, null);
+    }
+
+    private void createDescriptionElementSection(RootElement parent, Object activePart) {
         DescriptionElementDetailSection descriptionElementDetailSection = formFactory.createDescriptionElementDetailSection(getConversationHolder(), parent, this, StoreUtil.getSectionStyle(DescriptionElementDetailSection.class, getInput().getClass().getCanonicalName(), true));
         descriptionElementDetailSection.setEnabled(this.detailsEnabled);
 
         //  IntextReferenceSection intextReferenceSection = formFactory.createIntextReferenceSection(getConversationHolder(), parent,  getSectionStyle(.class, getInput().getClass().getCanonicalName()));
 
         formFactory.createHorizontalSeparator(parent, SWT.BORDER);
+        DescriptionElementSourceSection descriptionElementSourceSection;
+        if (activePart != null && activePart instanceof IDistributionEditorPart){
+            Reference defaultSource =((IDistributionEditorPart)activePart).getEditor().getDefaultSource();
+            descriptionElementSourceSection = formFactory.createDescriptionElementSourceSection(getConversationHolder(), parent, defaultSource, StoreUtil.getSectionStyle(DescriptionElementSourceSection.class, getInput().getClass().getCanonicalName()));
 
-        DescriptionElementSourceSection descriptionElementSourceSection = formFactory.createDescriptionElementSourceSection(getConversationHolder(), parent, StoreUtil.getSectionStyle(DescriptionElementSourceSection.class, getInput().getClass().getCanonicalName()));
+        }else{
+            descriptionElementSourceSection = formFactory.createDescriptionElementSourceSection(getConversationHolder(), parent, StoreUtil.getSectionStyle(DescriptionElementSourceSection.class, getInput().getClass().getCanonicalName()) );
+        }
 
         formFactory.createHorizontalSeparator(parent, SWT.BORDER);
 
@@ -607,7 +692,6 @@ public class DetailsViewerE4 extends AbstractCdmDataViewerE4 {
 
         addPart(descriptionDetailSection);
         addPart(descriptionSourceSection);
-
     }
 
     private void createImageGallerySection(RootElement parent) {
@@ -617,7 +701,7 @@ public class DetailsViewerE4 extends AbstractCdmDataViewerE4 {
     }
 
     private void createMediaElementSection(RootElement parent) {
-        MediaDetailsSection mediaDetailSection = formFactory.createMediaDetailsSection(getConversationHolder(), parent, this, StoreUtil.getSectionStyle(MediaDetailsSection.class, getInput().getClass().getCanonicalName()));
+        MediaDetailsSection mediaDetailSection = formFactory.createMediaDetailsSection(getConversationHolder(), parent, this, StoreUtil.getSectionStyle(MediaDetailsSection.class, getInput().getClass().getCanonicalName(), true));
 
         addPart(mediaDetailSection);
     }
@@ -665,7 +749,6 @@ public class DetailsViewerE4 extends AbstractCdmDataViewerE4 {
         formFactory.createHorizontalSeparator(parent, SWT.BORDER);
         DerivedUnitTypeDesignationSection derivedUnitTypeDesignationSection = formFactory.createDerivedUnitTypeDesignationSection(getConversationHolder(), parent, this, StoreUtil.getSectionStyle(DerivedUnitTypeDesignationSection.class, getInput().getClass().getCanonicalName()));
         addPart(derivedUnitTypeDesignationSection);
-
     }
 
     private void createFieldUnitSection(RootElement parent) {
@@ -683,11 +766,9 @@ public class DetailsViewerE4 extends AbstractCdmDataViewerE4 {
         addPart(gatheringEventDetailSection);
         addPart(fieldUnitDetailSection);
 
-        if(PreferencesUtil.isDeterminationOnlyForFieldUnits()){
-            formFactory.createHorizontalSeparator(parent, SWT.BORDER);
-            DeterminationDetailSection determinationDetailSection = formFactory.createDeterminationDetailSection(getConversationHolder(), parent, this, StoreUtil.getSectionStyle(DeterminationDetailSection.class, getInput().getClass().getCanonicalName()));
-            addPart(determinationDetailSection);
-        }
+        formFactory.createHorizontalSeparator(parent, SWT.BORDER);
+        DeterminationDetailSection determinationDetailSection = formFactory.createDeterminationDetailSection(getConversationHolder(), parent, this, StoreUtil.getSectionStyle(DeterminationDetailSection.class, getInput().getClass().getCanonicalName()));
+        addPart(determinationDetailSection);
     }
 
     private void createTissueSampleSection(RootElement parent) {
@@ -716,10 +797,18 @@ public class DetailsViewerE4 extends AbstractCdmDataViewerE4 {
 
         SampleDesignationDetailSection sampleDesignationDetailSection = formFactory.createSampleDesignationDetailSection(getConversationHolder(), parent, this, StoreUtil.getSectionStyle(SampleDesignationDetailSection.class, getInput().getClass().getCanonicalName(), true));
 
+        formFactory.createHorizontalSeparator(parent, SWT.BORDER);
+        DeterminationDetailSection determinationDetailSection = null;
+        if(!PreferencesUtil.isDeterminationOnlyForFieldUnits()){
+            determinationDetailSection = formFactory.createDeterminationDetailSection(getConversationHolder(), parent, this, StoreUtil.getSectionStyle(DeterminationDetailSection.class, getInput().getClass().getCanonicalName()));
+        }
         addPart(section);
         addPart(preparationPreservationSection);
         addPart(qualitySection);
         addPart(sampleDesignationDetailSection);
+        if(!PreferencesUtil.isDeterminationOnlyForFieldUnits()){
+            addPart(determinationDetailSection);
+        }
     }
 
     private void createSequenceSection(RootElement parent) {
@@ -733,7 +822,6 @@ public class DetailsViewerE4 extends AbstractCdmDataViewerE4 {
 
         SequenceContigFileCollectionDetailSection contigFileSection = formFactory.createSequenceContigFileCollectionDetailSection(getConversationHolder(), parent, StoreUtil.getSectionStyle(SequenceContigFileCollectionDetailSection.class, getInput().getClass().getCanonicalName(), true));
 
-
         addPart(section);
         addPart(referenceSection);
         addPart(contigFileSection);
@@ -747,7 +835,6 @@ public class DetailsViewerE4 extends AbstractCdmDataViewerE4 {
 
         SingleReadPherogramCollectionDetailSection pherogramSection = formFactory.createSingleReadPherogramCollectionDetailSection(getConversationHolder(), parent, StoreUtil.getSectionStyle(SingleReadPherogramCollectionDetailSection.class, getInput().getClass().getCanonicalName(), true));
         addPart(pherogramSection);
-
     }
 
     private void createMediaSpecimenSection(RootElement parent) {
@@ -757,31 +844,43 @@ public class DetailsViewerE4 extends AbstractCdmDataViewerE4 {
         formFactory.createHorizontalSeparator(parent, SWT.BORDER);
 
         RightsSection rightsSection = formFactory.createRightsSection(getConversationHolder(), parent, StoreUtil.getSectionStyle(RightsSection.class, getInput().getClass().getCanonicalName()));
+//        rightsSection.setEntity(generalSection.getEntity().innerDerivedUnit());
         addPart(rightsSection);
-
     }
 
+    private void createFeatureTreeSectionForDto(RootElement parent) {
+        TermTreeDetailSection section = formFactory.createFeatureTreeDetailSection(getConversationHolder(), parent, this, StoreUtil.getSectionStyle(TermTreeDetailSection.class, getInput().getClass().getCanonicalName(), true));
+
+        addPart(section);
+    }
     private void createFeatureTreeSection(RootElement parent) {
-        FeatureTreeDetailSection section = formFactory.createFeatureTreeDetailSection(getConversationHolder(), parent, this, StoreUtil.getSectionStyle(FeatureTreeDetailSection.class, getInput().getClass().getCanonicalName(), true));
+        TermTreeDetailSectionForNode section = formFactory.createFeatureTreeDetailSectionForTree(getConversationHolder(), parent, this, StoreUtil.getSectionStyle(TermTreeDetailSection.class, getInput().getClass().getCanonicalName(), true));
 
         addPart(section);
     }
 
     private void createFeatureNodeSection(RootElement parent) {
-        FeatureNodeDetailSection featureDistributionSection = formFactory.createFeatureNodeDetailSection(getConversationHolder(), parent, this, StoreUtil.getSectionStyle(FeatureNodeDetailSection.class, getInput().getClass().getCanonicalName(), true));
-
+        TermNodeDetailSection featureDistributionSection = formFactory.createFeatureNodeDetailSection(getConversationHolder(), parent, this, StoreUtil.getSectionStyle(TermNodeDetailSection.class, getInput().getClass().getCanonicalName(), true));
         addPart(featureDistributionSection);
     }
 
     private void createFeatureDistributionSection(RootElement parent) {
         FeatureDistributionDetailSection featureDistributionSection = formFactory.createFeatureDistributionDetailSection(getConversationHolder(), parent, this, StoreUtil.getSectionStyle(FeatureDistributionDetailSection.class, getInput().getClass().getCanonicalName(), true));
+        addPart(featureDistributionSection);
+    }
+
+    private void createCharacterNodeSection(RootElement parent) {
+        CharacterNodeDetailSection featureDistributionSection = formFactory.createCharacterNodeDetailSection(getConversationHolder(), parent, this, StoreUtil.getSectionStyle(CharacterDetailSection.class, getInput().getClass().getCanonicalName(), true));
+        addPart(featureDistributionSection);
+    }
 
+    private void createCharacterNodeDtoSection(RootElement parent) {
+        CharacterNodeDtoDetailSection featureDistributionSection = formFactory.createCharacterNodeDtoDetailSection(getConversationHolder(), parent, this, StoreUtil.getSectionStyle(CharacterDetailSection.class, getInput().getClass().getCanonicalName(), true));
         addPart(featureDistributionSection);
     }
 
     private void createCharacterSection(RootElement parent) {
         CharacterDetailSection featureDistributionSection = formFactory.createCharacterDetailSection(getConversationHolder(), parent, this, StoreUtil.getSectionStyle(CharacterDetailSection.class, getInput().getClass().getCanonicalName(), true));
-
         addPart(featureDistributionSection);
     }
 
@@ -799,12 +898,8 @@ public class DetailsViewerE4 extends AbstractCdmDataViewerE4 {
 
     private void createUseRecordSection(RootElement parent) {
         UseRecordDetailSection descriptionUseRecordSection = formFactory.createUseRecordDetailSection(getConversationHolder(), parent, this,StoreUtil.getSectionStyle(UseRecordDetailSection.class, getInput().getClass().getCanonicalName(), true));
-
         formFactory.createHorizontalSeparator(parent, SWT.BORDER);
-
         addPart(descriptionUseRecordSection);
-
-
     }
 
     private void createUserSection(RootElement parent) {
@@ -823,7 +918,6 @@ public class DetailsViewerE4 extends AbstractCdmDataViewerE4 {
 
         formFactory.createHorizontalSeparator(parent, SWT.BORDER);
 
-
         NonViralNameDetailSection nonViralNameSection = formFactory
                 .createNonViralNameDetailSection(getConversationHolder(), parent, this, true,
                         StoreUtil.getSectionStyle(NonViralNameDetailSection.class, getInput().getClass().getCanonicalName(), true));
@@ -836,15 +930,14 @@ public class DetailsViewerE4 extends AbstractCdmDataViewerE4 {
         formFactory.createHorizontalSeparator(parent, SWT.BORDER);
         addPart(referenceDetailSection);
 
-
         NomenclaturalStatusSection nomenclaturalStatusSection = formFactory.createNomenclaturalStatusSection(getConversationHolder(), parent,
                        StoreUtil.getSectionStyle(NomenclaturalStatusSection.class, getInput().getClass().getCanonicalName(), true));
         formFactory.createHorizontalSeparator(parent, SWT.BORDER);
         addPart(nomenclaturalStatusSection);
 
-               ProtologueSection protologSection = formFactory.createProtologueSection(getConversationHolder(), parent, StoreUtil.getSectionStyle(ProtologueSection.class, getInput().getClass().getCanonicalName()));
-               formFactory.createHorizontalSeparator(parent, SWT.BORDER);
-               addPart(protologSection);
+//             ProtologueSection protologSection = formFactory.createProtologueSection(getConversationHolder(), parent, StoreUtil.getSectionStyle(ProtologueSection.class, getInput().getClass().getCanonicalName()));
+//             formFactory.createHorizontalSeparator(parent, SWT.BORDER);
+//             addPart(protologSection);
 
                TypeDesignationSection typeDesignationSection = formFactory.createTypeDesignationSection(getConversationHolder(), parent, StoreUtil.getSectionStyle(TypeDesignationSection.class, getInput().getClass().getCanonicalName()));
                formFactory.createHorizontalSeparator(parent, SWT.BORDER);
@@ -853,7 +946,6 @@ public class DetailsViewerE4 extends AbstractCdmDataViewerE4 {
                NameRelationshipDetailSection nameRelationshipSection = formFactory.createNameRelationshipDetailSection(getConversationHolder(), parent, StoreUtil.getSectionStyle(NameRelationshipDetailSection.class, getInput().getClass().getCanonicalName()));
                formFactory.createHorizontalSeparator(parent, SWT.BORDER);
                addPart(nameRelationshipSection);
-
     }
 
     private void createTaxonRelationshipSection(RootElement parent) {
@@ -869,7 +961,7 @@ public class DetailsViewerE4 extends AbstractCdmDataViewerE4 {
     }
 
     private void createDefinedTermSection(RootElement parent) {
-        DefinedTermDetailSection definedTermDetailSection = formFactory.createDefinedTermDetailSection(getInput().getClass(), getConversationHolder(), parent, this, StoreUtil.getSectionStyle(DefinedTermDetailSection.class, getInput().getClass().getCanonicalName(), true));
+        DefinedTermDetailSection<?> definedTermDetailSection = formFactory.createDefinedTermDetailSection(getInput().getClass(), getConversationHolder(), parent, this, StoreUtil.getSectionStyle(DefinedTermDetailSection.class, getInput().getClass().getCanonicalName(), true));
         addPart(definedTermDetailSection);
         TermMediaSection termMediaSection = formFactory.createTermMediaSection(getConversationHolder(), parent, StoreUtil.getSectionStyle(DefinedTermDetailSection.class, getInput().getClass().getCanonicalName(), true));
         addPart(termMediaSection);
@@ -884,8 +976,24 @@ public class DetailsViewerE4 extends AbstractCdmDataViewerE4 {
     private void updateView(@UIEventTopic(WorkbenchEventConstants.REFRESH_DETAILS)boolean refresh){
         if(refresh){
             refresh();
-
         }
     }
 
-}
+    @Inject
+    @Optional
+    private void updateView(@UIEventTopic(WorkbenchEventConstants.REFRESH_DETAILS_DISTRIBUTION)String nameCache){
+        if(nameCache != null && getInput() instanceof Distribution && this.activePart instanceof IDistributionEditorPart){
+           if (part instanceof CdmSectionPart && ((CdmSectionPart)part).getSection() instanceof DescriptionElementDetailSection){
+               for (ICdmFormElement element: ((DescriptionElementDetailSection)((CdmSectionPart)part).getSection()).getElements()){
+                   if (element instanceof DescriptionElementDetailElement){
+                       for(ICdmFormElement descriptionElement:((DescriptionElementDetailElement)element).getElements()){
+                           if (descriptionElement instanceof DistributionDetailElement){
+                               ((DistributionDetailElement) descriptionElement).setName(nameCache);
+                           }
+                       }
+                   }
+               }
+           }
+        }
+    }
+}
\ No newline at end of file