- sorting/ordering on all hierarchy levels (#3736)
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / element / CdmFormFactory.java
index e8b705e2652cf46a06db4482a922422836a04156..00818c1455b98f60c566345fbb4f73cf30b40c25 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,7 +90,6 @@ 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;
@@ -97,6 +97,7 @@ import eu.etaxonomy.cdm.strategy.parser.ParserProblem;
 import eu.etaxonomy.taxeditor.model.AbstractUtility;
 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;
@@ -200,8 +201,8 @@ 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.GatheringEventDetailElement;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.GatheringEventDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.GeneralDetailElement;
@@ -246,6 +247,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;
@@ -264,1054 +266,1120 @@ import eu.etaxonomy.taxeditor.ui.selection.TaxonNodeSelectionElement;
  */
 public class CdmFormFactory extends FormToolkit {
 
-    private BoldFontHolder2 boldFontHolder2;
-    private MouseListener selectionMouseHandler;
-    private FocusListener selectionFocusHandler;
+       private BoldFontHolder2 boldFontHolder2;
+       private MouseListener selectionMouseHandler;
+       private FocusListener selectionFocusHandler;
 
     private final Set<SelectionListener> selectionListenerList = new HashSet<SelectionListener>();
 
-    private final List<IPropertyChangeListener> propertyChangeListeners = new ArrayList<IPropertyChangeListener>();
+       private final List<IPropertyChangeListener> propertyChangeListeners = new ArrayList<IPropertyChangeListener>();
 
-    private final int orientation = Window.getDefaultOrientation();
-    private ISelectionProvider selectionProvider;
+       private final int orientation = Window.getDefaultOrientation();
+       private ISelectionProvider selectionProvider;
 
-    /** Constant <code>EMPTY_SELECTION</code> */
-    public static ISelection EMPTY_SELECTION = new ISelection() {
-        @Override
-        public boolean isEmpty() {
-            return true;
-        }
-    };
-
-    /**
-     *
-     * @author n.hoffmann
-     * @date Jan 25, 2010
-     *
-     */
-    private class SelectionMouseHandler extends MouseAdapter {
-        @Override
-        public void mouseDown(MouseEvent e) {
-            notifySelectionListeners(e);
-        }
-    }
-
-    /**
-     *
-     * @author n.hoffmann
-     * @date Jan 25, 2010
-     *
-     */
-    private class SelectionFocusHandler extends FocusAdapter {
-        @Override
-        public void focusGained(FocusEvent e) {
-            notifySelectionListeners(e);
-        }
-    }
+       /** Constant <code>EMPTY_SELECTION</code> */
+       public static ISelection EMPTY_SELECTION = new ISelection() {
+               @Override
+               public boolean isEmpty() {
+                       return true;
+               }
+       };
 
-    private void notifySelectionListeners(TypedEvent e) {
-        Event event = new Event();
-        event.widget = e.widget;
-        SelectionEvent selectionEvent = new SelectionEvent(event);
+       /**
+        *
+        * @author n.hoffmann
+        * @date Jan 25, 2010
+        *
+        */
+       private class SelectionMouseHandler extends MouseAdapter {
+               @Override
+               public void mouseDown(MouseEvent e) {
+                       notifySelectionListeners(e);
+               }
+       }
+
+       /**
+        *
+        * @author n.hoffmann
+        * @date Jan 25, 2010
+        *
+        */
+       private class SelectionFocusHandler extends FocusAdapter {
+               @Override
+               public void focusGained(FocusEvent e) {
+                       notifySelectionListeners(e);
+               }
+       }
+
+       private void notifySelectionListeners(TypedEvent e) {
+               Event event = new Event();
+               event.widget = e.widget;
+               SelectionEvent selectionEvent = new SelectionEvent(event);
 
         for (SelectionListener listener : selectionListenerList) {
             listener.widgetSelected(selectionEvent);
-        }
-    }
-
-    /**
-     * <p>
-     * Constructor for CdmFormFactory.
-     * </p>
-     *
-     * @param display
-     *            a {@link org.eclipse.swt.widgets.Display} object.
-     * @param selectionProvider
-     *            a {@link org.eclipse.jface.viewers.ISelectionProvider} object.
-     */
-    public CdmFormFactory(Display display, ISelectionProvider selectionProvider) {
-        super(display);
-        this.selectionProvider = selectionProvider;
-        init();
-    }
-
-    /**
-     * <p>
-     * Constructor for CdmFormFactory.
-     * </p>
-     *
-     * @param display
-     *            a {@link org.eclipse.swt.widgets.Display} object.
-     */
-    public CdmFormFactory(Display display) {
-        super(display);
-        init();
-    }
+               }
+       }
 
-    /**
+       /**
+        * <p>
+        * Constructor for CdmFormFactory.
+        * </p>
         *
+        * @param display
+        *            a {@link org.eclipse.swt.widgets.Display} object.
+        * @param selectionProvider
+        *            a {@link org.eclipse.jface.viewers.ISelectionProvider} object.
         */
-    private void init() {
-        boldFontHolder2 = new BoldFontHolder2();
-        selectionMouseHandler = new SelectionMouseHandler();
-        selectionFocusHandler = new SelectionFocusHandler();
-    }
+       public CdmFormFactory(Display display, ISelectionProvider selectionProvider) {
+               super(display);
+               this.selectionProvider = selectionProvider;
+               init();
+       }
+
+       /**
+        * <p>
+        * Constructor for CdmFormFactory.
+        * </p>
+        *
+        * @param display
+        *            a {@link org.eclipse.swt.widgets.Display} object.
+        */
+       public CdmFormFactory(Display display) {
+               super(display);
+               init();
+       }
 
-    /**
-     * Creates an instance initialized with the correct selectionProvider
-     *
-     * Make sure to remove the instance when the entityComposite disposes via
-     * destroySelectionArbitrator(..)
-     *
-     * @param entityElement
-     *            a {@link eu.etaxonomy.taxeditor.ui.element.IEntityElement}
-     *            object.
-     * @return a {@link eu.etaxonomy.taxeditor.ui.element.SelectionArbitrator}
-     *         object.
-     */
+       /**
+        *
+        */
+       private void init() {
+               boldFontHolder2 = new BoldFontHolder2();
+               selectionMouseHandler = new SelectionMouseHandler();
+               selectionFocusHandler = new SelectionFocusHandler();
+       }
+
+       /**
+        * Creates an instance initialized with the correct selectionProvider
+        *
+        * Make sure to remove the instance when the entityComposite disposes via
+        * destroySelectionArbitrator(..)
+        *
+        * @param entityElement
+        *            a {@link eu.etaxonomy.taxeditor.ui.element.IEntityElement}
+        *            object.
+        * @return a {@link eu.etaxonomy.taxeditor.ui.element.SelectionArbitrator}
+        *         object.
+        */
     public SelectionArbitrator createSelectionArbitrator(IEntityElement entityElement) {
         SelectionArbitrator selectionArbitrator = new SelectionArbitrator(entityElement);
-        selectionArbitrator.addSelectionProvider(selectionProvider);
-        selectionProvider.addSelectionChangedListener(selectionArbitrator);
-        addSelectionListener(selectionArbitrator);
-        return selectionArbitrator;
-    }
-
-    /**
-     * <p>
-     * destroySelectionArbitrator
-     * </p>
-     *
-     * @param selectionArbitrator
+               selectionArbitrator.addSelectionProvider(selectionProvider);
+               selectionProvider.addSelectionChangedListener(selectionArbitrator);
+               addSelectionListener(selectionArbitrator);
+               return selectionArbitrator;
+       }
+
+       /**
+        * <p>
+        * destroySelectionArbitrator
+        * </p>
+        *
+        * @param selectionArbitrator
      *            a
      *            {@link eu.etaxonomy.taxeditor.ui.element.SelectionArbitrator}
-     *            object.
-     */
+        *            object.
+        */
     public void destroySelectionArbitrator(SelectionArbitrator selectionArbitrator) {
-        removeSelectionListener(selectionArbitrator);
-        if (selectionProvider != null) {
+               removeSelectionListener(selectionArbitrator);
+               if (selectionProvider != null) {
             selectionProvider.removeSelectionChangedListener(selectionArbitrator);
-        } else {
+               } else {
             AbstractUtility.error(this.getClass(),
                     "Tried to destroy a selection listener from this factories listeners but was null", null);
-        }
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public void adapt(Composite composite) {
-        composite.addMouseListener(selectionMouseHandler);
-        super.adapt(composite);
-    }
-
-    /**
-     * <p>
+               }
+       }
+
+       /** {@inheritDoc} */
+       @Override
+       public void adapt(Composite composite) {
+               composite.addMouseListener(selectionMouseHandler);
+               super.adapt(composite);
+       }
+
+       /**
+        * <p>
      * Adapts the {@link AbstractCdmFormElement}:<br>
      * - sets the {@link IPropertyChangeListener}s handled by this class
-     * </p>
-     *
-     * @param formElement
-     *            a
-     *            {@link eu.etaxonomy.taxeditor.ui.element.AbstractCdmFormElement}
-     *            object.
-     */
-    public void adapt(AbstractCdmFormElement formElement) {
-        formElement.setPropertyChangeListeners(propertyChangeListeners);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public void adapt(Control control, boolean trackFocus, boolean trackKeyboard) {
-        if (trackFocus) {
-            control.addFocusListener(selectionFocusHandler);
-        }
-        super.adapt(control, trackFocus, trackKeyboard);
-    }
-
-    /**
-     * <p>
-     * destroyElement
-     * </p>
-     *
-     * @param formElement
-     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-     *            object.
-     */
-    public void destroyElement(ICdmFormElement formElement) {
-        // return if element was not initialized
-        if (formElement == null) {
-            return;
-        }
-        // destroy selection arbitrator, if any
-        if (formElement instanceof ISelectableElement) {
+        * </p>
+        *
+        * @param formElement
+        *            a
+        *            {@link eu.etaxonomy.taxeditor.ui.element.AbstractCdmFormElement}
+        *            object.
+        */
+       public void adapt(AbstractCdmFormElement formElement) {
+               formElement.setPropertyChangeListeners(propertyChangeListeners);
+       }
+
+       /** {@inheritDoc} */
+       @Override
+       public void adapt(Control control, boolean trackFocus, boolean trackKeyboard) {
+               if (trackFocus) {
+                       control.addFocusListener(selectionFocusHandler);
+               }
+               super.adapt(control, trackFocus, trackKeyboard);
+       }
+
+       /**
+        * <p>
+        * destroyElement
+        * </p>
+        *
+        * @param formElement
+        *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
+        *            object.
+        */
+       public void destroyElement(ICdmFormElement formElement) {
+               // return if element was not initialized
+               if (formElement == null) {
+                       return;
+               }
+               // destroy selection arbitrator, if any
+               if (formElement instanceof ISelectableElement) {
             destroySelectionArbitrator(((ISelectableElement) formElement).getSelectionArbitrator());
-        }
-        // remove this element form its parents list of elements
-        // ICdmFormElement parentElement = formElement.getParentElement();
-        // if(parentElement != null){
-        // parentElement.removeElement(formElement);
-        // }
-        // call destroy on child elements recursively
-        for (ICdmFormElement childElement : formElement.getElements()) {
-            destroyElement(childElement);
-        }
-        // dispose of the controls
-        for (Control control : formElement.getControls()) {
-            // we added the layoutComposite of the parental element as the
-            // layout composite to this formElement
-            // but we do not want to destroy it.
-            if (control.equals(formElement.getLayoutComposite())) {
-                continue;
-            } else {
-                control.dispose();
-                control = null;
-            }
-        }
-    }
-
-    /**
-     * <p>
-     * createEmptyCell
-     * </p>
-     *
-     * @param parent
-     *            a {@link org.eclipse.swt.widgets.Composite} object.
-     * @return a {@link org.eclipse.swt.widgets.Label} object.
-     */
-    public Label createEmptyCell(Composite parent) {
-        return this.createLabel(parent, null);
-    }
-
-    /**
-     * <p>
-     * createMultilineTextWithLabel
-     * </p>
-     *
-     * @param labelString
-     *            a {@link java.lang.String} object.
-     * @param textHeight
-     *            a int.
-     * @param style
-     *            a int.
-     * @param parentElement
-     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-     *            object.
-     * @return a {@link eu.etaxonomy.taxeditor.ui.element.TextWithLabelElement}
-     *         object.
-     */
+               }
+               // remove this element form its parents list of elements
+               // ICdmFormElement parentElement = formElement.getParentElement();
+               // if(parentElement != null){
+               // parentElement.removeElement(formElement);
+               // }
+               // call destroy on child elements recursively
+               for (ICdmFormElement childElement : formElement.getElements()) {
+                       destroyElement(childElement);
+               }
+               // dispose of the controls
+               for (Control control : formElement.getControls()) {
+                       // we added the layoutComposite of the parental element as the
+                       // layout composite to this formElement
+                       // but we do not want to destroy it.
+                       if (control.equals(formElement.getLayoutComposite())) {
+                               continue;
+                       } else {
+                               control.dispose();
+                               control = null;
+                       }
+               }
+       }
+
+       /**
+        * <p>
+        * createEmptyCell
+        * </p>
+        *
+        * @param parent
+        *            a {@link org.eclipse.swt.widgets.Composite} object.
+        * @return a {@link org.eclipse.swt.widgets.Label} object.
+        */
+       public Label createEmptyCell(Composite parent) {
+               return this.createLabel(parent, null);
+       }
+
+       /**
+        * <p>
+        * createMultilineTextWithLabel
+        * </p>
+        *
+        * @param labelString
+        *            a {@link java.lang.String} object.
+        * @param textHeight
+        *            a int.
+        * @param style
+        *            a int.
+        * @param parentElement
+        *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
+        *            object.
+        * @return a {@link eu.etaxonomy.taxeditor.ui.element.TextWithLabelElement}
+        *         object.
+        */
     public TextWithLabelElement createMultilineTextWithLabel(ICdmFormElement parentElement, String labelString,
             int textHeight, int style) {
         TextWithLabelElement element = new TextWithLabelElement(this, parentElement, labelString, "", textHeight, style);
-        adapt(element);
-        parentElement.addElement(element);
-        return element;
-    }
-
-    /**
-     * <p>
-     * createMultiLanguageTextElement
-     * </p>
-     *
-     * @param parentElement
-     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-     *            object.
-     * @param labelString
-     *            a {@link java.lang.String} object.
-     * @param multilanguageText
-     *            a {@link java.util.Map} object.
-     * @param textHeight
-     *            a int.
-     * @param style
-     *            a int.
-     * @return a
-     *         {@link eu.etaxonomy.taxeditor.ui.element.MultilanguageTextElement}
-     *         object.
-     */
+               adapt(element);
+               parentElement.addElement(element);
+               return element;
+       }
+
+       /**
+        * <p>
+        * createMultiLanguageTextElement
+        * </p>
+        *
+        * @param parentElement
+        *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
+        *            object.
+        * @param labelString
+        *            a {@link java.lang.String} object.
+        * @param multilanguageText
+        *            a {@link java.util.Map} object.
+        * @param textHeight
+        *            a int.
+        * @param style
+        *            a int.
+        * @return a
+        *         {@link eu.etaxonomy.taxeditor.ui.element.MultilanguageTextElement}
+        *         object.
+        */
     public MultilanguageTextElement createMultiLanguageTextElement(ICdmFormElement parentElement, String labelString,
             Map<Language, LanguageString> multilanguageText, int textHeight, int style) {
         MultilanguageTextElement element = new MultilanguageTextElement(this, parentElement, labelString,
                 multilanguageText, textHeight, style);
-        adapt(element);
-        parentElement.addElement(element);
-        return element;
-    }
+               adapt(element);
+               parentElement.addElement(element);
+               return element;
+       }
 
     public KeyStatementElement createKeyStatementElement(ICdmFormElement parentElement, String labelString,
-            KeyStatement keyStatement, int textHeight, int style) {
+                       KeyStatement keyStatement, int textHeight, int style) {
         KeyStatementElement element = new KeyStatementElement(this, parentElement, labelString, keyStatement,
                 textHeight, style);
-        adapt(element);
-        parentElement.addElement(element);
-        return element;
-    }
-
-    /**
-     * <p>
-     * createTextWithLabelElement
-     * </p>
-     *
-     * @param labelString
-     *            a {@link java.lang.String} object.
-     * @param initialText
-     *            a {@link java.lang.String} object.
-     * @param style
-     *            a int.
-     * @param parentElement
-     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-     *            object.
-     * @return a {@link eu.etaxonomy.taxeditor.ui.element.TextWithLabelElement}
-     *         object.
-     */
+               adapt(element);
+               parentElement.addElement(element);
+               return element;
+       }
+
+       /**
+        * <p>
+        * createTextWithLabelElement
+        * </p>
+        *
+        * @param labelString
+        *            a {@link java.lang.String} object.
+        * @param initialText
+        *            a {@link java.lang.String} object.
+        * @param style
+        *            a int.
+        * @param parentElement
+        *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
+        *            object.
+        * @return a {@link eu.etaxonomy.taxeditor.ui.element.TextWithLabelElement}
+        *         object.
+        */
     public TextWithLabelElement createTextWithLabelElement(ICdmFormElement parentElement, String labelString,
-            String initialText, int style) {
+                       String initialText, int style) {
         TextWithLabelElement element = new TextWithLabelElement(this, parentElement, labelString, initialText, null,
                 style);
-        adapt(element);
-        parentElement.addElement(element);
-        return element;
-    }
+               adapt(element);
+               parentElement.addElement(element);
+               return element;
+       }
 
     public UriWithLabelElement createUriWithLabelElement(ICdmFormElement parentElement, String labelString,
             URI initialUri, int style) {
         UriWithLabelElement element = new UriWithLabelElement(this, parentElement, labelString, initialUri, null, style);
-        adapt(element);
-        parentElement.addElement(element);
-        return element;
-    }
-
-    /**
-     * @param element
-     * @param string
-     * @param uri
-     * @param style
-     * @return
-     */
+               adapt(element);
+               parentElement.addElement(element);
+               return element;
+       }
+
+       /**
+        * @param element
+        * @param string
+        * @param uri
+        * @param style
+        * @return
+        */
     public OpenUrlSelectorElement createOpenUrlSelectorElement(ICdmFormElement parentElement, String labelString,
-            IOpenUrlEnabled openUrlEnabled, int style) {
+                       IOpenUrlEnabled openUrlEnabled, int style) {
         OpenUrlSelectorElement element = new OpenUrlSelectorElement(this, parentElement, labelString, openUrlEnabled,
                 style);
-        adapt(element);
-        parentElement.addElement(element);
-        return element;
-    }
+               adapt(element);
+               parentElement.addElement(element);
+               return element;
+       }
 
