- completed Specimen and FieldObservation view + wizards
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / element / CdmFormFactory.java
index 534b93d32bed93c58e9a28d9c49c3ad83535b403..ee3fed4560c42d41d753b70a0f9b4178114d59af 100644 (file)
@@ -41,36 +41,37 @@ import org.joda.time.Partial;
 import org.springframework.security.core.GrantedAuthority;
 
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
+import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade;
 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.common.Annotation;
 import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.common.Credit;
+import eu.etaxonomy.cdm.model.common.DefinedTerm;
 import eu.etaxonomy.cdm.model.common.DefinedTermBase;
-import eu.etaxonomy.cdm.model.common.DescriptionElementSource;
 import eu.etaxonomy.cdm.model.common.Extension;
 import eu.etaxonomy.cdm.model.common.GrantedAuthorityImpl;
 import eu.etaxonomy.cdm.model.common.Group;
 import eu.etaxonomy.cdm.model.common.ICdmBase;
-import eu.etaxonomy.cdm.model.common.IDefinedTerm;
+import eu.etaxonomy.cdm.model.common.IEnumTerm;
 import eu.etaxonomy.cdm.model.common.IdentifiableSource;
 import eu.etaxonomy.cdm.model.common.Language;
 import eu.etaxonomy.cdm.model.common.LanguageString;
 import eu.etaxonomy.cdm.model.common.Marker;
+import eu.etaxonomy.cdm.model.common.TermType;
 import eu.etaxonomy.cdm.model.common.TimePeriod;
 import eu.etaxonomy.cdm.model.common.User;
 import eu.etaxonomy.cdm.model.common.VersionableEntity;
 import eu.etaxonomy.cdm.model.description.CategoricalData;
 import eu.etaxonomy.cdm.model.description.CommonTaxonName;
 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
+import eu.etaxonomy.cdm.model.description.DescriptionElementSource;
 import eu.etaxonomy.cdm.model.description.Distribution;
 import eu.etaxonomy.cdm.model.description.Feature;
 import eu.etaxonomy.cdm.model.description.IndividualsAssociation;
 import eu.etaxonomy.cdm.model.description.KeyStatement;
-import eu.etaxonomy.cdm.model.description.Modifier;
 import eu.etaxonomy.cdm.model.description.QuantitativeData;
-import eu.etaxonomy.cdm.model.description.Scope;
 import eu.etaxonomy.cdm.model.description.StateData;
 import eu.etaxonomy.cdm.model.description.StatisticalMeasurementValue;
 import eu.etaxonomy.cdm.model.description.TaxonInteraction;
@@ -89,21 +90,38 @@ import eu.etaxonomy.cdm.model.name.NomenclaturalStatus;
 import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;
 import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
 import eu.etaxonomy.cdm.model.occurrence.DeterminationEvent;
-import eu.etaxonomy.cdm.model.occurrence.Specimen;
 import eu.etaxonomy.cdm.model.reference.Reference;
 import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.cdm.model.taxon.TaxonNode;
 import eu.etaxonomy.cdm.strategy.parser.ParserProblem;
 import eu.etaxonomy.taxeditor.model.AbstractUtility;
+import eu.etaxonomy.taxeditor.ui.campanula.basicFields.NamedAreaFieldController;
+import eu.etaxonomy.taxeditor.ui.campanula.compatibility.ICdmFormElement;
+import eu.etaxonomy.taxeditor.ui.campanula.detailViews.fieldObservation.FieldObservationDetailsElement;
+import eu.etaxonomy.taxeditor.ui.campanula.detailViews.fieldObservation.FieldObservationDetailsElementController;
+import eu.etaxonomy.taxeditor.ui.campanula.detailViews.fieldObservation.FieldObservationDetailsSection;
+import eu.etaxonomy.taxeditor.ui.campanula.detailViews.fieldObservation.FieldObservationGeneralElement;
+import eu.etaxonomy.taxeditor.ui.campanula.detailViews.fieldObservation.FieldObservationGeneralElementController;
+import eu.etaxonomy.taxeditor.ui.campanula.detailViews.fieldObservation.FieldObservationGeneralSection;
+import eu.etaxonomy.taxeditor.ui.campanula.detailViews.fieldObservation.GatheringEventDetailsElement;
+import eu.etaxonomy.taxeditor.ui.campanula.detailViews.fieldObservation.GatheringEventDetailsElementController;
+import eu.etaxonomy.taxeditor.ui.campanula.detailViews.fieldObservation.GatheringEventSection;
+import eu.etaxonomy.taxeditor.ui.campanula.detailViews.specimen.DerivedUnitDetailsElement;
+import eu.etaxonomy.taxeditor.ui.campanula.detailViews.specimen.DerivedUnitDetailsElementController;
+import eu.etaxonomy.taxeditor.ui.campanula.detailViews.specimen.DerivedUnitDetailsSection;
+import eu.etaxonomy.taxeditor.ui.campanula.detailViews.specimen.SpecimenDetailsElement;
+import eu.etaxonomy.taxeditor.ui.campanula.detailViews.specimen.SpecimenDetailsElementController;
+import eu.etaxonomy.taxeditor.ui.campanula.detailViews.specimen.SpecimenDetailsSection;
+import eu.etaxonomy.taxeditor.ui.campanula.detailViews.specimen.SpecimenGeneralSection;
 import eu.etaxonomy.taxeditor.ui.combo.EnumComboElement;
 import eu.etaxonomy.taxeditor.ui.combo.TermComboElement;
+import eu.etaxonomy.taxeditor.ui.element.MinMaxTextSection.UnitType;
 import eu.etaxonomy.taxeditor.ui.openurl.IOpenUrlEnabled;
 import eu.etaxonomy.taxeditor.ui.openurl.OpenUrlSelectorElement;
 import eu.etaxonomy.taxeditor.ui.password.EditPasswordElement;
 import eu.etaxonomy.taxeditor.ui.section.AbstractCdmDetailElement;
 import eu.etaxonomy.taxeditor.ui.section.AbstractCdmDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.AbstractEntityCollectionElement;
-import eu.etaxonomy.taxeditor.ui.section.AbstractEntityCollectionSection;
 import eu.etaxonomy.taxeditor.ui.section.EmptyElement;
 import eu.etaxonomy.taxeditor.ui.section.agent.InstitutionDetailElement;
 import eu.etaxonomy.taxeditor.ui.section.agent.InstitutionDetailSection;
@@ -118,8 +136,8 @@ import eu.etaxonomy.taxeditor.ui.section.classification.ClassificationDetailElem
 import eu.etaxonomy.taxeditor.ui.section.classification.ClassificationDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.classification.TaxonNodeDetailElement;
 import eu.etaxonomy.taxeditor.ui.section.classification.TaxonNodeDetailSection;
+import eu.etaxonomy.taxeditor.ui.section.common.ReferenceEntityDetailElement;
 import eu.etaxonomy.taxeditor.ui.section.common.ReferencedEntityDetailSection;
-import eu.etaxonomy.taxeditor.ui.section.common.RefereneEntityDetailElement;
 import eu.etaxonomy.taxeditor.ui.section.description.DerivedUnitElement;
 import eu.etaxonomy.taxeditor.ui.section.description.DescribedSpecimenSection;
 import eu.etaxonomy.taxeditor.ui.section.description.DescriptionDetailElement;
@@ -398,13 +416,6 @@ public class CdmFormFactory extends FormToolkit {
         }
     }
 
