Add dynamic context menu entry for FieldUnit creation
authorPatrick Plitzner <p.plitzner@bgbm.org>
Tue, 27 Oct 2015 07:26:14 +0000 (08:26 +0100)
committerPatrick Plitzner <p.plitzner@bgbm.org>
Tue, 27 Oct 2015 07:26:42 +0000 (08:26 +0100)
eu.etaxonomy.taxeditor.editor/plugin.xml
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateView.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/CreateFieldUnitContextMenu.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/DerivateViewContextMenu.java

index 90e7ec540d578bad5b05888b338baf7901c25e88..e2a53ba3ef6b73fdd90d769ee097ffe3a2eb3c2e 100644 (file)
                label="%command.label.52"
                style="push">
          </command>
                label="%command.label.52"
                style="push">
          </command>
-         <command
-               commandId="eu.etaxonomy.taxeditor.editor.derivate.createFieldUnit"
-               label="%command.label.53"
-               style="push">
-         </command>
          <command
                commandId="eu.etaxonomy.taxeditor.editor.derivate.deepDelete"
                icon="icons/deep-delete-16x16-32.png"
          <command
                commandId="eu.etaxonomy.taxeditor.editor.derivate.deepDelete"
                icon="icons/deep-delete-16x16-32.png"
index 87072579f9f623930fe7aebcda30e32fe9937506..6e3c42201319baa4c2a44e77458bdd1188ab3aa9 100644 (file)
@@ -38,6 +38,7 @@ import org.eclipse.ui.IWorkbenchPart;
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
 import eu.etaxonomy.cdm.api.service.IOccurrenceService;
 import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
 import eu.etaxonomy.cdm.api.service.IOccurrenceService;
 import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
+import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
 import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.molecular.Sequence;
 import eu.etaxonomy.cdm.model.molecular.SingleRead;
 import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.molecular.Sequence;
 import eu.etaxonomy.cdm.model.molecular.SingleRead;
@@ -99,9 +100,6 @@ public class DerivateView extends AbstractCdmViewPart implements IPartContentHas
 
     private Set<SingleRead> multiLinkSingleReads;
 
 
     private Set<SingleRead> multiLinkSingleReads;
 
-    private ISelection selection = null;
-
-
     private DerivateContentProvider contentProvider;
 
     private DerivateSearchCompositeController derivateSearchCompositeController;
     private DerivateContentProvider contentProvider;
 
     private DerivateSearchCompositeController derivateSearchCompositeController;
@@ -124,6 +122,8 @@ public class DerivateView extends AbstractCdmViewPart implements IPartContentHas
      */
     private boolean listenToSelectionChange;
 
      */
     private boolean listenToSelectionChange;
 
+    private Taxon selectedTaxon;
+
     /**
      * Default constructor
      */
     /**
      * Default constructor
      */
@@ -403,8 +403,8 @@ public class DerivateView extends AbstractCdmViewPart implements IPartContentHas
         return this.multiLinkSingleReads;
     }
 
         return this.multiLinkSingleReads;
     }
 
-    public ISelection getSelection() {
-        return selection;
+    public Object getSelectionInput() {
+        return selectedTaxon;
     }
 
     public DerivateLabelProvider getLabelProvider() {
     }
 
     public DerivateLabelProvider getLabelProvider() {
@@ -431,11 +431,6 @@ public class DerivateView extends AbstractCdmViewPart implements IPartContentHas
         return true;
     }
 
         return true;
     }
 
