merge-update from trunk
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / element / CdmFormFactory.java
index 9460de11cf1a6f79db4e1101261d1f93361889ab..ac9f81406f92a71774eec8cfb87cf24c2b9cf1eb 100644 (file)
@@ -33,6 +33,7 @@ import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Event;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.ui.forms.IFormColors;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
 import org.eclipse.ui.forms.widgets.FormToolkit;
 import org.eclipse.ui.forms.widgets.Section;
 import org.eclipse.ui.internal.forms.widgets.FormFonts;
@@ -40,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;
@@ -82,20 +84,38 @@ import eu.etaxonomy.cdm.model.media.Media;
 import eu.etaxonomy.cdm.model.media.MediaRepresentation;
 import eu.etaxonomy.cdm.model.media.MediaRepresentationPart;
 import eu.etaxonomy.cdm.model.media.Rights;
+import eu.etaxonomy.cdm.model.molecular.Sequence;
 import eu.etaxonomy.cdm.model.name.NameRelationship;
 import eu.etaxonomy.cdm.model.name.NameTypeDesignation;
 import eu.etaxonomy.cdm.model.name.NomenclaturalStatus;
 import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;
 import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
 import eu.etaxonomy.cdm.model.occurrence.DeterminationEvent;
-import eu.etaxonomy.cdm.model.occurrence.Specimen;
 import eu.etaxonomy.cdm.model.reference.Reference;
 import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.cdm.model.taxon.TaxonNode;
 import eu.etaxonomy.cdm.strategy.parser.ParserProblem;
-import eu.etaxonomy.taxeditor.store.StoreUtil;
+import eu.etaxonomy.taxeditor.model.AbstractUtility;
+import eu.etaxonomy.taxeditor.ui.campanula.basicFields.NamedAreaFieldController;
+import eu.etaxonomy.taxeditor.ui.campanula.compatibility.ICdmFormElement;
+import eu.etaxonomy.taxeditor.ui.campanula.detailViews.fieldObservation.FieldObservationDetailsElement;
+import eu.etaxonomy.taxeditor.ui.campanula.detailViews.fieldObservation.FieldObservationDetailsElementController;
+import eu.etaxonomy.taxeditor.ui.campanula.detailViews.fieldObservation.FieldObservationDetailsSection;
+import eu.etaxonomy.taxeditor.ui.campanula.detailViews.fieldObservation.FieldObservationGeneralElement;
+import eu.etaxonomy.taxeditor.ui.campanula.detailViews.fieldObservation.FieldObservationGeneralElementController;
+import eu.etaxonomy.taxeditor.ui.campanula.detailViews.fieldObservation.FieldObservationGeneralSection;
+import eu.etaxonomy.taxeditor.ui.campanula.detailViews.fieldObservation.GatheringEventDetailsElement;
+import eu.etaxonomy.taxeditor.ui.campanula.detailViews.fieldObservation.GatheringEventDetailsElementController;
+import eu.etaxonomy.taxeditor.ui.campanula.detailViews.fieldObservation.GatheringEventSection;
+import eu.etaxonomy.taxeditor.ui.campanula.detailViews.specimen.DerivedUnitDetailsElement;
+import eu.etaxonomy.taxeditor.ui.campanula.detailViews.specimen.DerivedUnitDetailsElementController;
+import eu.etaxonomy.taxeditor.ui.campanula.detailViews.specimen.DerivedUnitDetailsSection;
+import eu.etaxonomy.taxeditor.ui.campanula.detailViews.specimen.SpecimenDetailsElement;
+import eu.etaxonomy.taxeditor.ui.campanula.detailViews.specimen.SpecimenDetailsElementController;
+import eu.etaxonomy.taxeditor.ui.campanula.detailViews.specimen.SpecimenGeneralSection;
 import eu.etaxonomy.taxeditor.ui.combo.EnumComboElement;
 import eu.etaxonomy.taxeditor.ui.combo.TermComboElement;
+import eu.etaxonomy.taxeditor.ui.element.MinMaxTextSection.UnitType;
 import eu.etaxonomy.taxeditor.ui.openurl.IOpenUrlEnabled;
 import eu.etaxonomy.taxeditor.ui.openurl.OpenUrlSelectorElement;
 import eu.etaxonomy.taxeditor.ui.password.EditPasswordElement;
@@ -116,8 +136,8 @@ import eu.etaxonomy.taxeditor.ui.section.classification.ClassificationDetailElem
 import eu.etaxonomy.taxeditor.ui.section.classification.ClassificationDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.classification.TaxonNodeDetailElement;
 import eu.etaxonomy.taxeditor.ui.section.classification.TaxonNodeDetailSection;
+import eu.etaxonomy.taxeditor.ui.section.common.ReferenceEntityDetailElement;
 import eu.etaxonomy.taxeditor.ui.section.common.ReferencedEntityDetailSection;
-import eu.etaxonomy.taxeditor.ui.section.common.RefereneEntityDetailElement;
 import eu.etaxonomy.taxeditor.ui.section.description.DerivedUnitElement;
 import eu.etaxonomy.taxeditor.ui.section.description.DescribedSpecimenSection;
 import eu.etaxonomy.taxeditor.ui.section.description.DescriptionDetailElement;
@@ -129,6 +149,7 @@ import eu.etaxonomy.taxeditor.ui.section.description.DescriptionElementSourceEle
 import eu.etaxonomy.taxeditor.ui.section.description.DescriptionElementSourceSection;
 import eu.etaxonomy.taxeditor.ui.section.description.DescriptionSourceElement;
 import eu.etaxonomy.taxeditor.ui.section.description.DescriptionSourceSection;
+import eu.etaxonomy.taxeditor.ui.section.description.MediaDetailsSection;
 import eu.etaxonomy.taxeditor.ui.section.description.ModifierElement;
 import eu.etaxonomy.taxeditor.ui.section.description.ModifierSection;
 import eu.etaxonomy.taxeditor.ui.section.description.NaturalLanguageDetailElement;
@@ -187,6 +208,10 @@ import eu.etaxonomy.taxeditor.ui.section.name.ProtologueElement;
 import eu.etaxonomy.taxeditor.ui.section.name.ProtologueSection;
 import eu.etaxonomy.taxeditor.ui.section.name.SpecimenTypeDesignationElement;
 import eu.etaxonomy.taxeditor.ui.section.name.TypeDesignationSection;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.AmplificationGeneralDetailElement;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.AmplificationGeneralDetailSection;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.ArtworkGeneralDetailElement;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.ArtworkGeneralDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.CollectingAreasDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.CollectionDetailElement;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.CurrentDeterminationDetailSection;
@@ -194,20 +219,45 @@ import eu.etaxonomy.taxeditor.ui.section.occurrence.DerivedUnitBaseDetailElement
 import eu.etaxonomy.taxeditor.ui.section.occurrence.DerivedUnitBaseDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.DerivedUnitFacadeDetailElement;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.DerivedUnitFacadeDetailSection;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.DerivedUnitGeneralDetailElement;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.DerivedUnitGeneralDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.DeterminationDetailElement;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.DeterminationDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.DeterminationEventDetailElement;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.DeterminationHistoryDetailSection;
-import eu.etaxonomy.taxeditor.ui.section.occurrence.FieldObservationDetailElement;
-import eu.etaxonomy.taxeditor.ui.section.occurrence.FieldObservationDetailSection;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.DnaSampleGeneralDetailElement;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.DnaSampleGeneralDetailSection;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.FieldUnitDetailElement;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.FieldUnitDetailSection;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.FieldUnitGeneralDetailElement;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.FieldUnitGeneralDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.GatheringEventDetailElement;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.GatheringEventDetailSection;
-import eu.etaxonomy.taxeditor.ui.section.occurrence.GeneralDetailElement;
-import eu.etaxonomy.taxeditor.ui.section.occurrence.GeneralDetailSection;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.LivingPlantPhotoGeneralDetailElement;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.LivingPlantPhotoGeneralDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.NamedAreaDetailElement;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.PreservedSpecimenCurrentDeterminationDetailSection;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.PreservedSpecimenDetailElement;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.PreservedSpecimenDetailSection;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.PreservedSpecimenDeterminationDetailElement;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.PreservedSpecimenDeterminationDetailSection;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.PreservedSpecimenDeterminationHistoryDetailSection;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.PreservedSpecimenGeneralDetailElement;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.PreservedSpecimenGeneralDetailSection;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.PreservedSpecimenSourceCollectionDetailSection;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.SequenceGeneralDetailElement;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.SequenceGeneralDetailSection;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.SequenceReferenceCollectionDetailElement;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.SequenceReferenceCollectionDetailSection;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.SingleReadGeneralDetailElement;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.SingleReadGeneralDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.SourceCollectionDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.SpecimenCollectionDetailElement;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.SpecimenCollectionDetailSection;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.SpecimenScanGeneralDetailElement;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.SpecimenScanGeneralDetailSection;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.TissueSampleGeneralDetailElement;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.TissueSampleGeneralDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.reference.NomenclaturalReferenceDetailElement;
 import eu.etaxonomy.taxeditor.ui.section.reference.NomenclaturalReferenceDetailSection;
 import eu.etaxonomy.taxeditor.ui.section.reference.ReferenceDetailElement;
