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