-    /**
-     *
-     * @param parentElement
-     * @param labelString
-     * @param conversationEnabled
-     * @param user
-     * @param style
-     * @return
-     */
+       /**
+        *
+        * @param parentElement
+        * @param labelString
+        * @param conversationEnabled
+        * @param user
+        * @param style
+        * @return
+        */
     public EditPasswordElement createEditPasswordElement(ICdmFormElement parentElement, String labelString,
-            ConversationHolder conversation, User user, int style) {
+                       ConversationHolder conversation, User user, int style) {
         EditPasswordElement element = new EditPasswordElement(this, parentElement, labelString, user, conversation);
-        adapt(element);
-        parentElement.addElement(element);
-        return element;
-    }
-
-    /**
-     * <p>
-     * createIntegerTextWithLabelElement
-     * </p>
-     *
-     * @param parentElement
-     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-     *            object.
-     * @param labelString
-     *            a {@link java.lang.String} object.
-     * @param initialInteger
-     *            a {@link java.lang.Integer} object.
-     * @param style
-     *            a int.
-     * @return a
-     *         {@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.
+               adapt(element);
+               parentElement.addElement(element);
+               return element;
+       }
+
+       /**
+        * <p>
+        * createIntegerTextWithLabelElement
+        * </p>
+        *
+        * @param parentElement
+        *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
+        *            object.
+        * @param labelString
+        *            a {@link java.lang.String} object.
+        * @param initialInteger
+        *            a {@link java.lang.Integer} object.
+        * @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;
-    }
-
-    /**
-     * <p>
-     * createLanguageStringWithLabelElement
-     * </p>
-     *
-     * @param parentElement
-     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-     *            object.
-     * @param labelString
-     *            a {@link java.lang.String} object.
-     * @param languageString
-     *            a {@link eu.etaxonomy.cdm.model.common.LanguageString} object.
-     * @param style
-     *            a int.
-     * @return a
-     *         {@link eu.etaxonomy.taxeditor.ui.element.LanguageStringWithLabelElement}
-     *         object.
-     */
+        *         object.
+        */
+       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>
+        * createLanguageStringWithLabelElement
+        * </p>
+        *
+        * @param parentElement
+        *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
+        *            object.
+        * @param labelString
+        *            a {@link java.lang.String} object.
+        * @param languageString
+        *            a {@link eu.etaxonomy.cdm.model.common.LanguageString} object.
+        * @param style
+        *            a int.
+        * @return a
+        *         {@link eu.etaxonomy.taxeditor.ui.element.LanguageStringWithLabelElement}
+        *         object.
+        */
     public LanguageStringWithLabelElement createLanguageStringWithLabelElement(ICdmFormElement parentElement,
             String labelString, LanguageString languageString, int style) {
         LanguageStringWithLabelElement element = new LanguageStringWithLabelElement(this, parentElement, labelString,
                 languageString, style);
-        adapt(element);
-        parentElement.addElement(element);
-        return element;
-    }
-
-    /**
-     * <p>
-     * createLanguageStringWithLabelElement
-     * </p>
-     *
-     * @param parentElement
-     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-     *            object.
-     * @param labelString
-     *            a {@link java.lang.String} object.
-     * @param languageString
-     *            a {@link eu.etaxonomy.cdm.model.common.LanguageString} object.
-     * @param height
-     *            a int.
-     * @param style
-     *            a int.
-     * @return a
-     *         {@link eu.etaxonomy.taxeditor.ui.element.LanguageStringWithLabelElement}
-     *         object.
-     */
+               adapt(element);
+               parentElement.addElement(element);
+               return element;
+       }
+
+       /**
+        * <p>
+        * createLanguageStringWithLabelElement
+        * </p>
+        *
+        * @param parentElement
+        *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
+        *            object.
+        * @param labelString
+        *            a {@link java.lang.String} object.
+        * @param languageString
+        *            a {@link eu.etaxonomy.cdm.model.common.LanguageString} object.
+        * @param height
+        *            a int.
+        * @param style
+        *            a int.
+        * @return a
+        *         {@link eu.etaxonomy.taxeditor.ui.element.LanguageStringWithLabelElement}
+        *         object.
+        */
     public LanguageStringWithLabelElement createLanguageStringWithLabelElement(ICdmFormElement parentElement,
             String labelString, LanguageString languageString, int height, int style) {
         LanguageStringWithLabelElement element = new LanguageStringWithLabelElement(this, parentElement, labelString,
                 languageString, height, style);
-        adapt(element);
-        parentElement.addElement(element);
-        return element;
-    }
-
-    /**
-     * <p>
-     * createTextElement
-     * </p>
-     *
-     * @param parentElement
-     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-     *            object.
-     * @param initialText
-     *            a {@link java.lang.String} object.
-     * @param style
-     *            a int.
-     * @return a {@link eu.etaxonomy.taxeditor.ui.element.TextWithLabelElement}
-     *         object.
-     */
+               adapt(element);
+               parentElement.addElement(element);
+               return element;
+       }
+
+       /**
+        * <p>
+        * createTextElement
+        * </p>
+        *
+        * @param parentElement
+        *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
+        *            object.
+        * @param initialText
+        *            a {@link java.lang.String} object.
+        * @param style
+        *            a int.
+        * @return a {@link eu.etaxonomy.taxeditor.ui.element.TextWithLabelElement}
+        *         object.
+        */
     public TextWithLabelElement createTextElement(ICdmFormElement parentElement, String initialText, int style) {
         TextWithLabelElement element = new TextWithLabelElement(this, parentElement, null, initialText, null, style);
-        adapt(element);
-        parentElement.addElement(element);
-        return element;
-    }
-
-    /**
-     * <p>
-     * createKeyValueViewerElement
-     * </p>
-     *
-     * @param parentElement
-     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-     *            object.
-     * @param keyHeading
-     *            a {@link java.lang.String} object.
-     * @param valueHeading
-     *            a {@link java.lang.String} object.
-     * @param map
-     *            a {@link java.util.Map} object.
-     * @return a {@link eu.etaxonomy.taxeditor.ui.element.KeyValueViewerElement}
-     *         object.
-     */
+               adapt(element);
+               parentElement.addElement(element);
+               return element;
+       }
+
+       /**
+        * <p>
+        * createKeyValueViewerElement
+        * </p>
+        *
+        * @param parentElement
+        *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
+        *            object.
+        * @param keyHeading
+        *            a {@link java.lang.String} object.
+        * @param valueHeading
+        *            a {@link java.lang.String} object.
+        * @param map
+        *            a {@link java.util.Map} object.
+        * @return a {@link eu.etaxonomy.taxeditor.ui.element.KeyValueViewerElement}
+        *         object.
+        */
     public KeyValueViewerElement createKeyValueViewerElement(ICdmFormElement parentElement, String keyHeading,
-            String valueHeading, Map<Object, Object> map) {
+                       String valueHeading, Map<Object, Object> map) {
         KeyValueViewerElement element = new KeyValueViewerElement(this, parentElement, keyHeading, valueHeading, map);
-        adapt(element);
-        parentElement.addElement(element);
-        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.
-     */
+               adapt(element);
+               parentElement.addElement(element);
+               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> createTermComboElement(Class<T> termComboType,
             ICdmFormElement parentElement, String labelString, T selection, int style) {
         TermComboElement<T> element = new TermComboElement<T>(this, parentElement, termComboType, labelString,
                 selection, style);
-        adapt(element);
-        parentElement.addElement(element);
-        return element;
-    }
-
-    /**
-     * <p>
-     * createEnumComboElement
-     * </p>
-     *
-     * @param enumComboType
-     *            a
-     *            {@link eu.eu.etaxonomy.taxeditor.ui.element.CdmFormFactory.EnumComboType}
-     *            object.
-     * @param parentElement
-     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-     *            object.
-     * @param style
-     *            a int.
-     * @return a {@link eu.etaxonomy.taxeditor.ui.term.AbstractEnumComboElement}
-     *         object.
-     */
-    public <T extends IDefinedTerm> 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);
-        return element;
-    }
+               adapt(element);
+               parentElement.addElement(element);
+               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.
+        */
 