-    public void removeHierarchy(SpecimenOrObservationBase<?> specimenOrObservationBase) {
-        SpecimenOrObservationBase<?> rootElement = derivateToRootEntityMap.remove(specimenOrObservationBase);
-        rootElements.remove(rootElement);
-    }
-
     public void addHierarchy(FieldUnit fieldUnit) {
         rootElements.add(fieldUnit);
         derivateToRootEntityMap.put(fieldUnit, fieldUnit);
     public void addHierarchy(FieldUnit fieldUnit) {
         rootElements.add(fieldUnit);
         derivateToRootEntityMap.put(fieldUnit, fieldUnit);
@@ -461,8 +456,9 @@ public class DerivateView extends AbstractCdmViewPart implements IPartContentHas
     public void selectionChanged(IWorkbenchPart part, ISelection selection) {
         if(listenToSelectionChange && selection instanceof IStructuredSelection){
             Object selectedElement = ((IStructuredSelection) selection).getFirstElement();
     public void selectionChanged(IWorkbenchPart part, ISelection selection) {
         if(listenToSelectionChange && selection instanceof IStructuredSelection){
             Object selectedElement = ((IStructuredSelection) selection).getFirstElement();
-            if(selectedElement instanceof Taxon){
-                Collection<SpecimenOrObservationBase> fieldUnits = CdmStore.getService(IOccurrenceService.class).listFieldUnitsByAssociatedTaxon((Taxon) selectedElement, null, null);
+            if(selectedElement instanceof CdmBase && ((CdmBase) selectedElement).isInstanceOf(Taxon.class)){
+                selectedTaxon = HibernateProxyHelper.deproxy(selectedElement, Taxon.class);
+                Collection<SpecimenOrObservationBase> fieldUnits = CdmStore.getService(IOccurrenceService.class).listFieldUnitsByAssociatedTaxon(selectedTaxon, null, null);
                 Collection<UUID> uuids = new HashSet<UUID>();
                 for (SpecimenOrObservationBase specimenOrObservationBase : fieldUnits) {
                     uuids.add(specimenOrObservationBase.getUuid());
                 Collection<UUID> uuids = new HashSet<UUID>();
                 for (SpecimenOrObservationBase specimenOrObservationBase : fieldUnits) {
                     uuids.add(specimenOrObservationBase.getUuid());
@@ -504,6 +500,13 @@ public class DerivateView extends AbstractCdmViewPart implements IPartContentHas
         listenToSelectionChange = !listenToSelectionChange;
         derivateSearchCompositeController.setEnabled(!listenToSelectionChange);
         derivateSearchCompositeController.setTaxon(null);
         listenToSelectionChange = !listenToSelectionChange;
         derivateSearchCompositeController.setEnabled(!listenToSelectionChange);
         derivateSearchCompositeController.setTaxon(null);
+        if(!listenToSelectionChange){
+            selectedTaxon = null;
+        }
+    }
+
+    public boolean isListenToSelectionChange(){
+        return listenToSelectionChange;
     }
 
     /**
     }
 
     /**
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/CreateFieldUnitContextMenu.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/CreateFieldUnitContextMenu.java
new file mode 100644 (file)
index 0000000..21b7320
--- /dev/null
@@ -0,0 +1,157 @@
+package eu.etaxonomy.taxeditor.editor.view.derivate.contextMenu;
+
+import org.eclipse.jface.action.ContributionItem;
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.util.LocalSelectionTransfer;
+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.IEditorPart;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.CompoundContributionItem;
+
+import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
+import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
+import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.molecular.Sequence;
+import eu.etaxonomy.cdm.model.molecular.SingleRead;
+import eu.etaxonomy.cdm.model.taxon.Taxon;
+import eu.etaxonomy.taxeditor.editor.EditorUtil;
+import eu.etaxonomy.taxeditor.editor.Messages;
+import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView;
+import eu.etaxonomy.taxeditor.model.MessagingUtils;
+import eu.etaxonomy.taxeditor.store.CdmStore;
+
+/**
+ * Context menu for the SingleReads in the derivate hierarchy.
+ *
+ */
+public class CreateFieldUnitContextMenu extends CompoundContributionItem {
+
+    private enum CommandType{
+        COPY_TO_CLIPBOARD,
+        REMOVE_FROM_SEQUENCE,
+        ADD_TO_SEQUENCE
+    }
+
+    @Override
+    protected IContributionItem[] getContributionItems() {
+        IContributionItem[] contributionItems = new IContributionItem[] {
+                new ContributionItem() {
+                    @Override
+                    public void fill(Menu menu, int index) {
+                        final IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+                        IWorkbenchPart activePart = window.getActivePage().getActivePart();
+                        if(activePart instanceof DerivateView){
+                            MenuItem item = new MenuItem(menu, SWT.NONE);
+                            item.setText("Create FieldUnit");
+                            if(((DerivateView) activePart).isListenToSelectionChange()){
+                                Object selectionInput = ((DerivateView) activePart).getSelectionInput();
+                                if(selectionInput instanceof CdmBase && ((CdmBase) selectionInput).isInstanceOf(Taxon.class)){
+                                    Taxon taxon = HibernateProxyHelper.deproxy(selectionInput, Taxon.class);
+                                    item.setText("Create FieldUnit (attach to "+taxon.getTitleCache()+")");
+                                }
+                            }
+                            item.addSelectionListener(new WidgetSelectionListener(CommandType.ADD_TO_SEQUENCE));
+                        }
+
+
+                        final ISelection selection = window.getActivePage().getSelection();
+                        TreeNode selectedTreeNode = EditorUtil.getTreeNodeOfSelection(selection);
+                        TreeNode clipboardNode = EditorUtil.getTreeNodeOfSelection(LocalSelectionTransfer.getTransfer().getSelection());
+                        if(selectedTreeNode!=null){
+                            //context menu for Sequence
+                            if(selectedTreeNode.getValue() instanceof Sequence
+                                    && clipboardNode!=null && clipboardNode.getValue() instanceof SingleRead){
+                                MenuItem item = new MenuItem(menu, SWT.NONE);
+                                item.setText(Messages.SingleReadSequenceContextMenu_REUSE_SINGLE_READ_HERE);
+                                item.addSelectionListener(new WidgetSelectionListener(CommandType.ADD_TO_SEQUENCE));
+                            }
+                            else if(selectedTreeNode.getValue() instanceof SingleRead){
+                                MenuItem item = new MenuItem(menu, SWT.NONE);
+                                item.setText(Messages.SingleReadSequenceContextMenu_REUSE_FOR_SEQUENCE);
+                                item.addSelectionListener(new WidgetSelectionListener(CommandType.COPY_TO_CLIPBOARD));
+                                if(activePart instanceof DerivateView
+                                        && ((DerivateView) activePart).getMultiLinkSingleReads().contains(selectedTreeNode.getValue())){
+                                    MenuItem unlinkItem = new MenuItem(menu, SWT.NONE);
+                                    unlinkItem.setText(Messages.SingleReadSequenceContextMenu_REMOVE_FROM_SEQUENCE);
+                                    unlinkItem.addSelectionListener(new WidgetSelectionListener(CommandType.REMOVE_FROM_SEQUENCE));
+                                }
+                            }
+                        }
+                    }
+                }
+        };
+        return contributionItems;
+    }
+
+    private class WidgetSelectionListener extends SelectionAdapter{
+        private final CommandType commandType;
+
+        /**
+         * @param selectedTreeNode
+         * @param clipboardNode
+         * @param commandType
+         */
+        public WidgetSelectionListener(CommandType commandType) {
+            this.commandType = commandType;
+        }
+
+        @Override
+        public void widgetSelected(SelectionEvent e) {
+            IEditorPart activeEditor = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
+            ISelection clipBoardSelection = LocalSelectionTransfer.getTransfer().getSelection();
+            final ISelection selection = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getSelection();
+            TreeNode clipBoardTreeNode = EditorUtil.getTreeNodeOfSelection(clipBoardSelection);
+            TreeNode selectedTreeNode = EditorUtil.getTreeNodeOfSelection(selection);
+            switch (commandType) {
+            case REMOVE_FROM_SEQUENCE:
+                if(activeEditor.isDirty()){
+                    MessagingUtils.warningDialog(DerivateView.VIEW_HAS_UNSAVED_CHANGES, this, DerivateView.YOU_NEED_TO_SAVE_BEFORE_PERFORMING_THIS_ACTION);
+                    return;
+                }
+                if(selectedTreeNode!=null && selectedTreeNode.getParent()!=null &&
+                        selectedTreeNode.getValue() instanceof SingleRead && selectedTreeNode.getParent().getValue() instanceof Sequence) {
+                    Sequence sequence = (Sequence) selectedTreeNode.getParent().getValue();
+                    sequence.removeSingleRead((SingleRead) selectedTreeNode.getValue());
+                    CdmStore.getService(ISequenceService.class).saveOrUpdate(sequence);
+                    if(activeEditor instanceof DerivateView) {
+                        DerivateView derivateView = (DerivateView)activeEditor;
+                        derivateView.getConversationHolder().commit();
+                        derivateView.refreshTree();
+                    }
+                }
+
+                break;
+            case ADD_TO_SEQUENCE:
+                if(activeEditor.isDirty()){
+                    MessagingUtils.warningDialog(DerivateView.VIEW_HAS_UNSAVED_CHANGES, this, DerivateView.YOU_NEED_TO_SAVE_BEFORE_PERFORMING_THIS_ACTION);
+                    return;
+                }
+                if(clipBoardTreeNode!=null && clipBoardTreeNode.getValue() instanceof SingleRead
+                        && selectedTreeNode!=null && selectedTreeNode.getValue() instanceof Sequence){
+                    SingleRead singleRead = (SingleRead)clipBoardTreeNode.getValue();
+                    Sequence sequence = (Sequence)selectedTreeNode.getValue();
+                    sequence.addSingleRead(singleRead);
+                    CdmStore.getService(ISequenceService.class).saveOrUpdate(sequence);
+                    if(activeEditor instanceof DerivateView) {
+                        DerivateView derivateView = (DerivateView)activeEditor;
+                        derivateView.getConversationHolder().commit();
+                        derivateView.refreshTree();
+                        LocalSelectionTransfer.getTransfer().setSelection(null);
+                    }
+                }
+                break;
+            case COPY_TO_CLIPBOARD:
+                LocalSelectionTransfer.getTransfer().setSelection(selection);
+                break;
+            }
+        }
+    }
+}
index 17d95b1976ecb4531358069717fe7b26b50c4dac..659ea528365f43205a01c99cfbe3b74ea9371f90 100644 (file)
@@ -8,6 +8,7 @@ public class DerivateViewContextMenu extends CompoundContributionItem  {
     @Override
     protected IContributionItem[] getContributionItems() {
         IContributionItem[] contributionItems = new IContributionItem[] {
     @Override
     protected IContributionItem[] getContributionItems() {
         IContributionItem[] contributionItems = new IContributionItem[] {
+                new CreateFieldUnitContextMenu(),
                 new CreateDerivateContextMenu(),
                 new SingleReadSequenceContextMenu()
         };
                 new CreateDerivateContextMenu(),
                 new SingleReadSequenceContextMenu()
         };