Sort description element sources #3185
authorPatrick Plitzner <p.plitzner@bgbm.org>
Thu, 17 Mar 2016 15:23:05 +0000 (16:23 +0100)
committerPatrick Plitzner <p.plitzner@bgbm.org>
Thu, 17 Mar 2016 15:23:05 +0000 (16:23 +0100)
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/description/DescriptionElementSourceSection.java

index 1546ffa8e288d8c6695e7c15b242ab2f6f629191..708236672dc660c0ca3d1d898b5e0935fd92c237 100644 (file)
  */
 package eu.etaxonomy.taxeditor.ui.section.description;
 
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
 
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
 import eu.etaxonomy.cdm.model.common.OriginalSourceType;
 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
 import eu.etaxonomy.cdm.model.description.DescriptionElementSource;
+import eu.etaxonomy.cdm.model.reference.Reference;
 import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
 import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
 import eu.etaxonomy.taxeditor.ui.section.AbstractEntityCollectionSection;
 
 /**
- * <p>DescriptionElementSourceSection class.</p>
+ * <p>
+ * DescriptionElementSourceSection class.
+ * </p>
  *
  * @author n.hoffmann
  * @created Nov 17, 2009
  * @version 1.0
  */
-public class DescriptionElementSourceSection extends AbstractEntityCollectionSection<DescriptionElementBase, DescriptionElementSource>{
+public class DescriptionElementSourceSection extends
+        AbstractEntityCollectionSection<DescriptionElementBase, DescriptionElementSource> {
 
-       /**
-        * <p>Constructor for DescriptionElementSourceSection.</p>
-        *
-        * @param parentElement a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement} object.
-        * @param style a int.
-        * @param cdmFormFactory a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory} object.
-        * @param conversation a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
-        */
-       public DescriptionElementSourceSection(CdmFormFactory cdmFormFactory, ConversationHolder conversation, ICdmFormElement parentElement, int style){
-               super(cdmFormFactory, conversation, parentElement, "References", style);
-       }
+    /**
+     * <p>
+     * Constructor for DescriptionElementSourceSection.
+     * </p>
+     *
+     * @param parentElement
+     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
+     *            object.
+     * @param style
+     *            a int.
+     * @param cdmFormFactory
+     *            a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
+     *            object.
+     * @param conversation
+     *            a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
+     *            object.
+     */
+    public DescriptionElementSourceSection(CdmFormFactory cdmFormFactory, ConversationHolder conversation,
+            ICdmFormElement parentElement, int style) {
+        super(cdmFormFactory, conversation, parentElement, "References", style);
+    }
 
-       /** {@inheritDoc} */
-       @Override
-       public DescriptionElementSource createNewElement() {
-               return DescriptionElementSource.NewInstance(OriginalSourceType.PrimaryTaxonomicSource);
-       }
+    /** {@inheritDoc} */
+    @Override
+    public DescriptionElementSource createNewElement() {
+        return DescriptionElementSource.NewInstance(OriginalSourceType.PrimaryTaxonomicSource);
+    }
 
-       /** {@inheritDoc} */
-       @Override
-       public Collection<DescriptionElementSource> getCollection(
-                       DescriptionElementBase entity) {
-               return entity.getSources();
-       }
+    /** {@inheritDoc} */
+    @Override
+    public Collection<DescriptionElementSource> getCollection(DescriptionElementBase entity) {
+        List<DescriptionElementSource> sources = new ArrayList<DescriptionElementSource>(entity.getSources());
+        Collections.sort(sources, new Comparator<DescriptionElementSource>() {
 
-       /** {@inheritDoc} */
-       @Override
-       public String getEmptyString() {
-               return "No references yet.";
-       }
+            @Override
+            public int compare(DescriptionElementSource o1, DescriptionElementSource o2) {
+                int id1 = o1.getId();
+                int id2 = o2.getId();
+                OriginalSourceType type1 = o1.getType();
+                OriginalSourceType type2 = o2.getType();
+                Reference citation1 = o1.getCitation();
+                Reference citation2 = o2.getCitation();
 
-       /** {@inheritDoc} */
-       @Override
-       protected String getTooltipString() {
-               return "Create a new reference";
-       }
+                // the newly created should always be on top
+                if (id1 == 0) {
+                    return -1;
+                }
+                if (id2 == 0) {
+                    return 1;
+                }
 
-       /** {@inheritDoc} */
-       @Override
-       public void addElement(DescriptionElementSource element) {
-               getEntity().addSource(element);
-       }
+                // sort by type (Primary taxonomic > Primary Media > others
+                // alphabetically by reference title cache)
+                if (type1 != null && type1.equals(OriginalSourceType.PrimaryTaxonomicSource)) {
+                    return -1;
+                }
+                if (type1 != null && type1.equals(OriginalSourceType.PrimaryMediaSource)
+                        && type2!=null && !type2.equals(OriginalSourceType.PrimaryTaxonomicSource)) {
+                    return -1;
+                }
+                if (type2 != null && type2.equals(OriginalSourceType.PrimaryTaxonomicSource)) {
+                    return 1;
+                }
+                if (type2 != null && type2.equals(OriginalSourceType.PrimaryMediaSource)
+                        && type1!=null && !type1.equals(OriginalSourceType.PrimaryTaxonomicSource)) {
+                    return 1;
+                }
 
-       /** {@inheritDoc} */
-       @Override
-       public void removeElement(DescriptionElementSource element) {
-               getEntity().removeSource(element);
-       }
+                //sort by citation title cache
+                if(citation1==null){
+                    return -1;
+                }
+                if(citation2==null){
+                    return 1;
+                }
+                if(citation1!=null && citation2!=null){
+                    return citation1.getTitleCache().compareTo(citation2.getTitleCache());
+                }
+                return 0;
+            }
+        });
+        return sources;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public String getEmptyString() {
+        return "No references yet.";
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected String getTooltipString() {
+        return "Create a new reference";
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public void addElement(DescriptionElementSource element) {
+        getEntity().addSource(element);
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public void removeElement(DescriptionElementSource element) {
+        getEntity().removeSource(element);
+    }
 }