-    /**
-     * <p>
-     * createBrowserElement
-     * </p>
-     *
-     * @param imageUri
-     *            a {@link java.net.URI} object.
-     * @param style
-     *            a int.
-     * @param parentElement
-     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-     *            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
+        * </p>
+        *
+        * @param enumComboType
+        *            a
+        *            {@link eu.eu.etaxonomy.taxeditor.ui.element.CdmFormFactory.EnumComboType}
+        *            object.
+        * @param parentElement
+        *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
+        *            object.
+        * @param style
+        *            a int.
+        * @return a {@link eu.etaxonomy.taxeditor.ui.term.AbstractEnumComboElement}
+        *         object.
+        */
+       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);
+               return element;
+       }
+
+       /**
+        * <p>
+        * createBrowserElement
+        * </p>
+        *
+        * @param imageUri
+        *            a {@link java.net.URI} object.
+        * @param style
+        *            a int.
+        * @param parentElement
+        *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
+        *            object.
      * @return a {@link eu.etaxonomy.taxeditor.ui.element.BrowserElement}
      *         object.
-     */
+        */
     public BrowserElement createBrowserElement(ICdmFormElement parentElement, URI imageUri, int style) {
         BrowserElement element = new BrowserElement(this, parentElement, imageUri, style);
-        adapt(element);
-        parentElement.addElement(element);
-        return element;
-    }
-
-    /**
-     * <p>
-     * createImageElement
-     * </p>
-     *
-     * @param parentElement
-     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-     *            object.
-     * @param imageUri
-     *            a {@link java.net.URI} object.
-     * @param style
-     *            a int.
-     * @return a {@link eu.etaxonomy.taxeditor.ui.element.ImageElement} object.
-     */
+               adapt(element);
+               parentElement.addElement(element);
+               return element;
+       }
+
+       /**
+        * <p>
+        * createImageElement
+        * </p>
+        *
+        * @param parentElement
+        *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
+        *            object.
+        * @param imageUri
+        *            a {@link java.net.URI} object.
+        * @param style
+        *            a int.
+        * @return a {@link eu.etaxonomy.taxeditor.ui.element.ImageElement} object.
+        */
     public ImageElement createImageElement(ICdmFormElement parentElement, URI imageUri, int style) {
         ImageElement element = new ImageElement(this, parentElement, imageUri, style);
-        adapt(element);
-        parentElement.addElement(element);
-        return element;
-    }
-
-    /**
-     * <p>
-     * createTextActionElement
-     * </p>
-     *
-     * @param labelString
-     *            a {@link java.lang.String} object.
-     * @param initialText
-     *            a {@link java.lang.String} object.
-     * @param style
-     *            a int.
-     * @param parentElement
-     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-     *            object.
-     * @param buttonLabel
-     *            a {@link java.lang.String} object.
-     * @return a {@link eu.etaxonomy.taxeditor.ui.element.TextActionElement}
-     *         object.
-     */
+               adapt(element);
+               parentElement.addElement(element);
+               return element;
+       }
+
+       /**
+        * <p>
+        * createTextActionElement
+        * </p>
+        *
+        * @param labelString
+        *            a {@link java.lang.String} object.
+        * @param initialText
+        *            a {@link java.lang.String} object.
+        * @param style
+        *            a int.
+        * @param parentElement
+        *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
+        *            object.
+        * @param buttonLabel
+        *            a {@link java.lang.String} object.
+        * @return a {@link eu.etaxonomy.taxeditor.ui.element.TextActionElement}
+        *         object.
+        */
     public TextActionElement createTextActionElement(ICdmFormElement parentElement, String labelString,
-            String buttonLabel, String initialText, int style) {
+                       String buttonLabel, String initialText, int style) {
         TextActionElement element = new TextActionElement(this, parentElement, labelString, buttonLabel, initialText,
                 style);
-        adapt(element);
-        parentElement.addElement(element);
-        return element;
-    }
-
-    /**
-     * <p>
-     * createCheckbox
-     * </p>
-     *
-     * @param parentElement
-     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-     *            object.
-     * @param label
-     *            a {@link java.lang.String} object.
-     * @param initialState
-     *            a boolean.
-     * @param style
-     *            a int.
+               adapt(element);
+               parentElement.addElement(element);
+               return element;
+       }
+
+       /**
+        * <p>
+        * createCheckbox
+        * </p>
+        *
+        * @param parentElement
+        *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
+        *            object.
+        * @param label
+        *            a {@link java.lang.String} object.
+        * @param initialState
+        *            a boolean.
+        * @param style
+        *            a int.
      * @return a {@link eu.etaxonomy.taxeditor.ui.element.CheckboxElement}
      *         object.
-     */
+        */
     public CheckboxElement createCheckbox(ICdmFormElement parentElement, String label, boolean initialState, int style) {
         CheckboxElement element = new CheckboxElement(this, parentElement, label, initialState, style | orientation);
-        adapt(element);
-        parentElement.addElement(element);
-        return element;
-    }
+               adapt(element);
+               parentElement.addElement(element);
+               return element;
+       }
 