@@ -244,6 +294,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;
@@ -262,2031 +313,2403 @@ 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 selectionListenerList = new HashSet();
+    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);
-               }
-       }
-
-       private void notifySelectionListeners(TypedEvent e) {
-               Event event = new Event();
-               event.widget = e.widget;
-               SelectionEvent selectionEvent = new SelectionEvent(event);
-
-               for (Object listener : selectionListenerList) {
-                       ((SelectionListener) 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();
-       }
-
-       /**
-        *
-        */
-       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
-        *            a {@link eu.etaxonomy.taxeditor.ui.element.SelectionArbitrator}
-        *            object.
-        */
-       public void destroySelectionArbitrator(
-                       SelectionArbitrator selectionArbitrator) {
-               removeSelectionListener(selectionArbitrator);
-               if (selectionProvider != null) {
-                       selectionProvider
-                                       .removeSelectionChangedListener(selectionArbitrator);
-               } else {
-                       StoreUtil
-                                       .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>
-        * 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) {
-                       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.
-        */
-       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.
-        */
-       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;
-       }
-
-       public KeyStatementElement createKeyStatementElement(
-                       ICdmFormElement parentElement, String labelString,
-                       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.
-        */
-       public TextWithLabelElement createTextWithLabelElement(
-                       ICdmFormElement parentElement, String labelString,
-                       String initialText, int style) {
-               TextWithLabelElement element = new TextWithLabelElement(this,
-                               parentElement, labelString, initialText, null, style);
-               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
-        */
-       public OpenUrlSelectorElement createOpenUrlSelectorElement(
-                       ICdmFormElement parentElement, String labelString,
-                       IOpenUrlEnabled openUrlEnabled, int style) {
-               OpenUrlSelectorElement element = new OpenUrlSelectorElement(this,
-                               parentElement, labelString, openUrlEnabled, style);
-               adapt(element);
-               parentElement.addElement(element);
-               return element;
-       }
-
-       /**
-        *
-        * @param parentElement
-        * @param labelString
-        * @param conversationEnabled
-        * @param user
-        * @param style
-        * @return
-        */
-       public EditPasswordElement createEditPasswordElement(
-                       ICdmFormElement parentElement, String labelString,
-                       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.
-        * @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.
-        */
-       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.
-        */
-       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.
-        */
-       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.
-        */
-       public KeyValueViewerElement createKeyValueViewerElement(
-                       ICdmFormElement parentElement, String keyHeading,
-                       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.
-        */
-
-       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;
-       }
-
-       /**
-        * <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.
-        */
-       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.
-        */
-       public TextActionElement createTextActionElement(
-                       ICdmFormElement parentElement, String labelString,
-                       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.
-        * @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;
-       }
-
-       /**
-        * 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);
-
-               // handle focus and property change events for cdm use
-               section.addFocusListener(selectionFocusHandler);
-               section.setPropertyChangeListeners(propertyChangeListeners);
-
-               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() & Section.TITLE_BAR) != 0
-                               || (section.getStyle() & Section.SHORT_TITLE_BAR) != 0) {
-                       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
-               section.setTitleBarForeground(getColors().getColor(
-                               IFormColors.TB_TOGGLE));
-               return section;
-       }
-
-       private class BoldFontHolder2 {
-               private Font normalFont;
-
-               private Font boldFont;
-
-               public BoldFontHolder2() {
-               }
-
-               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) {
-                               boldFont = FormFonts.getInstance().getBoldFont(
-                                               getColors().getDisplay(), normalFont);
-                       }
-               }
-
-               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.
-        */
-       public ToggleableTextElement createToggleableTextField(
-                       ICdmFormElement parentElement, String labelString,
-                       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.
-        */
-       public TimePeriodElement createTimePeriodElement(
-                       ICdmFormElement parentElement, String labelString,
-                       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.
-        */
-       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.
-        */
-       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.
-        * @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) {
-                       StoreUtil
-                                       .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.
-        */
-       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.
-        */
-       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
-        */
-       public CdmBaseElement createCdmBaseElement(ICdmFormElement parentElement,
-                       CdmBase entity, int style) {
-               CdmBaseElement element = new CdmBaseElement(this, parentElement,
-                               entity, style);
-               adapt(element);
-               parentElement.addElement(element);
-               return element;
-       }
+    /** 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);
+        }
+    }
 
+    private void notifySelectionListeners(TypedEvent e) {
+        Event event = new Event();
+        event.widget = e.widget;
+        SelectionEvent selectionEvent = new SelectionEvent(event);
 
-       /**
-        * <p>
-        * createVersionSection
-        * </p>
+        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();
+    }
+
+    /**
         *
-        * @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;
-       }
+    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
+     *            a
+     *            {@link eu.etaxonomy.taxeditor.ui.element.SelectionArbitrator}
+     *            object.
+     */
+    public void destroySelectionArbitrator(SelectionArbitrator selectionArbitrator) {
+        removeSelectionListener(selectionArbitrator);
+        if (selectionProvider != null) {
+            selectionProvider.removeSelectionChangedListener(selectionArbitrator);
+        } else {
+            AbstractUtility.error(this.getClass(),
+                    "Tried to destroy a selection listener from this factories listeners but was null", null);
+        }
+    }
+
+    /**
+     * <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);
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public void adapt(Composite composite) {
+        composite.addMouseListener(selectionMouseHandler);
+        super.adapt(composite);
+    }
+
+    /**
+     * <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.
+     */
+    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.
+     */
+    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;
+    }
+
+    public KeyStatementElement createKeyStatementElement(ICdmFormElement parentElement, String labelString,
+            KeyStatement keyStatement, int textHeight, int style) {
+        KeyStatementElement element = new KeyStatementElement(this, parentElement, labelString, keyStatement,
+                textHeight, style);
+        adapt(element);
+        parentElement.addElement(element);
+        return element;
+    }
+
+    /**
+     * Creates a text field with a label. The initial content will be the return value of the initalObject's {@link #toString()}
+     * method.<br>
+     * <b>Note</b>: if initialObject is <code>null</code> then an empty string is used.
+     * @param parentElement the parent container
+     * @param labelString the label name
+     * @param initialObject the object from which the <code>toString()</code> method is called
+     * @param style {@link SWT} style constant
+     * @return the created textfield with label
+     */
+    public TextWithLabelElement createTextWithLabelElement(ICdmFormElement parentElement, String labelString,
+            Object initialObject, int style) {
+        return createTextWithLabelElement(parentElement, labelString, initialObject==null?"":initialObject.toString(), style);
+    }
+
+    /**
+     * <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) {
+        if(initialText==null){
+            initialText = "";
+        }
 
-       /**
-        * <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);
+        TextWithLabelElement element = new TextWithLabelElement(this, parentElement, labelString, initialText, null,
+                style);
+        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
+     */
+    public OpenUrlSelectorElement createOpenUrlSelectorElement(ICdmFormElement parentElement, String labelString,
+            IOpenUrlEnabled openUrlEnabled, int style) {
+        OpenUrlSelectorElement element = new OpenUrlSelectorElement(this, parentElement, labelString, openUrlEnabled,
+                style);
+        adapt(element);
+        parentElement.addElement(element);
+        return element;
+    }
+
+    /**
+     *
+     * @param parentElement
+     * @param labelString
+     * @param conversationEnabled
+     * @param user
+     * @param style
+     * @return
+     */
+    public EditPasswordElement createEditPasswordElement(ICdmFormElement parentElement, String labelString,
+            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 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>
-        * 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>
+     * 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.
+     */
+    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.
+     */
+    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.
+     */
+    public KeyValueViewerElement createKeyValueViewerElement(ICdmFormElement parentElement, String keyHeading,
+            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.
+     */
+
+    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>
-        * createParsingMessageElement
+        * 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 parserProblem
-        *            a {@link eu.etaxonomy.cdm.strategy.parser.ParserProblem}
+        * @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.section.taxon.ParsingMessageElement}
+        * @return a {@link eu.etaxonomy.taxeditor.ui.combo.TermComboElement}
         *         object.
         */
-       public ParsingMessageElement createParsingMessageElement(
-                       ICdmFormElement parentElement, ParserProblem parserProblem,
+
+       public <T extends DefinedTermBase> TermComboElement<T> createDefinedTermComboElement(
+                       TermType termType,
+                       ICdmFormElement parentElement,
+                       String labelString,
+                       T selection,
                        int style) {
-               ParsingMessageElement element = new ParsingMessageElement(this,
-                               parentElement, parserProblem, style);
+               TermComboElement<T> element = new TermComboElement<T>(this, parentElement, termType, labelString, selection, style);
                adapt(element);
                parentElement.addElement(element);
                return element;
        }
 
-       // SIMPLIFY
+    /**
+     * <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.
+     */
+    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.
+     */
+    public TextActionElement createTextActionElement(ICdmFormElement parentElement, String labelString,
+            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.
+     * @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;
+    }
+
+    /**
+     * 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);
+
+        // handle focus and property change events for cdm use
+        section.addFocusListener(selectionFocusHandler);
+        section.setPropertyChangeListeners(propertyChangeListeners);
+
+        if (section.getToggle() != null) {
+            section.getToggle().setHoverDecorationColor(getColors().getColor(IFormColors.TB_TOGGLE_HOVER));
+            section.getToggle().setDecorationColor(getColors().getColor(IFormColors.TB_TOGGLE));
+        }
 
-       /**
-        *
-        */
-       public static enum DetailType {
-               AUTHORSHIP,
-               CLASSIFICATION,
-               COLLECTION,
-               DERIVED_UNIT,
-               DERIVED_UNIT_FACADE,
-               DERIVED_UNIT_GENERAL,
-               DESCRIPTION,
-               DESCRIPTIONELEMENT,
-               DETERMINATION,
-               FEATURE_DISTRIBUTION,
-               FIELD_OBSERVATION,
-               GATHERING_EVENT,
-               GRANTEDAUTHORITY,
-               GROUP,
-               HYBRID,
-               INSTITUTION,
-               MEDIA,
-               NAMED_AREA,
-               NAMED_AREA_LEVEL,
-               NAMERELATIONSHIP,
-               NATURAL_LANGUAGE,
-               NOMENCLATURALREFERENCE,
-               NONVIRALNAME,
-               PARSINGMESSAGE,
-               PERSON,
-               POLYTOMOUS_KEY,
-               POLYTOMOUS_KEY_NODE,
-               REFERENCEBASE,
-               REFERENCED_ENTITY,
-               SCIENTIFICNAME,
-               TAXON_NODE,
-               TAXON_RELATIONSHIP,
-               TAXONBASE,
-               TEAM,
-               TEAMORPERSONBASE,
-               TERM_VOCABULARY,
-               USE_RECORD,
-               USER
-       }
+        section.setFont(boldFontHolder2.getBoldFont(section.getLayoutComposite().getFont()));
 
-       public AbstractFormSection createDefinedTermDetailSection(Class definedTermClass,
-                       ConversationHolder conversation, ICdmFormElement parentElement,
-                       ISelectionProvider selectionProvider, int style) {
+        if ((section.getStyle() & ExpandableComposite.TITLE_BAR) != 0
+                || (section.getStyle() & ExpandableComposite.SHORT_TITLE_BAR) != 0) {
+            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
+        section.setTitleBarForeground(getColors().getColor(IFormColors.TB_TOGGLE));
+        return section;
+    }
 
-               AbstractFormSection section = new DefinedTermDetailSection(this, definedTermClass, conversation, parentElement, selectionProvider, style);
+    private class BoldFontHolder2 {
+        private Font normalFont;
 
-               parentElement.addElement(section);
-               adapt(section);
-               return section;
+        private Font boldFont;
 
-       }
+        public BoldFontHolder2() {
+        }
 
-       /**
-        * @param definedTermClass
-        * @param formElement
-        * @param style
-        * @return
-        */
-       public AbstractCdmDetailElement createDefinedTermDetailElement(
-                       Class definedTermClass, AbstractCdmDetailSection parentElement,
-                       int style) {
-               AbstractCdmDetailElement element = null;
+        public Font getBoldFont(Font font) {
+            createBoldFont(font);
+            return boldFont;
+        }
 
-               if (NamedArea.class.isAssignableFrom(definedTermClass)){
-                       element = new eu.etaxonomy.taxeditor.ui.section.vocabulary.NamedAreaDetailElement(this, parentElement);
-               }
-               else {
-                       element = new DefinedTermDetailElement(this, parentElement);
-               }
+        private void createBoldFont(Font font) {
+            if (normalFont == null || !normalFont.equals(font)) {
+                normalFont = font;
+                dispose();
+            }
+            if (boldFont == null) {
+                boldFont = FormFonts.getInstance().getBoldFont(getColors().getDisplay(), normalFont);
+            }
+        }
 
-               adapt(element);
-               parentElement.addElement(element);
-               return element;
-       }
+        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.
+     */
+    public ToggleableTextElement createToggleableTextField(ICdmFormElement parentElement, String labelString,
+            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.
+     */
+    public TimePeriodElement createTimePeriodElement(ICdmFormElement parentElement, String labelString,
+            TimePeriod timePeriod, int style) {
+        TimePeriodElement element = new TimePeriodElement(this, parentElement, labelString, timePeriod, style);
+        adapt(element);
+        parentElement.addElement(element);
+        return element;
+    }
 
        /**
         * <p>
-        * createCdmDetailSection
+        * createGatheringEventUnitElement
         * </p>
         *
-        * @param detailType
-        *            a
-        *            {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory.DetailType}
-        *            object.
         * @param parentElement
         *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
         *            object.
-        * @param selectionProvider
-        *            a {@link org.eclipse.jface.viewers.ISelectionProvider} object.
-        * @param style
-        *            a int.
-        * @param conversation
-        *            a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
-        *            object.
-        * @return a {@link eu.etaxonomy.taxeditor.ui.element.AbstractFormSection}
-        *         object.
-        */
-       public AbstractFormSection createCdmDetailSection(DetailType detailType,
-                       ConversationHolder conversation, ICdmFormElement parentElement,
-                       ISelectionProvider selectionProvider, int style) {
-               AbstractFormSection section = null;
-
-               switch (detailType) {
-               case SCIENTIFICNAME:
-                       section = new NameDetailSection(this, conversation, parentElement,
-                                       selectionProvider, style);
-                       break;
-               case REFERENCEBASE:
-                       section = new ReferenceDetailSection(this, conversation,
-                                       parentElement, selectionProvider, style);
-                       break;
-               case NOMENCLATURALREFERENCE:
-                       section = new NomenclaturalReferenceDetailSection(this,
-                                       conversation, parentElement, selectionProvider, style);
-                       break;
-               case TAXONBASE:
-                       section = new TaxonBaseDetailSection(this, conversation,
-                                       parentElement, selectionProvider, style);
-                       break;
-               case AUTHORSHIP:
-                       section = new AuthorshipDetailSection(this, conversation,
-                                       parentElement, selectionProvider, style);
-                       break;
-               case TEAMORPERSONBASE:
-                       section = new TeamOrPersonBaseDetailSection(this, conversation,
-                                       parentElement, selectionProvider, style);
-                       break;
-               case TEAM:
-                       section = new TeamDetailSection(this, conversation, parentElement,
-                                       null, style);
-                       break;
-               case PERSON:
-                       section = new PersonDetailSection(this, conversation,
-                                       parentElement, null, style);
-                       break;
-               case DESCRIPTION:
-                       section = new DescriptionDetailSection(this, conversation,
-                                       parentElement, selectionProvider, style);
-                       break;
-               case DESCRIPTIONELEMENT:
-                       section = new DescriptionElementDetailSection(this, conversation,
-                                       parentElement, selectionProvider, style);
-                       break;
-               case PARSINGMESSAGE:
-                       section = new ParsingMessagesSection(this, conversation,
-                                       parentElement, selectionProvider, style);
-                       break;
-               case NONVIRALNAME:
-                       section = new NonViralNameDetailSection(this, conversation,
-                                       parentElement, selectionProvider, style);
-                       break;
-               case MEDIA:
-                       section = new eu.etaxonomy.taxeditor.ui.section.description.MediaDetailsSection(
-                                       this, conversation, parentElement, selectionProvider, style);
-                       break;
-               case DERIVED_UNIT_FACADE:
-                       section = new DerivedUnitFacadeDetailSection(this, conversation,
-                                       parentElement, selectionProvider, style);
-                       break;
-               case FIELD_OBSERVATION:
-                       section = new FieldObservationDetailSection(this, conversation,
-                                       parentElement, selectionProvider, style);
-                       break;
-               case GATHERING_EVENT:
-                       section = new GatheringEventDetailSection(this, conversation,
-                                       parentElement, selectionProvider, style);
-                       break;
-               case DERIVED_UNIT:
-                       section = new DerivedUnitBaseDetailSection(this, conversation,
-                                       parentElement, selectionProvider, style);
-                       break;
-               case NATURAL_LANGUAGE:
-                       section = new NaturalLanguageSection(this, conversation,
-                                       parentElement, selectionProvider, style);
-                       break;
-               case FEATURE_DISTRIBUTION:
-                       section = new FeatureDistributionDetailSection(this, conversation,
-                                       parentElement, selectionProvider, style);
-                       break;
-               case CLASSIFICATION:
-                       section = new ClassificationDetailSection(this, conversation,
-                                       parentElement, selectionProvider, style);
-                       break;
-               case TAXON_NODE:
-                       section = new TaxonNodeDetailSection(this, conversation,
-                                       parentElement, selectionProvider, style);
-                       break;
-               case POLYTOMOUS_KEY:
-                       section = new PolytomousKeyDetailSection(this, conversation,
-                                       parentElement, selectionProvider, style);
-                       break;
-               case POLYTOMOUS_KEY_NODE:
-                       section = new PolytomousKeyNodeDetailSection(this, conversation,
-                                       parentElement, selectionProvider, style);
-                       break;
-               case INSTITUTION:
-                       section = new InstitutionDetailSection(this, conversation,
-                                       parentElement, selectionProvider, style);
-                       break;
-               case DERIVED_UNIT_GENERAL:
-                       section = new GeneralDetailSection(this, conversation,
-                                       parentElement, selectionProvider, style);
-                       break;
-               case HYBRID:
-                       section = new HybridDetailSection(this, conversation,
-                                       parentElement, selectionProvider, style);
-                       break;
-               case USER:
-                       section = new UserDetailSection(this, conversation, parentElement,
-                                       selectionProvider, style);
-                       break;
-               case GROUP:
-                       section = new GroupDetailSection(this, conversation, parentElement,
-                                       selectionProvider, style);
-                       break;
-               case DETERMINATION:
-                       section = new DeterminationDetailSection(this, conversation, parentElement,
-                                       selectionProvider, style);
-                       break;
-               case TAXON_RELATIONSHIP:
-                       section = new TaxonRelationshipDetailSection(this, conversation, parentElement,
-                                       selectionProvider, style);
-                       break;
-               case REFERENCED_ENTITY:
-                       section = new ReferencedEntityDetailSection(this, conversation, parentElement,
-                                       selectionProvider, style);
-                       break;
-               case TERM_VOCABULARY:
-                       section = new TermVocabularyDetailSection(this, conversation, parentElement,
-                                       selectionProvider, style);
-                       break;
-               case NAMED_AREA:
-                       section = new NamedAreaDetailSection(this, conversation, parentElement,
-                                       selectionProvider, style);
-                       break;
-               case USE_RECORD:
-                       section = new UseRecordDetailSection(this, conversation, parentElement,
-                                       selectionProvider, style);
-                       break;
-               }
-
-
-               if (section == null) {
-                       throw new RuntimeException(
-                                       "You tried to create a cdm detail section that is not implemented yet.");
-               }
-
-               parentElement.addElement(section);
-               adapt(section);
-               return section;
-       }
-
-
-
-       /**
-        * <p>
-        * createCdmDetailElement
-        * </p>
-        *
-        * @param detailType
-        *            a
-        *            {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory.DetailType}
-        *            object.
+        * @param labelString
+        *            a {@link java.lang.String} object.
+        * @param timePeriod
+        *            a {@link eu.etaxonomy.cdm.model.common.GatheringEvent} object.
         * @param style
         *            a int.
-        * @param parentElement
-        *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-        *            object.
-        * @return a
-        *         {@link eu.etaxonomy.taxeditor.ui.section.AbstractCdmDetailElement}
+        * @return a {@link eu.etaxonomy.taxeditor.ui.element.GatheringEventUnitElement}
         *         object.
         */
-       public AbstractCdmDetailElement createCdmDetailElement(
-                       DetailType detailType, ICdmFormElement parentElement, int style) {
-               AbstractCdmDetailElement element = null;
-
-               switch (detailType) {
-               case SCIENTIFICNAME:
-                       element = new NameDetailElement(this, parentElement, style);
-                       break;
-               case REFERENCEBASE:
-                       element = new ReferenceDetailElement(this, parentElement, style);
-                       break;
-               case NOMENCLATURALREFERENCE:
-                       element = new NomenclaturalReferenceDetailElement(this,
-                                       parentElement, style);
-                       break;
-               case TAXONBASE:
-                       element = new TaxonBaseDetailElement(this, parentElement, style);
-                       break;
-               case AUTHORSHIP:
-                       element = new AuthorshipDetailElement(this, parentElement, style);
-                       break;
-               case TEAM:
-                       element = new TeamDetailElement(this, parentElement, style);
-                       break;
-               case PERSON:
-                       element = new PersonDetailElement(this, parentElement, style);
-                       break;
-               case DESCRIPTION:
-                       element = new DescriptionDetailElement(this, parentElement, style);
-                       break;
-               case DESCRIPTIONELEMENT:
-                       element = new DescriptionElementDetailElement(this, parentElement,
-                                       style);
-                       break;
-               case NONVIRALNAME:
-                       element = new NonViralNameDetailElement(this, parentElement);
-                       break;
-               case DERIVED_UNIT_FACADE:
-                       element = new DerivedUnitFacadeDetailElement(this, parentElement);
-                       break;
-               case FIELD_OBSERVATION:
-                       element = new FieldObservationDetailElement(this, parentElement);
-                       break;
-               case GATHERING_EVENT:
-                       element = new GatheringEventDetailElement(this, parentElement);
-                       break;
-               case DERIVED_UNIT:
-                       element = new DerivedUnitBaseDetailElement(this, parentElement);
-                       break;
-               case NATURAL_LANGUAGE:
-                       element = new NaturalLanguageDetailElement(this, parentElement);
-                       break;
-               case FEATURE_DISTRIBUTION:
-                       element = new FeatureDistributionDetailElement(this, parentElement);
-                       break;
-               case CLASSIFICATION:
-                       element = new ClassificationDetailElement(this, parentElement);
-                       break;
-               case TAXON_NODE:
-                       element = new TaxonNodeDetailElement(this, parentElement);
-                       break;
-               case COLLECTION:
-                       element = new CollectionDetailElement(this, parentElement);
-                       break;
-               case POLYTOMOUS_KEY:
-                       element = new PolytomousKeyDetailElement(this, parentElement);
-                       break;
-               case POLYTOMOUS_KEY_NODE:
-                       element = new PolytomousKeyNodeDetailElement(this, parentElement);
-                       break;
-               case INSTITUTION:
-                       element = new InstitutionDetailElement(this, parentElement);
-                       break;
-               case DERIVED_UNIT_GENERAL:
-                       element = new GeneralDetailElement(this, parentElement);
-                       break;
-               case HYBRID:
-                       element = new HybridDetailElement(this, parentElement);
-                       break;
-               case USER:
-                       element = new UserDetailElement(this, parentElement);
-                       break;
-               case GROUP:
-                       element = new GroupDetailElement(this, parentElement);
-                       break;
-               case GRANTEDAUTHORITY:
-                       element = new GrantedAuthorityDetailElement(this, parentElement);
-                       break;
-               case DETERMINATION:
-                       element = new DeterminationDetailElement(this, parentElement);
-                       break;
-               case TAXON_RELATIONSHIP:
-                       element = new TaxonRelationshipDetailElement(this, parentElement);
-                       break;
-               case REFERENCED_ENTITY:
-                       element = new RefereneEntityDetailElement(this, parentElement);
-                       break;
-               case TERM_VOCABULARY:
-                       element = new TermVocabularyDetailElement(this, parentElement);
-                       break;
-               case NAMED_AREA:
-                       element = new eu.etaxonomy.taxeditor.ui.section.vocabulary.NamedAreaDetailElement(this, parentElement);
-                       break;
-               case NAMED_AREA_LEVEL:
-                       element = new DefinedTermDetailElement<NamedAreaLevel>(this, parentElement);
-                       break;
-               case USE_RECORD:
-                       //element = new UseRecordDetailElement(this, parentElement, style);
-                       element = new UseRecordDetailElement(this, parentElement);
-                       break;
-               }
-
-               if (element == null) {
-                       StoreUtil
-                                       .error(this.getClass(),
-                                                       "Detail element was not created. Seems like the case was not implemented for the requested detail type: "
-                                                                       + detailType, null);
-               }
-
+       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;
        }
 
-       /**
-        *
-        * @author n.hoffmann
-        * @created Mar 5, 2010
-        * @version 1.0
-        */
-       public static enum EntityDetailType {
-               TEAM,
-               TEAMMEMBER,
-               ANNOTATION,
-               CREDIT,
-               DESCRIPTIONELEMENTSOURCE,
-               EXTENSION,
-               MARKER,
-               MEDIA,
-               DESCRIPTIONELEMENTMEDIA,
-               MEDIAREPRESENTATION,
-               MEDIAREPRESENTATIONPART,
-               MODIFIER,
-               NOMENCLATURALSTATUS,
-               NAME_RELATIONSHIP,
-               PROTOLOG,
-               RIGHTS,
-               SOURCE,
-               SCOPE,
-               DESCRIPTIONSOURCE,
-               TYPEDESIGNATION,
-               STATE_DATA,
-               STATISTICAL_MEASUREMENT_VALUE,
-               DESCRIBED_SPECIMEN,
-               COLLECTING_AREA,
-               DETERMINATION_EVENT,
-               SPECIMEN_COLLECTION,
-               IDENTIFIABLE_SOURCE_COLLECTION,
-               GEOGRAPHICAL_SCOPE,
-               SCOPE_RESTRICTION,
-               MEMBER,
-               GRANTED_AUTHORITY,
-               GROUPS_BY_USER,
-               TAXONOMIC_SCOPE,
-               DETERMINATION_CURRENT,
-               DETERMINATION_HISTORY
-       }
+    /**
+     * <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.
+     */
+    public DateDetailSection createDateDetailSection(ICdmFormElement parentElement, int style) {
+        DateDetailSection section = new DateDetailSection(this, parentElement, style);
+        parentElement.addElement(section);
+        adapt(section);
+        return section;
+    }
 
        /**
         * <p>
-        * createEntityDetailSection
+        * createDateDetailSection
         * </p>
         *
-        * @param entityDetailType
-        *            a
-        *            {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory.EntityDetailType}
-        *            object.
-        * @param style
-        *            a int.
-        * @param conversation
-        *            a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
-        *            object.
         * @param parentElement
         *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
         *            object.
-        * @return a {@link eu.etaxonomy.taxeditor.ui.element.AbstractFormSection}
+        * @param style
+        *            a int.
+        * @return a {@link eu.etaxonomy.taxeditor.ui.element.MinMaxTextSection}
         *         object.
         */
-       public AbstractFormSection createEntityDetailSection(EntityDetailType entityDetailType, ConversationHolder conversation, ICdmFormElement parentElement, int style) {
-               AbstractFormSection section = null;
-
-               switch (entityDetailType) {
-               case TEAM:
-                   //TODO this is not an AbstractEntityCollectionSection
-                       section = new TeamDetailSection(this, conversation, parentElement,
-                                       null, style);
-                       break;
-               case TEAMMEMBER:
-                       section = new TeamMemberSection(this, conversation, parentElement,
-                                       style);
-                       break;
-               case ANNOTATION:
-                       section = new AnnotationSection(this, conversation, parentElement,
-                                       style);
-                       break;
-               case CREDIT:
-                       section = new CreditSection(this, conversation, parentElement,
-                                       style);
-                       break;
-               case DESCRIPTIONELEMENTSOURCE:
-                       section = new DescriptionElementSourceSection(this, conversation,
-                                       parentElement, style);
-                       break;
-               case EXTENSION:
-                       section = new ExtensionSection(this, conversation, parentElement,
-                                       style);
-                       break;
-               case MARKER:
-                       section = new MarkerSection(this, conversation, parentElement,
-                                       style);
-                       break;
-               case MEDIA:
-                       section = new MediaSection(this, conversation, parentElement, style);
-                       break;
-               case DESCRIPTIONELEMENTMEDIA:
-                       section = new DescriptionElementMediaSection(this, conversation,
-                                       parentElement, style);
-                       break;
-               case MEDIAREPRESENTATION:
-                       section = new MediaRepresentationSection(this, conversation,
-                                       parentElement, style);
-                       break;
-               case MEDIAREPRESENTATIONPART:
-                       section = new MediaRepresentationPartSection(this, conversation,
-                                       parentElement, style);
-                       break;
-               case MODIFIER:
-                       section = new ModifierSection(this, conversation, parentElement,
-                                       style);
-                       break;
-               case NOMENCLATURALSTATUS:
-                       section = new NomenclaturalStatusSection(this, conversation,
-                                       parentElement, style);
-                       break;
-               case NAME_RELATIONSHIP:
-                       section = new NameRelationshipDetailSection(this, conversation,
-                                       parentElement, style);
-                       break;
-               case PROTOLOG:
-                       section = new ProtologueSection(this, conversation, parentElement,
-                                       style);
-                       break;
-               case RIGHTS:
-                       section = new RightsSection(this, conversation, parentElement,
-                                       style);
-                       break;
-               case SOURCE:
-                       section = new SourceSection(this, conversation, parentElement,
-                                       style);
-                       break;
-               case SCOPE:
-                       section = new ScopeSection(this, conversation, parentElement, style);
-                       break;
-               case DESCRIPTIONSOURCE:
-                       section = new DescriptionSourceSection(this, conversation,
-                                       parentElement, style);
-                       break;
-               case TYPEDESIGNATION:
-                       section = new TypeDesignationSection(this, conversation,
-                                       parentElement, style);
-                       break;
-               case STATE_DATA:
-                       section = new StateDataSection(this, conversation, parentElement,
-                                       style);
-                       break;
-               case STATISTICAL_MEASUREMENT_VALUE:
-                       section = new StatisticalMeasurementValueSection(this,
-                                       conversation, parentElement, style);
-                       break;
-               case DESCRIBED_SPECIMEN:
-                       section = new DescribedSpecimenSection(this, conversation,
-                                       parentElement, style);
-                       break;
-               case COLLECTING_AREA:
-                       section = new CollectingAreasDetailSection(this, conversation,
-                                       parentElement, style);
-                       break;
-               case DETERMINATION_CURRENT:
-                       section = new CurrentDeterminationDetailSection(this, conversation,
-                                       parentElement, style);
-                       break;
-               case DETERMINATION_HISTORY:
-                       section = new DeterminationHistoryDetailSection(this, conversation,
-                                       parentElement, style);
-                       break;
-               case SPECIMEN_COLLECTION:
-                       section = new SpecimenCollectionDetailSection(this, conversation,
-                                       parentElement, style);
-                       break;
-               case IDENTIFIABLE_SOURCE_COLLECTION:
-                       section = new SourceCollectionDetailSection(this, conversation,
-                                       parentElement, style);
-                       break;
-               case GEOGRAPHICAL_SCOPE:
-                       section = new GeographicalScopeDetailSection(this, conversation,
-                                       parentElement, style);
-                       break;
-               case SCOPE_RESTRICTION:
-                       section = new ScopeRestrictionSection(this, conversation,
-                                       parentElement, style);
-                       break;
-               case MEMBER:
-                       section = new MemberDetailSection(this, conversation,
-                                       parentElement, style);
-                       break;
-               case GRANTED_AUTHORITY:
-                       section = new GrantedAuthorityDetailSection(this, conversation,
-                                       parentElement, style);
-                       break;
-               case GROUPS_BY_USER:
-                       section = new GroupsByUserDetailSection(this, conversation,
-                                       parentElement, style);
-                       break;
-               case TAXONOMIC_SCOPE:
-                       section = new TaxonomicScopeSection(this, conversation,
-                                       parentElement, style);
-                       break;
-               }
+       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>
-        * 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.
-        */
-       public AbstractEntityCollectionElement createEntityCollectionElement(
-                       AbstractFormSection parentElement, Object versionableEntity,
-                       SelectionListener removeListener, Color backgroundColor, int style) {
-               AbstractEntityCollectionElement element = null;
-
-               Object entity = HibernateProxyHelper.deproxy(versionableEntity);
-
-               if (entity instanceof Annotation) {
-                       element = new AnnotationElement(this, parentElement,
-                                       (Annotation) entity, removeListener, style);
-               } else if (entity instanceof Person) {
-                       element = new TeamMemberElement(this, parentElement,
-                                       (Person) entity, removeListener, style);
-               } else if (entity instanceof Credit) {
-                       element = new CreditElement(this, parentElement, (Credit) entity,
-                                       removeListener, style);
-               } else if (entity instanceof Extension) {
-                       element = new ExtensionElement(this, parentElement,
-                                       (Extension) entity, removeListener, style);
-               } else if (entity instanceof Marker) {
-                       element = new MarkerElement(this, parentElement, (Marker) entity,
-                                       removeListener, style);
-               } else if (entity instanceof Media) {
-                       element = new MediaElement(this, parentElement, (Media) entity,
-                                       removeListener, style);
-               } else if (entity instanceof MediaRepresentation) {
-                       element = new MediaRepresentationElement(this, parentElement,
-                                       (MediaRepresentation) entity, removeListener, style);
-               } else if (entity instanceof ImageFile) {
-                       element = new ImageFileElement(this, parentElement,
-                                       (ImageFile) entity, removeListener, style);
-               } else if (entity instanceof MediaRepresentationPart){
-                       element = new MediaRepresentationPartElement(this, parentElement,
-                                       (MediaRepresentationPart) entity, removeListener, style);
-               } else if (entity instanceof NomenclaturalStatus) {
-                       element = new NomenclaturalStatusElement(this, parentElement,
-                                       (NomenclaturalStatus) entity, removeListener, style);
-               } 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) {
-                       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) {
-                       element = new DescriptionSourceElement(this, parentElement,
-                                       (Reference) entity, removeListener, style);
-               } else if (entity instanceof NameTypeDesignation) {
-                       element = new NameTypeDesignationElement(this, parentElement,
-                                       (NameTypeDesignation) entity, removeListener, style);
-               } else if (entity instanceof NameRelationship) {
-                       element = new NameRelationshipDetailElement(this, parentElement,
-                                       (NameRelationship) entity, removeListener, style);
-               } else if (entity instanceof SpecimenTypeDesignation) {
-                       element = new SpecimenTypeDesignationElement(this, parentElement,
-                                       (SpecimenTypeDesignation) entity, removeListener, style);
-               } else if (entity instanceof StateData) {
-                       element = new StateDataElement(this, parentElement,
-                                       (StateData) entity, removeListener, style);
-               } 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) {
-                       element = new NamedAreaDetailElement(this, parentElement,
-                                       (NamedArea) entity, removeListener, style);
-               } else if (entity instanceof DeterminationEvent) {
-                       element = new DeterminationEventDetailElement(this, parentElement,
-                                       (DeterminationEvent) entity, removeListener, style);
-               } else if (entity instanceof Specimen) {
-                       element = new SpecimenCollectionDetailElement(this, parentElement,
-                                       (Specimen) entity, removeListener, style);
-               } else if (entity instanceof User) {
-                       element = new MemberDetailElement(this, parentElement,
-                                       (User) entity, removeListener, style);
-               } else if (entity instanceof GrantedAuthority) {
-                       element = new GrantedAuthorityCollectionElement(this, parentElement,
-                                       (GrantedAuthorityImpl) entity, removeListener, style);
-               } else if (entity instanceof Group) {
-                       element = new GroupsByUserDetailElement(this, parentElement,
-                                       (Group) entity, removeListener, style);
-               } 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())) {
-                               element = new ProtologueElement(this, parentElement,
-                                               descriptionElement, removeListener, style);
-                       }
-               }
-
-               if (element == null) {
-                       StoreUtil
-                                       .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);
-
-               }
-
-               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
-        *                        a {@link Class} object of the type that you want the selection element to handle
-        * @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.
-        * @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;
-       }
-
-       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;
-       }
-
-       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;
-       }
+    /**
+     * <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) {
+            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);
+    }
+
+    /**
+     * @return the propertyChangeListeners
+     */
+    public List<IPropertyChangeListener> getPropertyChangeListeners() {
+        return propertyChangeListeners;
+    }
+
+    /**
+     * <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.
+     */
+    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
+     */
+    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;
+    }
+
+    /**
+     * @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) {
+        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.
+     */
+    public ParsingMessageElement createParsingMessageElement(ICdmFormElement parentElement,
+            ParserProblem parserProblem, int style) {
+        ParsingMessageElement element = new ParsingMessageElement(this, parentElement, parserProblem, style);
+        adapt(element);
+        parentElement.addElement(element);
+        return element;
+    }
+
+    public AbstractFormSection createDefinedTermDetailSection(Class definedTermClass, ConversationHolder conversation,
+            ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style) {
+
+        AbstractFormSection section = new DefinedTermDetailSection(this, definedTermClass, conversation, parentElement,
+                selectionProvider, style);
+
+        parentElement.addElement(section);
+        adapt(section);
+        return section;
+
+    }
+
+    /**
+     * @param definedTermClass
+     * @param formElement
+     * @param style
+     * @return
+     */
+    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);
+        }
 
+        adapt(element);
+        parentElement.addElement(element);
+        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);
+        return section;
+    }
+
+    public ReferenceDetailSection createReferenceDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        ReferenceDetailSection section = new ReferenceDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public NomenclaturalReferenceDetailSection createNomenclaturalReferenceDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        NomenclaturalReferenceDetailSection section = new NomenclaturalReferenceDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public TaxonBaseDetailSection createTaxonBaseDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        TaxonBaseDetailSection section = new TaxonBaseDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public AuthorshipDetailSection createAuthorshipDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        AuthorshipDetailSection section = new AuthorshipDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public TeamOrPersonBaseDetailSection createTeamOrPersonBaseDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        TeamOrPersonBaseDetailSection section = new TeamOrPersonBaseDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public TeamDetailSection createTeamDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        TeamDetailSection section = new TeamDetailSection(this, conversation, parentElement, null, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public PersonDetailSection createPersonDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        PersonDetailSection section = new PersonDetailSection(this, conversation, parentElement, null, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public DescriptionDetailSection createDescriptionDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        DescriptionDetailSection section = new DescriptionDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public DescriptionElementDetailSection createDescriptionElementDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        DescriptionElementDetailSection section = new DescriptionElementDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public ParsingMessagesSection createParsingMessagesSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        ParsingMessagesSection section = new ParsingMessagesSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public NonViralNameDetailSection createNonViralNameDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        NonViralNameDetailSection section = new NonViralNameDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public MediaDetailsSection createMediaDetailsSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        MediaDetailsSection section = new MediaDetailsSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public DerivedUnitFacadeDetailSection createDerivedUnitFacadeDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        DerivedUnitFacadeDetailSection section = new DerivedUnitFacadeDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    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;
+    }
+
+    public GatheringEventDetailSection createGatheringEventDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        GatheringEventDetailSection section = new GatheringEventDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public DerivedUnitBaseDetailSection createDerivedUnitBaseDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        DerivedUnitBaseDetailSection section = new DerivedUnitBaseDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public NaturalLanguageSection createNaturalLanguageSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        NaturalLanguageSection section = new NaturalLanguageSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public FeatureDistributionDetailSection createFeatureDistributionDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        FeatureDistributionDetailSection section = new FeatureDistributionDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public ClassificationDetailSection createClassificationDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        ClassificationDetailSection section = new ClassificationDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public TaxonNodeDetailSection createTaxonNodeDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        TaxonNodeDetailSection section = new TaxonNodeDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public PolytomousKeyDetailSection createPolytomousKeyDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        PolytomousKeyDetailSection section = new PolytomousKeyDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public PolytomousKeyNodeDetailSection createPolytomousKeyNodeDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        PolytomousKeyNodeDetailSection section = new PolytomousKeyNodeDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public InstitutionDetailSection createInstitutionDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        InstitutionDetailSection section = new InstitutionDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public FieldUnitGeneralDetailSection createFieldUnitGeneralDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        FieldUnitGeneralDetailSection section = new FieldUnitGeneralDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public DerivedUnitGeneralDetailSection createDerivedUnitGeneralDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        DerivedUnitGeneralDetailSection section = new DerivedUnitGeneralDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public PreservedSpecimenGeneralDetailSection createPreservedSpecimenGeneralDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        PreservedSpecimenGeneralDetailSection section = new PreservedSpecimenGeneralDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public TissueSampleGeneralDetailSection createTissueSampleGeneralDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        TissueSampleGeneralDetailSection section = new TissueSampleGeneralDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public DnaSampleGeneralDetailSection createDnaSampleGeneralDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        DnaSampleGeneralDetailSection section = new DnaSampleGeneralDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public SequenceGeneralDetailSection createSequenceGeneralDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        SequenceGeneralDetailSection section = new SequenceGeneralDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public SequenceReferenceCollectionDetailSection createSequenceReferenceCollectionDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        SequenceReferenceCollectionDetailSection section = new SequenceReferenceCollectionDetailSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public SingleReadGeneralDetailSection createSingleReadGeneralDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        SingleReadGeneralDetailSection section = new SingleReadGeneralDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public AmplificationGeneralDetailSection createAmplificationGeneralDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        AmplificationGeneralDetailSection section = new AmplificationGeneralDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public SpecimenScanGeneralDetailSection createSpecimenScanGeneralDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        SpecimenScanGeneralDetailSection section = new SpecimenScanGeneralDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public LivingPlantPhotoGeneralDetailSection createLivingPlantPhotoGeneralDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        LivingPlantPhotoGeneralDetailSection section = new LivingPlantPhotoGeneralDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public ArtworkGeneralDetailSection createArtworkGeneralDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        ArtworkGeneralDetailSection section = new ArtworkGeneralDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public HybridDetailSection createHybridDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        HybridDetailSection section = new HybridDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public UserDetailSection createUserDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        UserDetailSection section = new UserDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public GroupDetailSection createGroupDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        GroupDetailSection section = new GroupDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public DeterminationDetailSection createDeterminationDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        DeterminationDetailSection section = new DeterminationDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public PreservedSpecimenDeterminationDetailSection createPreservedSpecimenDeterminationDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        PreservedSpecimenDeterminationDetailSection section = new PreservedSpecimenDeterminationDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public TaxonRelationshipDetailSection createTaxonRelationshipDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        TaxonRelationshipDetailSection section = new TaxonRelationshipDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public ReferencedEntityDetailSection createReferencedEntityDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        ReferencedEntityDetailSection section = new ReferencedEntityDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public TermVocabularyDetailSection createTermVocabularyDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        TermVocabularyDetailSection section = new TermVocabularyDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public GatheringEventDetailSection createGatheringSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        GatheringEventDetailSection section = new GatheringEventDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public NamedAreaDetailSection createNamedAreaDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        NamedAreaDetailSection section = new NamedAreaDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public UseRecordDetailSection createUseRecordDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
+        UseRecordDetailSection section = new UseRecordDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    private void addAndAdaptSection(ICdmFormElement parentElement, AbstractFormSection<?> section) {
+        parentElement.addElement(section);
+        adapt(section);
+    }
+
+    //--------DetailElements------------
+
+    public UseRecordDetailElement createUseRecordDetailElement(ICdmFormElement parentElement){
+        UseRecordDetailElement element = new UseRecordDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public DefinedTermDetailElement<NamedAreaLevel> createNamedAreaLevelElement(ICdmFormElement parentElement){
+        DefinedTermDetailElement<NamedAreaLevel> element = new DefinedTermDetailElement<NamedAreaLevel>(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public eu.etaxonomy.taxeditor.ui.section.vocabulary.NamedAreaDetailElement createNamedAreaDetailElement(ICdmFormElement parentElement){
+        eu.etaxonomy.taxeditor.ui.section.vocabulary.NamedAreaDetailElement element = new eu.etaxonomy.taxeditor.ui.section.vocabulary.NamedAreaDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public TermVocabularyDetailElement createTermVocabularyDetailElement(ICdmFormElement parentElement){
+        TermVocabularyDetailElement element = new TermVocabularyDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public ReferenceEntityDetailElement createReferenceEntityDetailElement(ICdmFormElement parentElement){
+        ReferenceEntityDetailElement element = new ReferenceEntityDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public TaxonRelationshipDetailElement createTaxonRelationshipDetailElement(ICdmFormElement parentElement){
+        TaxonRelationshipDetailElement element = new TaxonRelationshipDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public GrantedAuthorityDetailElement createGrantedAuthorityDetailElement(ICdmFormElement parentElement){
+        GrantedAuthorityDetailElement element = new GrantedAuthorityDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public GroupDetailElement createGroupDetailElement(ICdmFormElement parentElement){
+        GroupDetailElement element = new GroupDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public UserDetailElement createUserDetailElement(ICdmFormElement parentElement){
+        UserDetailElement element = new UserDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public HybridDetailElement createHybridDetailElement(ICdmFormElement parentElement){
+        HybridDetailElement element = new HybridDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public InstitutionDetailElement createInstitutionDetailElement(ICdmFormElement parentElement){
+        InstitutionDetailElement element = new InstitutionDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public PolytomousKeyNodeDetailElement createPolytomousKeyNodeDetailElement(ICdmFormElement parentElement){
+        PolytomousKeyNodeDetailElement element = new PolytomousKeyNodeDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public PolytomousKeyDetailElement createPolytomousKeyDetailElement(ICdmFormElement parentElement){
+        PolytomousKeyDetailElement element = new PolytomousKeyDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public CollectionDetailElement createCollectionDetailElement(ICdmFormElement parentElement){
+        CollectionDetailElement element = new CollectionDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public TaxonNodeDetailElement createTaxonNodeDetailElement(ICdmFormElement parentElement){
+        TaxonNodeDetailElement element = new TaxonNodeDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public ClassificationDetailElement createClassificationDetailElement(ICdmFormElement parentElement){
+        ClassificationDetailElement element = new ClassificationDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public FeatureDistributionDetailElement createFeatureDistributionDetailElement(ICdmFormElement parentElement){
+        FeatureDistributionDetailElement element = new FeatureDistributionDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public NaturalLanguageDetailElement createNaturalLanguageDetailElement(ICdmFormElement parentElement){
+        NaturalLanguageDetailElement element = new NaturalLanguageDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public DerivedUnitFacadeDetailElement createDerivedUnitFacadeDetailElement(ICdmFormElement parentElement){
+        DerivedUnitFacadeDetailElement element = new DerivedUnitFacadeDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public NonViralNameDetailElement createNonViralNameDetailElement(ICdmFormElement parentElement){
+        NonViralNameDetailElement element = new NonViralNameDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public DescriptionElementDetailElement createDescriptionElementDetailElement(ICdmFormElement parentElement, int style){
+        DescriptionElementDetailElement element = new DescriptionElementDetailElement(this, parentElement, style);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public DescriptionDetailElement createDescriptionDetailElement(ICdmFormElement parentElement, int style){
+        DescriptionDetailElement element = new DescriptionDetailElement(this, parentElement, style);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public PersonDetailElement createPersonDetailElement(ICdmFormElement parentElement, int style){
+        PersonDetailElement element = new PersonDetailElement(this, parentElement, style);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public TeamDetailElement createTeamDetailElement(ICdmFormElement parentElement, int style){
+        TeamDetailElement element = new TeamDetailElement(this, parentElement, style);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public AuthorshipDetailElement createAuthorshipDetailElement(ICdmFormElement parentElement, int style){
+        AuthorshipDetailElement element = new AuthorshipDetailElement(this, parentElement, style);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public TaxonBaseDetailElement createTaxonBaseDetailElement(ICdmFormElement parentElement, int style){
+        TaxonBaseDetailElement element = new TaxonBaseDetailElement(this, parentElement, style);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public NameDetailElement createNameDetailElement(ICdmFormElement parentElement, int style){
+        NameDetailElement element = new NameDetailElement(this, parentElement, style);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public ReferenceDetailElement createReferenceDetailElement(ICdmFormElement parentElement, int style){
+        ReferenceDetailElement element = new ReferenceDetailElement(this, parentElement, style);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public NomenclaturalReferenceDetailElement createNomenclaturalReferenceDetailElement(ICdmFormElement parentElement, int style){
+        NomenclaturalReferenceDetailElement element = new NomenclaturalReferenceDetailElement(this, parentElement, style);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+
+    public FieldUnitGeneralDetailElement createFieldUnitGeneralDetailElement(ICdmFormElement parentElement){
+        FieldUnitGeneralDetailElement element = new FieldUnitGeneralDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public DerivedUnitGeneralDetailElement createDerivedUnitGeneralDetailElement(ICdmFormElement parentElement){
+        DerivedUnitGeneralDetailElement element = new DerivedUnitGeneralDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public PreservedSpecimenGeneralDetailElement createPreservedSpecimenGeneralDetailElement(ICdmFormElement parentElement){
+        PreservedSpecimenGeneralDetailElement element = new PreservedSpecimenGeneralDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public TissueSampleGeneralDetailElement createTissueSampleGeneralDetailElement(ICdmFormElement parentElement){
+        TissueSampleGeneralDetailElement element = new TissueSampleGeneralDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public DnaSampleGeneralDetailElement createDnaSampleGeneralDetailElement(ICdmFormElement parentElement){
+        DnaSampleGeneralDetailElement element = new DnaSampleGeneralDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public SequenceGeneralDetailElement createSequenceGeneralDetailElement(ICdmFormElement parentElement){
+        SequenceGeneralDetailElement element = new SequenceGeneralDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public SingleReadGeneralDetailElement createSingleReadGeneralDetailElement(ICdmFormElement parentElement){
+        SingleReadGeneralDetailElement element = new SingleReadGeneralDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public AmplificationGeneralDetailElement createAmplificationGeneralDetailElement(ICdmFormElement parentElement){
+        AmplificationGeneralDetailElement element = new AmplificationGeneralDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public SpecimenScanGeneralDetailElement createSpecimenScanGeneralDetailElement(ICdmFormElement parentElement){
+        SpecimenScanGeneralDetailElement element = new SpecimenScanGeneralDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public LivingPlantPhotoGeneralDetailElement createLivingPlantPhotoGeneralDetailElement(ICdmFormElement parentElement){
+        LivingPlantPhotoGeneralDetailElement element = new LivingPlantPhotoGeneralDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public ArtworkGeneralDetailElement createArtworkGeneralDetailElement(ICdmFormElement parentElement){
+        ArtworkGeneralDetailElement element = new ArtworkGeneralDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+
+    public GatheringEventDetailElement createGatheringEventDetailElement(ICdmFormElement parentElement) {
+        GatheringEventDetailElement element = new GatheringEventDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    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;
+    }
+
+    public PreservedSpecimenDetailElement createPreservedSpecimenDetailElement(ICdmFormElement parentElement) {
+        PreservedSpecimenDetailElement element = new PreservedSpecimenDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public PreservedSpecimenDeterminationDetailElement createPreservedSpecimenDeterminationDetailElement(ICdmFormElement parentElement) {
+        PreservedSpecimenDeterminationDetailElement element = new PreservedSpecimenDeterminationDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    public DeterminationDetailElement createDeterminationDetailElement(ICdmFormElement parentElement) {
+        DeterminationDetailElement element = new DeterminationDetailElement(this, parentElement);
+        addAndAdaptElement(parentElement, element);
+        return element;
+    }
+
+    /**
+     * @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);
+        return section;
+    }
+
+    public AnnotationSection createAnnotationSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        AnnotationSection section = new AnnotationSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public CreditSection createCreditSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        CreditSection section = new CreditSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public DescriptionElementSourceSection createDescriptionElementSourceSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        DescriptionElementSourceSection section = new DescriptionElementSourceSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public ExtensionSection createExtensionSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        ExtensionSection section = new ExtensionSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public MarkerSection createMarkerSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        MarkerSection section = new MarkerSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public MediaSection createMediaSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        MediaSection section = new MediaSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public DescriptionElementMediaSection createDescriptionElementMediaSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        DescriptionElementMediaSection section = new DescriptionElementMediaSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public MediaRepresentationSection createMediaRepresentationSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        MediaRepresentationSection section = new MediaRepresentationSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public MediaRepresentationPartSection createMediaRepresentationPartSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        MediaRepresentationPartSection section = new MediaRepresentationPartSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public ModifierSection createModifierSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        ModifierSection section = new ModifierSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public NomenclaturalStatusSection createNomenclaturalStatusSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        NomenclaturalStatusSection section = new NomenclaturalStatusSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public NameRelationshipDetailSection createNameRelationshipDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        NameRelationshipDetailSection section = new NameRelationshipDetailSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public ProtologueSection createProtologueSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        ProtologueSection section = new ProtologueSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public RightsSection createRightsSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        RightsSection section = new RightsSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public SourceSection createSourceSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        SourceSection section = new SourceSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public ScopeSection createScopeSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        ScopeSection section = new ScopeSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public DescriptionSourceSection createDescriptionSourceSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        DescriptionSourceSection section = new DescriptionSourceSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public TypeDesignationSection createTypeDesignationSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        TypeDesignationSection section = new TypeDesignationSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public StateDataSection createStateDataSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        StateDataSection section = new StateDataSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public StatisticalMeasurementValueSection createStatisticalMeasurementValueSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        StatisticalMeasurementValueSection section = new StatisticalMeasurementValueSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public DescribedSpecimenSection createDescribedSpecimenSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        DescribedSpecimenSection section = new DescribedSpecimenSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public CollectingAreasDetailSection createCollectingAreasDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        CollectingAreasDetailSection section = new CollectingAreasDetailSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public CurrentDeterminationDetailSection createCurrentDeterminationDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        CurrentDeterminationDetailSection section = new CurrentDeterminationDetailSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public PreservedSpecimenCurrentDeterminationDetailSection createPreservedSpecimenCurrentDeterminationDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        PreservedSpecimenCurrentDeterminationDetailSection section = new PreservedSpecimenCurrentDeterminationDetailSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public DeterminationHistoryDetailSection createDeterminationHistoryDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        DeterminationHistoryDetailSection section = new DeterminationHistoryDetailSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public PreservedSpecimenDeterminationHistoryDetailSection createPreservedSpecimenDeterminationHistoryDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        PreservedSpecimenDeterminationHistoryDetailSection section = new PreservedSpecimenDeterminationHistoryDetailSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public SpecimenCollectionDetailSection createSpecimenCollectionDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        SpecimenCollectionDetailSection section = new SpecimenCollectionDetailSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public PreservedSpecimenSourceCollectionDetailSection createPreservedSpecimenSourceCollectionDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        PreservedSpecimenSourceCollectionDetailSection section = new PreservedSpecimenSourceCollectionDetailSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public SourceCollectionDetailSection createSourceCollectionDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        SourceCollectionDetailSection section = new SourceCollectionDetailSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public GeographicalScopeDetailSection createGeographicalScopeDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        GeographicalScopeDetailSection section = new GeographicalScopeDetailSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public ScopeRestrictionSection createScopeRestrictionSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        ScopeRestrictionSection section = new ScopeRestrictionSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public MemberDetailSection createMemberDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        MemberDetailSection section = new MemberDetailSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public GrantedAuthorityDetailSection createGrantedAuthorityDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        GrantedAuthorityDetailSection section = new GrantedAuthorityDetailSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public GroupsByUserDetailSection createGroupsByUserDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        GroupsByUserDetailSection section = new GroupsByUserDetailSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public TaxonomicScopeSection createTaxonomicScopeSection(ConversationHolder conversation, ICdmFormElement parentElement, int style){
+        TaxonomicScopeSection section = new TaxonomicScopeSection(this, conversation, parentElement, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    /**
+     * <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.
+     */
+    public AbstractEntityCollectionElement createEntityCollectionElement(AbstractFormSection parentElement,
+            Object versionableEntity, SelectionListener removeListener, Color backgroundColor, int style) {
+        AbstractEntityCollectionElement element = null;
+
+        Object entity = HibernateProxyHelper.deproxy(versionableEntity);
+
+        if (entity instanceof Annotation) {
+            element = new AnnotationElement(this, parentElement, (Annotation) entity, removeListener, style);
+        } else if (entity instanceof Person) {
+            element = new TeamMemberElement(this, parentElement, (Person) entity, removeListener, style);
+        } else if (entity instanceof Credit) {
+            element = new CreditElement(this, parentElement, (Credit) entity, removeListener, style);
+        } else if (entity instanceof Extension) {
+            element = new ExtensionElement(this, parentElement, (Extension) entity, removeListener, style);
+        } else if (entity instanceof Marker) {
+            element = new MarkerElement(this, parentElement, (Marker) entity, removeListener, style);
+        } else if (entity instanceof Media) {
+            element = new MediaElement(this, parentElement, (Media) entity, removeListener, style);
+        } else if (entity instanceof MediaRepresentation) {
+            element = new MediaRepresentationElement(this, parentElement, (MediaRepresentation) entity, removeListener,
+                    style);
+        } else if (entity instanceof ImageFile) {
+            element = new ImageFileElement(this, parentElement, (ImageFile) entity, removeListener, style);
+        } else if (entity instanceof MediaRepresentationPart) {
+            element = new MediaRepresentationPartElement(this, parentElement, (MediaRepresentationPart) entity,
+                    removeListener, style);
+        } else if (entity instanceof NomenclaturalStatus) {
+            element = new NomenclaturalStatusElement(this, parentElement, (NomenclaturalStatus) entity, removeListener,
+                    style);
+        } 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) {
+            element = new IdentifiableSourceElement(this, parentElement, (IdentifiableSource) entity, removeListener,
+                    style);
+               } else if (entity instanceof DefinedTerm) {
+                       switch(((DefinedTerm)entity).getTermType()) {
+                               case Scope:
+                                       element = new ScopeElement(this,
+                                                       parentElement,
+                                                       (DefinedTerm) entity,
+                                                       removeListener,
+                                                       style);
+                                       break;
+                               case Modifier:
+                                       element = new ModifierElement(this,
+                                                       parentElement,
+                                                       (DefinedTerm) entity,
+                                                       removeListener,
+                                                       style);
+                                       break;
+                               default:
+                                       //FIXME : Actually we should through an exception here
+                                       element = null;
+                                       break;
 
-       /** {@inheritDoc} */
-       public LabelElement createLabel(ICdmFormElement parentElement, String text) {
-               LabelElement labelElement = new LabelElement(this, parentElement, text);
-               adapt(labelElement);
-               parentElement.addElement(labelElement);
-               return labelElement;
-       }
+                       }
+        } else if (entity instanceof Reference) {
+            element = new DescriptionSourceElement(this, parentElement, (Reference) entity, removeListener, style);
+        } else if (entity instanceof NameTypeDesignation) {
+            element = new NameTypeDesignationElement(this, parentElement, (NameTypeDesignation) entity, removeListener,
+                    style);
+        } else if (entity instanceof NameRelationship) {
+            element = new NameRelationshipDetailElement(this, parentElement, (NameRelationship) entity, removeListener,
+                    style);
+        } else if (entity instanceof SpecimenTypeDesignation) {
+            element = new SpecimenTypeDesignationElement(this, parentElement, (SpecimenTypeDesignation) entity,
+                    removeListener, style);
+        } else if (entity instanceof StateData) {
+            element = new StateDataElement(this, parentElement, (StateData) entity, removeListener, style);
+        } else if (entity instanceof StatisticalMeasurementValue) {
+            element = new StatisticalMeasurementValueElement(this, parentElement, (StatisticalMeasurementValue) entity,
+                    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);
+                       }
 
-       /**
-        * <p>
-        * Getter for the field <code>selectionProvider</code>.
-        * </p>
-        *
-        * @return a {@link org.eclipse.jface.viewers.ISelectionProvider} object.
-        */
-       public ISelectionProvider getSelectionProvider() {
-               return selectionProvider;
-       }
+        } else if (entity instanceof NamedArea) {
+            element = new NamedAreaDetailElement(this, parentElement, (NamedArea) entity, removeListener, style);
+        } else if (entity instanceof DeterminationEvent) {
+            element = new DeterminationEventDetailElement(this, parentElement, (DeterminationEvent) entity, removeListener, style);
+        } else if (entity instanceof User) {
+            element = new MemberDetailElement(this, parentElement, (User) entity, removeListener, style);
+        } else if (entity instanceof GrantedAuthority) {
+            element = new GrantedAuthorityCollectionElement(this, parentElement, (GrantedAuthorityImpl) entity,
+                    removeListener, style);
+        } else if (entity instanceof Group) {
+            element = new GroupsByUserDetailElement(this, parentElement, (Group) entity, removeListener, style);
+        } 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())) {
+                element = new ProtologueElement(this, parentElement, descriptionElement, removeListener, style);
+            }
+        } else if (entity instanceof Sequence) {
+            element = new SequenceReferenceCollectionDetailElement(this, parentElement, (Sequence) entity, removeListener, style);
+        }
 
-       /**
-        * <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;
-
-               if (entity instanceof CategoricalData) {
-                       detailedDescriptionElement = new CategoricalDataDetailElement(this,
-                                       parentElement, (CategoricalData) entity, style);
-               } else if (entity instanceof CommonTaxonName) {
-                       detailedDescriptionElement = new CommonNameDetailElement(this,
-                                       parentElement, (CommonTaxonName) entity, style);
-               } else if (entity instanceof Distribution) {
-                       detailedDescriptionElement = new DistributionDetailElement(this,
-                                       parentElement, (Distribution) entity, style);
-               } else if (entity instanceof IndividualsAssociation) {
-                       detailedDescriptionElement = new IndividualsAssociationDetailElement(
-                                       this, parentElement, (IndividualsAssociation) entity, style);
-               } else if (entity instanceof QuantitativeData) {
-                       detailedDescriptionElement = new QuantitativeDataDetailElement(
-                                       this, parentElement, (QuantitativeData) entity, style);
-               } else if (entity instanceof TaxonInteraction) {
-                       detailedDescriptionElement = new TaxonInteractionDetailElement(
-                                       this, parentElement, (TaxonInteraction) entity, style);
-               } else if (entity instanceof TextData) {
-                       detailedDescriptionElement = new TextDataDetailElement(this,
-                                       parentElement, (TextData) entity, style);
-               } else {
-                       throw new IllegalStateException(
-                                       "There is no interface for the given description element");
-               }
-               adapt(detailedDescriptionElement);
-               parentElement.addElement(detailedDescriptionElement);
-               return detailedDescriptionElement;
+        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);
+        }
 
-       }
+        else if (backgroundColor != null && !backgroundColor.isDisposed()) {
+            element.setPersistentBackground(backgroundColor);
+            adapt(element);
+            parentElement.addElement(element);
+        }
 
-       /**
-        * 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) {
+        return element;
+    }
+
+    public void createNamedAreaFieldController(AbstractFormSection parentElement, NamedArea namedArea, SelectionListener removeListener){
+//        Object entity = HibernateProxyHelper.deproxy(versionableEntity); TODO deproxy necessary??
+        NamedAreaFieldController element = new NamedAreaFieldController(this, parentElement, namedArea, removeListener, SWT.NONE);
+        adapt(element);
+        parentElement.addElement(element);
+    }
+
+    /**
+     * <p>
+     * Creates a selection element for the given type T.
+     * </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
+     *            a {@link Class} object of the type that you want the selection
+     *            element to handle
+     * @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.
+     * @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;
+    }
+
+    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;
+    }
+
+    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(
+            ICdmFormElement parentElement, DescriptionElementBase entity, int style) {
+        AbstractDetailedDescriptionDetailElement detailedDescriptionElement = null;
+
+        if (entity instanceof CategoricalData) {
+            detailedDescriptionElement = new CategoricalDataDetailElement(this, parentElement,
+                    (CategoricalData) entity, style);
+        } else if (entity instanceof CommonTaxonName) {
+            detailedDescriptionElement = new CommonNameDetailElement(this, parentElement, (CommonTaxonName) entity,
+                    style);
+        } else if (entity instanceof Distribution) {
+            detailedDescriptionElement = new DistributionDetailElement(this, parentElement, (Distribution) entity,
+                    style);
+        } else if (entity instanceof IndividualsAssociation) {
+            detailedDescriptionElement = new IndividualsAssociationDetailElement(this, parentElement,
+                    (IndividualsAssociation) entity, style);
+        } else if (entity instanceof QuantitativeData) {
+            detailedDescriptionElement = new QuantitativeDataDetailElement(this, parentElement,
+                    (QuantitativeData) entity, style);
+        } else if (entity instanceof TaxonInteraction) {
+            detailedDescriptionElement = new TaxonInteractionDetailElement(this, parentElement,
+                    (TaxonInteraction) entity, style);
+        } else if (entity instanceof TextData) {
+            detailedDescriptionElement = new TextDataDetailElement(this, parentElement, (TextData) entity, style);
+        } else {
+            throw new IllegalStateException("There is no interface for the given description element");
+        }
+        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) {
+        StyledText text = new StyledText(parent, getBorderStyle() | style | getOrientation());
+        if (value != null) {
             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;
+    }
+
+
+
+    /**
+     * @param conversationHolder
+     * @param parent
+     * @param detailsViewer
+     * @param i
+     * @return
+     */
+    public FieldObservationGeneralSection createFieldObservationGeneralSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style) {
+        FieldObservationGeneralSection section = new FieldObservationGeneralSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+    /**
+     * @param conversationHolder
+     * @param parent
+     * @param detailsViewer
+     * @param i
+     * @return
+     */
+    public GatheringEventSection createGatheringEventSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style) {
+        GatheringEventSection section = new GatheringEventSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+    /**
+     * @param conversationHolder
+     * @param parent
+     * @param detailsViewer
+     * @param i
+     * @return
+     */
+    public FieldObservationDetailsSection createFieldObservationDetailsSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style) {
+        FieldObservationDetailsSection section = new FieldObservationDetailsSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public SpecimenGeneralSection createSpecimenSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style) {
+        SpecimenGeneralSection section = new SpecimenGeneralSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public PreservedSpecimenDetailSection createPreservedSpecimenDetailsSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style) {
+        PreservedSpecimenDetailSection section = new PreservedSpecimenDetailSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public DerivedUnitDetailsSection createDerivedUnitDetailsSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style) {
+        DerivedUnitDetailsSection section = new DerivedUnitDetailsSection(this, conversation, parentElement, selectionProvider, style);
+        addAndAdaptSection(parentElement, section);
+        return section;
+    }
+
+    public FieldObservationGeneralElementController createSpecimenGeneralElementController(ICdmFormElement parentElement){
+        return createFieldObservationGeneralElementController_internal(parentElement, true, false);
+    }
+
+    public SpecimenDetailsElementController createSpecimenDetailsElementController(ICdmFormElement parentElement){
+        SpecimenDetailsElement element = new SpecimenDetailsElement(parentElement.getLayoutComposite(), SWT.NONE);
+        element.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2,1));
+        SpecimenDetailsElementController controller = new SpecimenDetailsElementController(element, this, parentElement);
+        addAndAdaptElement(parentElement, controller);
+        return controller;
+    }
+
+    public DerivedUnitDetailsElementController createDerivedUnitDetailsElementController(ICdmFormElement parentElement){
+        DerivedUnitDetailsElement element = new DerivedUnitDetailsElement(parentElement.getLayoutComposite(), SWT.NONE);
+        element.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2,1));
+        DerivedUnitDetailsElementController controller = new DerivedUnitDetailsElementController(element, this, parentElement);
+        addAndAdaptElement(parentElement, controller);
+        return controller;
+    }
+
+    public FieldObservationGeneralElementController createSpecimenGeneralElementControllerWizard(ICdmFormElement parentElement){
+        return createFieldObservationGeneralElementController_internal(parentElement, true, true);
+    }
+
+    public FieldObservationGeneralElementController createFieldObservationGeneralElementControllerWizard(ICdmFormElement parentElement){
+        return createFieldObservationGeneralElementController_internal(parentElement, false, true);
+    }
+
+    public FieldObservationGeneralElementController createFieldObservationGeneralElementController(ICdmFormElement parentElement){
+        return createFieldObservationGeneralElementController_internal(parentElement, false, false);
+    }
+
+    private FieldObservationGeneralElementController createFieldObservationGeneralElementController_internal(ICdmFormElement parentElement, boolean isSpecimen, boolean isWizard){
+        FieldObservationGeneralElement element = new FieldObservationGeneralElement(parentElement.getLayoutComposite(), SWT.NONE);
+        element.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2,1));
+        FieldObservationGeneralElementController controller = new FieldObservationGeneralElementController(element, this, parentElement, isSpecimen, isWizard);
+        addAndAdaptElement(parentElement, controller);
+        return controller;
+    }
+
+    public GatheringEventDetailsElementController createGatheringEventDetailsElementController(ICdmFormElement parentElement) {
+        GatheringEventDetailsElement element = new GatheringEventDetailsElement(parentElement.getLayoutComposite(), SWT.NONE);
+        element.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2,1));
+        GatheringEventDetailsElementController controller = new GatheringEventDetailsElementController(element, this, parentElement);
+        adapt(controller);
+        parentElement.addElement(controller);
+        return controller;
+    }
+
+    public FieldObservationDetailsElementController createFieldObservationDetailsElementController(ICdmFormElement parentElement) {
+        FieldObservationDetailsElement element = new FieldObservationDetailsElement(parentElement.getLayoutComposite(), SWT.NONE);
+        element.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2,1));
+        FieldObservationDetailsElementController controller = new FieldObservationDetailsElementController(element, this, parentElement);
+        addAndAdaptElement(parentElement, controller);
+        return controller;
+    }
 
 }