-    /** {@inheritDoc} */
-    @Override
-    public void adapt(Composite composite) {
-        composite.addMouseListener(selectionMouseHandler);
-        super.adapt(composite);
-    }
-
     /**
      * <p>
      * Adapts the {@link AbstractCdmFormElement}:<br>
@@ -429,6 +440,13 @@ public class CdmFormFactory extends FormToolkit {
         super.adapt(control, trackFocus, trackKeyboard);
     }
 
+    /** {@inheritDoc} */
+    @Override
+    public void adapt(Composite composite) {
+        composite.addMouseListener(selectionMouseHandler);
+        super.adapt(composite);
+    }
+
     /**
      * <p>
      * destroyElement
@@ -631,41 +649,15 @@ public class CdmFormFactory extends FormToolkit {
      *         {@link eu.etaxonomy.taxeditor.ui.element.NumberWithLabelElement}
      *         object.
      */
-    public NumberWithLabelElement createIntegerTextWithLabelElement(ICdmFormElement parentElement, String labelString,
-            Integer initialInteger, int style) {
-        NumberWithLabelElement element = new NumberWithLabelElement(this, parentElement, labelString, initialInteger,
-                style);
-        adapt(element);
-        parentElement.addElement(element);
-        return element;
-    }
-
-    /**
-     * <p>
-     * createFloatTextWithLabelElement
-     * </p>
-     *
-     * @param parentElement
-     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-     *            object.
-     * @param labelString
-     *            a {@link java.lang.String} object.
-     * @param initialFloat
-     *            a float.
-     * @param style
-     *            a int.
-     * @return a
-     *         {@link eu.etaxonomy.taxeditor.ui.element.NumberWithLabelElement}
-     *         object.
-     */
-    public NumberWithLabelElement createFloatTextWithLabelElement(ICdmFormElement parentElement, String labelString,
-            float initialFloat, int style) {
-        NumberWithLabelElement element = new NumberWithLabelElement(this, parentElement, labelString, initialFloat,
-                style);
-        adapt(element);
-        parentElement.addElement(element);
-        return element;
-    }
+       public NumberWithLabelElement createNumberTextWithLabelElement(
+                       ICdmFormElement parentElement, String labelString,
+                       Number initialNumber, int style) {
+               NumberWithLabelElement element = new NumberWithLabelElement(this,
+                               parentElement, labelString, initialNumber, style);
+               adapt(element);
+               parentElement.addElement(element);
+               return element;
+       }
 
     /**
      * <p>
@@ -802,6 +794,41 @@ public class CdmFormFactory extends FormToolkit {
         return element;
     }
 
+       /**
+        * <p>
+        * createTermComboElement
+        * </p>
+        *
+        * @param termComboType
+        *            a
+        *            {@link eu.eu.etaxonomy.taxeditor.ui.element.CdmFormFactory.TermComboType}
+        *            object.
+        * @param parentElement
+        *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
+        *            object.
+        * @param labelString
+        *            a {@link java.lang.String} object.
+        * @param selection
+        *            a {@link eu.etaxonomy.cdm.model.common.DefinedTermBase}
+        *            object.
+        * @param style
+        *            a int.
+        * @return a {@link eu.etaxonomy.taxeditor.ui.combo.TermComboElement}
+        *         object.
+        */
+
+       public <T extends DefinedTermBase> TermComboElement<T> createDefinedTermComboElement(
+                       TermType termType,
+                       ICdmFormElement parentElement,
+                       String labelString,
+                       T selection,
+                       int style) {
+               TermComboElement<T> element = new TermComboElement<T>(this, parentElement, termType, labelString, selection, style);
+               adapt(element);
+               parentElement.addElement(element);
+               return element;
+       }
+
     /**
      * <p>
      * createEnumComboElement
@@ -819,8 +846,9 @@ public class CdmFormFactory extends FormToolkit {
      * @return a {@link eu.etaxonomy.taxeditor.ui.term.AbstractEnumComboElement}
      *         object.
      */