-    /**
-     * Creates a section as a part of the form.
-     *
-     * @return the section widget
-     * @param section
+       /**
+        * Creates a section as a part of the form.
+        *
+        * @return the section widget
+        * @param section
      *            a
      *            {@link eu.etaxonomy.taxeditor.ui.element.AbstractFormSection}
-     *            object.
-     */
-    public Section adapt(AbstractFormSection section) {
-        section.setMenu(section.getLayoutComposite().getMenu());
-        adapt(section, true, true);
+        *            object.
+        */
+       public Section adapt(AbstractFormSection section) {
+               section.setMenu(section.getLayoutComposite().getMenu());
+               adapt(section, true, true);
 
-        // handle focus and property change events for cdm use
-        section.addFocusListener(selectionFocusHandler);
-        section.setPropertyChangeListeners(propertyChangeListeners);
+               // handle focus and property change events for cdm use
+               section.addFocusListener(selectionFocusHandler);
+               section.setPropertyChangeListeners(propertyChangeListeners);
 
-        if (section.getToggle() != null) {
+               if (section.getToggle() != null) {
             section.getToggle().setHoverDecorationColor(getColors().getColor(IFormColors.TB_TOGGLE_HOVER));
             section.getToggle().setDecorationColor(getColors().getColor(IFormColors.TB_TOGGLE));
-        }
+               }
 
         section.setFont(boldFontHolder2.getBoldFont(section.getLayoutComposite().getFont()));
 
         if ((section.getStyle() & ExpandableComposite.TITLE_BAR) != 0
                 || (section.getStyle() & ExpandableComposite.SHORT_TITLE_BAR) != 0) {
-            getColors().initializeSectionToolBarColors();
+                       getColors().initializeSectionToolBarColors();
             section.setTitleBarBackground(getColors().getColor(IFormColors.TB_BG));
             section.setTitleBarBorderColor(getColors().getColor(IFormColors.TB_BORDER));
-        }
-        // call setTitleBarForeground regardless as it also sets the label color
+               }
+               // call setTitleBarForeground regardless as it also sets the label color
         section.setTitleBarForeground(getColors().getColor(IFormColors.TB_TOGGLE));
-        return section;
-    }
+               return section;
+       }
 
