merge-update from trunk
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / view / derivateSearch / DerivateLabelProvider.java
index 4f16e00c441526f4d1b9279ebaff449f6208bab0..fc1be090d1e87a86f08ac33b6157af6a5bd60430 100644 (file)
@@ -9,20 +9,94 @@
 */
 package eu.etaxonomy.taxeditor.view.derivateSearch;
 
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+
 import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.jface.viewers.TreeNode;
 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.model.common.DefinedTerm;
+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.occurrence.DerivedUnit;
 import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
+import eu.etaxonomy.cdm.model.occurrence.GatheringEvent;
+import eu.etaxonomy.cdm.model.occurrence.MediaSpecimen;
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
 import eu.etaxonomy.taxeditor.model.ImageResources;
+import eu.etaxonomy.taxeditor.store.CdmStore;
 
 /**
- * Label provider for the views to show {@link SpecimenOrObservationBase}s.
+ * Label provider for the views to show {@link SpecimenOrObservationBase}s.<br>
+ * <br>
+ * <b>Note:</b> If you use this label provider you need to assure that you
+ * created a {@link ConversationHolder} resp. have an open session because
+ * the labels are generated from various fields of the derivate hierarchy which
+ * are lazy loaded and could therefore throw a {@link LazyInitializationException}.
  */
 public class DerivateLabelProvider extends ColumnLabelProvider {
 
+    private Set<SingleRead> multiLinkSingleReads;
+
+    private static DefinedTerm photoTerm = null;
+    private static DefinedTerm drawingTerm = null;
+    private static DefinedTerm specimenScanTerm = null;
+    private static DefinedTerm detailImageTerm = null;
+
+    private static void initializeTerms() {
+        List<DefinedTerm> preferredTerms = CdmStore.getTermManager().getPreferredTerms(DefinedTerm.class);
+        for (DefinedTerm definedTerm : preferredTerms) {
+            if(definedTerm.getUuid().equals(UUID.fromString("c5c59c42-f254-471e-96c6-09f459f7c903"))){
+                photoTerm = definedTerm;
+            }
+            else if(definedTerm.getUuid().equals(UUID.fromString("669b0409-4aa4-4695-aae4-a95ed27bad4c"))){
+                drawingTerm = definedTerm;
+            }
+            else if(definedTerm.getUuid().equals(UUID.fromString("acda15be-c0e2-4ea8-8783-b9b0c4ad7f03"))){
+                specimenScanTerm = definedTerm;
+            }
+            else if(definedTerm.getUuid().equals(UUID.fromString("31eb8d02-bf5d-437c-bcc6-87a626445f34"))){
+                detailImageTerm = definedTerm;
+            }
+        }
+    }
+
+    public static DefinedTerm getLivingPlantPhotoTerm(){
+        if(photoTerm==null){
+            initializeTerms();
+        }
+        return photoTerm;
+    }
+
+    public static DefinedTerm getArtworkTerm(){
+        if(drawingTerm==null){
+            initializeTerms();
+        }
+        return drawingTerm;
+    }
+
+    public static DefinedTerm getSpecimenScanTerm(){
+        if(specimenScanTerm==null){
+            initializeTerms();
+        }
+        return specimenScanTerm;
+    }
+
+    public static DefinedTerm getDetailImageTerm(){
+        if(detailImageTerm==null){
+            initializeTerms();
+        }
+        return detailImageTerm;
+    }
+
+
     /** {@inheritDoc} */
     @Override
     public String getText(Object element) {
@@ -35,13 +109,101 @@ public class DerivateLabelProvider extends ColumnLabelProvider {
         return getDerivateText(element);
     }
 
-    private String getDerivateText(Object element){
-        if(element instanceof SpecimenOrObservationBase){
+    /**
+     *
+     * @param element
+     * @return
+     */
+    public static String getDerivateText(Object element){
+        TreeNode parentNode = null;
+        if(element instanceof TreeNode){
+            parentNode = ((TreeNode) element).getParent();
+            //unwrap specimen from TreeNode
+            element = ((TreeNode) element).getValue();
+        }
+
+        String label = "";
+        if(element instanceof FieldUnit){
+            FieldUnit fieldUnit = (FieldUnit)element;
+            GatheringEvent gatheringEvent = fieldUnit.getGatheringEvent();
+            if(gatheringEvent!=null){
+                label += gatheringEvent.getCountry()!=null?gatheringEvent.getCountry().getLabel()+", ":"";
+                label += gatheringEvent.getLocality()!=null?gatheringEvent.getLocality().getText()+", ":"";
+                label += gatheringEvent.getGatheringDate()!=null?gatheringEvent.getGatheringDate()+", ":"";
+                label += gatheringEvent.getCollector()!=null?gatheringEvent.getCollector()+", ":"";
+            }
+            label += fieldUnit.getFieldNumber()!=null?fieldUnit.getFieldNumber():"";
+        }
+        else if(element instanceof MediaSpecimen){
+            MediaSpecimen mediaSpecimen = (MediaSpecimen)element;
+            label += mediaSpecimen.getMediaSpecimen().getTitle()!=null?mediaSpecimen.getMediaSpecimen().getTitle().getText()+", ":"[no motif]";
+            label += mediaSpecimen.getMediaSpecimen().getArtist()!=null?mediaSpecimen.getMediaSpecimen().getArtist()+", ":"";
+            eu.etaxonomy.cdm.model.occurrence.Collection collection = mediaSpecimen.getCollection();
+            if(collection!=null){
+                label += collection.getName()!=null?collection.getName()+" ":"";
+                label += collection.getCode()!=null?"("+collection.getCode()+"), ":"";
+            }
+            label += mediaSpecimen.getAccessionNumber()!=null?mediaSpecimen.getAccessionNumber()+", ":"";
+        }
+        else if(element instanceof DnaSample
+                || (element instanceof DerivedUnit
+                        && ((SpecimenOrObservationBase<?>) element).getRecordBasis()==SpecimenOrObservationType.DnaSample)){
+            label += "[no sample designation]";
+
+        }
+        else if(element instanceof DerivedUnit){
+            DerivedUnit derivedUnit = (DerivedUnit)element;
+            if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.PreservedSpecimen){
+                java.util.Collection<FieldUnit> fieldUnits = CdmStore.getService(IOccurrenceService.class).getFieldUnits(derivedUnit.getUuid());
+                if(fieldUnits!=null && !fieldUnits.isEmpty()){
+                    FieldUnit fieldUnit = fieldUnits.iterator().next();
+                    GatheringEvent gatheringEvent = fieldUnit.getGatheringEvent();
+//                    gatheringEvent = HibernateProxyHelper.deproxy(gatheringEvent, GatheringEvent.class);
+                    if(gatheringEvent!=null){
+                        label += gatheringEvent.getCollector()!=null?gatheringEvent.getCollector()+", ":"";
+                    }
+                    label += fieldUnit.getFieldNumber()!=null?fieldUnit.getFieldNumber()+", ":"";
+                }
+                eu.etaxonomy.cdm.model.occurrence.Collection collection = derivedUnit.getCollection();
+                if(collection!=null){
+                    label += collection.getName()!=null?collection.getName()+" ":"";
+                    label += collection.getCode()!=null?"("+collection.getCode()+"), ":"";
+                }
+                label += derivedUnit.getAccessionNumber()!=null?derivedUnit.getAccessionNumber()+", ":"";
+                label += derivedUnit.getBarcode()!=null?derivedUnit.getBarcode():"";
+            }
+            else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.TissueSample){
+                //TODO: implement
+                label += "kindofTissue? + [no sample designation]";
+            }
+        }
+        else if(element instanceof Sequence){
+            Sequence sequence = (Sequence)element;
+            label += "[no sample designation]"+", ";
+            label += sequence.getDnaMarker()!=null?sequence.getDnaMarker():"";
+        }
+        else if(element instanceof SingleRead){
+            SingleRead singleRead = (SingleRead)element;
+            label += "[no sample designation]"+", ";
+            label += singleRead.getPrimer()!=null?singleRead.getPrimer().getLabel()+", ":"";
+            if(parentNode!=null && parentNode.getValue() instanceof Sequence){
+                Sequence sequence = (Sequence) parentNode.getValue();
+                label += sequence.getDnaMarker()!=null?sequence.getDnaMarker():"";
+            }
+        }
+        else if(element instanceof SpecimenOrObservationBase){
             SpecimenOrObservationBase<?> derivate = (SpecimenOrObservationBase<?>) element;
             SpecimenOrObservationType type = derivate.getRecordBasis();
             return derivate.getTitleCache() + (type!=null?" ["+type.toString()+"]":"");
         }
-        return element.toString();
+        if(label.isEmpty()){
+            label = element.toString();
+        }
+        //remove last comma
+        else if(label.endsWith(", ")){
+            label = label.substring(0, label.length()-2);
+        }
+        return label;
     }
 
     /* (non-Javadoc)
@@ -49,6 +211,9 @@ public class DerivateLabelProvider extends ColumnLabelProvider {
      */
     @Override
     public Image getImage(Object element) {
+        if(element instanceof TreeNode){
+            element = ((TreeNode) element).getValue();
+        }
         if(element instanceof FieldUnit){
             return ImageResources.getImage(ImageResources.FIELD_UNIT);
         }
@@ -66,11 +231,43 @@ public class DerivateLabelProvider extends ColumnLabelProvider {
             else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.PreservedSpecimen){
                 return ImageResources.getImage(ImageResources.SPECIMEN_DERIVATE);
             }
-            else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.StillImage){
-                return ImageResources.getImage(ImageResources.ARTWORK_DERIVATE);
+            else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.Media){
+                if(derivedUnit.getKindOfUnit()!=null){
+                    if(derivedUnit.getKindOfUnit().equals(getArtworkTerm())){
+                        return ImageResources.getImage(ImageResources.ARTWORK_DERIVATE);
+                    }
+                    else if(derivedUnit.getKindOfUnit().equals(getLivingPlantPhotoTerm())){
+                        return ImageResources.getImage(ImageResources.LIVING_PLANT_PHOTO_DERIVATE);
+                    }
+                    else if(derivedUnit.getKindOfUnit().equals(getSpecimenScanTerm())){
+                        return ImageResources.getImage(ImageResources.SPECIMEN_SCAN_DERIVATE);
+                    }
+                    else if(derivedUnit.getKindOfUnit().equals(getDetailImageTerm())){
+                        return ImageResources.getImage(ImageResources.DETAIL_IMAGE_DERIVATE);
+                    }
+                }
+            }
+        }
+        else if(element instanceof Sequence){
+            return ImageResources.getImage(ImageResources.SEQUENCE_DERIVATE);
+        }
+
+        else if(element instanceof SingleRead){
+            if(multiLinkSingleReads.contains(element)){
+                return ImageResources.getImage(ImageResources.SINGLE_READ_DERIVATE_MULTILINK);
+            }
+            else{
+                return ImageResources.getImage(ImageResources.SINGLE_READ_DERIVATE);
             }
         }
         return super.getImage(element);
     }
 
+    /**
+     * @param multiLinkSingleReads2
+     */
+    public void setMultiLinkSingleReads(Set<SingleRead> multiLinkSingleReads) {
+        this.multiLinkSingleReads = multiLinkSingleReads;
+    }
+
 }