Merge branch 'release/3.12.0'
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / view / derivate / contextMenu / SingleReadSequenceContextMenu.java
1 package eu.etaxonomy.taxeditor.editor.view.derivate.contextMenu;
2
3 import org.eclipse.jface.action.ContributionItem;
4 import org.eclipse.jface.action.IContributionItem;
5 import org.eclipse.jface.util.LocalSelectionTransfer;
6 import org.eclipse.jface.viewers.ISelection;
7 import org.eclipse.jface.viewers.TreeNode;
8 import org.eclipse.swt.SWT;
9 import org.eclipse.swt.events.SelectionAdapter;
10 import org.eclipse.swt.events.SelectionEvent;
11 import org.eclipse.swt.widgets.Menu;
12 import org.eclipse.swt.widgets.MenuItem;
13 import org.eclipse.ui.IEditorPart;
14 import org.eclipse.ui.IWorkbenchWindow;
15 import org.eclipse.ui.PlatformUI;
16 import org.eclipse.ui.actions.CompoundContributionItem;
17
18 import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
19 import eu.etaxonomy.cdm.model.molecular.Sequence;
20 import eu.etaxonomy.cdm.model.molecular.SingleRead;
21 import eu.etaxonomy.taxeditor.editor.EditorUtil;
22 import eu.etaxonomy.taxeditor.editor.Messages;
23 import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView;
24 import eu.etaxonomy.taxeditor.model.MessagingUtils;
25 import eu.etaxonomy.taxeditor.store.CdmStore;
26
27 /**
28 * Context menu for the SingleReads in the derivate hierarchy.
29 *
30 */
31 public class SingleReadSequenceContextMenu extends CompoundContributionItem {
32
33 private enum CommandType{
34 COPY_TO_CLIPBOARD,
35 REMOVE_FROM_SEQUENCE,
36 ADD_TO_SEQUENCE
37 }
38
39 @Override
40 protected IContributionItem[] getContributionItems() {
41 IContributionItem[] contributionItems = new IContributionItem[] {
42 new ContributionItem() {
43 @Override
44 public void fill(Menu menu, int index) {
45 final IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
46 final IEditorPart activeEditor = window.getActivePage().getActiveEditor();
47 final ISelection selection = window.getActivePage().getSelection();
48 TreeNode selectedTreeNode = EditorUtil.getTreeNodeOfSelection(selection);
49 TreeNode clipboardNode = EditorUtil.getTreeNodeOfSelection(LocalSelectionTransfer.getTransfer().getSelection());
50 if(selectedTreeNode!=null){
51 //context menu for Sequence
52 if(selectedTreeNode.getValue() instanceof Sequence
53 && clipboardNode!=null && clipboardNode.getValue() instanceof SingleRead){
54 MenuItem item = new MenuItem(menu, SWT.NONE);
55 item.setText(Messages.SingleReadSequenceContextMenu_REUSE_SINGLE_READ_HERE);
56 item.addSelectionListener(new WidgetSelectionListener(CommandType.ADD_TO_SEQUENCE));
57 }
58 else if(selectedTreeNode.getValue() instanceof SingleRead){
59 MenuItem item = new MenuItem(menu, SWT.NONE);
60 item.setText(Messages.SingleReadSequenceContextMenu_REUSE_FOR_SEQUENCE);
61 item.addSelectionListener(new WidgetSelectionListener(CommandType.COPY_TO_CLIPBOARD));
62 if(activeEditor instanceof DerivateView
63 && ((DerivateView) activeEditor).getMultiLinkSingleReads().contains(selectedTreeNode.getValue())){
64 MenuItem unlinkItem = new MenuItem(menu, SWT.NONE);
65 unlinkItem.setText(Messages.SingleReadSequenceContextMenu_REMOVE_FROM_SEQUENCE);
66 unlinkItem.addSelectionListener(new WidgetSelectionListener(CommandType.REMOVE_FROM_SEQUENCE));
67 }
68 }
69 }
70 }
71 }
72 };
73 return contributionItems;
74 }
75
76 private class WidgetSelectionListener extends SelectionAdapter{
77 private final CommandType commandType;
78
79 /**
80 * @param selectedTreeNode
81 * @param clipboardNode
82 * @param commandType
83 */
84 public WidgetSelectionListener(CommandType commandType) {
85 this.commandType = commandType;
86 }
87
88 @Override
89 public void widgetSelected(SelectionEvent e) {
90 IEditorPart activeEditor = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
91 ISelection clipBoardSelection = LocalSelectionTransfer.getTransfer().getSelection();
92 final ISelection selection = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getSelection();
93 TreeNode clipBoardTreeNode = EditorUtil.getTreeNodeOfSelection(clipBoardSelection);
94 TreeNode selectedTreeNode = EditorUtil.getTreeNodeOfSelection(selection);
95 switch (commandType) {
96 case REMOVE_FROM_SEQUENCE:
97 if(activeEditor.isDirty()){
98 MessagingUtils.warningDialog(DerivateView.VIEW_HAS_UNSAVED_CHANGES, this, DerivateView.YOU_NEED_TO_SAVE_BEFORE_PERFORMING_THIS_ACTION);
99 return;
100 }
101 if(selectedTreeNode!=null && selectedTreeNode.getParent()!=null &&
102 selectedTreeNode.getValue() instanceof SingleRead && selectedTreeNode.getParent().getValue() instanceof Sequence) {
103 Sequence sequence = (Sequence) selectedTreeNode.getParent().getValue();
104 sequence.removeSingleRead((SingleRead) selectedTreeNode.getValue());
105 CdmStore.getService(ISequenceService.class).saveOrUpdate(sequence);
106 if(activeEditor instanceof DerivateView) {
107 DerivateView derivateView = (DerivateView)activeEditor;
108 derivateView.getConversationHolder().commit();
109 derivateView.refreshTree();
110 }
111 }
112
113 break;
114 case ADD_TO_SEQUENCE:
115 if(activeEditor.isDirty()){
116 MessagingUtils.warningDialog(DerivateView.VIEW_HAS_UNSAVED_CHANGES, this, DerivateView.YOU_NEED_TO_SAVE_BEFORE_PERFORMING_THIS_ACTION);
117 return;
118 }
119 if(clipBoardTreeNode!=null && clipBoardTreeNode.getValue() instanceof SingleRead
120 && selectedTreeNode!=null && selectedTreeNode.getValue() instanceof Sequence){
121 SingleRead singleRead = (SingleRead)clipBoardTreeNode.getValue();
122 Sequence sequence = (Sequence)selectedTreeNode.getValue();
123 sequence.addSingleRead(singleRead);
124 CdmStore.getService(ISequenceService.class).merge(sequence);
125 if(activeEditor instanceof DerivateView) {
126 DerivateView derivateView = (DerivateView)activeEditor;
127 derivateView.getConversationHolder().commit();
128 derivateView.refreshTree();
129 LocalSelectionTransfer.getTransfer().setSelection(null);
130 }
131 }
132 break;
133 case COPY_TO_CLIPBOARD:
134 LocalSelectionTransfer.getTransfer().setSelection(selection);
135 break;
136 }
137 }
138 }
139 }