-    private class BoldFontHolder2 {
-        private Font normalFont;
+       private class BoldFontHolder2 {
+               private Font normalFont;
 
-        private Font boldFont;
+               private Font boldFont;
 
-        public BoldFontHolder2() {
-        }
+               public BoldFontHolder2() {
+               }
 
-        public Font getBoldFont(Font font) {
-            createBoldFont(font);
-            return boldFont;
-        }
+               public Font getBoldFont(Font font) {
+                       createBoldFont(font);
+                       return boldFont;
+               }
 
-        private void createBoldFont(Font font) {
-            if (normalFont == null || !normalFont.equals(font)) {
-                normalFont = font;
-                dispose();
-            }
-            if (boldFont == null) {
+               private void createBoldFont(Font font) {
+                       if (normalFont == null || !normalFont.equals(font)) {
+                               normalFont = font;
+                               dispose();
+                       }
+                       if (boldFont == null) {
                 boldFont = FormFonts.getInstance().getBoldFont(getColors().getDisplay(), normalFont);
-            }
-        }
+                       }
+               }
 
-        public void dispose() {
-            if (boldFont != null) {
+               public void dispose() {
+                       if (boldFont != null) {
                 FormFonts.getInstance().markFinished(boldFont, getColors().getDisplay());
-                boldFont = null;
-            }
-        }
-    }
-
-    /**
-     * <p>
-     * createToggleableTextField
-     * </p>
-     *
-     * @param parentElement
-     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-     *            object.
-     * @param labelString
-     *            a {@link java.lang.String} object.
-     * @param initialText
-     *            a {@link java.lang.String} object.
-     * @param initialState
-     *            a boolean.
-     * @param style
-     *            a int.
-     * @return a {@link eu.etaxonomy.taxeditor.ui.element.ToggleableTextElement}
-     *         object.
-     */
+                               boldFont = null;
+                       }
+               }
+       }
+
+       /**
+        * <p>
+        * createToggleableTextField
+        * </p>
+        *
+        * @param parentElement
+        *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
+        *            object.
+        * @param labelString
+        *            a {@link java.lang.String} object.
+        * @param initialText
+        *            a {@link java.lang.String} object.
+        * @param initialState
+        *            a boolean.
+        * @param style
+        *            a int.
+        * @return a {@link eu.etaxonomy.taxeditor.ui.element.ToggleableTextElement}
+        *         object.
+        */
     public ToggleableTextElement createToggleableTextField(ICdmFormElement parentElement, String labelString,
-            String initialText, boolean initialState, int style) {
+                       String initialText, boolean initialState, int style) {
         ToggleableTextElement element = new ToggleableTextElement(this, parentElement, labelString, initialText,
                 initialState, style | orientation);
-        adapt(element);
-        parentElement.addElement(element);
-        return element;
-    }
-
-    /**
-     * <p>
-     * createTimePeriodElement
-     * </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.TimePeriod} object.
-     * @param style
-     *            a int.
-     * @return a {@link eu.etaxonomy.taxeditor.ui.element.TimePeriodElement}
-     *         object.
-     */
+               adapt(element);
+               parentElement.addElement(element);
+               return element;
+       }
+
+       /**
+        * <p>
+        * createTimePeriodElement
+        * </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.TimePeriod} object.
+        * @param style
+        *            a int.
+        * @return a {@link eu.etaxonomy.taxeditor.ui.element.TimePeriodElement}
+        *         object.
+        */
     public TimePeriodElement createTimePeriodElement(ICdmFormElement parentElement, String labelString,
-            TimePeriod timePeriod, int style) {
+                       TimePeriod timePeriod, int style) {
         TimePeriodElement element = new TimePeriodElement(this, parentElement, labelString, timePeriod, style);
-        adapt(element);
-        parentElement.addElement(element);
-        return element;
-    }
-
-    /**
-     * <p>
-     * createPointElement
-     * </p>
-     *
-     * @param style
-     *            a int.
-     * @param parentElement
-     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-     *            object.
-     * @param point
-     *            a {@link eu.etaxonomy.cdm.model.location.Point} object.
-     * @return a {@link eu.etaxonomy.taxeditor.ui.element.PointElement} object.
-     */
+               adapt(element);
+               parentElement.addElement(element);
+               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
+        * </p>
+        *
+        * @param style
+        *            a int.
+        * @param parentElement
+        *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
+        *            object.
+        * @param point
+        *            a {@link eu.etaxonomy.cdm.model.location.Point} object.
+        * @return a {@link eu.etaxonomy.taxeditor.ui.element.PointElement} object.
+        */
     public PointElement createPointElement(ICdmFormElement parentElement, Point point, int style) {
         PointElement element = new PointElement(this, parentElement, point, style);
-        adapt(element);
-        parentElement.addElement(element);
-        return element;
-    }
-
-    /**
-     * <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.DateDetailSection}
-     *         object.
-     */
+               adapt(element);
+               parentElement.addElement(element);
+               return element;
+       }
+
+       /**
+        * <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.DateDetailSection}
+        *         object.
+        */
     public DateDetailSection createDateDetailSection(ICdmFormElement parentElement, int style) {
         DateDetailSection section = new DateDetailSection(this, parentElement, style);
-        parentElement.addElement(section);
-        adapt(section);
-        return section;
-    }
-
-    /**
-     * <p>
-     * createPartialElement
-     * </p>
-     *
-     * @param parentElement
-     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-     *            object.
-     * @param labelString
-     *            a {@link java.lang.String} object.
-     * @param partial
-     *            a {@link org.joda.time.Partial} object.
-     * @param style
-     *            a int.
+               parentElement.addElement(section);
+               adapt(section);
+               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
+        * </p>
+        *
+        * @param parentElement
+        *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
+        *            object.
+        * @param labelString
+        *            a {@link java.lang.String} object.
+        * @param partial
+        *            a {@link org.joda.time.Partial} object.
+        * @param style
+        *            a int.
      * @return a {@link eu.etaxonomy.taxeditor.ui.element.PartialElement}
      *         object.
-     */
+        */
     public PartialElement createPartialElement(ICdmFormElement parentElement, String labelString, Partial partial,
             int style) {
         PartialElement element = new PartialElement(this, parentElement, labelString, style);
-        adapt(element);
-        parentElement.addElement(element);
-        return element;
-    }
-
-    /**
-     * <p>
-     * addSelectionListener
-     * </p>
-     *
-     * @param listener
-     *            a {@link org.eclipse.swt.events.SelectionListener} object.
-     */
-    public void addSelectionListener(SelectionListener listener) {
-        selectionListenerList.add(listener);
-    }
-
-    /**
-     * <p>
-     * removeSelectionListener
-     * </p>
-     *
-     * @param listener
-     *            a {@link org.eclipse.swt.events.SelectionListener} object.
-     */
-    public void removeSelectionListener(SelectionListener listener) {
-        if (listener == null) {
+               adapt(element);
+               parentElement.addElement(element);
+               return element;
+       }
+
+       /**
+        * <p>
+        * addSelectionListener
+        * </p>
+        *
+        * @param listener
+        *            a {@link org.eclipse.swt.events.SelectionListener} object.
+        */
+       public void addSelectionListener(SelectionListener listener) {
+               selectionListenerList.add(listener);
+       }
+
+       /**
+        * <p>
+        * removeSelectionListener
+        * </p>
+        *
+        * @param listener
+        *            a {@link org.eclipse.swt.events.SelectionListener} object.
+        */
+       public void removeSelectionListener(SelectionListener listener) {
+               if (listener == null) {
             AbstractUtility.error(this.getClass(),
                     "Tried to remove a selection listener from this factories listeners but was null", null);
-        } else {
-            selectionListenerList.remove(listener);
-        }
-    }
-
-    /**
-     * <p>
-     * addPropertyChangeListener
-     * </p>
-     *
-     * @param listener
-     *            a {@link org.eclipse.jface.util.IPropertyChangeListener}
-     *            object.
-     */
-    public void addPropertyChangeListener(IPropertyChangeListener listener) {
-        if (propertyChangeListeners.contains(listener)) {
-            return;
-        }
-        propertyChangeListeners.add(0, listener);
-    }
-
-    /**
-     * <p>
-     * removePropertyChangeListener
-     * </p>
-     *
-     * @param listener
-     *            a {@link org.eclipse.jface.util.IPropertyChangeListener}
-     *            object.
-     */
-    public void removePropertyChangeListener(IPropertyChangeListener listener) {
-        propertyChangeListeners.remove(listener);
-    }
-
-    /**
-     * <p>
-     * createHorizontalSeparator
-     * </p>
-     *
-     * @param parentElement
-     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-     *            object.
-     * @param style
-     *            a int.
-     * @return a {@link org.eclipse.swt.widgets.Label} object.
-     */
+               } else {
+                       selectionListenerList.remove(listener);
+               }
+       }
+
+       /**
+        * <p>
+        * addPropertyChangeListener
+        * </p>
+        *
+        * @param listener
+        *            a {@link org.eclipse.jface.util.IPropertyChangeListener}
+        *            object.
+        */
+       public void addPropertyChangeListener(IPropertyChangeListener listener) {
+               if(propertyChangeListeners.contains(listener)){
+                       return;
+               }
+               propertyChangeListeners.add(0, listener);
+       }
+
+       /**
+        * <p>
+        * removePropertyChangeListener
+        * </p>
+        *
+        * @param listener
+        *            a {@link org.eclipse.jface.util.IPropertyChangeListener}
+        *            object.
+        */
+       public void removePropertyChangeListener(IPropertyChangeListener listener) {
+               propertyChangeListeners.remove(listener);
+       }
+
+       /**
+        * <p>
+        * createHorizontalSeparator
+        * </p>
+        *
+        * @param parentElement
+        *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
+        *            object.
+        * @param style
+        *            a int.
+        * @return a {@link org.eclipse.swt.widgets.Label} object.
+        */
     public Label createHorizontalSeparator(ICdmFormElement parentElement, int style) {
         Label separator = this.createSeparator(parentElement.getLayoutComposite(), SWT.HORIZONTAL | style);
-        separator.setLayoutData(LayoutConstants.FILL_HORIZONTALLY());
-        return separator;
-    }
-
-    /**
-     * <p>
-     * createVersionElement
-     * </p>
-     *
-     * @param parentElement
-     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-     *            object.
-     * @param entity
-     *            a {@link eu.etaxonomy.cdm.model.common.VersionableEntity}
-     *            object.
-     * @param style
-     *            a int.
-     * @return a
-     *         {@link eu.etaxonomy.taxeditor.ui.section.supplemental.VersionElement}
-     *         object.
-     */
+               separator.setLayoutData(LayoutConstants.FILL_HORIZONTALLY());
+               return separator;
+       }
+
+       /**
+        * <p>
+        * createVersionElement
+        * </p>
+        *
+        * @param parentElement
+        *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
+        *            object.
+        * @param entity
+        *            a {@link eu.etaxonomy.cdm.model.common.VersionableEntity}
+        *            object.
+        * @param style
+        *            a int.
+        * @return a
+        *         {@link eu.etaxonomy.taxeditor.ui.section.supplemental.VersionElement}
+        *         object.
+        */
     public VersionElement createVersionElement(ICdmFormElement parentElement, VersionableEntity entity, int style) {
         VersionElement element = new VersionElement(this, parentElement, entity, style);
-        adapt(element);
-        parentElement.addElement(element);
-        return element;
-    }
-
-    /**
-     * @param cdmBaseSection
-     * @param object
-     * @param style
-     * @return
-     */
+               adapt(element);
+               parentElement.addElement(element);
+               return element;
+       }
+
+       /**
+        * @param cdmBaseSection
+        * @param object
+        * @param style
+        * @return
+        */
     public CdmBaseElement createCdmBaseElement(ICdmFormElement parentElement, CdmBase entity, int style) {
         CdmBaseElement element = new CdmBaseElement(this, parentElement, entity, style);
-        adapt(element);
-        parentElement.addElement(element);
-        return element;
-    }
-
-    /**
-     * <p>
-     * createVersionSection
-     * </p>
-     *
-     * @param parentElement
-     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-     *            object.
-     * @param style
-     *            a int.
-     * @return a
-     *         {@link eu.etaxonomy.taxeditor.ui.section.supplemental.VersionSection}
-     *         object.
-     */
-    public VersionSection createVersionSection(ICdmFormElement parentElement, int style) {
-        VersionSection section = new VersionSection(this, parentElement, style);
-        parentElement.addElement(section);
-        adapt(section);
-        return section;
-    }
+               adapt(element);
+               parentElement.addElement(element);
+               return element;
+       }
 
