- derivate view shows derivate hierarchy of FieldUnits and DerivedUnits
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / view / derivate / DerivateContentProvider.java
index 47c5d234afae2cfa59f3f074c7440e9fe2b948e0..37d5e7f2f51998dd60bfa627c2625f0f006706a3 100644 (file)
@@ -1,10 +1,18 @@
 package eu.etaxonomy.taxeditor.editor.view.derivate;
 
+import java.util.ArrayList;
 import java.util.Collections;
+import java.util.List;
+import java.util.Set;
 
 import org.eclipse.jface.viewers.ITreeContentProvider;
 import org.eclipse.jface.viewers.Viewer;
 
+import eu.etaxonomy.cdm.model.occurrence.DerivationEvent;
+import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
+import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
+import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
+
 public class DerivateContentProvider implements ITreeContentProvider {
 
        @Override
@@ -19,24 +27,63 @@ public class DerivateContentProvider implements ITreeContentProvider {
 
        @Override
        public Object[] getElements(Object inputElement) {
-               return Collections.singleton(inputElement).toArray();
+           // return the parent FieldUnit if element is a DerivedUnit
+           if(inputElement instanceof DerivedUnit){
+               DerivedUnit derivedUnit = (DerivedUnit)inputElement;
+               for(SpecimenOrObservationBase original:derivedUnit.getOriginals()){
+                 if(original instanceof FieldUnit){
+                     return Collections.singletonList(original).toArray();
+                 }
+                 else{
+                     return getElements(original);
+                 }
+               }
+           }
+           // return the FieldUnit itself if element is a FieldUnit (used clone() due to recursion issues -> see javadoc of this method)
+           else if(inputElement instanceof FieldUnit){
+               FieldUnit fieldUnit = ((FieldUnit) inputElement).clone();
+               fieldUnit.getTitleCache();
+               return Collections.singleton(fieldUnit).toArray();
+           }
+               return Collections.EMPTY_LIST.toArray();
        }
 
        @Override
        public Object[] getChildren(Object parentElement) {
-               return null;
+           if(parentElement instanceof SpecimenOrObservationBase){
+               return getDerivates((SpecimenOrObservationBase) parentElement).toArray();
+           }
+           return null;
        }
 
        @Override
        public Object getParent(Object element) {
-               // TODO Auto-generated method stub
+           if(element instanceof DerivedUnit){
+               DerivedUnit derivedUnit = (DerivedUnit)element;
+               return derivedUnit.getOriginalUnit();
+           }
                return null;
        }
 
        @Override
        public boolean hasChildren(Object element) {
-               // TODO Auto-generated method stub
+           if(element instanceof SpecimenOrObservationBase){
+               SpecimenOrObservationBase specimenOrObservation = (SpecimenOrObservationBase)element;
+               for(DerivationEvent event:(Set<DerivationEvent>)specimenOrObservation.getDerivationEvents()){
+                   if(!event.getDerivatives().isEmpty()){
+                       return true;
+                   }
+               }
+           }
                return false;
        }
 
+       private List<DerivedUnit> getDerivates(SpecimenOrObservationBase specimenOrObservation){
+           List<DerivedUnit> derivates = new ArrayList<DerivedUnit>();
+           for(DerivationEvent derivationEvent:(Set<DerivationEvent>)specimenOrObservation.getDerivationEvents()){
+               derivates.addAll(derivationEvent.getDerivatives());
+           }
+           return derivates;
+       }
+
 }