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