-    public <T extends IDefinedTerm> EnumComboElement<T> createEnumComboElement(Class<T> enumComboType,
-            ICdmFormElement parentElement, int style) {
+       public <T extends IEnumTerm> EnumComboElement<T> createEnumComboElement(
+                       Class<T> enumComboType, ICdmFormElement parentElement,
+                       int style) {
         EnumComboElement<T> element = new EnumComboElement<T>(this, parentElement, enumComboType, style);
         adapt(element);
         parentElement.addElement(element);
@@ -1041,6 +1069,40 @@ public class CdmFormFactory extends FormToolkit {
         return element;
     }
 
+       /**
+        * <p>
+        * createGatheringEventUnitElement
+        * </p>
+        *
+        * @param parentElement
+        *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
+        *            object.
+        * @param labelString
+        *            a {@link java.lang.String} object.
+        * @param timePeriod
+        *            a {@link eu.etaxonomy.cdm.model.common.GatheringEvent} object.
+        * @param style
+        *            a int.
+        * @return a {@link eu.etaxonomy.taxeditor.ui.element.GatheringEventUnitElement}
+        *         object.
+        */
+       public GatheringEventUnitElement createGatheringEventUnitElement(
+                       ICdmFormElement parentElement,
+                       String labelString,
+                       DerivedUnitFacade gatheringEvent,
+                       MinMaxTextSection.UnitType unitType,
+                       int style) {
+               GatheringEventUnitElement element = new GatheringEventUnitElement(this,
+                               parentElement,
+                               labelString,
+                               gatheringEvent,
+                               unitType,
+                               style);
+               adapt(element);
+               parentElement.addElement(element);
+               return element;
+       }
+
     /**
      * <p>
      * createPointElement
@@ -1082,6 +1144,26 @@ public class CdmFormFactory extends FormToolkit {
         return section;
     }
 
+       /**
+        * <p>
+        * createDateDetailSection
+        * </p>
+        *
+        * @param parentElement
+        *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
+        *            object.
+        * @param style
+        *            a int.
+        * @return a {@link eu.etaxonomy.taxeditor.ui.element.MinMaxTextSection}
+        *         object.
+        */
+       public MinMaxTextSection createMinMaxTextSection(ICdmFormElement parentElement, UnitType unitType, int style) {
+               MinMaxTextSection section = new MinMaxTextSection(this, parentElement, unitType, style);
+               parentElement.addElement(section);
+               adapt(section);
+               return section;
+       }
+
     /**
      * <p>
      * createPartialElement
@@ -1165,6 +1247,13 @@ public class CdmFormFactory extends FormToolkit {
         propertyChangeListeners.remove(listener);
     }
 
+    /**
+     * @return the propertyChangeListeners
+     */
+    public List<IPropertyChangeListener> getPropertyChangeListeners() {
+        return propertyChangeListeners;
+    }
+
     /**
      * <p>
      * createHorizontalSeparator
@@ -1314,56 +1403,6 @@ public class CdmFormFactory extends FormToolkit {
         return element;
     }
 
-    // SIMPLIFY
-
-    /**
-     * Used to define which {@link AbstractCdmDetailSection} or
-     * {@link AbstractCdmDetailElement} should be created with
-     * {@link CdmFormFactory#createCdmDetailSection(DetailType, ConversationHolder, ICdmFormElement, ISelectionProvider, int)}
-     * or
-     * {@link CdmFormFactory#createCdmDetailElement(DetailType, ICdmFormElement, int)}
-     */
-    public static enum DetailType {
-        AUTHORSHIP,
-        CLASSIFICATION,
-        COLLECTION,
-        DERIVED_UNIT,
-        DERIVED_UNIT_FACADE,
-        DERIVED_UNIT_GENERAL,
-        DESCRIPTION,
-        DESCRIPTIONELEMENT,
-        DETERMINATION,
-        FEATURE_DISTRIBUTION,
-        FIELD_OBSERVATION,
-        GATHERING_EVENT,
-        GRANTEDAUTHORITY,
-        GROUP,
-        HYBRID,
-        INSTITUTION,
-        MEDIA,
-        NAMED_AREA,
-        NAMED_AREA_LEVEL,
-        NAMERELATIONSHIP,//never used
-        NATURAL_LANGUAGE,
-        NOMENCLATURALREFERENCE,
-        NONVIRALNAME,
-        PARSINGMESSAGE,
-        PERSON,
-        POLYTOMOUS_KEY,
-        POLYTOMOUS_KEY_NODE,
-        REFERENCEBASE,
-        REFERENCED_ENTITY,
-        SCIENTIFICNAME,
-        TAXON_NODE,
-        TAXON_RELATIONSHIP,
-        TAXONBASE,
-        TEAM,
-        TEAMORPERSONBASE,
-        TERM_VOCABULARY,
-        USE_RECORD,
-        USER
-    }
-
     public AbstractFormSection createDefinedTermDetailSection(Class definedTermClass, ConversationHolder conversation,
             ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style) {
 
@@ -1382,8 +1421,7 @@ public class CdmFormFactory extends FormToolkit {
      * @param style
      * @return
      */
-    public AbstractCdmDetailElement createDefinedTermDetailElement(Class definedTermClass,
-            AbstractCdmDetailSection parentElement, int style) {
+    public AbstractCdmDetailElement createDefinedTermDetailElement(Class definedTermClass, AbstractCdmDetailSection parentElement, int style) {
         AbstractCdmDetailElement element = null;
 
         if (NamedArea.class.isAssignableFrom(definedTermClass)) {
@@ -1397,543 +1435,429 @@ public class CdmFormFactory extends FormToolkit {
         return element;
     }
 
-    /**
-     * <p>
-     * createCdmDetailSection
-     * </p>
-     *
-     * @param detailType
-     *            a
-     *            {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory.DetailType}
-     *            object.
-     * @param parentElement
-     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-     *            object.
-     * @param selectionProvider
-     *            a {@link org.eclipse.jface.viewers.ISelectionProvider} object.
-     * @param style
-     *            a int.
-     * @param conversation
-     *            a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
-     *            object.
-     * @return a {@link eu.etaxonomy.taxeditor.ui.element.AbstractFormSection}
-     *         object.
-     */
-    public AbstractFormSection createCdmDetailSection(DetailType detailType, ConversationHolder conversation,
-            ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style) {
-        AbstractFormSection section = null;
-
-        switch (detailType) {
-        case SCIENTIFICNAME:
-            section = new NameDetailSection(this, conversation, parentElement, selectionProvider, style);
-            break;
-        case REFERENCEBASE:
-            section = new ReferenceDetailSection(this, conversation, parentElement, selectionProvider, style);
-            break;
-        case NOMENCLATURALREFERENCE:
-            section = new NomenclaturalReferenceDetailSection(this, conversation, parentElement, selectionProvider,
-                    style);
-            break;
-        case TAXONBASE:
-            section = new TaxonBaseDetailSection(this, conversation, parentElement, selectionProvider, style);
-            break;
-        case AUTHORSHIP:
-            section = new AuthorshipDetailSection(this, conversation, parentElement, selectionProvider, style);
-            break;
-        case TEAMORPERSONBASE:
-            section = new TeamOrPersonBaseDetailSection(this, conversation, parentElement, selectionProvider, style);
-            break;
-        case TEAM:
-            section = new TeamDetailSection(this, conversation, parentElement, null, style);
-            break;
-        case PERSON:
-            section = new PersonDetailSection(this, conversation, parentElement, null, style);
-            break;
-        case DESCRIPTION:
-            section = new DescriptionDetailSection(this, conversation, parentElement, selectionProvider, style);
-            break;
-        case DESCRIPTIONELEMENT:
-            section = new DescriptionElementDetailSection(this, conversation, parentElement, selectionProvider, style);
-            break;
-        case PARSINGMESSAGE:
-            section = new ParsingMessagesSection(this, conversation, parentElement, selectionProvider, style);
-            break;
-        case NONVIRALNAME:
-            section = new NonViralNameDetailSection(this, conversation, parentElement, selectionProvider, style);
-            break;
-        case MEDIA:
-            section = new eu.etaxonomy.taxeditor.ui.section.description.MediaDetailsSection(this, conversation,
-                    parentElement, selectionProvider, style);
-            break;
-        case DERIVED_UNIT_FACADE:
-            section = new DerivedUnitFacadeDetailSection(this, conversation, parentElement, selectionProvider, style);
-            break;
-        case FIELD_OBSERVATION:
-            section = new FieldObservationDetailSection(this, conversation, parentElement, selectionProvider, style);
-            break;
-        case GATHERING_EVENT:
-            section = new GatheringEventDetailSection(this, conversation, parentElement, selectionProvider, style);
-            break;
-        case DERIVED_UNIT:
-            section = new DerivedUnitBaseDetailSection(this, conversation, parentElement, selectionProvider, style);
-            break;
-        case NATURAL_LANGUAGE:
-            section = new NaturalLanguageSection(this, conversation, parentElement, selectionProvider, style);
-            break;
-        case FEATURE_DISTRIBUTION:
-            section = new FeatureDistributionDetailSection(this, conversation, parentElement, selectionProvider, style);
-            break;
-        case CLASSIFICATION:
-            section = new ClassificationDetailSection(this, conversation, parentElement, selectionProvider, style);
-            break;
-        case TAXON_NODE:
-            section = new TaxonNodeDetailSection(this, conversation, parentElement, selectionProvider, style);
-            break;
-        case POLYTOMOUS_KEY:
-            section = new PolytomousKeyDetailSection(this, conversation, parentElement, selectionProvider, style);
-            break;
-        case POLYTOMOUS_KEY_NODE:
-            section = new PolytomousKeyNodeDetailSection(this, conversation, parentElement, selectionProvider, style);
-            break;
-        case INSTITUTION:
-            section = new InstitutionDetailSection(this, conversation, parentElement, selectionProvider, style);
-            break;
-        case DERIVED_UNIT_GENERAL:
-            section = new GeneralDetailSection(this, conversation, parentElement, selectionProvider, style);
-            break;
-        case HYBRID:
-            section = new HybridDetailSection(this, conversation, parentElement, selectionProvider, style);
-            break;
-        case USER:
-            section = new UserDetailSection(this, conversation, parentElement, selectionProvider, style);
-            break;
-        case GROUP:
-            section = new GroupDetailSection(this, conversation, parentElement, selectionProvider, style);
-            break;
-        case DETERMINATION:
-            section = new DeterminationDetailSection(this, conversation, parentElement, selectionProvider, style);
-            break;
-        case TAXON_RELATIONSHIP:
-            section = new TaxonRelationshipDetailSection(this, conversation, parentElement, selectionProvider, style);
-            break;
-        case REFERENCED_ENTITY:
-            section = new ReferencedEntityDetailSection(this, conversation, parentElement, selectionProvider, style);
-            break;
-        case TERM_VOCABULARY:
-            section = new TermVocabularyDetailSection(this, conversation, parentElement, selectionProvider, style);
-            break;
-        case NAMED_AREA:
-            section = new NamedAreaDetailSection(this, conversation, parentElement, selectionProvider, style);
-            break;
-        case USE_RECORD:
-            section = new UseRecordDetailSection(this, conversation, parentElement, selectionProvider, style);
-            break;
-        }
-
-        if (section == null) {
-            throw new RuntimeException("You tried to create a cdm detail section that is not implemented yet.");
-        }
-
-        parentElement.addElement(section);
-        adapt(section);
-        return section;
-    }
 
+    //--------DetailSections---------
     public NameDetailSection createNameDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         NameDetailSection section = new NameDetailSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
     public ReferenceDetailSection createReferenceDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         ReferenceDetailSection section = new ReferenceDetailSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
     public NomenclaturalReferenceDetailSection createNomenclaturalReferenceDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         NomenclaturalReferenceDetailSection section = new NomenclaturalReferenceDetailSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
     public TaxonBaseDetailSection createTaxonBaseDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         TaxonBaseDetailSection section = new TaxonBaseDetailSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
     public AuthorshipDetailSection createAuthorshipDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         AuthorshipDetailSection section = new AuthorshipDetailSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
     public TeamOrPersonBaseDetailSection createTeamOrPersonBaseDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         TeamOrPersonBaseDetailSection section = new TeamOrPersonBaseDetailSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
     public TeamDetailSection createTeamDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
         TeamDetailSection section = new TeamDetailSection(this, conversation, parentElement, null, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
     public PersonDetailSection createPersonDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
         PersonDetailSection section = new PersonDetailSection(this, conversation, parentElement, null, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
     public DescriptionDetailSection createDescriptionDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         DescriptionDetailSection section = new DescriptionDetailSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
     public DescriptionElementDetailSection createDescriptionElementDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         DescriptionElementDetailSection section = new DescriptionElementDetailSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
     public ParsingMessagesSection createParsingMessagesSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         ParsingMessagesSection section = new ParsingMessagesSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
     public NonViralNameDetailSection createNonViralNameDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         NonViralNameDetailSection section = new NonViralNameDetailSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
     public MediaDetailsSection createMediaDetailsSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         MediaDetailsSection section = new MediaDetailsSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
     public DerivedUnitFacadeDetailSection createDerivedUnitFacadeDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         DerivedUnitFacadeDetailSection section = new DerivedUnitFacadeDetailSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
     public FieldObservationDetailSection createFieldObservationDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         FieldObservationDetailSection section = new FieldObservationDetailSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
     public GatheringEventDetailSection createGatheringEventDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         GatheringEventDetailSection section = new GatheringEventDetailSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
     public DerivedUnitBaseDetailSection createDerivedUnitBaseDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         DerivedUnitBaseDetailSection section = new DerivedUnitBaseDetailSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
     public NaturalLanguageSection createNaturalLanguageSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         NaturalLanguageSection section = new NaturalLanguageSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
     public FeatureDistributionDetailSection createFeatureDistributionDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         FeatureDistributionDetailSection section = new FeatureDistributionDetailSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
     public ClassificationDetailSection createClassificationDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         ClassificationDetailSection section = new ClassificationDetailSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
     public TaxonNodeDetailSection createTaxonNodeDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         TaxonNodeDetailSection section = new TaxonNodeDetailSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
     public PolytomousKeyDetailSection createPolytomousKeyDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         PolytomousKeyDetailSection section = new PolytomousKeyDetailSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
     public PolytomousKeyNodeDetailSection createPolytomousKeyNodeDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         PolytomousKeyNodeDetailSection section = new PolytomousKeyNodeDetailSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
     public InstitutionDetailSection createInstitutionDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         InstitutionDetailSection section = new InstitutionDetailSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
     public GeneralDetailSection createGeneralDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         GeneralDetailSection section = new GeneralDetailSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
     public HybridDetailSection createHybridDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         HybridDetailSection section = new HybridDetailSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
     public UserDetailSection createUserDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         UserDetailSection section = new UserDetailSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
     public GroupDetailSection createGroupDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         GroupDetailSection section = new GroupDetailSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
     public DeterminationDetailSection createDeterminationDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         DeterminationDetailSection section = new DeterminationDetailSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
     public TaxonRelationshipDetailSection createTaxonRelationshipDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         TaxonRelationshipDetailSection section = new TaxonRelationshipDetailSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
     public ReferencedEntityDetailSection createReferencedEntityDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         ReferencedEntityDetailSection section = new ReferencedEntityDetailSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
     public TermVocabularyDetailSection createTermVocabularyDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         TermVocabularyDetailSection section = new TermVocabularyDetailSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
+    public GatheringEventDetailSection createGatheringSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        GatheringEventDetailSection section = new GatheringEventDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
 
     public NamedAreaDetailSection createNamedAreaDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         NamedAreaDetailSection section = new NamedAreaDetailSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
     public UseRecordDetailSection createUseRecordDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         UseRecordDetailSection section = new UseRecordDetailSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
-    public GeneralDetailSection createFOSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
-        GeneralDetailSection section = new GeneralDetailSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
-        return section;
+    private void addAndAdaptSection(ICdmFormElement parentElement, AbstractFormSection<?> section) {
+        parentElement.addElement(section);
+        adapt(section);
     }
 
-    public GatheringEventDetailSection createGatheringSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
-        GatheringEventDetailSection section = new GatheringEventDetailSection(this, conversation, parentElement, selectionProvider, style);
-        addAndAdapt(parentElement, section);
-        return section;
+    //--------DetailElements------------
+
+    public UseRecordDetailElement createUseRecordDetailElement(ICdmFormElement parentElement){
+        UseRecordDetailElement element = new UseRecordDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
     }
 
-    public FieldObservationDetailSection createFODetailsSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
-        FieldObservationDetailSection foDetailsSection = new FieldObservationDetailSection(this, conversation, parentElement, selectionProvider, style);
-        parentElement.addElement(foDetailsSection);
-        adapt(foDetailsSection);
-        return foDetailsSection;
+    public DefinedTermDetailElement<NamedAreaLevel> createNamedAreaLevelElement(ICdmFormElement parentElement){
+        DefinedTermDetailElement<NamedAreaLevel> element = new DefinedTermDetailElement<NamedAreaLevel>(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
     }
 
-    private void addAndAdapt(ICdmFormElement parentElement, AbstractFormSection<?> section) {
-        parentElement.addElement(section);
-        adapt(section);
+    public eu.etaxonomy.taxeditor.ui.section.vocabulary.NamedAreaDetailElement createNamedAreaDetailElement(ICdmFormElement parentElement){
+        eu.etaxonomy.taxeditor.ui.section.vocabulary.NamedAreaDetailElement element = new eu.etaxonomy.taxeditor.ui.section.vocabulary.NamedAreaDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
     }
 
+    public TermVocabularyDetailElement createTermVocabularyDetailElement(ICdmFormElement parentElement){
+        TermVocabularyDetailElement element = new TermVocabularyDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
 
-    /**
-     * <p>
-     * createCdmDetailElement
-     * </p>
-     *
-     * @param detailType
-     *            a
-     *            {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory.DetailType}
-     *            object.
-     * @param style
-     *            a int.
-     * @param parentElement
-     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-     *            object.
-     * @return a
-     *         {@link eu.etaxonomy.taxeditor.ui.section.AbstractCdmDetailElement}
-     *         object.
-     */
-    public AbstractCdmDetailElement createCdmDetailElement(DetailType detailType, ICdmFormElement parentElement, int style) {
-        AbstractCdmDetailElement element = null;
+    public ReferenceEntityDetailElement createReferenceEntityDetailElement(ICdmFormElement parentElement){
+        ReferenceEntityDetailElement element = new ReferenceEntityDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
 
-        switch (detailType) {
-        case SCIENTIFICNAME:
-            element = new NameDetailElement(this, parentElement, style);
-            break;
-        case REFERENCEBASE:
-            element = new ReferenceDetailElement(this, parentElement, style);
-            break;
-        case NOMENCLATURALREFERENCE:
-            element = new NomenclaturalReferenceDetailElement(this, parentElement, style);
-            break;
-        case TAXONBASE:
-            element = new TaxonBaseDetailElement(this, parentElement, style);
-            break;
-        case AUTHORSHIP:
-            element = new AuthorshipDetailElement(this, parentElement, style);
-            break;
-        case TEAM:
-            element = new TeamDetailElement(this, parentElement, style);
-            break;
-        case PERSON:
-            element = new PersonDetailElement(this, parentElement, style);
-            break;
-        case DESCRIPTION:
-            element = new DescriptionDetailElement(this, parentElement, style);
-            break;
-        case DESCRIPTIONELEMENT:
-            element = new DescriptionElementDetailElement(this, parentElement, style);
-            break;
-        case NONVIRALNAME:
-            element = new NonViralNameDetailElement(this, parentElement);
-            break;
-        case DERIVED_UNIT_FACADE:
-            element = new DerivedUnitFacadeDetailElement(this, parentElement);
-            break;
-        case FIELD_OBSERVATION:
-            element = new FieldObservationDetailElement(this, parentElement);
-            break;
-        case GATHERING_EVENT:
-            element = new GatheringEventDetailElement(this, parentElement);
-            break;
-        case DERIVED_UNIT:
-            element = new DerivedUnitBaseDetailElement(this, parentElement);
-            break;
-        case NATURAL_LANGUAGE:
-            element = new NaturalLanguageDetailElement(this, parentElement);
-            break;
-        case FEATURE_DISTRIBUTION:
-            element = new FeatureDistributionDetailElement(this, parentElement);
-            break;
-        case CLASSIFICATION:
-            element = new ClassificationDetailElement(this, parentElement);
-            break;
-        case TAXON_NODE:
-            element = new TaxonNodeDetailElement(this, parentElement);
-            break;
-        case COLLECTION:
-            element = new CollectionDetailElement(this, parentElement);
-            break;
-        case POLYTOMOUS_KEY:
-            element = new PolytomousKeyDetailElement(this, parentElement);
-            break;
-        case POLYTOMOUS_KEY_NODE:
-            element = new PolytomousKeyNodeDetailElement(this, parentElement);
-            break;
-        case INSTITUTION:
-            element = new InstitutionDetailElement(this, parentElement);
-            break;
-        case DERIVED_UNIT_GENERAL:
-            element = new GeneralDetailElement(this, parentElement);
-            break;
-        case HYBRID:
-            element = new HybridDetailElement(this, parentElement);
-            break;
-        case USER:
-            element = new UserDetailElement(this, parentElement);
-            break;
-        case GROUP:
-            element = new GroupDetailElement(this, parentElement);
-            break;
-        case GRANTEDAUTHORITY:
-            element = new GrantedAuthorityDetailElement(this, parentElement);
-            break;
-        case DETERMINATION:
-            element = new DeterminationDetailElement(this, parentElement);
-            break;
-        case TAXON_RELATIONSHIP:
-            element = new TaxonRelationshipDetailElement(this, parentElement);
-            break;
-        case REFERENCED_ENTITY:
-            element = new RefereneEntityDetailElement(this, parentElement);
-            break;
-        case TERM_VOCABULARY:
-            element = new TermVocabularyDetailElement(this, parentElement);
-            break;
-        case NAMED_AREA:
-            element = new eu.etaxonomy.taxeditor.ui.section.vocabulary.NamedAreaDetailElement(this, parentElement);
-            break;
-        case NAMED_AREA_LEVEL:
-            element = new DefinedTermDetailElement<NamedAreaLevel>(this, parentElement);
-            break;
-        case USE_RECORD:
-            // element = new UseRecordDetailElement(this, parentElement, style);
-            element = new UseRecordDetailElement(this, parentElement);
-            break;
-        }
+    public TaxonRelationshipDetailElement createTaxonRelationshipDetailElement(ICdmFormElement parentElement){
+        TaxonRelationshipDetailElement element = new TaxonRelationshipDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
 
-        if (element == null) {
-            AbstractUtility.error(this.getClass(),
-                    "Detail element was not created. Seems like the case was not implemented for the requested detail type: "
-                            + detailType, null);
-        }
+    public GrantedAuthorityDetailElement createGrantedAuthorityDetailElement(ICdmFormElement parentElement){
+        GrantedAuthorityDetailElement element = new GrantedAuthorityDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
 
-        adapt(element);
-        parentElement.addElement(element);
+    public GroupDetailElement createGroupDetailElement(ICdmFormElement parentElement){
+        GroupDetailElement element = new GroupDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public UserDetailElement createUserDetailElement(ICdmFormElement parentElement){
+        UserDetailElement element = new UserDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public HybridDetailElement createHybridDetailElement(ICdmFormElement parentElement){
+        HybridDetailElement element = new HybridDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public InstitutionDetailElement createInstitutionDetailElement(ICdmFormElement parentElement){
+        InstitutionDetailElement element = new InstitutionDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public PolytomousKeyNodeDetailElement createPolytomousKeyNodeDetailElement(ICdmFormElement parentElement){
+        PolytomousKeyNodeDetailElement element = new PolytomousKeyNodeDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public PolytomousKeyDetailElement createPolytomousKeyDetailElement(ICdmFormElement parentElement){
+        PolytomousKeyDetailElement element = new PolytomousKeyDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public CollectionDetailElement createCollectionDetailElement(ICdmFormElement parentElement){
+        CollectionDetailElement element = new CollectionDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public TaxonNodeDetailElement createTaxonNodeDetailElement(ICdmFormElement parentElement){
+        TaxonNodeDetailElement element = new TaxonNodeDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public ClassificationDetailElement createClassificationDetailElement(ICdmFormElement parentElement){
+        ClassificationDetailElement element = new ClassificationDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public FeatureDistributionDetailElement createFeatureDistributionDetailElement(ICdmFormElement parentElement){
+        FeatureDistributionDetailElement element = new FeatureDistributionDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public NaturalLanguageDetailElement createNaturalLanguageDetailElement(ICdmFormElement parentElement){
+        NaturalLanguageDetailElement element = new NaturalLanguageDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public DerivedUnitFacadeDetailElement createDerivedUnitFacadeDetailElement(ICdmFormElement parentElement){
+        DerivedUnitFacadeDetailElement element = new DerivedUnitFacadeDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public NonViralNameDetailElement createNonViralNameDetailElement(ICdmFormElement parentElement){
+        NonViralNameDetailElement element = new NonViralNameDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public DescriptionElementDetailElement createDescriptionElementDetailElement(ICdmFormElement parentElement, int style){
+        DescriptionElementDetailElement element = new DescriptionElementDetailElement(this, parentElement, style);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public DescriptionDetailElement createDescriptionDetailElement(ICdmFormElement parentElement, int style){
+        DescriptionDetailElement element = new DescriptionDetailElement(this, parentElement, style);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public PersonDetailElement createPersonDetailElement(ICdmFormElement parentElement, int style){
+        PersonDetailElement element = new PersonDetailElement(this, parentElement, style);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public TeamDetailElement createTeamDetailElement(ICdmFormElement parentElement, int style){
+        TeamDetailElement element = new TeamDetailElement(this, parentElement, style);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public AuthorshipDetailElement createAuthorshipDetailElement(ICdmFormElement parentElement, int style){
+        AuthorshipDetailElement element = new AuthorshipDetailElement(this, parentElement, style);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public TaxonBaseDetailElement createTaxonBaseDetailElement(ICdmFormElement parentElement, int style){
+        TaxonBaseDetailElement element = new TaxonBaseDetailElement(this, parentElement, style);
+        addAndAdaptElement(parentElement, element);
         return element;
     }
 
+    public NameDetailElement createNameDetailElement(ICdmFormElement parentElement, int style){
+        NameDetailElement element = new NameDetailElement(this, parentElement, style);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public ReferenceDetailElement createReferenceDetailElement(ICdmFormElement parentElement, int style){
+        ReferenceDetailElement element = new ReferenceDetailElement(this, parentElement, style);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public NomenclaturalReferenceDetailElement createNomenclaturalReferenceDetailElement(ICdmFormElement parentElement, int style){
+        NomenclaturalReferenceDetailElement element = new NomenclaturalReferenceDetailElement(this, parentElement, style);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+
     public GeneralDetailElement createGeneralDetailElement(ICdmFormElement parentElement){
         GeneralDetailElement element = new GeneralDetailElement(this, parentElement);
-        addAndAdapt(parentElement, element);
+        addAndAdaptElement(parentElement, element);
         return element;
     }
 
+
     public GatheringEventDetailElement createGatheringEventDetailElement(ICdmFormElement parentElement) {
         GatheringEventDetailElement element = new GatheringEventDetailElement(this, parentElement);
-        addAndAdapt(parentElement, element);
+        addAndAdaptElement(parentElement, element);
         return element;
     }
 
     public FieldObservationDetailElement createFieldObservationDetailElement(ICdmFormElement parentElement) {
         FieldObservationDetailElement element = new FieldObservationDetailElement(this, parentElement);
-        addAndAdapt(parentElement, element);
+        addAndAdaptElement(parentElement, element);
         return element;
     }
 
+
     public DerivedUnitBaseDetailElement createDerivedUnitBaseDetailElement(ICdmFormElement parentElement) {
         DerivedUnitBaseDetailElement element = new DerivedUnitBaseDetailElement(this, parentElement);
-        addAndAdapt(parentElement, element);
+        addAndAdaptElement(parentElement, element);
         return element;
     }
 
     public DeterminationDetailElement createDeterminationDetailElement(ICdmFormElement parentElement) {
         DeterminationDetailElement element = new DeterminationDetailElement(this, parentElement);
-        addAndAdapt(parentElement, element);
+        addAndAdaptElement(parentElement, element);
         return element;
     }
 
@@ -1941,190 +1865,207 @@ public class CdmFormFactory extends FormToolkit {
      * @param parentElement
      * @param element
      */
-    private void addAndAdapt(ICdmFormElement parentElement, AbstractCdmDetailElement<?> element) {
+    private void addAndAdaptElement(ICdmFormElement parentElement, AbstractCdmDetailElement<?> element) {
         adapt(element);
         parentElement.addElement(element);
     }
 
-    /**
-     *
-     * Used to define which {@link AbstractEntityCollectionSection} should be
-     * created in
-     * {@link CdmFormFactory#createEntityDetailSection(EntityDetailType, ConversationHolder, ICdmFormElement, int)}
-     *
-     * @author n.hoffmann
-     * @created Mar 5, 2010
-     * @version 1.0
-     */
-    public static enum EntityDetailType {
-        TEAM, // never used
-        TEAMMEMBER,
-        ANNOTATION,
-        CREDIT,
-        DESCRIPTIONELEMENTSOURCE,
-        EXTENSION,
-        MARKER,
-        MEDIA,
-        DESCRIPTIONELEMENTMEDIA,
-        MEDIAREPRESENTATION,
-        MEDIAREPRESENTATIONPART,
-        MODIFIER,
-        NOMENCLATURALSTATUS,
-        NAME_RELATIONSHIP,
-        PROTOLOG,
-        RIGHTS,
-        SOURCE,
-        SCOPE,
-        DESCRIPTIONSOURCE,
-        TYPEDESIGNATION,
-        STATE_DATA,
-        STATISTICAL_MEASUREMENT_VALUE,
-        DESCRIBED_SPECIMEN,
-        COLLECTING_AREA, DETERMINATION_EVENT, // never used
-        SPECIMEN_COLLECTION,
-        IDENTIFIABLE_SOURCE_COLLECTION,
-        GEOGRAPHICAL_SCOPE, // never used
-        SCOPE_RESTRICTION,
-        MEMBER,
-        GRANTED_AUTHORITY,
-        GROUPS_BY_USER,
-        TAXONOMIC_SCOPE,
-        DETERMINATION_CURRENT,
-        DETERMINATION_HISTORY
+    //--------EntityCollectionSection----------
+    public TeamMemberSection createTeamMemberSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        TeamMemberSection section = new TeamMemberSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
     }
 
-    /**
-     * <p>
-     * createEntityDetailSection
-     * </p>
-     *
-     * @param entityDetailType
-     *            a
-     *            {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory.EntityDetailType}
-     *            object.
-     * @param style
-     *            a int.
-     * @param conversation
-     *            a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
-     *            object.
-     * @param parentElement
-     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-     *            object.
-     * @return a {@link eu.etaxonomy.taxeditor.ui.element.AbstractFormSection}
-     *         object.
-     */
-    public AbstractFormSection createEntityDetailSection(EntityDetailType entityDetailType,
-            ConversationHolder conversation, ICdmFormElement parentElement, int style) {
-        AbstractFormSection section = null;
-
-//        System.out.println("EntityDetailSection: " + entityDetailType);
-        switch (entityDetailType) {
-        case TEAM:
-            // TODO this is not an AbstractEntityCollectionSection
-            section = new TeamDetailSection(this, conversation, parentElement, null, style);
-            break;
-        case TEAMMEMBER:
-            section = new TeamMemberSection(this, conversation, parentElement, style);
-            break;
-        case ANNOTATION:
-            section = new AnnotationSection(this, conversation, parentElement, style);
-            break;
-        case CREDIT:
-            section = new CreditSection(this, conversation, parentElement, style);
-            break;
-        case DESCRIPTIONELEMENTSOURCE:
-            section = new DescriptionElementSourceSection(this, conversation, parentElement, style);
-            break;
-        case EXTENSION:
-            section = new ExtensionSection(this, conversation, parentElement, style);
-            break;
-        case MARKER:
-            section = new MarkerSection(this, conversation, parentElement, style);
-            break;
-        case MEDIA:
-            section = new MediaSection(this, conversation, parentElement, style);
-            break;
-        case DESCRIPTIONELEMENTMEDIA:
-            section = new DescriptionElementMediaSection(this, conversation, parentElement, style);
-            break;
-        case MEDIAREPRESENTATION:
-            section = new MediaRepresentationSection(this, conversation, parentElement, style);
-            break;
-        case MEDIAREPRESENTATIONPART:
-            section = new MediaRepresentationPartSection(this, conversation, parentElement, style);
-            break;
-        case MODIFIER:
-            section = new ModifierSection(this, conversation, parentElement, style);
-            break;
-        case NOMENCLATURALSTATUS:
-            section = new NomenclaturalStatusSection(this, conversation, parentElement, style);
-            break;
-        case NAME_RELATIONSHIP:
-            section = new NameRelationshipDetailSection(this, conversation, parentElement, style);
-            break;
-        case PROTOLOG:
-            section = new ProtologueSection(this, conversation, parentElement, style);
-            break;
-        case RIGHTS:
-            section = new RightsSection(this, conversation, parentElement, style);
-            break;
-        case SOURCE:
-            section = new SourceSection(this, conversation, parentElement, style);
-            break;
-        case SCOPE:
-            section = new ScopeSection(this, conversation, parentElement, style);
-            break;
-        case DESCRIPTIONSOURCE:
-            section = new DescriptionSourceSection(this, conversation, parentElement, style);
-            break;
-        case TYPEDESIGNATION:
-            section = new TypeDesignationSection(this, conversation, parentElement, style);
-            break;
-        case STATE_DATA:
-            section = new StateDataSection(this, conversation, parentElement, style);
-            break;
-        case STATISTICAL_MEASUREMENT_VALUE:
-            section = new StatisticalMeasurementValueSection(this, conversation, parentElement, style);
-            break;
-        case DESCRIBED_SPECIMEN:
-            section = new DescribedSpecimenSection(this, conversation, parentElement, style);
-            break;
-        case COLLECTING_AREA:
-            section = new CollectingAreasDetailSection(this, conversation, parentElement, style);
-            break;
-        case DETERMINATION_CURRENT:
-            section = new CurrentDeterminationDetailSection(this, conversation, parentElement, style);
-            break;
-        case DETERMINATION_HISTORY:
-            section = new DeterminationHistoryDetailSection(this, conversation, parentElement, style);
-            break;
-        case SPECIMEN_COLLECTION:
-            section = new SpecimenCollectionDetailSection(this, conversation, parentElement, style);
-            break;
-        case IDENTIFIABLE_SOURCE_COLLECTION:
-            section = new SourceCollectionDetailSection(this, conversation, parentElement, style);
-            break;
-        case GEOGRAPHICAL_SCOPE:
-            section = new GeographicalScopeDetailSection(this, conversation, parentElement, style);
-            break;
-        case SCOPE_RESTRICTION:
-            section = new ScopeRestrictionSection(this, conversation, parentElement, style);
-            break;
-        case MEMBER:
-            section = new MemberDetailSection(this, conversation, parentElement, style);
-            break;
-        case GRANTED_AUTHORITY:
-            section = new GrantedAuthorityDetailSection(this, conversation, parentElement, style);
-            break;
-        case GROUPS_BY_USER:
-            section = new GroupsByUserDetailSection(this, conversation, parentElement, style);
-            break;
-        case TAXONOMIC_SCOPE:
-            section = new TaxonomicScopeSection(this, conversation, parentElement, style);
-            break;
-        }
-        parentElement.addElement(section);
-        adapt(section);
+    public AnnotationSection createAnnotationSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        AnnotationSection section = new AnnotationSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public CreditSection createCreditSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        CreditSection section = new CreditSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public DescriptionElementSourceSection createDescriptionElementSourceSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        DescriptionElementSourceSection section = new DescriptionElementSourceSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public ExtensionSection createExtensionSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        ExtensionSection section = new ExtensionSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public MarkerSection createMarkerSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        MarkerSection section = new MarkerSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public MediaSection createMediaSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        MediaSection section = new MediaSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public DescriptionElementMediaSection createDescriptionElementMediaSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        DescriptionElementMediaSection section = new DescriptionElementMediaSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public MediaRepresentationSection createMediaRepresentationSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        MediaRepresentationSection section = new MediaRepresentationSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public MediaRepresentationPartSection createMediaRepresentationPartSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        MediaRepresentationPartSection section = new MediaRepresentationPartSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public ModifierSection createModifierSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        ModifierSection section = new ModifierSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public NomenclaturalStatusSection createNomenclaturalStatusSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        NomenclaturalStatusSection section = new NomenclaturalStatusSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public NameRelationshipDetailSection createNameRelationshipDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        NameRelationshipDetailSection section = new NameRelationshipDetailSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public ProtologueSection createProtologueSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        ProtologueSection section = new ProtologueSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public RightsSection createRightsSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        RightsSection section = new RightsSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public SourceSection createSourceSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        SourceSection section = new SourceSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public ScopeSection createScopeSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        ScopeSection section = new ScopeSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public DescriptionSourceSection createDescriptionSourceSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        DescriptionSourceSection section = new DescriptionSourceSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public TypeDesignationSection createTypeDesignationSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        TypeDesignationSection section = new TypeDesignationSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public StateDataSection createStateDataSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        StateDataSection section = new StateDataSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public StatisticalMeasurementValueSection createStatisticalMeasurementValueSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        StatisticalMeasurementValueSection section = new StatisticalMeasurementValueSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public DescribedSpecimenSection createDescribedSpecimenSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        DescribedSpecimenSection section = new DescribedSpecimenSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public CollectingAreasDetailSection createCollectingAreasDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        CollectingAreasDetailSection section = new CollectingAreasDetailSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public CurrentDeterminationDetailSection createCurrentDeterminationDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        CurrentDeterminationDetailSection section = new CurrentDeterminationDetailSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public DeterminationHistoryDetailSection createDeterminationHistoryDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        DeterminationHistoryDetailSection section = new DeterminationHistoryDetailSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public SpecimenCollectionDetailSection createSpecimenCollectionDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        SpecimenCollectionDetailSection section = new SpecimenCollectionDetailSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public SourceCollectionDetailSection createSourceCollectionDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        SourceCollectionDetailSection section = new SourceCollectionDetailSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public GeographicalScopeDetailSection createGeographicalScopeDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        GeographicalScopeDetailSection section = new GeographicalScopeDetailSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public ScopeRestrictionSection createScopeRestrictionSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        ScopeRestrictionSection section = new ScopeRestrictionSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public MemberDetailSection createMemberDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        MemberDetailSection section = new MemberDetailSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public GrantedAuthorityDetailSection createGrantedAuthorityDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        GrantedAuthorityDetailSection section = new GrantedAuthorityDetailSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public GroupsByUserDetailSection createGroupsByUserDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        GroupsByUserDetailSection section = new GroupsByUserDetailSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public TaxonomicScopeSection createTaxonomicScopeSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        TaxonomicScopeSection section = new TaxonomicScopeSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
         return section;
     }
 
@@ -2187,10 +2128,28 @@ public class CdmFormFactory extends FormToolkit {
         } else if (entity instanceof IdentifiableSource) {
             element = new IdentifiableSourceElement(this, parentElement, (IdentifiableSource) entity, removeListener,
                     style);
-        } else if (entity instanceof Scope) {
-            element = new ScopeElement(this, parentElement, (Scope) entity, removeListener, style);
-        } else if (entity instanceof Modifier) {
-            element = new ModifierElement(this, parentElement, (Modifier) entity, removeListener, style);
+               } else if (entity instanceof DefinedTerm) {
+                       switch(((DefinedTerm)entity).getTermType()) {
+                               case Scope:
+                                       element = new ScopeElement(this,
+                                                       parentElement,
+                                                       (DefinedTerm) entity,
+                                                       removeListener,
+                                                       style);
+                                       break;
+                               case Modifier:
+                                       element = new ModifierElement(this,
+                                                       parentElement,
+                                                       (DefinedTerm) entity,
+                                                       removeListener,
+                                                       style);
+                                       break;
+                               default:
+                                       //FIXME : Actually we should through an exception here
+                                       element = null;
+                                       break;
+
+                       }
         } else if (entity instanceof Reference) {
             element = new DescriptionSourceElement(this, parentElement, (Reference) entity, removeListener, style);
         } else if (entity instanceof NameTypeDesignation) {
@@ -2208,14 +2167,28 @@ public class CdmFormFactory extends FormToolkit {
             element = new StatisticalMeasurementValueElement(this, parentElement, (StatisticalMeasurementValue) entity,
                     removeListener, style);
         } else if (entity instanceof DerivedUnit) {
-            element = new DerivedUnitElement(this, parentElement, (DerivedUnit) entity, removeListener, style);
+               switch(((DerivedUnit)entity).getRecordBasis()) {
+                               case LivingSpecimen:
+                               case PreservedSpecimen:
+                               case OtherSpecimen:
+                                       element = new SpecimenCollectionDetailElement(this,
+                                                               parentElement,
+                                                               (DerivedUnit) entity,
+                                                               removeListener,
+                                                               style);
+                                       break;
+                               default:
+                                       element = new DerivedUnitElement(this,
+                                                               parentElement,
+                                                               (DerivedUnit) entity,
+                                                               removeListener,
+                                                               style);
+                       }
+
         } else if (entity instanceof NamedArea) {
             element = new NamedAreaDetailElement(this, parentElement, (NamedArea) entity, removeListener, style);
         } else if (entity instanceof DeterminationEvent) {
-            element = new DeterminationEventDetailElement(this, parentElement, (DeterminationEvent) entity,
-                    removeListener, style);
-        } else if (entity instanceof Specimen) {
-            element = new SpecimenCollectionDetailElement(this, parentElement, (Specimen) entity, removeListener, style);
+            element = new DeterminationEventDetailElement(this, parentElement, (DeterminationEvent) entity, removeListener, style);
         } else if (entity instanceof User) {
             element = new MemberDetailElement(this, parentElement, (User) entity, removeListener, style);
         } else if (entity instanceof GrantedAuthority) {
@@ -2242,11 +2215,18 @@ public class CdmFormFactory extends FormToolkit {
 
         else if (backgroundColor != null && !backgroundColor.isDisposed()) {
             element.setPersistentBackground(backgroundColor);
+            adapt(element);
+            parentElement.addElement(element);
         }
 
+        return element;
+    }
+
+    public void createNamedAreaFieldController(AbstractFormSection parentElement, NamedArea namedArea, SelectionListener removeListener){
+//        Object entity = HibernateProxyHelper.deproxy(versionableEntity); TODO deproxy necessary??
+        NamedAreaFieldController element = new NamedAreaFieldController(this, parentElement, namedArea, removeListener, SWT.NONE);
         adapt(element);
         parentElement.addElement(element);
-        return element;
     }
 
     /**
@@ -2402,4 +2382,118 @@ public class CdmFormFactory extends FormToolkit {
         return text;
     }
 
+
+
+    /**
+     * @param conversationHolder
+     * @param parent
+     * @param detailsViewer
+     * @param i
+     * @return
+     */
+    public FieldObservationGeneralSection createFieldObservationGeneralSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style) {
+        FieldObservationGeneralSection section = new FieldObservationGeneralSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+    /**
+     * @param conversationHolder
+     * @param parent
+     * @param detailsViewer
+     * @param i
+     * @return
+     */
+    public GatheringEventSection createGatheringEventSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style) {
+        GatheringEventSection section = new GatheringEventSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+    /**
+     * @param conversationHolder
+     * @param parent
+     * @param detailsViewer
+     * @param i
+     * @return
+     */
+    public FieldObservationDetailsSection createFieldObservationDetailsSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style) {
+        FieldObservationDetailsSection section = new FieldObservationDetailsSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public SpecimenGeneralSection createSpecimenSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style) {
+        SpecimenGeneralSection section = new SpecimenGeneralSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public SpecimenDetailsSection createSpecimenDetailsSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style) {
+        SpecimenDetailsSection section = new SpecimenDetailsSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public DerivedUnitDetailsSection createDerivedUnitDetailsSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style) {
+        DerivedUnitDetailsSection section = new DerivedUnitDetailsSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public FieldObservationGeneralElementController createSpecimenGeneralElementController(ICdmFormElement parentElement){
+        return createFieldObservationGeneralElementController_internal(parentElement, true, false);
+    }
+
+    public SpecimenDetailsElementController createSpecimenDetailsElementController(ICdmFormElement parentElement){
+        SpecimenDetailsElement element = new SpecimenDetailsElement(parentElement.getLayoutComposite(), SWT.NONE);
+        element.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2,1));
+        SpecimenDetailsElementController controller = new SpecimenDetailsElementController(element, this, parentElement);
+        addAndAdaptElement(parentElement, controller);
+        return controller;
+    }
+
+    public DerivedUnitDetailsElementController createDerivedUnitDetailsElementController(ICdmFormElement parentElement){
+        DerivedUnitDetailsElement element = new DerivedUnitDetailsElement(parentElement.getLayoutComposite(), SWT.NONE);
+        element.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2,1));
+        DerivedUnitDetailsElementController controller = new DerivedUnitDetailsElementController(element, this, parentElement);
+        addAndAdaptElement(parentElement, controller);
+        return controller;
+    }
+
+    public FieldObservationGeneralElementController createSpecimenGeneralElementControllerWizard(ICdmFormElement parentElement){
+        return createFieldObservationGeneralElementController_internal(parentElement, true, true);
+    }
+
+    public FieldObservationGeneralElementController createFieldObservationGeneralElementControllerWizard(ICdmFormElement parentElement){
+        return createFieldObservationGeneralElementController_internal(parentElement, false, true);
+    }
+
+    public FieldObservationGeneralElementController createFieldObservationGeneralElementController(ICdmFormElement parentElement){
+        return createFieldObservationGeneralElementController_internal(parentElement, false, false);
+    }
+
+    private FieldObservationGeneralElementController createFieldObservationGeneralElementController_internal(ICdmFormElement parentElement, boolean isSpecimen, boolean isWizard){
+        FieldObservationGeneralElement element = new FieldObservationGeneralElement(parentElement.getLayoutComposite(), SWT.NONE);
+        element.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2,1));
+        FieldObservationGeneralElementController controller = new FieldObservationGeneralElementController(element, this, parentElement, isSpecimen, isWizard);
+        addAndAdaptElement(parentElement, controller);
+        return controller;
+    }
+
+    public GatheringEventDetailsElementController createGatheringEventDetailsElementController(ICdmFormElement parentElement) {
+        GatheringEventDetailsElement element = new GatheringEventDetailsElement(parentElement.getLayoutComposite(), SWT.NONE);
+        element.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2,1));
+        GatheringEventDetailsElementController controller = new GatheringEventDetailsElementController(element, this, parentElement);
+        adapt(controller);
+        parentElement.addElement(controller);
+        return controller;
+    }
+
+    public FieldObservationDetailsElementController createFieldObservationDetailsElementController(ICdmFormElement parentElement) {
+        FieldObservationDetailsElement element = new FieldObservationDetailsElement(parentElement.getLayoutComposite(), SWT.NONE);
+        element.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2,1));
+        FieldObservationDetailsElementController controller = new FieldObservationDetailsElementController(element, this, parentElement);
+        addAndAdaptElement(parentElement, controller);
+        return controller;
+    }
+
 }