fix #5714 Add possibility for adding a comparator to EnumComboElement
authorPatrick Plitzner <p.plitzner@bgbm.org>
Fri, 6 Jan 2017 13:36:44 +0000 (14:36 +0100)
committerPatrick Plitzner <p.plitzner@bgbm.org>
Fri, 6 Jan 2017 13:36:44 +0000 (14:36 +0100)
 - for Sources always have PrimaryTaxonomicSource or PrimaryMediaSource
on top depending on IdentifiableSource

eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/combo/EnumComboElement.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/element/CdmFormFactory.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/AbstractEntityCollectionElement.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/supplemental/AbstractOriginalSourceElement.java

index f36e2786c9168870124111ebf8988b9a9b736803..6553cc99dd5ce05a2805b52caab7038984cbb7e3 100644 (file)
@@ -12,6 +12,8 @@ package eu.etaxonomy.taxeditor.ui.combo;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map.Entry;
@@ -123,12 +125,12 @@ public class EnumComboElement<T extends IEnumTerm<T>> extends
        private final Class<T> enumType;
 
        public EnumComboElement(CdmFormFactory formFactory,
-                       ICdmFormElement parentElement, Class<T> enumType, int style) {
+                       ICdmFormElement parentElement, Class<T> enumType, Comparator<T> comparator, int style) {
                super(formFactory, parentElement);
                this.enumType = enumType;
                label.setText(getDefaultLabelString());
 
-               populateTypes();
+               populateTypes(comparator);
 
                combo.addSelectionListener(this);
        }
@@ -146,8 +148,11 @@ public class EnumComboElement<T extends IEnumTerm<T>> extends
                return "No Label";
        }
 
-    private void populateTypes(){
-        Collection<T> elementsForClass = getElementsForClass(enumType);
+    private void populateTypes(Comparator<T> comparator){
+        List<T> elementsForClass = new ArrayList<T>(getElementsForClass(enumType));
+        if(comparator!=null){
+            Collections.sort(elementsForClass, comparator);
+        }
         // special hierarchical order for specimens
         if(enumType.equals(SpecimenOrObservationType.class)){
             LinkedHashMap<T, String> orderedTerms = AbstractUtility.orderTerms(elementsForClass);
@@ -158,7 +163,7 @@ public class EnumComboElement<T extends IEnumTerm<T>> extends
         }
         // default order
         else{
-            for(T enumElement : getElementsForClass(enumType)){
+            for(T enumElement : elementsForClass){
                 elementTypeList.add(enumElement);
                 combo.add(((Enum) enumElement).name());
             }
index f3a4a74810077fdfc85c281569d6303ac0674621..c526ef31c12188238b571a581fefb13abd2462f1 100644 (file)
@@ -5,6 +5,7 @@ package eu.etaxonomy.taxeditor.ui.element;
 
 import java.net.URI;
 import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -971,27 +972,16 @@ public class CdmFormFactory extends FormToolkit {
            return element;
        }
 
-    /**
-     * <p>
-     * createEnumComboElement
-     * </p>
-     *
-     * @param enumComboType
-     *            a
-     *            {@link eu.eu.etaxonomy.taxeditor.ui.element.CdmFormFactory.EnumComboType}
-     *            object.
-     * @param parentElement
-     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-     *            object.
-     * @param style
-     *            a int.
-     * @return a {@link eu.etaxonomy.taxeditor.ui.term.AbstractEnumComboElement}
-     *         object.
-     */
        public <T extends IEnumTerm<T>> EnumComboElement<T> createEnumComboElement(
-                       Class<T> enumComboType, ICdmFormElement parentElement,
+               Class<T> enumComboType, ICdmFormElement parentElement,
+               int style) {
+           return createEnumComboElement(enumComboType, parentElement, null, style);
+       }
+
+       public <T extends IEnumTerm<T>> EnumComboElement<T> createEnumComboElement(
+                       Class<T> enumComboType, ICdmFormElement parentElement, Comparator<T> comparator,
                        int style) {
-        EnumComboElement<T> element = new EnumComboElement<T>(this, parentElement, enumComboType, style);
+        EnumComboElement<T> element = new EnumComboElement<T>(this, parentElement, enumComboType, comparator, style);
         adapt(element);
         parentElement.addElement(element);
         return element;
index 70e9f88a7fa70c338092d2afcf13ea7f4ab85cd3..2a32e820560fc1aaf521c5c120cd2b73648e09ce 100644 (file)
@@ -68,6 +68,7 @@ public abstract class AbstractEntityCollectionElement<ENTITY> extends
                        AbstractFormSection section, ENTITY entity, SelectionListener removeListener,
                        boolean isChoosableEntity, Color backgroundColor, int style) {
                super(formFactory, (ICdmFormElement) section);
+               this.entity = entity;
 
                init();
 
index 44d3547944604e72ee5ef4313a81c2ab742b6eed..9f1a896794ef7da0554f7e5f5342bc515afe676e 100644 (file)
@@ -9,6 +9,8 @@
 
 package eu.etaxonomy.taxeditor.ui.section.supplemental;
 
+import java.util.Comparator;
+
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionListener;
 
@@ -52,11 +54,63 @@ public abstract class AbstractOriginalSourceElement<T extends OriginalSourceBase
        public void createControls(ICdmFormElement formElement, int style) {
                combo_origsourcetype = formFactory
                                .createEnumComboElement(OriginalSourceType.class,
-                                               formElement, style);
+                                               formElement, new OriginalSourceTypeComparator(getEntity()), style);
                super.createControls(formElement, style);
                text_idInSource = formFactory.createTextWithLabelElement(formElement, "ID in Source", null, style);
                text_idNamespace = formFactory.createTextWithLabelElement(formElement, "ID Namespace", null, style);
                text_originaleNameString = formFactory.createTextWithLabelElement(
                        formElement, "Original Name", null, SWT.NULL);
        }
+
+       /**
+        * Sorts source type combo alphabetically <b>except</b> for PrimaryTaxonomicSource resp.
+        * PrimaryMediaSource which are alway on top depending on the IdentifiableSource;
+        * @author pplitzner
+        * @date Jan 6, 2017
+        *
+        */
+       private class OriginalSourceTypeComparator implements Comparator<OriginalSourceType>{
+
+           private OriginalSourceBase entity;
+
+        public OriginalSourceTypeComparator(OriginalSourceBase entity) {
+            this.entity = entity;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public int compare(OriginalSourceType o1, OriginalSourceType o2) {
+            if(o1!=null && o2==null){
+                return 1;
+            }
+            else if(o1==null && o2!=null){
+                return -1;
+            }
+            else if(o1!=null && o2 !=null){
+                if(entity.getType().equals(OriginalSourceType.PrimaryMediaSource)){
+                    if(o1.equals(OriginalSourceType.PrimaryMediaSource)){
+                        return -1;
+                    }
+                    else if(o2.equals(OriginalSourceType.PrimaryMediaSource)){
+                        return 1;
+                    }
+                }
+                else{
+                    if(o1.equals(OriginalSourceType.PrimaryTaxonomicSource)){
+                        return -1;
+                    }
+                    else if(o2.equals(OriginalSourceType.PrimaryTaxonomicSource)){
+                        return 1;
+                    }
+                }
+                String message1 = o1.getMessage();
+                String message2 = o2.getMessage();
+                return message1.compareTo(message2);
+            }
+            return 0;
+        }
+
+       }
 }