-    /**
-     * @param parent
-     * @param i
-     * @return
-     */
-    public CdmBaseSection createCdmBaseSection(ICdmFormElement parentElement, int style) {
-        CdmBaseSection section = new CdmBaseSection(this, parentElement, style);
-        parentElement.addElement(section);
-        adapt(section);
-        return section;
-    }
 
-    /**
-     * <p>
-     * createEmptyElement
-     * </p>
-     *
-     * @param parentElement
-     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-     *            object.
-     * @return a {@link eu.etaxonomy.taxeditor.ui.section.EmptyElement} object.
-     */
-    public EmptyElement createEmptyElement(ICdmFormElement parentElement) {
+       /**
+        * <p>
+        * createVersionSection
+        * </p>
+        *
+        * @param parentElement
+        *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
+        *            object.
+        * @param style
+        *            a int.
+        * @return a
+        *         {@link eu.etaxonomy.taxeditor.ui.section.supplemental.VersionSection}
+        *         object.
+        */
+    public VersionSection createVersionSection(ICdmFormElement parentElement, int style) {
+               VersionSection section = new VersionSection(this, parentElement, style);
+               parentElement.addElement(section);
+               adapt(section);
+               return section;
+       }
+
+       /**
+        * @param parent
+        * @param i
+        * @return
+        */
+       public CdmBaseSection createCdmBaseSection(ICdmFormElement parentElement, int style) {
+               CdmBaseSection section = new CdmBaseSection(this, parentElement, style);
+               parentElement.addElement(section);
+               adapt(section);
+               return section;
+       }
+
+       /**
+        * <p>
+        * createEmptyElement
+        * </p>
+        *
+        * @param parentElement
+        *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
+        *            object.
+        * @return a {@link eu.etaxonomy.taxeditor.ui.section.EmptyElement} object.
+        */
+       public EmptyElement createEmptyElement(ICdmFormElement parentElement) {
         EmptyElement element = new EmptyElement(this, parentElement, null, SWT.NULL);
-        adapt(element);
-        parentElement.addElement(element);
-        return element;
-    }
-
-    /**
-     * <p>
-     * createHeadlineSection
-     * </p>
-     *
-     * @param parentElement
-     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-     *            object.
-     * @return a
-     *         {@link eu.etaxonomy.taxeditor.ui.section.supplemental.HeadlineSection}
-     *         object.
-     */
-    public HeadlineSection createHeadlineSection(ICdmFormElement parentElement) {
+               adapt(element);
+               parentElement.addElement(element);
+               return element;
+       }
+
+       /**
+        * <p>
+        * createHeadlineSection
+        * </p>
+        *
+        * @param parentElement
+        *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
+        *            object.
+        * @return a
+        *         {@link eu.etaxonomy.taxeditor.ui.section.supplemental.HeadlineSection}
+        *         object.
+        */
+       public HeadlineSection createHeadlineSection(ICdmFormElement parentElement) {
         HeadlineSection section = new HeadlineSection(this, parentElement, SWT.NULL);
-        parentElement.addElement(section);
-        adapt(section);
-        return section;
-    }
-
-    /**
-     * <p>
-     * createParsingMessageElement
-     * </p>
-     *
-     * @param parentElement
-     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-     *            object.
-     * @param parserProblem
-     *            a {@link eu.etaxonomy.cdm.strategy.parser.ParserProblem}
-     *            object.
-     * @param style
-     *            a int.
-     * @return a
-     *         {@link eu.etaxonomy.taxeditor.ui.section.taxon.ParsingMessageElement}
-     *         object.
-     */
+               parentElement.addElement(section);
+               adapt(section);
+               return section;
+       }
+
+       /**
+        * <p>
+        * createParsingMessageElement
+        * </p>
+        *
+        * @param parentElement
+        *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
+        *            object.
+        * @param parserProblem
+        *            a {@link eu.etaxonomy.cdm.strategy.parser.ParserProblem}
+        *            object.
+        * @param style
+        *            a int.
+        * @return a
+        *         {@link eu.etaxonomy.taxeditor.ui.section.taxon.ParsingMessageElement}
+        *         object.
+        */
     public ParsingMessageElement createParsingMessageElement(ICdmFormElement parentElement,
             ParserProblem parserProblem, int style) {
         ParsingMessageElement element = new ParsingMessageElement(this, parentElement, parserProblem, style);
-        adapt(element);
-        parentElement.addElement(element);
-        return element;
-    }
+               adapt(element);
+               parentElement.addElement(element);
+               return element;
+       }
 
     public AbstractFormSection createDefinedTermDetailSection(Class definedTermClass, ConversationHolder conversation,
             ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style) {
@@ -1319,11 +1387,11 @@ public class CdmFormFactory extends FormToolkit {
         AbstractFormSection section = new DefinedTermDetailSection(this, definedTermClass, conversation, parentElement,
                 selectionProvider, style);
 
-        parentElement.addElement(section);
-        adapt(section);
-        return section;
+               parentElement.addElement(section);
+               adapt(section);
+               return section;
 
-    }
+       }
 
     /**
      * @param definedTermClass
@@ -1331,11 +1399,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);
         }
@@ -1345,6 +1416,8 @@ public class CdmFormFactory extends FormToolkit {
         return element;
     }
 
+
+    //--------DetailSections---------
     public NameDetailSection createNameDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
         NameDetailSection section = new NameDetailSection(this, conversation, parentElement, selectionProvider, style);
         addAndAdaptSection(parentElement, section);
@@ -1429,8 +1502,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;
     }
@@ -1554,7 +1627,7 @@ public class CdmFormFactory extends FormToolkit {
         GeneralDetailSection section = new GeneralDetailSection(this, conversation, parentElement, selectionProvider, style);
         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);
@@ -1562,17 +1635,18 @@ public class CdmFormFactory extends FormToolkit {
         return section;
     }
 
-    public FieldObservationDetailSection createFODetailsSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
-        FieldObservationDetailSection section = new FieldObservationDetailSection(this, conversation, parentElement, selectionProvider, style);
+    public FieldUnitDetailSection createFODetailsSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        FieldUnitDetailSection section = new FieldUnitDetailSection(this, conversation, parentElement, selectionProvider, style);
         addAndAdaptSection(parentElement, section);
         return section;
-    }
+               }
 
     private void addAndAdaptSection(ICdmFormElement parentElement, AbstractFormSection<?> section) {
-        parentElement.addElement(section);
-        adapt(section);
-    }
+               parentElement.addElement(section);
+               adapt(section);
+       }
 
+    //--------DetailElements------------
 
     public UseRecordDetailElement createUseRecordDetailElement(ICdmFormElement parentElement){
         UseRecordDetailElement element = new UseRecordDetailElement(this, parentElement);
@@ -1759,36 +1833,36 @@ public class CdmFormFactory extends FormToolkit {
         GatheringEventDetailElement element = new GatheringEventDetailElement(this, parentElement);
         addAndAdaptElement(parentElement, 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);
-        return element;
-    }
+               return element;
+       }
 
     public DeterminationDetailElement createDeterminationDetailElement(ICdmFormElement parentElement) {
         DeterminationDetailElement element = new DeterminationDetailElement(this, parentElement);
         addAndAdaptElement(parentElement, element);
         return element;
-    }
+       }
 
-    /**
-     * @param parentElement
+       /**
+        * @param parentElement
      * @param element
-     */
+        */
     private void addAndAdaptElement(ICdmFormElement parentElement, AbstractCdmDetailElement<?> element) {
         adapt(element);
         parentElement.addElement(element);
     }
 
