* @date 25.08.2015\r
*/\r
public class AlignmentEditorActionUpdater implements SelectionListener, Listener {\r
- private void updateEvents(String[] ids) {\r
+ private static final String[] IDS = {ActionFactory.COPY.getCommandId(), ActionFactory.CUT.getCommandId(), \r
+ ActionFactory.PASTE.getCommandId()};\r
+ \r
+ \r
+ private void updateEvents() {\r
ICommandService service = (ICommandService)PlatformUI.getWorkbench().getService(ICommandService.class);\r
- for (int i = 0; i < ids.length; i++) {\r
- service.refreshElements(ids[i], null);\r
+ for (int i = 0; i < IDS.length; i++) {\r
+ service.refreshElements(IDS[i], null);\r
}\r
}\r
\r
public void handleEvent(Event event) {\r
AlignmentEditor editor = AbstractAlignmentEditorHandler.getActiveAlignmentEditor();\r
if (editor != null) {\r
- updateEvents(new String[]{ActionFactory.COPY.getCommandId(), ActionFactory.CUT.getCommandId(), \r
- ActionFactory.PASTE.getCommandId()});\r
+ updateEvents();\r
}\r
}\r
\r
if ((e.getSource() == editor.getReadsArea().getSelection()) || \r
(e.getSource() == editor.getEditableConsensusArea().getSelection())) {\r
\r
- updateEvents(new String[]{ActionFactory.COPY.getCommandId(), ActionFactory.CUT.getCommandId()});\r
+ updateEvents();\r
}\r
}\r
}\r
--- /dev/null
+package eu.etaxonomy.taxeditor.molecular.handler;\r
+\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Scanner;\r
+\r
+import info.bioinfweb.libralign.alignmentarea.AlignmentArea;\r
+import info.bioinfweb.libralign.alignmentarea.order.SequenceOrder;\r
+import info.bioinfweb.libralign.alignmentarea.selection.SelectionModel;\r
+import info.bioinfweb.libralign.model.AlignmentModel;\r
+import info.bioinfweb.libralign.model.AlignmentModelUtils;\r
+\r
+import org.eclipse.core.commands.ExecutionEvent;\r
+import org.eclipse.jface.dialogs.MessageDialog;\r
+import org.eclipse.swt.dnd.TextTransfer;\r
+import org.eclipse.ui.commands.IElementUpdater;\r
+import org.eclipse.ui.handlers.HandlerUtil;\r
+import org.eclipse.ui.menus.UIElement;\r
+\r
+import eu.etaxonomy.taxeditor.molecular.editor.AlignmentEditor;\r
+\r
+\r
+\r
+/**\r
+ * Handler that pastes the current contents of the clipboard into an active instance of {@link AlignmentEditor}.\r
+ * \r
+ * @author Ben Stöver\r
+ * @date 26.08.2015\r
+ */\r
+public class AlignmentEditorPasteHandler extends AbstractFocusedAlignmentAreaHandler implements IElementUpdater {\r
+ private void pasteString(AlignmentArea area, int sequenceID, String content) {\r
+ AlignmentModel<Object> alignmentModel = (AlignmentModel<Object>)area.getAlignmentModel();\r
+ List<Object> tokens = AlignmentModelUtils.charSequenceToTokenList(content, alignmentModel.getTokenSet(),\r
+ true, alignmentModel.getTokenSet().getGapToken()); \r
+ \r
+ area.getActionProvider().deleteSelection(); // Overwrite selected tokens.\r
+ area.getActionProvider().elongateSequence(sequenceID, area.getSelection().getCursorColumn());\r
+ alignmentModel.insertTokensAt(sequenceID, area.getSelection().getCursorColumn(), tokens);\r
+ }\r
+ \r
+ \r
+ @Override\r
+ protected void doExecute2(ExecutionEvent event, AlignmentEditor editor, AlignmentArea focusedArea) {\r
+ SelectionModel selection = focusedArea.getSelection();\r
+ String clipboardText = (String)editor.CLIPBOARD.getContents(TextTransfer.getInstance());\r
+ if (clipboardText != null) {\r
+ List<String> lines = new ArrayList<String>();\r
+ Scanner scanner = new Scanner(clipboardText);\r
+ try {\r
+ while (scanner.hasNext()) {\r
+ lines.add(scanner.nextLine());\r
+ }\r
+ if (lines.get(lines.size() - 1).equals("")) {\r
+ lines.remove(lines.size() - 1);\r
+ }\r
+ }\r
+ finally {\r
+ scanner.close();\r
+ }\r
+ \r
+ if (!lines.isEmpty()) { //TODO Can lines be empty? (Can an empty string "" be copied to the clipboard?)\r
+ if (selection.getCursorHeight() == 1) { // If the consensus sequence is focused, this is the only possible case.\r
+ int sequenceID = focusedArea.getSequenceOrder().idByIndex(selection.getCursorRow());\r
+ if (lines.size() == 1) {\r
+ pasteString(focusedArea, sequenceID, lines.get(0));\r
+ }\r
+ else {\r
+ MessageDialog dialog = new MessageDialog(HandlerUtil.getActiveWorkbenchWindow(event).getShell(), //TODO Can the window be null? \r
+ "Pasting multiple lines", null,\r
+ "The text to be pasted contains mutlitple lines (" + lines.size() + \r
+ ") although the current cursor height is one. What do you want to do?", \r
+ MessageDialog.QUESTION, \r
+ new String[]{"Ingnore line breaks and paste as one sequence", \r
+ "Only paste the first line from the clipboard", "Cancel"}, \r
+ 0);\r
+ //TODO Does the dialog have to be disposed in some way?\r
+ \r
+ switch (dialog.open()) {\r
+ case 0: // Paste all lines in one sequence.\r
+ pasteString(focusedArea, sequenceID, clipboardText);\r
+ break;\r
+ case 1: // Paste only first line.\r
+ pasteString(focusedArea, sequenceID, lines.get(0));\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ else {\r
+ if (selection.getCursorHeight() == lines.size()) {\r
+ SequenceOrder order = focusedArea.getSequenceOrder();\r
+ for (int i = 0; i < selection.getCursorHeight(); i++) {\r
+ pasteString(focusedArea, order.idByIndex(selection.getCursorRow() + i), lines.get(i)); // Multiple calls of deleteSelection() in here are unnecessary, but should have no effect.\r
+ }\r
+ }\r
+ else {\r
+ MessageDialog.openError(HandlerUtil.getActiveWorkbenchWindow(event).getShell(), //TODO Can the window be null?\r
+ "Unable to paste multiple lines", \r
+ "The current cursor height (" + selection.getCursorHeight() + \r
+ ") does not match the number of lines to be pasted (" + lines.size() + ")." + \r
+ System.getProperty("line.separator") + System.getProperty("line.separator") + \r
+ "You can either change the cursor height accordingly or set the cursor height to one "\r
+ + "allowing you to paste all lines from the clipboad into one sequence.");\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+\r
+ @Override\r
+ public boolean isEnabled() {\r
+ AlignmentEditor editor = getActiveAlignmentEditor();\r
+ if (editor != null) {\r
+ AlignmentArea focusedArea = editor.getFocusedArea();\r
+ return (focusedArea != null);\r
+ }\r
+ else {\r
+ return false;\r
+ }\r
+ }\r
+\r
+\r
+ @Override\r
+ public void updateElement(UIElement element, @SuppressWarnings("rawtypes") Map parameters) {\r
+ setBaseEnabled(isEnabled());\r
+ }\r
+}\r