#5234 Add correct updated objects to change event
[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.IWorkbenchWindow;
13 import org.eclipse.ui.PlatformUI;
14 import org.eclipse.ui.actions.CompoundContributionItem;
15
16 import eu.etaxonomy.cdm.api.application.CdmApplicationState;
17 import eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeCacheStrategy;
18 import eu.etaxonomy.cdm.api.service.IOccurrenceService;
19 import eu.etaxonomy.cdm.model.media.Media;
20 import eu.etaxonomy.cdm.model.molecular.DnaSample;
21 import eu.etaxonomy.cdm.model.molecular.Sequence;
22 import eu.etaxonomy.cdm.model.molecular.SingleRead;
23 import eu.etaxonomy.cdm.model.occurrence.DerivationEvent;
24 import eu.etaxonomy.cdm.model.occurrence.DerivationEventType;
25 import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
26 import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
27 import eu.etaxonomy.cdm.model.occurrence.MediaSpecimen;
28 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
29 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
30 import eu.etaxonomy.taxeditor.editor.EditorUtil;
31 import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView;
32 import eu.etaxonomy.taxeditor.model.AbstractUtility;
33 import eu.etaxonomy.taxeditor.model.MessagingUtils;
34 import eu.etaxonomy.taxeditor.store.CdmStore;
35 import eu.etaxonomy.taxeditor.ui.dialog.selection.MediaSelectionDialog;
36
37 /**
38 * Context menu for the creation of derivates in the derivate hierarchy.
39 *
40 */
41 public class CreateDerivateContextMenu extends CompoundContributionItem {
42
43 @Override
44 protected IContributionItem[] getContributionItems() {
45 IContributionItem[] contributionItems = new IContributionItem[] {
46 new ContributionItem() {
47 @Override
48 public void fill(Menu menu, int index) {
49 MenuItem addItem = new MenuItem(menu, SWT.CASCADE);
50 addItem.setText("Add...");
51 Menu addMenu = new Menu(menu);
52 addItem.setMenu(addMenu);
53 final IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
54 final ISelection selection = window.getActivePage().getSelection();
55 TreeNode selectedTreeNode = EditorUtil.getTreeNodeOfSelection(selection);
56 if(selectedTreeNode!=null){
57 //context menu for FieldUnit
58 if(selectedTreeNode.getValue() instanceof FieldUnit){
59 createMenuItem(addMenu, "Specimen", selectedTreeNode, DerivedUnit.class, SpecimenOrObservationType.PreservedSpecimen, DerivationEventType.GATHERING_IN_SITU());
60 new MenuItem(addMenu, SWT.SEPARATOR);
61 createMenuItem(addMenu, "Tissue Sample", selectedTreeNode, DnaSample.class, SpecimenOrObservationType.TissueSample, DerivationEventType.PREPARATION());
62 createMenuItem(addMenu, "DNA Sample", selectedTreeNode, DnaSample.class, SpecimenOrObservationType.DnaSample, DerivationEventType.DNA_EXTRACTION());
63 createMenuItem(addMenu, "Media Specimen", selectedTreeNode, MediaSpecimen.class, SpecimenOrObservationType.Media, DerivationEventType.ACCESSIONING());
64 }
65 //context menu for Specimen
66 else if(selectedTreeNode.getValue() instanceof DerivedUnit && ((DerivedUnit)selectedTreeNode.getValue()).getRecordBasis()==SpecimenOrObservationType.PreservedSpecimen){
67
68 createMenuItem(addMenu, "Tissue Sample", selectedTreeNode, DnaSample.class, SpecimenOrObservationType.TissueSample, DerivationEventType.PREPARATION());
69 createMenuItem(addMenu, "DNA Sample", selectedTreeNode, DnaSample.class, SpecimenOrObservationType.DnaSample, DerivationEventType.DNA_EXTRACTION());
70 createMenuItem(addMenu, "Media Specimen", selectedTreeNode, MediaSpecimen.class, SpecimenOrObservationType.Media, DerivationEventType.ACCESSIONING());
71 }
72 //context menu for TissueSample
73 else if(selectedTreeNode.getValue() instanceof DnaSample && ((DnaSample)selectedTreeNode.getValue()).getRecordBasis()==SpecimenOrObservationType.TissueSample){
74 createMenuItem(addMenu, "DnaSample", selectedTreeNode, DnaSample.class, SpecimenOrObservationType.DnaSample, DerivationEventType.DNA_EXTRACTION());
75 createMenuItem(addMenu, "Media Specimen", selectedTreeNode, MediaSpecimen.class, SpecimenOrObservationType.Media, DerivationEventType.ACCESSIONING());
76 }
77 //context menu for DnaSample
78 else if(selectedTreeNode.getValue() instanceof DnaSample && ((DnaSample)selectedTreeNode.getValue()).getRecordBasis()==SpecimenOrObservationType.DnaSample){
79 createMenuItem(addMenu, "Consensus Sequence", selectedTreeNode, Sequence.class, null, null);
80 createMenuItem(addMenu, "Media Specimen", selectedTreeNode, MediaSpecimen.class, SpecimenOrObservationType.Media, DerivationEventType.ACCESSIONING());
81 }
82 //context menu for Sequence
83 else if(selectedTreeNode.getValue() instanceof Sequence){
84 createMenuItem(addMenu, "Single Read", selectedTreeNode, SingleRead.class, null, null);
85 }
86 //default
87 else{
88 MenuItem menuItem = new MenuItem(addMenu, SWT.NONE);
89 menuItem.setText("No child derivates");
90 menuItem.setEnabled(false);
91 }
92 }
93 }
94
95
96 }
97 };
98 return contributionItems;
99 }
100
101 private void createMenuItem(Menu menu, String menuLabel, final TreeNode selectedNode, Class<?> childClass, final SpecimenOrObservationType specimenType, final DerivationEventType derivationEventType) {
102 if(specimenType!=null && specimenType.equals(SpecimenOrObservationType.Media)){
103 //media submenu
104 MenuItem mediaItem = new MenuItem(menu, SWT.CASCADE);
105 mediaItem.setText("Media...");
106 Menu mediaMenu = new Menu(menu);
107 mediaItem.setMenu(mediaMenu);
108
109 //media specimen menu
110 MenuItem menuItem = new MenuItem(mediaMenu, SWT.NONE);
111 menuItem.setText(menuLabel);
112 menuItem.addSelectionListener(new WidgetSelectionListener(selectedNode, childClass, specimenType, derivationEventType));
113
114 //existing media menu
115 MenuItem existingMediaItem = new MenuItem(mediaMenu, SWT.NONE);
116 existingMediaItem.setText("Media Specimen with existing media");
117 existingMediaItem.addSelectionListener(new SelectionAdapter() {
118 @Override
119 public void widgetSelected(SelectionEvent e) {
120 //select media
121 Media media = MediaSelectionDialog.select(AbstractUtility.getShell(), null, null);
122 //create MediaSpecimen
123 MediaSpecimen mediaSpecimen = MediaSpecimen.NewInstance(specimenType);
124 mediaSpecimen.setMediaSpecimen(media);
125
126 //attach to parent
127 if(selectedNode.getValue() instanceof SpecimenOrObservationBase){
128 SpecimenOrObservationBase<?> specimenOrObservationBase = (SpecimenOrObservationBase<?>)selectedNode.getValue();
129
130 specimenOrObservationBase.addDerivationEvent(DerivationEvent.NewSimpleInstance(specimenOrObservationBase, mediaSpecimen, derivationEventType));
131 mediaSpecimen.setCacheStrategy(new DerivedUnitFacadeCacheStrategy());
132 mediaSpecimen.getTitleCache(); //update title cache
133 CdmStore.getService(IOccurrenceService.class).merge(specimenOrObservationBase);
134 }
135
136 //refresh view
137 DerivateView derivateView = null;
138 if(AbstractUtility.getActivePart() instanceof DerivateView){
139 derivateView = (DerivateView) AbstractUtility.getActivePart();
140 }
141 if(derivateView!=null){
142
143 derivateView.getConversationHolder().commit();
144 derivateView.refreshTree(mediaSpecimen);
145 }
146 }
147 });
148 }
149 else{
150 MenuItem menuItem = new MenuItem(menu, SWT.NONE);
151 menuItem.setText(menuLabel);
152 menuItem.addSelectionListener(new WidgetSelectionListener(selectedNode, childClass, specimenType, derivationEventType));
153 }
154 }
155
156 private class WidgetSelectionListener extends SelectionAdapter{
157
158 private final TreeNode selectedNode;
159 //TODO: we need a common interface for the generic like e.g. "IDerivateHierarchyNode"
160 private final Class<?> childClass;
161 private final SpecimenOrObservationType specimenType;
162 private final DerivationEventType derivationEventType;
163
164 /**
165 * @param selectedNode
166 * @param specimenType
167 */
168 public WidgetSelectionListener(TreeNode selectedNode, Class<?> childClass, SpecimenOrObservationType specimenType, DerivationEventType derivationEventType) {
169 this.selectedNode = selectedNode;
170 this.childClass = childClass;
171 this.specimenType = specimenType;
172 this.derivationEventType = derivationEventType;
173 }
174
175 @Override
176 public void widgetSelected(SelectionEvent e) {
177 DerivateView derivateView = null;
178 if(AbstractUtility.getActivePart() instanceof DerivateView){
179 derivateView = (DerivateView) AbstractUtility.getActivePart();
180 }
181 if(derivateView!=null){
182 if(derivateView.isDirty()){
183 e.doit = false;
184 MessagingUtils.warningDialog("View has unsaved changes", this, "You need to save before performing this action");
185 return;
186 }
187 }
188
189 Object createdElement = null;
190 Object selectedDerivate = selectedNode.getValue();
191 if(selectedDerivate instanceof DnaSample && ((DnaSample) selectedDerivate).getRecordBasis()==SpecimenOrObservationType.DnaSample){
192 DnaSample dnaSample = (DnaSample)selectedDerivate;
193 if(childClass.equals(Sequence.class)){
194 Sequence newInstance = Sequence.NewInstance(dnaSample, "", 0);
195 createdElement = newInstance;
196 }
197 CdmStore.getService(IOccurrenceService.class).merge((SpecimenOrObservationBase) selectedDerivate);
198 }
199 else if(selectedDerivate instanceof Sequence){
200 SingleRead newInstance = SingleRead.NewInstance();
201 ((Sequence) selectedDerivate).addSingleRead(newInstance);
202 createdElement = newInstance;
203 CdmApplicationState.getCurrentAppConfig().getSequenceService().merge((Sequence)selectedDerivate);
204 }
205 else if(selectedDerivate instanceof SpecimenOrObservationBase && DerivedUnit.class.isAssignableFrom(childClass)){
206 SpecimenOrObservationBase<?> specimenOrObservationBase = (SpecimenOrObservationBase<?>)selectedDerivate;
207 DerivedUnit derivedUnit;
208 if(childClass.equals(DnaSample.class)){
209 derivedUnit = DnaSample.NewInstance();
210 if(specimenType==SpecimenOrObservationType.DnaSample){
211 derivedUnit.setRecordBasis(SpecimenOrObservationType.DnaSample);
212 }
213 else if(specimenType==SpecimenOrObservationType.TissueSample){
214 derivedUnit.setRecordBasis(SpecimenOrObservationType.TissueSample);
215 }
216 }
217 else if(childClass.equals(MediaSpecimen.class)){
218 derivedUnit = MediaSpecimen.NewInstance(specimenType);
219 //a MediaSpecimen with no media attached does not make sense. Hence we add one
220 ((MediaSpecimen)derivedUnit).setMediaSpecimen(Media.NewInstance());
221 }
222 else{
223 derivedUnit = DerivedUnit.NewInstance(specimenType);
224 }
225 specimenOrObservationBase.addDerivationEvent(DerivationEvent.NewSimpleInstance(specimenOrObservationBase, derivedUnit, derivationEventType));
226 derivedUnit.setCacheStrategy(new DerivedUnitFacadeCacheStrategy());
227 derivedUnit.getTitleCache(); //update title cache
228 createdElement = derivedUnit;
229 CdmStore.getService(IOccurrenceService.class).merge((SpecimenOrObservationBase) selectedDerivate);
230 }
231
232 //refresh view
233 if(derivateView!=null){
234 //CdmStore.getService(IOccurrenceService.class).merge((SpecimenOrObservationBase) selectedDerivate);
235 derivateView.getConversationHolder().commit();
236 derivateView.refreshTree(createdElement);
237 }
238 }
239 }
240
241 }