- used more pepresentative DerivationEventTypes when creating derivates via DerivatView
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / view / derivate / contextMenu / CreateDerivateContextMenu.java
1 package eu.etaxonomy.taxeditor.editor.view.derivate.contextMenu;
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.TreeNode;
7 import org.eclipse.swt.SWT;
8 import org.eclipse.swt.events.SelectionAdapter;
9 import org.eclipse.swt.events.SelectionEvent;
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.media.Media;
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.MediaSpecimen;
27 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
28 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
29 import eu.etaxonomy.taxeditor.editor.EditorUtil;
30 import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView;
31 import eu.etaxonomy.taxeditor.model.AbstractUtility;
32
33 /**
34 * Context menu for the creation of derivates in the derivate hierarchy.
35 *
36 */
37 public class CreateDerivateContextMenu extends CompoundContributionItem {
38
39 /* (non-Javadoc)
40 * @see org.eclipse.ui.actions.CompoundContributionItem#getContributionItems()
41 */
42 @Override
43 protected IContributionItem[] getContributionItems() {
44 IContributionItem[] contributionItems = new IContributionItem[] {
45 new ContributionItem() {
46 @Override
47 public void fill(Menu menu, int index) {
48 MenuItem addItem = new MenuItem(menu, SWT.CASCADE);
49 addItem.setText("Add...");
50 Menu addMenu = new Menu(menu);
51 addItem.setMenu(addMenu);
52 final IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
53 final ISelection selection = window.getActivePage().getSelection();
54 TreeNode selectedTreeNode = EditorUtil.getTreeNodeOfSelection(selection);
55 if(selectedTreeNode!=null){
56 //context menu for FieldUnit
57 if(selectedTreeNode.getValue() instanceof FieldUnit){
58 createMenuItem(addMenu, "Specimen", selectedTreeNode, DerivedUnit.class, SpecimenOrObservationType.PreservedSpecimen, DerivationEventType.GATHERING_IN_SITU());
59 new MenuItem(addMenu, SWT.SEPARATOR);
60 createMenuItem(addMenu, "Tissue Sample", selectedTreeNode, DnaSample.class, SpecimenOrObservationType.TissueSample, DerivationEventType.PREPARATION());
61 createMenuItem(addMenu, "DNA Sample", selectedTreeNode, DnaSample.class, SpecimenOrObservationType.DnaSample, DerivationEventType.DNA_EXTRACTION());
62 createMenuItem(addMenu, "Media Specimen", selectedTreeNode, MediaSpecimen.class, SpecimenOrObservationType.Media, DerivationEventType.ACCESSIONING());
63 }
64 //context menu for Specimen
65 else if(selectedTreeNode.getValue() instanceof DerivedUnit && ((DerivedUnit)selectedTreeNode.getValue()).getRecordBasis()==SpecimenOrObservationType.PreservedSpecimen){
66
67 createMenuItem(addMenu, "Tissue Sample", selectedTreeNode, DnaSample.class, SpecimenOrObservationType.TissueSample, DerivationEventType.PREPARATION());
68 createMenuItem(addMenu, "DNA Sample", selectedTreeNode, DnaSample.class, SpecimenOrObservationType.DnaSample, DerivationEventType.DNA_EXTRACTION());
69 createMenuItem(addMenu, "Media Specimen", selectedTreeNode, MediaSpecimen.class, SpecimenOrObservationType.Media, DerivationEventType.ACCESSIONING());
70 }
71 //context menu for TissueSample
72 else if(selectedTreeNode.getValue() instanceof DnaSample && ((DnaSample)selectedTreeNode.getValue()).getRecordBasis()==SpecimenOrObservationType.TissueSample){
73 createMenuItem(addMenu, "DnaSample", selectedTreeNode, DnaSample.class, SpecimenOrObservationType.DnaSample, DerivationEventType.DNA_EXTRACTION());
74 createMenuItem(addMenu, "Media Specimen", selectedTreeNode, MediaSpecimen.class, SpecimenOrObservationType.Media, DerivationEventType.ACCESSIONING());
75 }
76 //context menu for DnaSample
77 else if(selectedTreeNode.getValue() instanceof DnaSample && ((DnaSample)selectedTreeNode.getValue()).getRecordBasis()==SpecimenOrObservationType.DnaSample){
78 createMenuItem(addMenu, "Consensus Sequence", selectedTreeNode, Sequence.class, null, null);
79 createMenuItem(addMenu, "Media Specimen", selectedTreeNode, MediaSpecimen.class, SpecimenOrObservationType.Media, DerivationEventType.ACCESSIONING());
80 }
81 //context menu for Sequence
82 else if(selectedTreeNode.getValue() instanceof Sequence){
83 createMenuItem(addMenu, "Single Read", selectedTreeNode, SingleRead.class, null, null);
84 }
85 //default
86 else{
87 MenuItem menuItem = new MenuItem(addMenu, SWT.NONE);
88 menuItem.setText("No child derivates");
89 menuItem.setEnabled(false);
90 }
91 }
92 }
93
94
95 }
96 };
97 return contributionItems;
98 }
99
100 private void createMenuItem(Menu menu, String menuLabel, TreeNode selectedNode, Class<?> childClass, SpecimenOrObservationType specimenType, DerivationEventType derivationEventType) {
101 MenuItem menuItem = new MenuItem(menu, SWT.NONE);
102 menuItem.setText(menuLabel);
103 menuItem.addSelectionListener(new WidgetSelectionListener(selectedNode, childClass, specimenType, derivationEventType));
104 }
105
106 private class WidgetSelectionListener extends SelectionAdapter{
107
108 private final TreeNode selectedNode;
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 private final DerivationEventType derivationEventType;
113
114 /**
115 * @param selectedNode
116 * @param specimenType
117 */
118 public WidgetSelectionListener(TreeNode selectedNode, Class<?> childClass, SpecimenOrObservationType specimenType, DerivationEventType derivationEventType) {
119 this.selectedNode = selectedNode;
120 this.childClass = childClass;
121 this.specimenType = specimenType;
122 this.derivationEventType = derivationEventType;
123 }
124
125 /* (non-Javadoc)
126 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
127 */
128 @Override
129 public void widgetSelected(SelectionEvent e) {
130 Object createdElement = null;
131 Object selectedDerivate = selectedNode.getValue();
132 if(selectedDerivate instanceof DnaSample && ((DnaSample) selectedDerivate).getRecordBasis()==SpecimenOrObservationType.DnaSample){
133 DnaSample dnaSample = (DnaSample)selectedDerivate;
134 if(childClass.equals(Sequence.class)){
135 Sequence newInstance = Sequence.NewInstance(dnaSample, "", 0);
136 createdElement = newInstance;
137 }
138 }
139 else if(selectedDerivate instanceof Sequence){
140 SingleRead newInstance = SingleRead.NewInstance();
141 ((Sequence) selectedDerivate).addSingleRead(newInstance);
142 createdElement = newInstance;
143 }
144 else if(selectedDerivate instanceof SpecimenOrObservationBase && DerivedUnit.class.isAssignableFrom(childClass)){
145 SpecimenOrObservationBase<?> specimenOrObservationBase = (SpecimenOrObservationBase<?>)selectedDerivate;
146 DerivedUnit derivedUnit;
147 if(childClass.equals(DnaSample.class)){
148 derivedUnit = DnaSample.NewInstance();
149 if(specimenType==SpecimenOrObservationType.DnaSample){
150 derivedUnit.setRecordBasis(SpecimenOrObservationType.DnaSample);
151 }
152 else if(specimenType==SpecimenOrObservationType.TissueSample){
153 derivedUnit.setRecordBasis(SpecimenOrObservationType.TissueSample);
154 }
155 }
156 else if(childClass.equals(MediaSpecimen.class)){
157 derivedUnit = MediaSpecimen.NewInstance(specimenType);
158 //a MediaSpecimen with no media attached does not make sense. Hence we add one
159 ((MediaSpecimen)derivedUnit).setMediaSpecimen(Media.NewInstance());
160 }
161 else{
162 derivedUnit = DerivedUnit.NewInstance(specimenType);
163 }
164 specimenOrObservationBase.addDerivationEvent(DerivationEvent.NewSimpleInstance(specimenOrObservationBase, derivedUnit, derivationEventType));
165 derivedUnit.setCacheStrategy(new DerivedUnitFacadeCacheStrategy());
166 derivedUnit.getTitleCache(); //update title cache
167 createdElement = derivedUnit;
168 }
169
170 //refresh view
171 IWorkbenchPart activePart = AbstractUtility.getActivePart();
172 if(activePart instanceof DerivateView){
173 DerivateView derivateView = (DerivateView)activePart;
174 derivateView.changed(null);
175 derivateView.refreshTree(createdElement);
176 }
177 }
178 }
179
180 }