-
+    //--------EntityCollectionSection----------
     public TeamMemberSection createTeamMemberSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
         TeamMemberSection section = new TeamMemberSection(this, conversation, parentElement, style);
         addAndAdaptSection(parentElement, section);
@@ -1979,286 +2053,326 @@ public class CdmFormFactory extends FormToolkit {
         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;
-    }
+               return section;
+       }
 
-    /**
-     * <p>
-     * createEntityCollectionElement
-     * </p>
-     *
-     * @param removeListener
-     *            a {@link org.eclipse.swt.events.SelectionListener} object.
-     * @param style
-     *            a int.
-     * @param parentElement
+       /**
+        * <p>
+        * createEntityCollectionElement
+        * </p>
+        *
+        * @param removeListener
+        *            a {@link org.eclipse.swt.events.SelectionListener} object.
+        * @param style
+        *            a int.
+        * @param parentElement
      *            a
      *            {@link eu.etaxonomy.taxeditor.ui.element.AbstractFormSection}
-     *            object.
-     * @param versionableEntity
-     *            a {@link eu.etaxonomy.cdm.model.common.IVersionableEntity}
-     *            object.
-     * @param backgroundColor
-     *            a {@link org.eclipse.swt.graphics.Color} object.
-     * @return a
-     *         {@link eu.etaxonomy.taxeditor.ui.section.AbstractEntityCollectionElement}
-     *         object.
-     */
+        *            object.
+        * @param versionableEntity
+        *            a {@link eu.etaxonomy.cdm.model.common.IVersionableEntity}
+        *            object.
+        * @param backgroundColor
+        *            a {@link org.eclipse.swt.graphics.Color} object.
+        * @return a
+        *         {@link eu.etaxonomy.taxeditor.ui.section.AbstractEntityCollectionElement}
+        *         object.
+        */
     public AbstractEntityCollectionElement createEntityCollectionElement(AbstractFormSection parentElement,
             Object versionableEntity, SelectionListener removeListener, Color backgroundColor, int style) {
-        AbstractEntityCollectionElement element = null;
+               AbstractEntityCollectionElement element = null;
 
-        Object entity = HibernateProxyHelper.deproxy(versionableEntity);
+               Object entity = HibernateProxyHelper.deproxy(versionableEntity);
 
-        if (entity instanceof Annotation) {
+               if (entity instanceof Annotation) {
             element = new AnnotationElement(this, parentElement, (Annotation) entity, removeListener, style);
-        } else if (entity instanceof Person) {
+               } else if (entity instanceof Person) {
             element = new TeamMemberElement(this, parentElement, (Person) entity, removeListener, style);
-        } else if (entity instanceof Credit) {
+               } else if (entity instanceof Credit) {
             element = new CreditElement(this, parentElement, (Credit) entity, removeListener, style);
-        } else if (entity instanceof Extension) {
+               } else if (entity instanceof Extension) {
             element = new ExtensionElement(this, parentElement, (Extension) entity, removeListener, style);
-        } else if (entity instanceof Marker) {
+               } else if (entity instanceof Marker) {
             element = new MarkerElement(this, parentElement, (Marker) entity, removeListener, style);
-        } else if (entity instanceof Media) {
+               } else if (entity instanceof Media) {
             element = new MediaElement(this, parentElement, (Media) entity, removeListener, style);
-        } else if (entity instanceof MediaRepresentation) {
+               } else if (entity instanceof MediaRepresentation) {
             element = new MediaRepresentationElement(this, parentElement, (MediaRepresentation) entity, removeListener,
                     style);
-        } else if (entity instanceof ImageFile) {
+               } else if (entity instanceof ImageFile) {
             element = new ImageFileElement(this, parentElement, (ImageFile) entity, removeListener, style);
-        } else if (entity instanceof MediaRepresentationPart) {
+               } else if (entity instanceof MediaRepresentationPart){
             element = new MediaRepresentationPartElement(this, parentElement, (MediaRepresentationPart) entity,
                     removeListener, style);
-        } else if (entity instanceof NomenclaturalStatus) {
+               } else if (entity instanceof NomenclaturalStatus) {
             element = new NomenclaturalStatusElement(this, parentElement, (NomenclaturalStatus) entity, removeListener,
                     style);
-        } else if (entity instanceof Rights) {
+               } else if (entity instanceof Rights) {
             element = new RightsElement(this, parentElement, (Rights) entity, removeListener, style);
         } else if (entity instanceof DescriptionElementSource) {
             element = new DescriptionElementSourceElement(this, parentElement, (DescriptionElementSource) entity,
-                    removeListener, style);
-        } else if (entity instanceof IdentifiableSource) {
+                                       removeListener, style);
+               } 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 Reference) {
+               } 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) {
+               } else if (entity instanceof NameTypeDesignation) {
             element = new NameTypeDesignationElement(this, parentElement, (NameTypeDesignation) entity, removeListener,
                     style);
-        } else if (entity instanceof NameRelationship) {
+               } else if (entity instanceof NameRelationship) {
             element = new NameRelationshipDetailElement(this, parentElement, (NameRelationship) entity, removeListener,
                     style);
-        } else if (entity instanceof SpecimenTypeDesignation) {
+               } else if (entity instanceof SpecimenTypeDesignation) {
             element = new SpecimenTypeDesignationElement(this, parentElement, (SpecimenTypeDesignation) entity,
                     removeListener, style);
-        } else if (entity instanceof StateData) {
+               } else if (entity instanceof StateData) {
             element = new StateDataElement(this, parentElement, (StateData) entity, removeListener, style);
-        } else if (entity instanceof StatisticalMeasurementValue) {
+               } else if (entity instanceof StatisticalMeasurementValue) {
             element = new StatisticalMeasurementValueElement(this, parentElement, (StatisticalMeasurementValue) entity,
-                    removeListener, style);
-        } else if (entity instanceof DerivedUnit) {
-            element = new DerivedUnitElement(this, parentElement, (DerivedUnit) entity, removeListener, style);
-        } else if (entity instanceof NamedArea) {
+                                       removeListener, style);
+               } else if (entity instanceof DerivedUnit) {
+                       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) {
+               } 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) {
+               } else if (entity instanceof User) {
             element = new MemberDetailElement(this, parentElement, (User) entity, removeListener, style);
-        } else if (entity instanceof GrantedAuthority) {
+               } else if (entity instanceof GrantedAuthority) {
             element = new GrantedAuthorityCollectionElement(this, parentElement, (GrantedAuthorityImpl) entity,
                     removeListener, style);
-        } else if (entity instanceof Group) {
+               } else if (entity instanceof Group) {
             element = new GroupsByUserDetailElement(this, parentElement, (Group) entity, removeListener, style);
-        } else if (entity instanceof Taxon) {
+               } else if (entity instanceof Taxon) {
             element = new TaxonDetailElement(this, parentElement, (Taxon) entity, removeListener, style);
-        } else if (entity instanceof DescriptionElementBase) {
-            // this is the special case for protologs, maybe we can do this
-            // differently when API improves
-            DescriptionElementBase descriptionElement = (DescriptionElementBase) entity;
-            if (descriptionElement.getFeature().equals(Feature.PROTOLOGUE())) {
+               } else if (entity instanceof DescriptionElementBase) {
+                       // this is the special case for protologs, maybe we can do this
+                       // differently when API improves
+                       DescriptionElementBase descriptionElement = (DescriptionElementBase) entity;
+                       if (descriptionElement.getFeature().equals(Feature.PROTOLOGUE())) {
                 element = new ProtologueElement(this, parentElement, descriptionElement, removeListener, style);
-            }
-        }
+                       }
+               }
 
-        if (element == null) {
+               if (element == null) {
             AbstractUtility.errorDialog("No element for entity", this,
                     "Could not generate element for entity. Looks like the case is not handled already. Check implementation. Entity: "
-                            + entity, null);
-        }
+                                                                       + entity, null);
 
-        else if (backgroundColor != null && !backgroundColor.isDisposed()) {
-            element.setPersistentBackground(backgroundColor);
-        }
-
-        adapt(element);
-        parentElement.addElement(element);
-        return element;
-    }
+               }
 
