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