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
.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
.Messages
;
32 import eu
.etaxonomy
.taxeditor
.editor
.view
.derivate
.DerivateView
;
33 import eu
.etaxonomy
.taxeditor
.model
.AbstractUtility
;
34 import eu
.etaxonomy
.taxeditor
.model
.MessagingUtils
;
35 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
36 import eu
.etaxonomy
.taxeditor
.ui
.dialog
.selection
.MediaSelectionDialog
;
39 * Context menu for the creation of derivates in the derivate hierarchy.
42 public class CreateDerivateContextMenu
extends CompoundContributionItem
{
44 private static final String SINGLE_READ
= Messages
.CreateDerivateContextMenu_SINGLE_READ
;
45 private static final String CONSENSUS_SEQUENCE
= Messages
.CreateDerivateContextMenu_SEQUENCE
;
46 private static final String MEDIA_SPECIMEN
= Messages
.CreateDerivateContextMenu_MEDIA_SPECIMEN
;
47 private static final String DNA_SAMPLE
= Messages
.CreateDerivateContextMenu_DNA_SAMPLE
;
48 private static final String TISSUE_SAMPLE
= Messages
.CreateDerivateContextMenu_TISSUE_SAMPLE
;
49 private static final String SPECIMEN
= Messages
.CreateDerivateContextMenu_SPECIMEN
;
52 protected IContributionItem
[] getContributionItems() {
53 IContributionItem
[] contributionItems
= new IContributionItem
[] {
54 new ContributionItem() {
56 public void fill(Menu menu
, int index
) {
57 MenuItem addItem
= new MenuItem(menu
, SWT
.CASCADE
);
58 addItem
.setText(Messages
.CreateDerivateContextMenu_ADD
);
59 Menu addMenu
= new Menu(menu
);
60 addItem
.setMenu(addMenu
);
61 final IWorkbenchWindow window
= PlatformUI
.getWorkbench().getActiveWorkbenchWindow();
62 final ISelection selection
= window
.getActivePage().getSelection();
63 TreeNode selectedTreeNode
= EditorUtil
.getTreeNodeOfSelection(selection
);
64 if(selectedTreeNode
!=null){
65 //context menu for FieldUnit
66 if(selectedTreeNode
.getValue() instanceof FieldUnit
){
67 createMenuItem(addMenu
, SPECIMEN
, selectedTreeNode
, DerivedUnit
.class, SpecimenOrObservationType
.PreservedSpecimen
, DerivationEventType
.GATHERING_IN_SITU());
68 new MenuItem(addMenu
, SWT
.SEPARATOR
);
69 createMenuItem(addMenu
, TISSUE_SAMPLE
, selectedTreeNode
, DnaSample
.class, SpecimenOrObservationType
.TissueSample
, DerivationEventType
.PREPARATION());
70 createMenuItem(addMenu
, DNA_SAMPLE
, selectedTreeNode
, DnaSample
.class, SpecimenOrObservationType
.DnaSample
, DerivationEventType
.DNA_EXTRACTION());
71 createMenuItem(addMenu
, MEDIA_SPECIMEN
, selectedTreeNode
, MediaSpecimen
.class, SpecimenOrObservationType
.Media
, DerivationEventType
.ACCESSIONING());
74 //context menu for Specimen
75 else if(selectedTreeNode
.getValue() instanceof DerivedUnit
&& ((DerivedUnit
)selectedTreeNode
.getValue()).getRecordBasis()==SpecimenOrObservationType
.PreservedSpecimen
){
77 createMenuItem(addMenu
, TISSUE_SAMPLE
, selectedTreeNode
, DnaSample
.class, SpecimenOrObservationType
.TissueSample
, DerivationEventType
.PREPARATION());
78 createMenuItem(addMenu
, DNA_SAMPLE
, selectedTreeNode
, DnaSample
.class, SpecimenOrObservationType
.DnaSample
, DerivationEventType
.DNA_EXTRACTION());
79 createMenuItem(addMenu
, MEDIA_SPECIMEN
, selectedTreeNode
, MediaSpecimen
.class, SpecimenOrObservationType
.Media
, DerivationEventType
.ACCESSIONING());
82 //context menu for TissueSample
83 else if(selectedTreeNode
.getValue() instanceof DnaSample
&& ((DnaSample
)selectedTreeNode
.getValue()).getRecordBasis()==SpecimenOrObservationType
.TissueSample
){
84 createMenuItem(addMenu
, DNA_SAMPLE
, selectedTreeNode
, DnaSample
.class, SpecimenOrObservationType
.DnaSample
, DerivationEventType
.DNA_EXTRACTION());
85 createMenuItem(addMenu
, MEDIA_SPECIMEN
, selectedTreeNode
, MediaSpecimen
.class, SpecimenOrObservationType
.Media
, DerivationEventType
.ACCESSIONING());
88 //context menu for DnaSample
89 else if(selectedTreeNode
.getValue() instanceof DnaSample
&& ((DnaSample
)selectedTreeNode
.getValue()).getRecordBasis()==SpecimenOrObservationType
.DnaSample
){
90 createMenuItem(addMenu
, CONSENSUS_SEQUENCE
, selectedTreeNode
, Sequence
.class, null, null);
91 createMenuItem(addMenu
, MEDIA_SPECIMEN
, selectedTreeNode
, MediaSpecimen
.class, SpecimenOrObservationType
.Media
, DerivationEventType
.ACCESSIONING());
94 //context menu for Sequence
95 else if(selectedTreeNode
.getValue() instanceof Sequence
){
96 createMenuItem(addMenu
, SINGLE_READ
, selectedTreeNode
, SingleRead
.class, null, null);
100 MenuItem menuItem
= new MenuItem(addMenu
, SWT
.NONE
);
101 menuItem
.setText(Messages
.CreateDerivateContextMenu_NO_CHILD_DERIVATE
);
102 menuItem
.setEnabled(false);
108 return contributionItems
;
111 private void createMenuItem(Menu menu
, String menuLabel
, final TreeNode selectedNode
, Class
<?
> childClass
, final SpecimenOrObservationType specimenType
, final DerivationEventType derivationEventType
) {
112 if(specimenType
!=null && specimenType
.equals(SpecimenOrObservationType
.Media
)){
114 MenuItem mediaItem
= new MenuItem(menu
, SWT
.CASCADE
);
115 mediaItem
.setText(Messages
.CreateDerivateContextMenu_MEDIA
);
116 Menu mediaMenu
= new Menu(menu
);
117 mediaItem
.setMenu(mediaMenu
);
119 //media specimen menu
120 MenuItem menuItem
= new MenuItem(mediaMenu
, SWT
.NONE
);
121 menuItem
.setText(menuLabel
);
122 menuItem
.addSelectionListener(new WidgetSelectionListener(selectedNode
, childClass
, specimenType
, derivationEventType
));
124 //existing media menu
125 MenuItem existingMediaItem
= new MenuItem(mediaMenu
, SWT
.NONE
);
126 existingMediaItem
.setText(Messages
.CreateDerivateContextMenu_MEDIA_EXISTING
);
127 existingMediaItem
.addSelectionListener(new SelectionAdapter() {
129 public void widgetSelected(SelectionEvent e
) {
131 Media media
= MediaSelectionDialog
.select(AbstractUtility
.getShell(), null, null);
133 //create MediaSpecimen
134 MediaSpecimen mediaSpecimen
= MediaSpecimen
.NewInstance(specimenType
);
135 mediaSpecimen
.setMediaSpecimen(media
);
138 if(selectedNode
.getValue() instanceof SpecimenOrObservationBase
){
139 SpecimenOrObservationBase
<?
> specimenOrObservationBase
= (SpecimenOrObservationBase
<?
>)selectedNode
.getValue();
141 specimenOrObservationBase
.addDerivationEvent(DerivationEvent
.NewSimpleInstance(specimenOrObservationBase
, mediaSpecimen
, derivationEventType
));
142 mediaSpecimen
.setCacheStrategy(new DerivedUnitFacadeCacheStrategy());
143 mediaSpecimen
.getTitleCache(); //update title cache
144 if(CdmStore
.getCurrentSessionManager().isRemoting()) {
145 CdmStore
.getService(IOccurrenceService
.class).merge(specimenOrObservationBase
, true);
150 DerivateView derivateView
= null;
151 if(AbstractUtility
.getActivePart() instanceof DerivateView
){
152 derivateView
= (DerivateView
) AbstractUtility
.getActivePart();
154 if(derivateView
!=null){
156 derivateView
.getConversationHolder().commit();
157 derivateView
.refreshTree(mediaSpecimen
);
164 MenuItem menuItem
= new MenuItem(menu
, SWT
.NONE
);
165 menuItem
.setText(menuLabel
);
166 menuItem
.addSelectionListener(new WidgetSelectionListener(selectedNode
, childClass
, specimenType
, derivationEventType
));
170 private class WidgetSelectionListener
extends SelectionAdapter
{
172 private final TreeNode selectedNode
;
173 //TODO: we need a common interface for the generic like e.g. "IDerivateHierarchyNode"
174 private final Class
<?
> childClass
;
175 private final SpecimenOrObservationType specimenType
;
176 private final DerivationEventType derivationEventType
;
179 * @param selectedNode
180 * @param specimenType
182 public WidgetSelectionListener(TreeNode selectedNode
, Class
<?
> childClass
, SpecimenOrObservationType specimenType
, DerivationEventType derivationEventType
) {
183 this.selectedNode
= selectedNode
;
184 this.childClass
= childClass
;
185 this.specimenType
= specimenType
;
186 this.derivationEventType
= derivationEventType
;
190 public void widgetSelected(SelectionEvent e
) {
191 DerivateView derivateView
= null;
192 if(AbstractUtility
.getActivePart() instanceof DerivateView
){
193 derivateView
= (DerivateView
) AbstractUtility
.getActivePart();
195 if(derivateView
!=null){
196 if(derivateView
.isDirty()){
198 MessagingUtils
.warningDialog(DerivateView
.VIEW_HAS_UNSAVED_CHANGES
, this, DerivateView
.YOU_NEED_TO_SAVE_BEFORE_PERFORMING_THIS_ACTION
);
203 Object createdElement
= null;
204 Object selectedDerivate
= selectedNode
.getValue();
205 if(selectedDerivate
instanceof DnaSample
&& ((DnaSample
) selectedDerivate
).getRecordBasis()==SpecimenOrObservationType
.DnaSample
){
206 DnaSample dnaSample
= (DnaSample
)selectedDerivate
;
207 if(childClass
.equals(Sequence
.class)){
208 Sequence newInstance
= Sequence
.NewInstance(dnaSample
, "", 0); //$NON-NLS-1$
209 createdElement
= newInstance
;
211 if(CdmStore
.getCurrentSessionManager().isRemoting()) {
212 CdmStore
.getService(IOccurrenceService
.class).merge((SpecimenOrObservationBase
) selectedDerivate
, true);
215 else if(selectedDerivate
instanceof Sequence
){
216 SingleRead newInstance
= SingleRead
.NewInstance();
217 ((Sequence
) selectedDerivate
).addSingleRead(newInstance
);
218 createdElement
= newInstance
;
219 if(CdmStore
.getCurrentSessionManager().isRemoting()) {
220 CdmApplicationState
.getCurrentAppConfig().getSequenceService().merge((Sequence
)selectedDerivate
, true);
223 if(selectedDerivate
instanceof SpecimenOrObservationBase
&& DerivedUnit
.class.isAssignableFrom(childClass
)){
224 SpecimenOrObservationBase
<?
> specimenOrObservationBase
= (SpecimenOrObservationBase
<?
>)selectedDerivate
;
225 DerivedUnit derivedUnit
;
226 if(childClass
.equals(DnaSample
.class)){
227 derivedUnit
= DnaSample
.NewInstance();
228 if(specimenType
==SpecimenOrObservationType
.DnaSample
){
229 derivedUnit
.setRecordBasis(SpecimenOrObservationType
.DnaSample
);
231 else if(specimenType
==SpecimenOrObservationType
.TissueSample
){
232 derivedUnit
.setRecordBasis(SpecimenOrObservationType
.TissueSample
);
235 else if(childClass
.equals(MediaSpecimen
.class)){
236 derivedUnit
= MediaSpecimen
.NewInstance(specimenType
);
237 //a MediaSpecimen with no media attached does not make sense. Hence we add one
238 ((MediaSpecimen
)derivedUnit
).setMediaSpecimen(Media
.NewInstance());
241 derivedUnit
= DerivedUnit
.NewInstance(specimenType
);
243 specimenOrObservationBase
.addDerivationEvent(DerivationEvent
.NewSimpleInstance(specimenOrObservationBase
, derivedUnit
, derivationEventType
));
244 derivedUnit
.setCacheStrategy(new DerivedUnitFacadeCacheStrategy());
245 derivedUnit
.getTitleCache(); //update title cache
246 createdElement
= derivedUnit
;
247 if(CdmStore
.getCurrentSessionManager().isRemoting()) {
248 CdmStore
.getService(IOccurrenceService
.class).merge((SpecimenOrObservationBase
) selectedDerivate
, true);
253 if(derivateView
!=null){
254 derivateView
.getConversationHolder().commit();
255 derivateView
.refreshTree(createdElement
);