Add type infop to derived unit label
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / view / derivateSearch / DerivateLabelProvider.java
index 9db13819c0184568e6234eee5f31ce7fe2aa8154..06116c3f3156d6e04dd715443c4ea606aca67177 100644 (file)
@@ -9,7 +9,13 @@
 */
 package eu.etaxonomy.taxeditor.view.derivateSearch;
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Set;
 import java.util.UUID;
 
@@ -19,6 +25,8 @@ import org.eclipse.swt.graphics.Image;
 import org.hibernate.LazyInitializationException;
 
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
+import eu.etaxonomy.cdm.api.service.IOccurrenceService;
+import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
 import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.common.DefinedTerm;
@@ -26,6 +34,8 @@ import eu.etaxonomy.cdm.model.common.Identifier;
 import eu.etaxonomy.cdm.model.molecular.DnaSample;
 import eu.etaxonomy.cdm.model.molecular.Sequence;
 import eu.etaxonomy.cdm.model.molecular.SingleRead;
+import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;
+import eu.etaxonomy.cdm.model.name.TaxonNameBase;
 import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
 import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
 import eu.etaxonomy.cdm.model.occurrence.GatheringEvent;
@@ -48,7 +58,9 @@ public class DerivateLabelProvider extends ColumnLabelProvider {
 
     private static final String NO_SAMPLE_DESIGNATION = "[no sample designation]";
 
-    private Set<SingleRead> multiLinkSingleReads;
+    private static Set<SingleRead> multiLinkSingleReads;
+
+    private static Map<DerivedUnit, List<SpecimenTypeDesignation>> typeDesignations;
 
     private ConversationHolder conversation;
 
@@ -217,6 +229,12 @@ public class DerivateLabelProvider extends ColumnLabelProvider {
         else if(derivate instanceof DerivedUnit){
             DerivedUnit derivedUnit = (DerivedUnit)derivate;
             if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.PreservedSpecimen){
+                //check for type designation
+                if(typeDesignations.isEmpty()){
+                    for (SpecimenTypeDesignation specimenTypeDesignation : CdmStore.getService(IOccurrenceService.class).listTypeDesignations(derivedUnit, null, null, null, null)) {
+                        addTypeDesignation(derivedUnit, specimenTypeDesignation);
+                    }
+                }
                 //java.util.Collection<FieldUnit> fieldUnits = CdmStore.getService(IOccurrenceService.class).getFieldUnits(derivedUnit.getUuid());
                 //TODO : This is not generic anymore for performance reasons
                 Set<SpecimenOrObservationBase> originals = derivedUnit.getOriginals();
@@ -238,6 +256,20 @@ public class DerivateLabelProvider extends ColumnLabelProvider {
                 }
                 String mostSignificantIdentifier = derivedUnit.getMostSignificantIdentifier();
                 label += mostSignificantIdentifier!=null?mostSignificantIdentifier+separator:emptyString;
+                //type designation extension
+                List<SpecimenTypeDesignation> list = typeDesignations.get(derivedUnit);
+                if(list!=null){
+                    for (SpecimenTypeDesignation specimenTypeDesignation : list) {
+                        label += "("+specimenTypeDesignation.getTypeStatus()+" of ";
+                        for (TaxonNameBase taxonNameBase : specimenTypeDesignation.getTypifiedNames()) {
+                            label += taxonNameBase+separator;
+                        }
+                        if(label.endsWith(separator)){
+                            label = label.substring(0, label.length()-separator.length());
+                        }
+                        label += ")";
+                    }
+                }
             }
             else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.TissueSample){
                 //TissueSample should only be created by using it's own class
@@ -294,9 +326,6 @@ public class DerivateLabelProvider extends ColumnLabelProvider {
         return label;
     }
 
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.ColumnLabelProvider#getImage(java.lang.Object)
-     */
     @Override
     public Image getImage(Object element) {
         if(element instanceof TreeNode){
@@ -381,10 +410,30 @@ public class DerivateLabelProvider extends ColumnLabelProvider {
     }
 
     /**
-     * @param multiLinkSingleReads2
+     * Refreshes cached label extensions
+     * @param multiLinkSingleReads
      */
-    public void setMultiLinkSingleReads(Set<SingleRead> multiLinkSingleReads) {
-        this.multiLinkSingleReads = multiLinkSingleReads;
+    public void refresh() {
+        this.multiLinkSingleReads = new HashSet<SingleRead>();
+        for(Entry<SingleRead, Collection<Sequence>> entry:CdmStore.getService(ISequenceService.class).getSingleReadSequencesMap().entrySet()){
+            if(entry.getValue().size()>1){
+                multiLinkSingleReads.add(entry.getKey());
+            }
+        }
+        this.typeDesignations = new HashMap<DerivedUnit, List<SpecimenTypeDesignation>>();
+    }
+
+    private static void addTypeDesignation(DerivedUnit derivedUnit, SpecimenTypeDesignation typeDesignation){
+        List<SpecimenTypeDesignation> list = typeDesignations.get(derivedUnit);
+        if(list==null){
+            list = new ArrayList<SpecimenTypeDesignation>();
+        }
+        list.add(typeDesignation);
+        typeDesignations.put(derivedUnit, list);
+    }
+
+    public static Set<SingleRead> getMultiLinkSingleReads() {
+        return multiLinkSingleReads;
     }
 
 }