- ordered list for context menu in bulk editor to create new specimen (fixes #3752)
authorPatric Plitzner <p.plitzner@bgbm.org>
Tue, 29 Oct 2013 09:29:55 +0000 (09:29 +0000)
committerPatric Plitzner <p.plitzner@bgbm.org>
Tue, 29 Oct 2013 09:29:55 +0000 (09:29 +0000)
eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/input/entitycreator/OccurrenceCreator.java

index 372bdfcd089c3182059d75c656de540ef2ae94b7..3796a11f461ba6991872f924cf297110ebca7ed7 100644 (file)
 
 package eu.etaxonomy.taxeditor.bulkeditor.input.entitycreator;
 
+import java.util.Comparator;
+import java.util.LinkedHashMap;
 import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
 import java.util.TreeMap;
+import java.util.TreeSet;
 
 import org.apache.log4j.Logger;
 import org.eclipse.core.runtime.IStatus;
@@ -72,24 +77,58 @@ public class OccurrenceCreator implements
         */
        @Override
        public Map<Object, String> getKeyLabelPairs() {
-//             Comparator<Object> comparator = new Comparator<Object>() {
-//                       public int compare(Object o1, Object o2) {
-//                         String key1 = ((SpecimenOrObservationType)o1).getKey();
-//                         String key2 = ((SpecimenOrObservationType)o2).getKey();
-//                         return key1.compareTo(key2);
-//                       }
-//                     };
-//             Map<Object, String> result = new TreeMap<Object, String>(comparator);
-//         Map<Object, String> result = new HashMap<Object, String>();
-               Map<Object, String> result = new TreeMap<Object, String>();
+               Comparator<Object> comparator = new Comparator<Object>() {
+                         @Override
+            public int compare(Object o1, Object o2) {
+                           String key1 = ((SpecimenOrObservationType)o1).getKey();
+                           String key2 = ((SpecimenOrObservationType)o2).getKey();
+                           return key1.compareTo(key2);
+                         }
+                       };
+               Map<Object, String> result = new LinkedHashMap<Object, String>();
+
+               Map<SpecimenOrObservationType, Set<SpecimenOrObservationType>> typeHierarchy = new TreeMap<SpecimenOrObservationType, Set<SpecimenOrObservationType>>(comparator);
 
                for(SpecimenOrObservationType sooType : SpecimenOrObservationType.values()) {
-                       result.put(sooType, sooType.getMessage());
+                   Set<SpecimenOrObservationType> childList = new TreeSet<SpecimenOrObservationType>(comparator);
+            // add root element as keys
+            if(sooType.getKindOf()==null){
+                typeHierarchy.put(sooType, childList);
+                   }
+                   // add child element to topmost parent i.e. root
+                   else{
+                       SpecimenOrObservationType root = getRootFor(sooType);
+                       if(typeHierarchy.containsKey(root)){
+                           typeHierarchy.get(root).add(sooType);
+                       }
+                       else{
+                           childList.add(sooType);
+                           typeHierarchy.put(root, childList);
+                       }
+                   }
                }
 
+               // create list according to the type hierarchy (root elements alphabetically with recursive children also alphabetically)
+               for(Entry<SpecimenOrObservationType, Set<SpecimenOrObservationType>> entry:typeHierarchy.entrySet()){
+                   SpecimenOrObservationType root = entry.getKey();
+                   result.put(root, root.getMessage());
+                   for(SpecimenOrObservationType child:entry.getValue()){
+                       result.put(child, " - " + child.getMessage());
+                   }
+               }
                return result;
        }
 
+       private SpecimenOrObservationType getRootFor(SpecimenOrObservationType type){
+           SpecimenOrObservationType parent = type.getKindOf();
+           if(parent==null){
+               return type;
+           }
+           else{
+               return getRootFor(type.getKindOf());
+           }
+       }
+
        @Override
        public boolean savesEntity() {
                // TODO Auto-generated method stub