From 7f7b4382605da749d0184c85ab7fe6269cb9dc9d Mon Sep 17 00:00:00 2001 From: Patrick Plitzner Date: Tue, 27 Oct 2015 08:26:14 +0100 Subject: [PATCH] Add dynamic context menu entry for FieldUnit creation --- eu.etaxonomy.taxeditor.editor/plugin.xml | 5 - .../editor/view/derivate/DerivateView.java | 27 +-- .../CreateFieldUnitContextMenu.java | 157 ++++++++++++++++++ .../contextMenu/DerivateViewContextMenu.java | 1 + 4 files changed, 173 insertions(+), 17 deletions(-) create mode 100644 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/CreateFieldUnitContextMenu.java diff --git a/eu.etaxonomy.taxeditor.editor/plugin.xml b/eu.etaxonomy.taxeditor.editor/plugin.xml index 90e7ec540..e2a53ba3e 100644 --- a/eu.etaxonomy.taxeditor.editor/plugin.xml +++ b/eu.etaxonomy.taxeditor.editor/plugin.xml @@ -810,11 +810,6 @@ label="%command.label.52" style="push"> - - multiLinkSingleReads; - private ISelection selection = null; - - private DerivateContentProvider contentProvider; private DerivateSearchCompositeController derivateSearchCompositeController; @@ -124,6 +122,8 @@ public class DerivateView extends AbstractCdmViewPart implements IPartContentHas */ private boolean listenToSelectionChange; + private Taxon selectedTaxon; + /** * Default constructor */ @@ -403,8 +403,8 @@ public class DerivateView extends AbstractCdmViewPart implements IPartContentHas return this.multiLinkSingleReads; } - public ISelection getSelection() { - return selection; + public Object getSelectionInput() { + return selectedTaxon; } public DerivateLabelProvider getLabelProvider() { @@ -431,11 +431,6 @@ public class DerivateView extends AbstractCdmViewPart implements IPartContentHas 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); @@ -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(); - if(selectedElement instanceof Taxon){ - Collection 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 fieldUnits = CdmStore.getService(IOccurrenceService.class).listFieldUnitsByAssociatedTaxon(selectedTaxon, null, null); Collection uuids = new HashSet(); 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); + 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 index 000000000..21b732089 --- /dev/null +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/CreateFieldUnitContextMenu.java @@ -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; + } + } + } +} diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/DerivateViewContextMenu.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/DerivateViewContextMenu.java index 17d95b197..659ea5283 100644 --- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/DerivateViewContextMenu.java +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/DerivateViewContextMenu.java @@ -8,6 +8,7 @@ public class DerivateViewContextMenu extends CompoundContributionItem { @Override protected IContributionItem[] getContributionItems() { IContributionItem[] contributionItems = new IContributionItem[] { + new CreateFieldUnitContextMenu(), new CreateDerivateContextMenu(), new SingleReadSequenceContextMenu() }; -- 2.34.1