merge-update from trunk
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / element / CdmFormFactory.java
index e5faf1536ae175357829eca536334911f91a625b..cbd7249d5d328e0f0315b3677ccc275ffd25e09b 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,14 +90,32 @@ 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;
@@ -113,10 +132,6 @@ import eu.etaxonomy.taxeditor.ui.section.agent.TeamDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.agent.TeamMemberElement;
 import eu.etaxonomy.taxeditor.ui.section.agent.TeamMemberSection;
 import eu.etaxonomy.taxeditor.ui.section.agent.TeamOrPersonBaseDetailSection;
-import eu.etaxonomy.taxeditor.ui.section.campanula.FieldObservationGeneralElement;
-import eu.etaxonomy.taxeditor.ui.section.campanula.FieldObservationGeneralElementController;
-import eu.etaxonomy.taxeditor.ui.section.campanula.GatheringEventDetailsElement;
-import eu.etaxonomy.taxeditor.ui.section.campanula.GatheringEventDetailsElementController;
 import eu.etaxonomy.taxeditor.ui.section.classification.ClassificationDetailElement;
 import eu.etaxonomy.taxeditor.ui.section.classification.ClassificationDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.classification.TaxonNodeDetailElement;
@@ -200,16 +215,18 @@ import eu.etaxonomy.taxeditor.ui.section.occurrence.DerivedUnitBaseDetailElement
 import eu.etaxonomy.taxeditor.ui.section.occurrence.DerivedUnitBaseDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.DerivedUnitFacadeDetailElement;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.DerivedUnitFacadeDetailSection;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.DerivedUnitGeneralDetailElement;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.DerivedUnitGeneralDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.DeterminationDetailElement;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.DeterminationDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.DeterminationEventDetailElement;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.DeterminationHistoryDetailSection;
-import eu.etaxonomy.taxeditor.ui.section.occurrence.FieldObservationDetailElement;
-import eu.etaxonomy.taxeditor.ui.section.occurrence.FieldObservationDetailSection;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.FieldUnitDetailElement;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.FieldUnitDetailSection;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.FieldUnitGeneralDetailElement;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.FieldUnitGeneralDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.GatheringEventDetailElement;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.GatheringEventDetailSection;
-import eu.etaxonomy.taxeditor.ui.section.occurrence.GeneralDetailElement;
-import eu.etaxonomy.taxeditor.ui.section.occurrence.GeneralDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.NamedAreaDetailElement;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.SourceCollectionDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.SpecimenCollectionDetailElement;
@@ -250,6 +267,7 @@ import eu.etaxonomy.taxeditor.ui.section.userecords.UseRecordDetailElement;
 import eu.etaxonomy.taxeditor.ui.section.userecords.UseRecordDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.vocabulary.DefinedTermDetailElement;
 import eu.etaxonomy.taxeditor.ui.section.vocabulary.DefinedTermDetailSection;
+import eu.etaxonomy.taxeditor.ui.section.vocabulary.FeatureDetailElement;
 import eu.etaxonomy.taxeditor.ui.section.vocabulary.NamedAreaDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.vocabulary.TermVocabularyDetailElement;
 import eu.etaxonomy.taxeditor.ui.section.vocabulary.TermVocabularyDetailSection;
@@ -634,41 +652,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>
@@ -805,6 +797,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
@@ -822,8 +849,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<T>> 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);
@@ -1044,6 +1072,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
@@ -1085,6 +1147,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
@@ -1342,11 +1424,14 @@ 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)) {
             element = new eu.etaxonomy.taxeditor.ui.section.vocabulary.NamedAreaDetailElement(this, parentElement);
+        } else if (definedTermClass.equals(Feature.class)) {
+            element = new FeatureDetailElement(this, parentElement);
         } else {
             element = new DefinedTermDetailElement(this, parentElement);
         }
@@ -1442,8 +1527,8 @@ public class CdmFormFactory extends FormToolkit {
         return section;
     }
 
-    public FieldObservationDetailSection createFieldObservationDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
-        FieldObservationDetailSection section = new FieldObservationDetailSection(this, conversation, parentElement, selectionProvider, style);
+    public FieldUnitDetailSection createFieldUnitDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        FieldUnitDetailSection section = new FieldUnitDetailSection(this, conversation, parentElement, selectionProvider, style);
         addAndAdaptSection(parentElement, section);
         return section;
     }
