Refactored description editor per #577
[taxeditor.git] / eclipseprojects / eu.etaxonomy.taxeditor / src / eu / etaxonomy / taxeditor / editor / FreeTextElementFactory.java
index a9ca3cd9ce9197d4f0d073e61cfd366bbb6653cd..a56efd23c20028a853f5e31d39e0fd830a88a297 100644 (file)
@@ -17,11 +17,18 @@ import org.eclipse.core.runtime.Assert;
 import org.eclipse.swt.widgets.Composite;\r
 import org.eclipse.ui.forms.IManagedForm;\r
 \r
+import eu.etaxonomy.cdm.model.description.DescriptionElementBase;\r
+import eu.etaxonomy.cdm.model.description.Feature;\r
+import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
 import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
 import eu.etaxonomy.cdm.model.taxon.Synonym;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;\r
 import eu.etaxonomy.taxeditor.controller.EditorController;\r
+import eu.etaxonomy.taxeditor.editor.description.DescriptionElementComposite;\r
+import eu.etaxonomy.taxeditor.editor.description.DescriptionFeatureGroupComposite;\r
+import eu.etaxonomy.taxeditor.editor.description.DescriptionGroupComposite;\r
+import eu.etaxonomy.taxeditor.editor.description.DescriptionLabelComposite;\r
 import eu.etaxonomy.taxeditor.editor.name.AcceptedNameComposite;\r
 import eu.etaxonomy.taxeditor.editor.name.ConceptComposite;\r
 import eu.etaxonomy.taxeditor.editor.name.ConceptGroupComposite;\r
