merge-update from trunk
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / view / derivate / CreateDerivateContextMenu.java
1 package eu.etaxonomy.taxeditor.editor.view.derivate;
2
3 import org.eclipse.jface.action.ContributionItem;
4 import org.eclipse.jface.action.IContributionItem;
5 import org.eclipse.jface.viewers.ISelection;
6 import org.eclipse.jface.viewers.TreeSelection;
7 import org.eclipse.swt.SWT;
8 import org.eclipse.swt.events.SelectionEvent;
9 import org.eclipse.swt.events.SelectionListener;
10 import org.eclipse.swt.widgets.Menu;
11 import org.eclipse.swt.widgets.MenuItem;
12 import org.eclipse.ui.IWorkbenchPart;
13 import org.eclipse.ui.IWorkbenchWindow;
14 import org.eclipse.ui.PlatformUI;
15 import org.eclipse.ui.actions.CompoundContributionItem;
16
17 import eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeCacheStrategy;
18 import eu.etaxonomy.cdm.model.molecular.Amplification;
19 import eu.etaxonomy.cdm.model.molecular.DnaSample;
20 import eu.etaxonomy.cdm.model.molecular.Sequence;
21 import eu.etaxonomy.cdm.model.molecular.SingleRead;
22 import eu.etaxonomy.cdm.model.occurrence.DerivationEvent;
23 import eu.etaxonomy.cdm.model.occurrence.DerivationEventType;
24 import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
25 import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
26 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
27 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
28 import eu.etaxonomy.taxeditor.model.AbstractUtility;
29
30 /**
31 * Context menu for the creation of sub-derivates.
32 *
33 */
34 public class CreateDerivateContextMenu extends CompoundContributionItem {
35
36 /* (non-Javadoc)
37 * @see org.eclipse.ui.actions.CompoundContributionItem#getContributionItems()
38 */
39 @Override
40 protected IContributionItem[] getContributionItems() {
41 IContributionItem[] contributionItems = new IContributionItem[] {
42 new ContributionItem() {
43 @Override
44 public void fill(Menu menu, int index) {
45 final IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
46 final ISelection selection = window.getActivePage().getSelection();
47 if(selection instanceof TreeSelection){
48 final Object selectedElement = ((TreeSelection) selection).getFirstElement();
49 //context menu for FieldUnit
50 if(selectedElement instanceof FieldUnit){
51 FieldUnit fieldUnit = (FieldUnit) selectedElement;
52 createMenuItem(menu, "Specimen", fieldUnit, DerivedUnit.class, SpecimenOrObservationType.PreservedSpecimen);
53 new MenuItem(menu, SWT.SEPARATOR);
54 createMenuItem(menu, "Tissue Sample", fieldUnit, DerivedUnit.class, SpecimenOrObservationType.TissueSample);
55 createMenuItem(menu, "DNA Sample", fieldUnit, DnaSample.class, SpecimenOrObservationType.DnaSample);
56 createMenuItem(menu, "Specimen Scan", fieldUnit, DerivedUnit.class, SpecimenOrObservationType.StillImage);
57 createMenuItem(menu, "Artwork", fieldUnit, DerivedUnit.class, SpecimenOrObservationType.StillImage);
58 createMenuItem(menu, "Living Plant Photo", fieldUnit, DerivedUnit.class, SpecimenOrObservationType.StillImage);
59 }
60 //context menu for Specimen
61 else if(selectedElement instanceof DerivedUnit && ((DerivedUnit)selectedElement).getRecordBasis()==SpecimenOrObservationType.PreservedSpecimen){
62 DerivedUnit derivedUnit = (DerivedUnit) selectedElement;
63
64 createMenuItem(menu, "Tissue Sample", derivedUnit, DerivedUnit.class, SpecimenOrObservationType.TissueSample);
65 createMenuItem(menu, "DNA Sample", derivedUnit, DnaSample.class, SpecimenOrObservationType.DnaSample);
66 createMenuItem(menu, "Specimen Scan", derivedUnit, DerivedUnit.class, SpecimenOrObservationType.StillImage);
67 createMenuItem(menu, "Artwork", derivedUnit, DerivedUnit.class, SpecimenOrObservationType.StillImage);
68 createMenuItem(menu, "Living Plant Photo", derivedUnit, DerivedUnit.class, SpecimenOrObservationType.StillImage);
69 }
70 //context menu for DnaSample
71 else if(selectedElement instanceof DnaSample){
72 DnaSample dnaSample = (DnaSample) selectedElement;
73 createMenuItem(menu, "Consensus Sequence", dnaSample, Sequence.class, null);
74 createMenuItem(menu, "Amplification", dnaSample, Amplification.class, null);
75 }
76 //context menu for Amplification
77 else if(selectedElement instanceof Amplification){
78 Amplification amplification = (Amplification) selectedElement;
79 createMenuItem(menu, "Single Read", amplification, SingleRead.class, null);
80 }
81 //context menu for Sequence
82 else if(selectedElement instanceof Sequence){
83 Sequence sequence = (Sequence) selectedElement;
84 createMenuItem(menu, "Single Read", sequence, SingleRead.class, null);
85 }
86 //default
87 else{
88 MenuItem menuItem = new MenuItem(menu, SWT.None);
89 menuItem.setText("No child derivates");
90 menuItem.setEnabled(false);
91 }
92 }
93 }
94
95 private void createMenuItem(Menu menu, String menuLabel, Object parent, Class<?> childClass, SpecimenOrObservationType specimenType) {
96 MenuItem menuItem = new MenuItem(menu, SWT.None);
97 menuItem.setText(menuLabel);
98 menuItem.addSelectionListener(new WidgetSelectionListener(parent, childClass, specimenType));
99 }
100
101 }
102 };
103 return contributionItems;
104 }
105
106 private class WidgetSelectionListener implements SelectionListener{
107
108 private final Object parent;
109 //TODO: we need a common interface for the generic like e.g. "IDerivateHierarchyNode"
110 private final Class<?> childClass;
111 private final SpecimenOrObservationType specimenType;
112
113 /**
114 * @param parent
115 * @param specimenType
116 */
117 public WidgetSelectionListener(Object parent, Class<?> childClass, SpecimenOrObservationType specimenType) {
118 this.parent = parent;
119 this.childClass = childClass;
120 this.specimenType = specimenType;
121 }
122
123 /* (non-Javadoc)
124 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
125 */
126 @Override
127 public void widgetSelected(SelectionEvent e) {
128 if(parent instanceof DnaSample){
129 DnaSample dnaSample = (DnaSample)parent;
130 if(childClass.equals(Amplification.class)){
131 Amplification.NewInstance(dnaSample);
132 }
133 else if(childClass.equals(Sequence.class)){
134 dnaSample.addSequence(Sequence.NewInstance(""));//why does this not have DnaSample as constructor parameter?
135 }
136 }
137 else if(parent instanceof Amplification){
138 ((Amplification) parent).addSingleRead(SingleRead.NewInstance());
139 }
140 else if(parent instanceof Sequence){
141 ((Sequence) parent).addSingleRead(SingleRead.NewInstance());
142 }
143 else if(parent instanceof SpecimenOrObservationBase && DerivedUnit.class.isAssignableFrom(childClass)){
144 SpecimenOrObservationBase<?> specimenOrObservationBase = (SpecimenOrObservationBase<?>)parent;
145 DerivedUnit derivedUnit;
146 if(childClass.equals(DnaSample.class)){
147 derivedUnit = DnaSample.NewInstance();
148 }
149 else{
150 derivedUnit = DerivedUnit.NewInstance(specimenType);
151 }
152 specimenOrObservationBase.addDerivationEvent(DerivationEvent.NewSimpleInstance(specimenOrObservationBase, derivedUnit, DerivationEventType.GATHERING_IN_SITU()));
153 derivedUnit.setCacheStrategy(new DerivedUnitFacadeCacheStrategy());
154 derivedUnit.getTitleCache(); //update title cache
155 }
156 IWorkbenchPart activePart = AbstractUtility.getActivePart();
157 if(activePart instanceof DerivateView){
158 DerivateView derivateView = (DerivateView)activePart;
159 derivateView.changed(null);
160 derivateView.viewer.refresh();
161 }
162 }
163
164 /* (non-Javadoc)
165 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
166 */
167 @Override
168 public void widgetDefaultSelected(SelectionEvent e) {
169 // TODO Auto-generated method stub
170
171 }
172
173 }
174
175 }