Project

General

Profile

Download (13.4 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.view.derivate.DerivateView;
30
import eu.etaxonomy.taxeditor.model.AbstractUtility;
31
import eu.etaxonomy.taxeditor.model.MessagingUtils;
32
import eu.etaxonomy.taxeditor.ui.dialog.selection.MediaSelectionDialog;
33

    
34
/**
35
 * Context menu for the creation of derivates in the derivate hierarchy.
36
 *
37
 */
38
public class CreateDerivateContextMenu extends CompoundContributionItem {
39

    
40
    /* (non-Javadoc)
41
     * @see org.eclipse.ui.actions.CompoundContributionItem#getContributionItems()
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
                /* (non-Javadoc)
119
                 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
120
                 */
121
                @Override
122
                public void widgetSelected(SelectionEvent e) {
123
                    //select media
124
                    Media media = MediaSelectionDialog.select(AbstractUtility.getShell(), null, null);
125
                    //create MediaSpecimen
126
                    MediaSpecimen mediaSpecimen = MediaSpecimen.NewInstance(specimenType);
127
                    mediaSpecimen.setMediaSpecimen(media);
128

    
129
                    //attach to parent
130
                    if(selectedNode.getValue() instanceof SpecimenOrObservationBase){
131
                        SpecimenOrObservationBase<?> specimenOrObservationBase = (SpecimenOrObservationBase<?>)selectedNode.getValue();
132

    
133
                        specimenOrObservationBase.addDerivationEvent(DerivationEvent.NewSimpleInstance(specimenOrObservationBase, mediaSpecimen, derivationEventType));
134
                        mediaSpecimen.setCacheStrategy(new DerivedUnitFacadeCacheStrategy());
135
                        mediaSpecimen.getTitleCache(); //update title cache
136
                    }
137

    
138
                    //refresh view
139
                    DerivateView derivateView = null;
140
                    if(AbstractUtility.getActivePart() instanceof DerivateView){
141
                        derivateView = (DerivateView) AbstractUtility.getActivePart();
142
                    }
143
                    if(derivateView!=null){
144
                        derivateView.getConversationHolder().commit();
145
                        derivateView.refreshTree(mediaSpecimen);
146
                    }
147
                }
148
            });
149
        }
150
        else{
151
            MenuItem menuItem = new MenuItem(menu, SWT.NONE);
152
            menuItem.setText(menuLabel);
153
            menuItem.addSelectionListener(new WidgetSelectionListener(selectedNode, childClass, specimenType, derivationEventType));
154
        }
155
    }
156

    
157
    private class WidgetSelectionListener extends SelectionAdapter{
158

    
159
        private final TreeNode selectedNode;
160
        //TODO: we need a common interface for the generic like e.g. "IDerivateHierarchyNode"
161
        private final Class<?> childClass;
162
        private final SpecimenOrObservationType specimenType;
163
        private final DerivationEventType derivationEventType;
164

    
165
        /**
166
         * @param selectedNode
167
         * @param specimenType
168
         */
169
        public WidgetSelectionListener(TreeNode selectedNode, Class<?> childClass, SpecimenOrObservationType specimenType, DerivationEventType derivationEventType) {
170
            this.selectedNode = selectedNode;
171
            this.childClass = childClass;
172
            this.specimenType = specimenType;
173
            this.derivationEventType = derivationEventType;
174
        }
175

    
176
        /* (non-Javadoc)
177
         * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
178
         */
179
        @Override
180
        public void widgetSelected(SelectionEvent e) {
181
            DerivateView derivateView = null;
182
            if(AbstractUtility.getActivePart() instanceof DerivateView){
183
                derivateView = (DerivateView) AbstractUtility.getActivePart();
184
            }
185
            if(derivateView!=null){
186
                if(derivateView.isDirty()){
187
                    e.doit = false;
188
                    MessagingUtils.warningDialog("View has unsaved changes", this, "You need to save before performing this action");
189
                    return;
190
                }
191
            }
192

    
193
            Object createdElement = null;
194
            Object selectedDerivate = selectedNode.getValue();
195
            if(selectedDerivate instanceof DnaSample && ((DnaSample) selectedDerivate).getRecordBasis()==SpecimenOrObservationType.DnaSample){
196
                DnaSample dnaSample = (DnaSample)selectedDerivate;
197
                if(childClass.equals(Sequence.class)){
198
                    Sequence newInstance = Sequence.NewInstance(dnaSample, "", 0);
199
                    createdElement = newInstance;
200
                }
201
            }
202
            else if(selectedDerivate instanceof Sequence){
203
                SingleRead newInstance = SingleRead.NewInstance();
204
                ((Sequence) selectedDerivate).addSingleRead(newInstance);
205
                createdElement = newInstance;
206
            }
207
            else if(selectedDerivate instanceof SpecimenOrObservationBase && DerivedUnit.class.isAssignableFrom(childClass)){
208
                SpecimenOrObservationBase<?> specimenOrObservationBase = (SpecimenOrObservationBase<?>)selectedDerivate;
209
                DerivedUnit derivedUnit;
210
                if(childClass.equals(DnaSample.class)){
211
                    derivedUnit = DnaSample.NewInstance();
212
                    if(specimenType==SpecimenOrObservationType.DnaSample){
213
                        derivedUnit.setRecordBasis(SpecimenOrObservationType.DnaSample);
214
                    }
215
                    else if(specimenType==SpecimenOrObservationType.TissueSample){
216
                        derivedUnit.setRecordBasis(SpecimenOrObservationType.TissueSample);
217
                    }
218
                }
219
                else if(childClass.equals(MediaSpecimen.class)){
220
                    derivedUnit = MediaSpecimen.NewInstance(specimenType);
221
                    //a MediaSpecimen with no media attached does not make sense. Hence we add one
222
                    ((MediaSpecimen)derivedUnit).setMediaSpecimen(Media.NewInstance());
223
                }
224
                else{
225
                    derivedUnit = DerivedUnit.NewInstance(specimenType);
226
                }
227
                specimenOrObservationBase.addDerivationEvent(DerivationEvent.NewSimpleInstance(specimenOrObservationBase, derivedUnit, derivationEventType));
228
                derivedUnit.setCacheStrategy(new DerivedUnitFacadeCacheStrategy());
229
                derivedUnit.getTitleCache(); //update title cache
230
                createdElement = derivedUnit;
231
            }
232

    
233
            //refresh view
234
            if(derivateView!=null){
235
                derivateView.getConversationHolder().commit();
236
                derivateView.refreshTree(createdElement);
237
            }
238
        }
239
    }
240

    
241
}
(1-1/3)