@@ -42,12 +49,7 @@ public class FreeTextElementFactory implements IFreeTextElementFactory {
        private static IFreeTextElementFactory factory;\r
        \r
        private Map<Taxon, IManagedForm> nameForms;\r
-       \r
-\r
-       /**\r
-        * Returns a taxon's composite which holds all misapplied names.\r
-        */\r
-       private Map<Taxon, Composite> misappliedComposites;\r
+       private Map<Taxon, IManagedForm> descriptionForms;\r
        \r
        public static IFreeTextElementFactory getDefault() {\r
                if (factory == null) {\r
@@ -60,7 +62,7 @@ public class FreeTextElementFactory implements IFreeTextElementFactory {
                \r
                // Put the taxon's form in the form map\r
                Assert.isNotNull(form, "A non-null IManagedForm must be provided.");\r
-               getTaxonForms().put(taxon, form);\r
+               getTaxonNameForms().put(taxon, form);\r
                \r
                // Create a homotypic group composite for the accepted taxon\r
                HomotypicalGroup group = taxon.getHomotypicGroup();\r
@@ -70,7 +72,6 @@ public class FreeTextElementFactory implements IFreeTextElementFactory {
                // Create a name composite for the accepted taxon\r
                Composite acceptedNameComposite =\r
                                new AcceptedNameComposite(groupComposite, form, taxon);\r
-               \r
        \r
                // Return the name composite\r
                return acceptedNameComposite;\r
@@ -79,7 +80,7 @@ public class FreeTextElementFactory implements IFreeTextElementFactory {
        public Composite createSynonym(Taxon taxon, Synonym synonym) {\r
                \r
                // Get the taxon's form\r
-               IManagedForm form = getForm(taxon);\r
+               IManagedForm form = getNameForm(taxon);\r
                Assert.isNotNull(form, "No IManagedForm has been provided for the synonym's accepted taxon.");\r
                \r
                // Get the synonym's homotypic group\r
@@ -88,7 +89,7 @@ public class FreeTextElementFactory implements IFreeTextElementFactory {
                \r
                // If the group doesn't yet have a composite, create one and add it to the repository\r
                Composite groupComposite = \r
-                               EditorController.getEditor(taxon).getHomotypicGroup(group);\r
+                               EditorController.getNameEditor(taxon).getHomotypicGroup(group);\r
                if (groupComposite == null) {\r
                        groupComposite = createHomotypicalGroup(taxon, group);\r
                }\r
@@ -104,13 +105,13 @@ public class FreeTextElementFactory implements IFreeTextElementFactory {
        public Composite createMisappliedName(Taxon taxon, Taxon misappliedName) {\r
 \r
                // Get the taxon's form\r
-               IManagedForm form = getForm(taxon);\r
+               IManagedForm form = getNameForm(taxon);\r
                Assert.isNotNull(form, "No IManagedForm has been provided for the synonym's accepted taxon.");\r
                                \r
                // If there is no composite for misapplied names, \r
                //      create one and add it to the repository\r
                Composite groupComposite = \r
-                               EditorController.getEditor(taxon).getMisappliedGroup();\r
+                               EditorController.getNameEditor(taxon).getMisappliedGroup();\r
                if (groupComposite == null) {\r
                        groupComposite = createMisappliedGroup(taxon);\r
                }\r
@@ -126,7 +127,8 @@ public class FreeTextElementFactory implements IFreeTextElementFactory {
        public Composite createMisappliedGroup(Taxon taxon) {\r
                \r
                // Get the taxon's form\r
-               IManagedForm form = getForm(taxon);\r
+               IManagedForm form = getNameForm(taxon);\r
+               Assert.isNotNull(form, "No IManagedForm has been provided for the misapplied group's accepted taxon.");\r
 \r
                // Create the group composite\r
                Composite groupComposite = new MisappliedGroupComposite(getTopLevelComposite(form), taxon);\r
@@ -134,7 +136,7 @@ public class FreeTextElementFactory implements IFreeTextElementFactory {
                \r
                // Put the group composite before concept group composite, if any\r
                Composite conceptGroupComposite = \r
-                       EditorController.getEditor(taxon).getConceptGroup();\r
+                       EditorController.getNameEditor(taxon).getConceptGroup();\r
                if (conceptGroupComposite != null) {\r
                        groupComposite.moveAbove(conceptGroupComposite);\r
                }\r
@@ -145,7 +147,8 @@ public class FreeTextElementFactory implements IFreeTextElementFactory {
        public Composite createHomotypicalGroup(Taxon taxon, HomotypicalGroup group) {\r
 \r
                // Get the taxon's form\r
-               IManagedForm form = getForm(taxon);\r
+               IManagedForm form = getNameForm(taxon);\r
+               Assert.isNotNull(form, "No IManagedForm has been provided for the homotypical group's accepted taxon.");\r
 \r
                // Create the group composite\r
                Composite groupComposite = new HomotypicalGroupComposite(getTopLevelComposite(form), taxon, group);\r
@@ -154,15 +157,15 @@ public class FreeTextElementFactory implements IFreeTextElementFactory {
                return groupComposite;\r
        }\r
 \r
-       private Map<Taxon, IManagedForm> getTaxonForms() {\r
+       private Map<Taxon, IManagedForm> getTaxonNameForms() {\r
                if (nameForms == null) {\r
                        nameForms = new HashMap<Taxon, IManagedForm>();\r
                }\r
                return nameForms;\r
        }\r
        \r
-       private IManagedForm getForm(Taxon taxon) {\r
-               return getTaxonForms().get(taxon);\r
+       private IManagedForm getNameForm(Taxon taxon) {\r
+               return getTaxonNameForms().get(taxon);\r
        }\r
                \r
        private Composite getTopLevelComposite(IManagedForm form) {\r
@@ -172,13 +175,13 @@ public class FreeTextElementFactory implements IFreeTextElementFactory {
        @Override\r
        public Composite createConcept(Taxon taxon, TaxonRelationship relationship) {\r
                // Get the taxon's form\r
-               IManagedForm form = getForm(taxon);\r
+               IManagedForm form = getNameForm(taxon);\r
                Assert.isNotNull(form, "No IManagedForm has been provided for the synonym's accepted taxon.");\r
                                \r
                // If there is no composite for misapplied names, \r
                //      create one and add it to the repository\r
                Composite groupComposite = \r
-                               EditorController.getEditor(taxon).getConceptGroup();\r
+                               EditorController.getNameEditor(taxon).getConceptGroup();\r
                if (groupComposite == null) {\r
                        groupComposite = createConceptGroup(taxon);\r
                }\r
@@ -194,7 +197,8 @@ public class FreeTextElementFactory implements IFreeTextElementFactory {
        public Composite createConceptGroup(Taxon taxon) {\r
                \r
                // Get the taxon's form\r
-               IManagedForm form = getForm(taxon);\r
+               IManagedForm form = getNameForm(taxon);\r
+               Assert.isNotNull(form, "No IManagedForm has been provided for the concept group's accepted taxon.");\r
 \r
                // Create the group composite\r
                Composite groupComposite = new ConceptGroupComposite(getTopLevelComposite(form), taxon);\r
@@ -202,7 +206,7 @@ public class FreeTextElementFactory implements IFreeTextElementFactory {
                \r
                // Put the group composite after misapplied group composite, if any\r
                Composite misappliedGroupComposite = \r
-                       EditorController.getEditor(taxon).getMisappliedGroup();\r
+                       EditorController.getNameEditor(taxon).getMisappliedGroup();\r
                if (misappliedGroupComposite != null) {\r
                        groupComposite.moveBelow(misappliedGroupComposite);\r
                }\r
@@ -210,4 +214,99 @@ public class FreeTextElementFactory implements IFreeTextElementFactory {
                return groupComposite;\r
 \r
        }\r
+\r
+       @Override\r
+       public Composite createDescriptionLabel(IManagedForm form, Taxon taxon,\r
+                       TaxonDescription description) {\r
+               \r
+               // Put the taxon's form in the form map if no other description has done so\r
+               Assert.isNotNull(form, "A non-null IManagedForm must be provided.");\r
+               getTaxonDescriptionForms().put(taxon, form);\r
+               \r
+               // Create a group composite for the description\r
+               Composite groupComposite = createDescriptionGroup(taxon, description);\r
+                               \r
+               // Create label composite\r
+               Composite labelComposite =\r
+                               new DescriptionLabelComposite(groupComposite, form, description);\r
+       \r
+               // Return the label composite\r
+               return labelComposite;\r
+       }\r
+\r
+       @Override\r
+       public Composite createDescriptionElement(Taxon taxon, TaxonDescription description,\r
+                       DescriptionElementBase element) {\r
+               \r
+               // Get the taxon's form\r
+               IManagedForm form = getDescriptionForm(taxon);\r
+               Assert.isNotNull(form, "No IManagedForm has been provided for the element's taxon.");\r
+\r
+               // Get the element's feature\r
+               Feature feature = element.getFeature();\r
+               Assert.isNotNull(feature, "Element does not have a feature.");\r
+                                                       \r
+               // If the feature doesn't yet have a composite, create one and add it to the repository\r
+               Composite groupComposite = EditorController.getDescriptionEditor(taxon)\r
+                                                                               .getDescriptionFeatureGroup(description, feature);\r
+               if (groupComposite == null) {\r
+                       groupComposite = createDescriptionFeatureGroup(taxon, description, feature);\r
+               }\r
+                               \r
+               // Create an element composite in the feature group\r
+               Composite elementComposite = \r
+                               new DescriptionElementComposite(groupComposite, form, element);\r
+                               \r
+               return elementComposite;\r
+       }\r
+\r
+       @Override\r
+       public Composite createDescriptionGroup(Taxon taxon,\r
+                       TaxonDescription description) {\r
+               \r
+               // Get the taxon's form\r
+               IManagedForm form = getDescriptionForm(taxon);\r
+               Assert.isNotNull(form, "No IManagedForm has been provided for the description's taxon.");\r
+\r
+               // Create the group composite\r
+               GroupComposite groupComposite = new DescriptionGroupComposite(getTopLevelComposite(form), taxon, description);\r
+               groupComposite.addFocusListener(new CompositeBorderDecorator(groupComposite, form));\r
+               groupComposite.setDroppable(false);\r
+                               \r
+               return groupComposite;\r
+       }\r
+               \r
+       @Override\r
+       public Composite createDescriptionFeatureGroup(Taxon taxon,\r
+                       TaxonDescription description, Feature feature) {\r
+\r
+               // Get the taxon's form\r
+               IManagedForm form = getDescriptionForm(taxon);\r
+               Assert.isNotNull(form, "No IManagedForm has been provided for the feature's taxon.");\r
+               \r
+               // Description label should be created before adding features\r
+               Composite descriptionGroupComposite = \r
+                       EditorController.getDescriptionEditor(taxon).getDescriptionGroup(description);\r
+               Assert.isNotNull(descriptionGroupComposite, \r
+                               "Description group must be created - usually by creating its label - before adding features.");\r
+               \r
+               // Create the group composite\r
+               Composite groupComposite = new DescriptionFeatureGroupComposite\r
+                                                                               (descriptionGroupComposite, taxon, description, feature);\r
+               groupComposite.addFocusListener(new CompositeBorderDecorator(groupComposite, form));    \r
+               \r
+               return groupComposite;          \r
+       }\r
+       \r
+       private Map<Taxon, IManagedForm> getTaxonDescriptionForms() {\r
+               if (descriptionForms == null) {\r
+                       descriptionForms = new HashMap<Taxon, IManagedForm>();\r
+               }\r
+               return descriptionForms;\r
+       }\r
+       \r
+\r
+       private IManagedForm getDescriptionForm(Taxon taxon) {\r
+               return getTaxonDescriptionForms().get(taxon);\r
+       }\r
 }\r