1 package eu
.etaxonomy
.taxeditor
.editor
.view
.derivate
.contextMenu
;
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
;
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
;
35 * Context menu for the creation of derivates in the derivate hierarchy.
38 public class CreateDerivateContextMenu
extends CompoundContributionItem
{
41 * @see org.eclipse.ui.actions.CompoundContributionItem#getContributionItems()
44 protected IContributionItem
[] getContributionItems() {
45 IContributionItem
[] contributionItems
= new IContributionItem
[] {
46 new ContributionItem() {
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());
65 //context menu for Specimen
66 else if(selectedTreeNode
.getValue() instanceof DerivedUnit
&& ((DerivedUnit
)selectedTreeNode
.getValue()).getRecordBasis()==SpecimenOrObservationType
.PreservedSpecimen
){
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());
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());
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());
82 //context menu for Sequence
83 else if(selectedTreeNode
.getValue() instanceof Sequence
){
84 createMenuItem(addMenu
, "Single Read", selectedTreeNode
, SingleRead
.class, null, null);
88 MenuItem menuItem
= new MenuItem(addMenu
, SWT
.NONE
);
89 menuItem
.setText("No child derivates");
90 menuItem
.setEnabled(false);
98 return contributionItems
;
101 private void createMenuItem(Menu menu
, String menuLabel
, final TreeNode selectedNode
, Class
<?
> childClass
, final SpecimenOrObservationType specimenType
, final DerivationEventType derivationEventType
) {
102 if(specimenType
.equals(SpecimenOrObservationType
.Media
)){
104 MenuItem mediaItem
= new MenuItem(menu
, SWT
.CASCADE
);
105 mediaItem
.setText("Media...");
106 Menu mediaMenu
= new Menu(menu
);
107 mediaItem
.setMenu(mediaMenu
);
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
));
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() {
119 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
122 public void widgetSelected(SelectionEvent e
) {
124 Media media
= MediaSelectionDialog
.select(AbstractUtility
.getShell(), null, null);
125 //create MediaSpecimen
126 MediaSpecimen mediaSpecimen
= MediaSpecimen
.NewInstance(specimenType
);
127 mediaSpecimen
.setMediaSpecimen(media
);
130 if(selectedNode
.getValue() instanceof SpecimenOrObservationBase
){
131 SpecimenOrObservationBase
<?
> specimenOrObservationBase
= (SpecimenOrObservationBase
<?
>)selectedNode
.getValue();
133 specimenOrObservationBase
.addDerivationEvent(DerivationEvent
.NewSimpleInstance(specimenOrObservationBase
, mediaSpecimen
, derivationEventType
));
134 mediaSpecimen
.setCacheStrategy(new DerivedUnitFacadeCacheStrategy());
135 mediaSpecimen
.getTitleCache(); //update title cache
139 DerivateView derivateView
= null;
140 if(AbstractUtility
.getActivePart() instanceof DerivateView
){
141 derivateView
= (DerivateView
) AbstractUtility
.getActivePart();
143 if(derivateView
!=null){
144 derivateView
.getConversationHolder().commit();
145 derivateView
.refreshTree(mediaSpecimen
);
151 MenuItem menuItem
= new MenuItem(menu
, SWT
.NONE
);
152 menuItem
.setText(menuLabel
);
153 menuItem
.addSelectionListener(new WidgetSelectionListener(selectedNode
, childClass
, specimenType
, derivationEventType
));
157 private class WidgetSelectionListener
extends SelectionAdapter
{
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
;
166 * @param selectedNode
167 * @param specimenType
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
;
177 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
180 public void widgetSelected(SelectionEvent e
) {
181 DerivateView derivateView
= null;
182 if(AbstractUtility
.getActivePart() instanceof DerivateView
){
183 derivateView
= (DerivateView
) AbstractUtility
.getActivePart();
185 if(derivateView
!=null){
186 if(derivateView
.isDirty()){
188 MessagingUtils
.warningDialog("View has unsaved changes", this, "You need to save before performing this action");
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
;
202 else if(selectedDerivate
instanceof Sequence
){
203 SingleRead newInstance
= SingleRead
.NewInstance();
204 ((Sequence
) selectedDerivate
).addSingleRead(newInstance
);
205 createdElement
= newInstance
;
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
);
215 else if(specimenType
==SpecimenOrObservationType
.TissueSample
){
216 derivedUnit
.setRecordBasis(SpecimenOrObservationType
.TissueSample
);
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());
225 derivedUnit
= DerivedUnit
.NewInstance(specimenType
);
227 specimenOrObservationBase
.addDerivationEvent(DerivationEvent
.NewSimpleInstance(specimenOrObservationBase
, derivedUnit
, derivationEventType
));
228 derivedUnit
.setCacheStrategy(new DerivedUnitFacadeCacheStrategy());
229 derivedUnit
.getTitleCache(); //update title cache
230 createdElement
= derivedUnit
;
234 if(derivateView
!=null){
235 derivateView
.getConversationHolder().commit();
236 derivateView
.refreshTree(createdElement
);