@@ -1502,8 +1587,14 @@ public class CdmFormFactory extends FormToolkit {
         return section;
     }
 
-    public GeneralDetailSection createGeneralDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
-        GeneralDetailSection section = new GeneralDetailSection(this, conversation, parentElement, selectionProvider, style);
+    public FieldUnitGeneralDetailSection createFieldUnitGeneralDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        FieldUnitGeneralDetailSection section = new FieldUnitGeneralDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public DerivedUnitGeneralDetailSection createDerivedUnitGeneralDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        DerivedUnitGeneralDetailSection section = new DerivedUnitGeneralDetailSection(this, conversation, parentElement, selectionProvider, style);
         addAndAdaptSection(parentElement, section);
         return section;
     }
@@ -1550,6 +1641,11 @@ public class CdmFormFactory extends FormToolkit {
         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);
@@ -1745,41 +1841,32 @@ public class CdmFormFactory extends FormToolkit {
     }
 
 
-    public GeneralDetailElement createGeneralDetailElement(ICdmFormElement parentElement){
-        GeneralDetailElement element = new GeneralDetailElement(this, parentElement);
+    public FieldUnitGeneralDetailElement createFieldUnitGeneralDetailElement(ICdmFormElement parentElement){
+        FieldUnitGeneralDetailElement element = new FieldUnitGeneralDetailElement(this, parentElement);
         addAndAdaptElement(parentElement, element);
         return element;
     }
 
-    public FieldObservationGeneralElementController createFieldObservationGeneralElement(ICdmFormElement parentElement){
-        FieldObservationGeneralElement fieldObservationGeneralElement = new FieldObservationGeneralElement(parentElement.getLayoutComposite(), SWT.NONE);
-        fieldObservationGeneralElement.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2,1));
-        FieldObservationGeneralElementController element = new FieldObservationGeneralElementController(fieldObservationGeneralElement, this, parentElement);
+    public DerivedUnitGeneralDetailElement createDerivedUnitGeneralDetailElement(ICdmFormElement parentElement){
+        DerivedUnitGeneralDetailElement element = new DerivedUnitGeneralDetailElement(this, parentElement);
         addAndAdaptElement(parentElement, element);
         return element;
     }
 
+
     public GatheringEventDetailElement createGatheringEventDetailElement(ICdmFormElement parentElement) {
         GatheringEventDetailElement element = new GatheringEventDetailElement(this, parentElement);
         addAndAdaptElement(parentElement, element);
         return element;
     }
 
-    public GatheringEventDetailsElementController createGatheringEventDetailsElementController(ICdmFormElement parentElement) {
-        GatheringEventDetailsElement gatheringEventDetailsElement = new GatheringEventDetailsElement(parentElement.getLayoutComposite(), SWT.NONE);
-        gatheringEventDetailsElement.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2,1));
-        GatheringEventDetailsElementController element = new GatheringEventDetailsElementController(gatheringEventDetailsElement, this, parentElement);
-        adapt(element);
-        parentElement.addElement(element);
-        return element;
-    }
-
-    public FieldObservationDetailElement createFieldObservationDetailElement(ICdmFormElement parentElement) {
-        FieldObservationDetailElement element = new FieldObservationDetailElement(this, parentElement);
+    public FieldUnitDetailElement createFieldUnitDetailElement(ICdmFormElement parentElement) {
+        FieldUnitDetailElement element = new FieldUnitDetailElement(this, parentElement);
         addAndAdaptElement(parentElement, element);
         return element;
     }
 
+
     public DerivedUnitBaseDetailElement createDerivedUnitBaseDetailElement(ICdmFormElement parentElement) {
         DerivedUnitBaseDetailElement element = new DerivedUnitBaseDetailElement(this, parentElement);
         addAndAdaptElement(parentElement, element);
@@ -2059,10 +2146,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) {
@@ -2080,13 +2185,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);
         } else if (entity instanceof User) {
             element = new MemberDetailElement(this, parentElement, (User) entity, removeListener, style);
         } else if (entity instanceof GrantedAuthority) {
@@ -2120,6 +2240,13 @@ public class CdmFormFactory extends FormToolkit {
         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);
+    }
+
     /**
      * <p>
      * Creates a selection element for the given type T.
@@ -2273,4 +2400,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;
+    }
+
 }