From 32746e439ea331258f535d5b42ab008afa484df0 Mon Sep 17 00:00:00 2001
From: Patrick Plitzner
Date: Wed, 20 Jan 2016 09:39:46 +0100
Subject: [PATCH] Refactor SingleReadContextMenu #5406 - split into separate
commands, property testers and menu items - adjusted molecular context menu
entries to be grouped together with singler read entries
---
eu.etaxonomy.taxeditor.editor/plugin.xml | 73 ++++++++-
.../handler/SpecimenPropertyTester.java | 36 +++-
.../editor/view/derivate/DerivateView.java | 6 +-
.../contextMenu/DerivateViewContextMenu.java | 1 -
.../SingleReadSequenceContextMenu.java | 154 ------------------
.../derivate/handler/SingleReadHandler.java | 84 ++++++++++
eu.etaxonomy.taxeditor.molecular/plugin.xml | 2 +-
.../derivateSearch/DerivateLabelProvider.java | 2 +-
8 files changed, 198 insertions(+), 160 deletions(-)
delete mode 100644 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/SingleReadSequenceContextMenu.java
create mode 100644 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/handler/SingleReadHandler.java
diff --git a/eu.etaxonomy.taxeditor.editor/plugin.xml b/eu.etaxonomy.taxeditor.editor/plugin.xml
index 928c3b581..70e779d74 100644
--- a/eu.etaxonomy.taxeditor.editor/plugin.xml
+++ b/eu.etaxonomy.taxeditor.editor/plugin.xml
@@ -791,6 +791,44 @@
name="eu.etaxonomy.taxeditor.editor.separator3"
visible="true">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1744,7 +1815,7 @@
class="eu.etaxonomy.taxeditor.editor.handler.SpecimenPropertyTester"
id="eu.etaxonomy.taxeditor.editor.handler.SpecimenPropertyTester"
namespace="eu.etaxonomy.taxeditor.editor.handler.SpecimenPropertyTester"
- properties="isSequence,isSingleRead"
+ properties="isSequence,isSingleRead,isSingleReadReusableHere,isSingleReadReused"
type="org.eclipse.jface.viewers.IStructuredSelection">
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/SpecimenPropertyTester.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/SpecimenPropertyTester.java
index eb3995c8e..ec8750734 100644
--- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/SpecimenPropertyTester.java
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/SpecimenPropertyTester.java
@@ -2,12 +2,17 @@ package eu.etaxonomy.taxeditor.editor.handler;
import org.eclipse.core.expressions.PropertyTester;
+import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeNode;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
import eu.etaxonomy.cdm.model.molecular.Sequence;
import eu.etaxonomy.cdm.model.molecular.SingleRead;
import eu.etaxonomy.taxeditor.editor.EditorUtil;
+import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView;
@@ -20,6 +25,8 @@ import eu.etaxonomy.taxeditor.editor.EditorUtil;
public class SpecimenPropertyTester extends PropertyTester {
private static final String SEQUENCE = "isSequence";
private static final String SINGLE_READ = "isSingleRead";
+ private static final String IS_SINGLEREAD_REUSABLE_HERE = "isSingleReadReusableHere";
+ private static final String IS_SINGLEREAD_REUSED = "isSingleReadReused";
public SpecimenPropertyTester() {}
@@ -37,12 +44,39 @@ public class SpecimenPropertyTester extends PropertyTester {
else if (SINGLE_READ.equals(property)) {
return isSingleReadAlignment(treeNodeOfSelection.getValue());
}
+ else if (IS_SINGLEREAD_REUSABLE_HERE.equals(property)) {
+ return isSingleReadReusableHere(treeNodeOfSelection.getValue());
+ }
+ else if (IS_SINGLEREAD_REUSED.equals(property)) {
+ return isSingleReadReused(treeNodeOfSelection.getValue());
+ }
}
}
return false;
}
- private boolean isSequence(Object object) {
+ private boolean isSingleReadReused(Object value) {
+ final IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ final IEditorPart activeEditor = window.getActivePage().getActiveEditor();
+ if(value instanceof SingleRead){
+ if(activeEditor instanceof DerivateView
+ && ((DerivateView) activeEditor).getMultiLinkSingleReads().contains(value)){
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private boolean isSingleReadReusableHere(Object value) {
+ TreeNode clipboardNode = EditorUtil.getTreeNodeOfSelection(LocalSelectionTransfer.getTransfer().getSelection());
+ if(value instanceof Sequence && clipboardNode!=null && clipboardNode.getValue() instanceof SingleRead
+ && !((Sequence) value).getSingleReads().contains(clipboardNode.getValue())){
+ return true;
+ }
+ return false;
+ }
+
+ private boolean isSequence(Object object) {
return (object instanceof Sequence);
}
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateView.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateView.java
index b53525b98..f591b9a14 100644
--- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateView.java
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateView.java
@@ -271,13 +271,17 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa
rootElements.add(specimen);
}
}
- labelProvider.initCache(rootElements);
+ labelProvider.updateLabelCache(rootElements);
viewer.setInput(rootElements);
getEditorSite().getActionBars().getStatusLineManager().setMessage(rootElements.size() +" derivative hierarchies found");
}
+ public void updateLabelCache(){
+ labelProvider.updateLabelCache(rootElements);
+ }
+
@Override
public void doSave(IProgressMonitor monitor) {
String taskName = Messages.DerivateView_SAVING_HIERARCHY;
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 e14001f39..c89c7c85d 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
@@ -11,7 +11,6 @@ public class DerivateViewContextMenu extends CompoundContributionItem {
IContributionItem[] contributionItems = new IContributionItem[] {
new CreateDerivateContextMenu(),
new CreateFieldUnitContextMenu(),
- new SingleReadSequenceContextMenu(),
new Separator(),
new ListenToSelectionChangeContextMenu(),
};
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/SingleReadSequenceContextMenu.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/SingleReadSequenceContextMenu.java
deleted file mode 100644
index 9f431f49d..000000000
--- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/SingleReadSequenceContextMenu.java
+++ /dev/null
@@ -1,154 +0,0 @@
-package eu.etaxonomy.taxeditor.editor.view.derivate.contextMenu;
-
-import org.eclipse.jface.action.ContributionItem;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.Separator;
-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.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.CompoundContributionItem;
-
-import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
-import eu.etaxonomy.cdm.model.molecular.Sequence;
-import eu.etaxonomy.cdm.model.molecular.SingleRead;
-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 SingleReadSequenceContextMenu extends CompoundContributionItem {
-
- private enum CommandType{
- COPY_TO_CLIPBOARD,
- REMOVE_FROM_SEQUENCE,
- ADD_TO_SEQUENCE
- }
-
- @Override
- protected IContributionItem[] getContributionItems() {
- boolean menuVisible = false;
- final IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
- final ISelection selection = window.getActivePage().getSelection();
- TreeNode selectedTreeNode = EditorUtil.getTreeNodeOfSelection(selection);
- TreeNode clipboardNode = EditorUtil.getTreeNodeOfSelection(LocalSelectionTransfer.getTransfer().getSelection());
- if(selectedTreeNode!=null &&
- (selectedTreeNode.getValue() instanceof Sequence && clipboardNode!=null && clipboardNode.getValue() instanceof SingleRead)
- || (selectedTreeNode.getValue() instanceof SingleRead)){
- menuVisible = true;
- }
- IContributionItem[] contributionItems = new IContributionItem[0];
- if(menuVisible){
- contributionItems = new IContributionItem[] {
- new Separator(),
- new ContributionItem() {
- @Override
- public void fill(Menu menu, int index) {
- final IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
- final IEditorPart activeEditor = window.getActivePage().getActiveEditor();
- 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(activeEditor instanceof DerivateView
- && ((DerivateView) activeEditor).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).merge(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/handler/SingleReadHandler.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/handler/SingleReadHandler.java
new file mode 100644
index 000000000..ba5f2b953
--- /dev/null
+++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/handler/SingleReadHandler.java
@@ -0,0 +1,84 @@
+package eu.etaxonomy.taxeditor.editor.view.derivate.handler;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.TreeNode;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.PlatformUI;
+
+import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
+import eu.etaxonomy.cdm.model.molecular.Sequence;
+import eu.etaxonomy.cdm.model.molecular.SingleRead;
+import eu.etaxonomy.taxeditor.editor.EditorUtil;
+import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView;
+import eu.etaxonomy.taxeditor.model.MessagingUtils;
+import eu.etaxonomy.taxeditor.store.CdmStore;
+
+public class SingleReadHandler extends AbstractHandler {
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ 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);
+ if(activeEditor instanceof DerivateView) {
+ DerivateView derivateView = (DerivateView)activeEditor;
+ if(event.getCommand().getId().equals("eu.etaxonomy.taxeditor.editor.derivative.copySingleReadToClipBoard")){
+ LocalSelectionTransfer.getTransfer().setSelection(selection);
+ }
+ else if(event.getCommand().getId().equals("eu.etaxonomy.taxeditor.editor.derivative.reuseSingleRead")){
+ if(activeEditor.isDirty()){
+ MessagingUtils.warningDialog(DerivateView.VIEW_HAS_UNSAVED_CHANGES, this, DerivateView.YOU_NEED_TO_SAVE_BEFORE_PERFORMING_THIS_ACTION);
+ return null;
+ }
+ 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);
+ if(CdmStore.getCurrentSessionManager().isRemoting()){
+ CdmStore.getService(ISequenceService.class).merge(sequence);
+ }
+ else{
+ CdmStore.getService(ISequenceService.class).saveOrUpdate(sequence);
+ }
+ if(activeEditor instanceof DerivateView) {
+ derivateView.getConversationHolder().commit();
+ derivateView.refreshTree();
+ LocalSelectionTransfer.getTransfer().setSelection(null);
+ }
+ }
+ }
+ else if(event.getCommand().getId().equals("eu.etaxonomy.taxeditor.editor.derivative.removeSingleReadFromSequence")){
+ if(activeEditor.isDirty()){
+ MessagingUtils.warningDialog(DerivateView.VIEW_HAS_UNSAVED_CHANGES, this, DerivateView.YOU_NEED_TO_SAVE_BEFORE_PERFORMING_THIS_ACTION);
+ return null;
+ }
+ 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());
+ if(CdmStore.getCurrentSessionManager().isRemoting()){
+ CdmStore.getService(ISequenceService.class).merge(sequence);
+ }
+ else{
+ CdmStore.getService(ISequenceService.class).saveOrUpdate(sequence);
+ }
+ if(activeEditor instanceof DerivateView) {
+ derivateView.getConversationHolder().commit();
+ derivateView.refreshTree();
+ }
+ }
+ }
+ derivateView.updateLabelCache();
+ derivateView.refreshTree();
+ }
+ return null;
+ }
+
+}
diff --git a/eu.etaxonomy.taxeditor.molecular/plugin.xml b/eu.etaxonomy.taxeditor.molecular/plugin.xml
index c38adc24d..749f4dedd 100644
--- a/eu.etaxonomy.taxeditor.molecular/plugin.xml
+++ b/eu.etaxonomy.taxeditor.molecular/plugin.xml
@@ -181,7 +181,7 @@
+ locationURI="popup:eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView?before=eu.etaxonomy.taxeditor.editor.derivative.reuseSingleReadMenuItem">
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateLabelProvider.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateLabelProvider.java
index 36c5e9278..14265f1d5 100644
--- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateLabelProvider.java
+++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateLabelProvider.java
@@ -432,7 +432,7 @@ public class DerivateLabelProvider extends ColumnLabelProvider {
return multiLinkSingleReads;
}
- public void initCache(Collection> rootElements) {
+ public void updateLabelCache(Collection> rootElements) {
DerivateLabelProvider.multiLinkSingleReads = new HashSet();
DerivateLabelProvider.typeDesignations = new HashMap>();
for(Entry> entry:CdmStore.getService(ISequenceService.class).getSingleReadSequencesMap().entrySet()){
--
2.34.1