merge-update from trunk
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / view / derivate / DerivateContentProvider.java
1 package eu.etaxonomy.taxeditor.editor.view.derivate;
2
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.List;
6 import java.util.Set;
7
8 import org.eclipse.jface.viewers.ITreeContentProvider;
9 import org.eclipse.jface.viewers.Viewer;
10
11 import eu.etaxonomy.cdm.model.molecular.Amplification;
12 import eu.etaxonomy.cdm.model.molecular.DnaSample;
13 import eu.etaxonomy.cdm.model.molecular.Sequence;
14 import eu.etaxonomy.cdm.model.molecular.SingleRead;
15 import eu.etaxonomy.cdm.model.occurrence.DerivationEvent;
16 import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
17 import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
18 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
19 import eu.etaxonomy.taxeditor.editor.EditorUtil;
20 import eu.etaxonomy.taxeditor.model.AbstractUtility;
21
22 public class DerivateContentProvider implements ITreeContentProvider {
23
24 @Override
25 public void dispose() {
26 // TODO Auto-generated method stub
27
28 }
29
30 @Override
31 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
32 }
33
34 @Override
35 public Object[] getElements(Object inputElement) {
36 SpecimenOrObservationBase<?> specimen = null;
37 if(inputElement instanceof DerivateViewEditorInput){
38 inputElement = ((DerivateViewEditorInput) inputElement).getDerivate();
39 }
40
41 // return the parent FieldUnit if element is a DerivedUnit
42 if(inputElement instanceof DerivedUnit){
43 specimen = EditorUtil.getFieldUnit((DerivedUnit)inputElement);
44 }
45 else if(inputElement instanceof FieldUnit){
46 specimen = (FieldUnit) inputElement;
47 }
48 else{
49 AbstractUtility.error(DerivateContentProvider.class, "Invalid input of type " + inputElement.getClass(), new UnsupportedOperationException());
50 }
51 if(specimen!=null){
52 return Collections.singleton(specimen).toArray();
53 }
54 else {
55 return Collections.EMPTY_LIST.toArray();
56 }
57 }
58
59 @Override
60 public Object[] getChildren(Object parentElement) {
61 if(parentElement instanceof DerivateViewEditorInput){
62 parentElement = ((DerivateViewEditorInput) parentElement).getDerivate();
63 }
64 if(parentElement instanceof DnaSample){
65 DnaSample dnaSample = (DnaSample)parentElement;
66 List<Object> children = new ArrayList<Object>();
67 //order is important: users want to see Sequences first
68 children.addAll(dnaSample.getSequences());
69 children.addAll(dnaSample.getAmplifications());
70 return children.toArray();
71 }
72 else if(parentElement instanceof Amplification){
73 return ((Amplification) parentElement).getSingleReads().toArray();
74 }
75 else if(parentElement instanceof Sequence){
76 return ((Sequence) parentElement).getSingleReads().toArray();
77 }
78 else if(parentElement instanceof SpecimenOrObservationBase){
79 return getDerivates((SpecimenOrObservationBase) parentElement).toArray();
80 }
81 else if(parentElement instanceof SingleRead){
82 List<Object> children = new ArrayList<Object>();
83 children.add(((SingleRead) parentElement).getAmplification());
84 //TODO getConsensusSequence??
85 return children.toArray();
86 }
87 return null;
88 }
89
90 @Override
91 public Object getParent(Object element) {
92 if(element instanceof DerivateViewEditorInput){
93 element = ((DerivateViewEditorInput) element).getDerivate();
94 }
95
96 if(element instanceof FieldUnit){
97 return element;
98 }
99 else if(element instanceof DerivedUnit){
100 DerivedUnit derivedUnit = (DerivedUnit)element;
101 return derivedUnit.getOriginalUnit();
102 }
103 else if(element instanceof Amplification){
104 ((Amplification) element).getDnaSample();
105 }
106 else if(element instanceof Sequence){
107 ((Sequence) element).getDnaSample();
108 }
109 else if(element instanceof SingleRead){
110 // TODO there are multiple possible parents
111 // does returning null help?
112 return null;
113 }
114 return null;
115 }
116
117 @Override
118 public boolean hasChildren(Object element) {
119 if(element instanceof DerivateViewEditorInput){
120 element = ((DerivateViewEditorInput) element).getDerivate();
121 }
122
123 if(element instanceof DnaSample){
124 DnaSample dnaSample = (DnaSample)element;
125 if(!dnaSample.getSequences().isEmpty() || !dnaSample.getAmplifications().isEmpty()){
126 return true;
127 }
128 }
129 else if(element instanceof Amplification){
130 Amplification amplification = (Amplification)element;
131 return !amplification.getSingleReads().isEmpty();
132 }
133 else if(element instanceof Sequence){
134 Sequence sequence = (Sequence)element;
135 return !sequence.getSingleReads().isEmpty();
136 }
137 else if(element instanceof SpecimenOrObservationBase){
138 SpecimenOrObservationBase specimenOrObservation = (SpecimenOrObservationBase)element;
139 for(DerivationEvent event:(Set<DerivationEvent>)specimenOrObservation.getDerivationEvents()){
140 if(!event.getDerivatives().isEmpty()){
141 return true;
142 }
143 }
144 }
145 return false;
146 }
147
148 private List<DerivedUnit> getDerivates(SpecimenOrObservationBase specimenOrObservation){
149 List<DerivedUnit> derivates = new ArrayList<DerivedUnit>();
150 for(DerivationEvent derivationEvent:(Set<DerivationEvent>)specimenOrObservation.getDerivationEvents()){
151 derivates.addAll(derivationEvent.getDerivatives());
152 }
153 return derivates;
154 }
155
156 }