-    /**
-     * <p>
-     * Creates a selection element for the given type T.
-     * </p>
-     * <p>
-     * <strong>Selection elements not handled by this method:</strong>
-     * <ul>
+        else if (backgroundColor != null && !backgroundColor.isDisposed()) {
+                       element.setPersistentBackground(backgroundColor);
+               }
+
+               adapt(element);
+               parentElement.addElement(element);
+               return element;
+       }
+
+       /**
+        * <p>
+        * Creates a selection element for the given type T.
+        * </p>
+        * <p>
+        *      <strong>Selection elements not handled by this method:</strong>
+        *      <ul>
      * <li>{@link TaxonNodeSelectionElement} see
      * {@link #createTaxonNodeSelectionElement(ConversationHolder, ICdmFormElement, String, TaxonNode, int, int)}
      * </li>
      * <li>{@link NomenclaturalAuthorTeamSelectionElement} see
      * {@link #createNomenclaturalAuthorTeamSelectionElement(ConversationHolder, ICdmFormElement, String, Team, int, int)}
      * </li>
-     * </ul>
-     * </p>
-     *
-     * @param clazz
+        *      </ul>
+        * </p>
+        *
+        * @param clazz
      *            a {@link Class} object of the type that you want the selection
      *            element to handle
-     * @param parentElement
+        * @param parentElement
      *            a {@link ICdmFormElement} object.
-     * @param labelString
-     *            a {@link String} object.
-     * @param selectionType
-     * @param selection
-     *            a {@link ICdmBase} object.
-     * @param style
-     *            a int.
-     * @param conversation
-     *            a {@link ConversationHolder} object.
+        * @param labelString
+        *            a {@link String} object.
+        * @param selectionType
+        * @param selection
+        *            a {@link ICdmBase} object.
+        * @param style
+        *            a int.
+        * @param conversation
+        *            a {@link ConversationHolder} object.
      * @return a {@link EntitySelectionElement} object.
-     */
+        */
     public <T extends ICdmBase> EntitySelectionElement<T> createSelectionElement(Class<T> clazz,
             ConversationHolder conversation, ICdmFormElement parentElement, String labelString, T selection, int mode,
             int style) {
         EntitySelectionElement<T> element = new EntitySelectionElement<T>(this, conversation, parentElement, clazz,
                 labelString, selection, mode, style);
-        adapt(element);
-        parentElement.addElement(element);
-        return element;
-    }
+               adapt(element);
+               parentElement.addElement(element);
+               return element;
+       }
 
     public TaxonNodeSelectionElement createTaxonNodeSelectionElement(ConversationHolder conversation,
             ICdmFormElement parentElement, String labelString, TaxonNode selection, int mode, int style) {
         TaxonNodeSelectionElement element = new TaxonNodeSelectionElement(this, conversation, parentElement,
                 labelString, selection, mode, style);
-        adapt(element);
-        parentElement.addElement(element);
-        return element;
-    }
+               adapt(element);
+               parentElement.addElement(element);
+               return element;
+       }
 
-    public NomenclaturalAuthorTeamSelectionElement createNomenclaturalAuthorTeamSelectionElement(
+       public NomenclaturalAuthorTeamSelectionElement createNomenclaturalAuthorTeamSelectionElement(
             ConversationHolder conversation, ICdmFormElement parentElement, String labelString, Team selection,
             int mode, int style) {
         NomenclaturalAuthorTeamSelectionElement element = new NomenclaturalAuthorTeamSelectionElement(this,
                 conversation, parentElement, labelString, selection, mode, style);
-        adapt(element);
-        parentElement.addElement(element);
-        return element;
-    }
-
-    /** {@inheritDoc} */
-    public LabelElement createLabel(ICdmFormElement parentElement, String text) {
-        LabelElement labelElement = new LabelElement(this, parentElement, text);
-        adapt(labelElement);
-        parentElement.addElement(labelElement);
-        return labelElement;
-    }
-
-    /**
-     * <p>
-     * Getter for the field <code>selectionProvider</code>.
-     * </p>
-     *
-     * @return a {@link org.eclipse.jface.viewers.ISelectionProvider} object.
-     */
-    public ISelectionProvider getSelectionProvider() {
-        return selectionProvider;
-    }
-
-    /**
-     * <p>
-     * createDetailedDescriptionDetailElement
-     * </p>
-     *
-     * @param parentElement
-     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-     *            object.
-     * @param entity
-     *            a
-     *            {@link eu.etaxonomy.cdm.model.description.DescriptionElementBase}
-     *            object.
-     * @param style
-     *            a int.
-     * @return a
-     *         {@link eu.etaxonomy.taxeditor.ui.section.description.detail.AbstractDetailedDescriptionDetailElement}
-     *         object.
-     */
-    public AbstractDetailedDescriptionDetailElement createDetailedDescriptionDetailElement(
+               adapt(element);
+               parentElement.addElement(element);
+               return element;
+       }
+
+
+       /** {@inheritDoc} */
+       public LabelElement createLabel(ICdmFormElement parentElement, String text) {
+               LabelElement labelElement = new LabelElement(this, parentElement, text);
+               adapt(labelElement);
+               parentElement.addElement(labelElement);
+               return labelElement;
+       }
+
+       /**
+        * <p>
+        * Getter for the field <code>selectionProvider</code>.
+        * </p>
+        *
+        * @return a {@link org.eclipse.jface.viewers.ISelectionProvider} object.
+        */
+       public ISelectionProvider getSelectionProvider() {
+               return selectionProvider;
+       }
+
+       /**
+        * <p>
+        * createDetailedDescriptionDetailElement
+        * </p>
+        *
+        * @param parentElement
+        *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
+        *            object.
+        * @param entity
+        *            a
+        *            {@link eu.etaxonomy.cdm.model.description.DescriptionElementBase}
+        *            object.
+        * @param style
+        *            a int.
+        * @return a
+        *         {@link eu.etaxonomy.taxeditor.ui.section.description.detail.AbstractDetailedDescriptionDetailElement}
+        *         object.
+        */
+       public AbstractDetailedDescriptionDetailElement createDetailedDescriptionDetailElement(
             ICdmFormElement parentElement, DescriptionElementBase entity, int style) {
-        AbstractDetailedDescriptionDetailElement detailedDescriptionElement = null;
+               AbstractDetailedDescriptionDetailElement detailedDescriptionElement = null;
 
-        if (entity instanceof CategoricalData) {
+               if (entity instanceof CategoricalData) {
             detailedDescriptionElement = new CategoricalDataDetailElement(this, parentElement,
                     (CategoricalData) entity, style);
-        } else if (entity instanceof CommonTaxonName) {
+               } else if (entity instanceof CommonTaxonName) {
             detailedDescriptionElement = new CommonNameDetailElement(this, parentElement, (CommonTaxonName) entity,
                     style);
-        } else if (entity instanceof Distribution) {
+               } else if (entity instanceof Distribution) {
             detailedDescriptionElement = new DistributionDetailElement(this, parentElement, (Distribution) entity,
                     style);
-        } else if (entity instanceof IndividualsAssociation) {
+               } else if (entity instanceof IndividualsAssociation) {
             detailedDescriptionElement = new IndividualsAssociationDetailElement(this, parentElement,
                     (IndividualsAssociation) entity, style);
-        } else if (entity instanceof QuantitativeData) {
+               } else if (entity instanceof QuantitativeData) {
             detailedDescriptionElement = new QuantitativeDataDetailElement(this, parentElement,
                     (QuantitativeData) entity, style);
-        } else if (entity instanceof TaxonInteraction) {
+               } else if (entity instanceof TaxonInteraction) {
             detailedDescriptionElement = new TaxonInteractionDetailElement(this, parentElement,
                     (TaxonInteraction) entity, style);
-        } else if (entity instanceof TextData) {
+               } else if (entity instanceof TextData) {
             detailedDescriptionElement = new TextDataDetailElement(this, parentElement, (TextData) entity, style);
-        } else {
+               } else {
             throw new IllegalStateException("There is no interface for the given description element");
-        }
-        adapt(detailedDescriptionElement);
-        parentElement.addElement(detailedDescriptionElement);
-        return detailedDescriptionElement;
+               }
+               adapt(detailedDescriptionElement);
+               parentElement.addElement(detailedDescriptionElement);
+               return detailedDescriptionElement;
 
-    }
+       }
 
-    /**
-     * Creates a styled text as a part of the form.
-     *
-     * @param parent
-     *            the text parent
-     * @param value
-     *            the text initial value
-     * @param style
-     *            the text style
-     * @return the text widget
-     */
-    public StyledText createStyledText(Composite parent, String value, int style) {
+       /**
+        * Creates a styled text as a part of the form.
+        *
+        * @param parent
+        *            the text parent
+        * @param value
+        *            the text initial value
+        * @param style
+        *            the text style
+        * @return the text widget
+        */
+       public StyledText createStyledText(Composite parent, String value, int style) {
         StyledText text = new StyledText(parent, getBorderStyle() | style | getOrientation());
         if (value != null) {
-            text.setText(value);
+                       text.setText(value);
         }
-        text.setForeground(getColors().getForeground());
-        text.setBackground(getColors().getBackground());
-        // text.addFocusListener(visibilityHandler);
-        return text;
-    }
+               text.setForeground(getColors().getForeground());
+               text.setBackground(getColors().getBackground());
+               // text.addFocusListener(visibilityHandler);
+               return text;
+       }
+
+
+
+
+
 
 }