Project

General

Profile

Download (13.7 KB) Statistics
| Branch: | Tag: | Revision:
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);
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
}
(1-1/3)