+++ /dev/null
-package eu.etaxonomy.taxeditor.editor.view.derivate.contextMenu;
-
-import org.eclipse.jface.action.ContributionItem;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.TreeNode;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.CompoundContributionItem;
-
-import eu.etaxonomy.cdm.api.application.CdmApplicationState;
-import eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeCacheStrategy;
-import eu.etaxonomy.cdm.api.service.IOccurrenceService;
-import eu.etaxonomy.cdm.model.media.Media;
-import eu.etaxonomy.cdm.model.molecular.DnaSample;
-import eu.etaxonomy.cdm.model.molecular.Sequence;
-import eu.etaxonomy.cdm.model.molecular.SingleRead;
-import eu.etaxonomy.cdm.model.occurrence.DerivationEvent;
-import eu.etaxonomy.cdm.model.occurrence.DerivationEventType;
-import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
-import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
-import eu.etaxonomy.cdm.model.occurrence.MediaSpecimen;
-import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
-import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
-import eu.etaxonomy.taxeditor.editor.EditorUtil;
-import eu.etaxonomy.taxeditor.editor.l10n.Messages;
-import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView;
-import eu.etaxonomy.taxeditor.model.AbstractUtility;
-import eu.etaxonomy.taxeditor.model.MessagingUtils;
-import eu.etaxonomy.taxeditor.store.CdmStore;
-import eu.etaxonomy.taxeditor.ui.dialog.selection.MediaSelectionDialog;
-
-/**
- * Context menu for the creation of derivates in the derivate hierarchy.
- *
- */
-public class CreateDerivateContextMenu extends CompoundContributionItem {
-
- private static final String SINGLE_READ = Messages.CreateDerivateContextMenu_SINGLE_READ;
- private static final String CONSENSUS_SEQUENCE = Messages.CreateDerivateContextMenu_SEQUENCE;
- private static final String MEDIA_SPECIMEN = Messages.CreateDerivateContextMenu_MEDIA_SPECIMEN;
- private static final String DNA_SAMPLE = Messages.CreateDerivateContextMenu_DNA_SAMPLE;
- private static final String TISSUE_SAMPLE = Messages.CreateDerivateContextMenu_TISSUE_SAMPLE;
- private static final String SPECIMEN = Messages.CreateDerivateContextMenu_SPECIMEN;
-
- @Override
- protected IContributionItem[] getContributionItems() {
- IContributionItem[] contributionItems = new IContributionItem[] {
- new ContributionItem() {
- @Override
- public void fill(Menu menu, int index) {
- MenuItem addItem = new MenuItem(menu, SWT.CASCADE);
- addItem.setText(Messages.CreateDerivateContextMenu_ADD);
- Menu addMenu = new Menu(menu);
- addItem.setMenu(addMenu);
- final IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
- final ISelection selection = window.getActivePage().getSelection();
- TreeNode selectedTreeNode = EditorUtil.getTreeNodeOfSelection(selection);
- if(selectedTreeNode!=null){
- //context menu for FieldUnit
- if(selectedTreeNode.getValue() instanceof FieldUnit){
- createMenuItem(addMenu, SPECIMEN, selectedTreeNode, DerivedUnit.class, SpecimenOrObservationType.PreservedSpecimen, DerivationEventType.GATHERING_IN_SITU());
- new MenuItem(addMenu, SWT.SEPARATOR);
- createMenuItem(addMenu, TISSUE_SAMPLE, selectedTreeNode, DnaSample.class, SpecimenOrObservationType.TissueSample, DerivationEventType.PREPARATION());
- createMenuItem(addMenu, DNA_SAMPLE, selectedTreeNode, DnaSample.class, SpecimenOrObservationType.DnaSample, DerivationEventType.DNA_EXTRACTION());
- createMenuItem(addMenu, MEDIA_SPECIMEN, selectedTreeNode, MediaSpecimen.class, SpecimenOrObservationType.StillImage, DerivationEventType.ACCESSIONING());
- return;
- }
- //context menu for Specimen
- else if(selectedTreeNode.getValue() instanceof DerivedUnit && ((DerivedUnit)selectedTreeNode.getValue()).getRecordBasis()==SpecimenOrObservationType.PreservedSpecimen){
-
- createMenuItem(addMenu, TISSUE_SAMPLE, selectedTreeNode, DnaSample.class, SpecimenOrObservationType.TissueSample, DerivationEventType.PREPARATION());
- createMenuItem(addMenu, DNA_SAMPLE, selectedTreeNode, DnaSample.class, SpecimenOrObservationType.DnaSample, DerivationEventType.DNA_EXTRACTION());
- createMenuItem(addMenu, MEDIA_SPECIMEN, selectedTreeNode, MediaSpecimen.class, SpecimenOrObservationType.StillImage, DerivationEventType.ACCESSIONING());
- return;
- }
- //context menu for TissueSample
- else if(selectedTreeNode.getValue() instanceof DnaSample && ((DnaSample)selectedTreeNode.getValue()).getRecordBasis()==SpecimenOrObservationType.TissueSample){
- createMenuItem(addMenu, DNA_SAMPLE, selectedTreeNode, DnaSample.class, SpecimenOrObservationType.DnaSample, DerivationEventType.DNA_EXTRACTION());
- createMenuItem(addMenu, MEDIA_SPECIMEN, selectedTreeNode, MediaSpecimen.class, SpecimenOrObservationType.StillImage, DerivationEventType.ACCESSIONING());
- return;
- }
- //context menu for DnaSample
- else if(selectedTreeNode.getValue() instanceof DnaSample && ((DnaSample)selectedTreeNode.getValue()).getRecordBasis()==SpecimenOrObservationType.DnaSample){
- createMenuItem(addMenu, CONSENSUS_SEQUENCE, selectedTreeNode, Sequence.class, null, null);
- createMenuItem(addMenu, MEDIA_SPECIMEN, selectedTreeNode, MediaSpecimen.class, SpecimenOrObservationType.StillImage, DerivationEventType.ACCESSIONING());
- return;
- }
- //context menu for Sequence
- else if(selectedTreeNode.getValue() instanceof Sequence){
- createMenuItem(addMenu, SINGLE_READ, selectedTreeNode, SingleRead.class, null, null);
- return;
- }
- }
- MenuItem menuItem = new MenuItem(addMenu, SWT.NONE);
- menuItem.setText(Messages.CreateDerivateContextMenu_NO_CHILD_DERIVATE);
- menuItem.setEnabled(false);
- }
-
-
- }
- };
- return contributionItems;
- }
-
- private void createMenuItem(Menu menu, String menuLabel, final TreeNode selectedNode, Class<?> childClass, final SpecimenOrObservationType specimenType, final DerivationEventType derivationEventType) {
- if(specimenType!=null && specimenType.equals(SpecimenOrObservationType.StillImage)){
- //media submenu
- MenuItem mediaItem = new MenuItem(menu, SWT.CASCADE);
- mediaItem.setText(Messages.CreateDerivateContextMenu_MEDIA);
- Menu mediaMenu = new Menu(menu);
- mediaItem.setMenu(mediaMenu);
-
- //media specimen menu
- MenuItem menuItem = new MenuItem(mediaMenu, SWT.NONE);
- menuItem.setText(menuLabel);
- menuItem.addSelectionListener(new WidgetSelectionListener(selectedNode, childClass, specimenType, derivationEventType));
-
- //existing media menu
- MenuItem existingMediaItem = new MenuItem(mediaMenu, SWT.NONE);
- existingMediaItem.setText(Messages.CreateDerivateContextMenu_MEDIA_EXISTING);
- existingMediaItem.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- //select media
- Media media = MediaSelectionDialog.select(AbstractUtility.getShell(), null, null);
- if(media!=null){
- //create MediaSpecimen
- MediaSpecimen mediaSpecimen = MediaSpecimen.NewInstance(specimenType);
- mediaSpecimen.setMediaSpecimen(media);
-
- //attach to parent
- if(selectedNode.getValue() instanceof SpecimenOrObservationBase){
- SpecimenOrObservationBase<?> specimenOrObservationBase = (SpecimenOrObservationBase<?>)selectedNode.getValue();
-
- specimenOrObservationBase.addDerivationEvent(DerivationEvent.NewSimpleInstance(specimenOrObservationBase, mediaSpecimen, derivationEventType));
- mediaSpecimen.setCacheStrategy(new DerivedUnitFacadeCacheStrategy());
- mediaSpecimen.getTitleCache(); //update title cache
- CdmStore.getService(IOccurrenceService.class).merge(specimenOrObservationBase, true);
-
- }
-
- //refresh view
- DerivateView derivateView = null;
- if(AbstractUtility.getActivePart() instanceof DerivateView){
- derivateView = (DerivateView) AbstractUtility.getActivePart();
- }
- if(derivateView!=null){
-
- derivateView.getConversationHolder().commit();
- derivateView.refreshTree(mediaSpecimen);
- }
- }
- }
- });
- }
- else{
- MenuItem menuItem = new MenuItem(menu, SWT.NONE);
- menuItem.setText(menuLabel);
- menuItem.addSelectionListener(new WidgetSelectionListener(selectedNode, childClass, specimenType, derivationEventType));
- }
- }
-
- private class WidgetSelectionListener extends SelectionAdapter{
-
- private final TreeNode selectedNode;
- //TODO: we need a common interface for the generic like e.g. "IDerivateHierarchyNode"
- private final Class<?> childClass;
- private final SpecimenOrObservationType specimenType;
- private final DerivationEventType derivationEventType;
-
- /**
- * @param selectedNode
- * @param specimenType
- */
- public WidgetSelectionListener(TreeNode selectedNode, Class<?> childClass, SpecimenOrObservationType specimenType, DerivationEventType derivationEventType) {
- this.selectedNode = selectedNode;
- this.childClass = childClass;
- this.specimenType = specimenType;
- this.derivationEventType = derivationEventType;
- }
-
- @Override
- public void widgetSelected(SelectionEvent e) {
- DerivateView derivateView = null;
- if(AbstractUtility.getActivePart() instanceof DerivateView){
- derivateView = (DerivateView) AbstractUtility.getActivePart();
- }
- if(derivateView!=null){
- if(derivateView.isDirty()){
- e.doit = false;
- MessagingUtils.warningDialog(DerivateView.VIEW_HAS_UNSAVED_CHANGES, this, DerivateView.YOU_NEED_TO_SAVE_BEFORE_PERFORMING_THIS_ACTION);
- return;
- }
- }
-
- Object createdElement = null;
- Object selectedDerivate = selectedNode.getValue();
- if(selectedDerivate instanceof DnaSample && ((DnaSample) selectedDerivate).getRecordBasis()==SpecimenOrObservationType.DnaSample){
- DnaSample dnaSample = (DnaSample)selectedDerivate;
- if(childClass.equals(Sequence.class)){
- Sequence newInstance = Sequence.NewInstance(dnaSample, "", 0); //$NON-NLS-1$
- createdElement = newInstance;
- }
- CdmStore.getService(IOccurrenceService.class).merge((SpecimenOrObservationBase) selectedDerivate, true);
- } else if(selectedDerivate instanceof Sequence){
- SingleRead newInstance = SingleRead.NewInstance();
- ((Sequence) selectedDerivate).addSingleRead(newInstance);
- createdElement = newInstance;
- CdmApplicationState.getCurrentAppConfig().getSequenceService().merge((Sequence)selectedDerivate, true);
-
- }
- if(selectedDerivate instanceof SpecimenOrObservationBase && DerivedUnit.class.isAssignableFrom(childClass)){
- SpecimenOrObservationBase<?> specimenOrObservationBase = (SpecimenOrObservationBase<?>)selectedDerivate;
- DerivedUnit derivedUnit;
- if(childClass.equals(DnaSample.class)){
- derivedUnit = DnaSample.NewInstance();
- if(specimenType==SpecimenOrObservationType.DnaSample){
- derivedUnit.setRecordBasis(SpecimenOrObservationType.DnaSample);
- }
- else if(specimenType==SpecimenOrObservationType.TissueSample){
- derivedUnit.setRecordBasis(SpecimenOrObservationType.TissueSample);
- }
- }
- else if(childClass.equals(MediaSpecimen.class)){
- derivedUnit = MediaSpecimen.NewInstance(specimenType);
- //a MediaSpecimen with no media attached does not make sense. Hence we add one
- ((MediaSpecimen)derivedUnit).setMediaSpecimen(Media.NewInstance());
- }
- else{
- derivedUnit = DerivedUnit.NewInstance(specimenType);
- }
- specimenOrObservationBase.addDerivationEvent(DerivationEvent.NewSimpleInstance(specimenOrObservationBase, derivedUnit, derivationEventType));
- derivedUnit.setCacheStrategy(new DerivedUnitFacadeCacheStrategy());
- derivedUnit.getTitleCache(); //update title cache
- createdElement = derivedUnit;
- CdmStore.getService(IOccurrenceService.class).merge((SpecimenOrObservationBase) selectedDerivate, true);
-
- }
-
- //refresh view
- if(derivateView!=null){
- derivateView.getConversationHolder().commit();
- derivateView.refreshTree(createdElement);
- }
- }
- }
-
-}