From c31e35b47f81c1462e4b3fae8ad191cd8da68d08 Mon Sep 17 00:00:00 2001 From: "b.stoever" Date: Wed, 17 Jun 2015 13:31:53 +0000 Subject: [PATCH] ToggleInsertOverwriteHandler now also triggers enabling and disabling of ToggleLeftRightInsertionHandler when the insert key is used instead of the tool bar button. Actions for cutting pherograms on the left and right ends added. Action for reverse complementing single reads added. Minor changes. --- .gitattributes | 2 + eu.etaxonomy.taxeditor.editor/plugin.xml | 40 +++++++++++ .../CutPherogramLeftHandler.java | 43 ++++++++++++ .../CutPherogramRightHandler.java | 43 ++++++++++++ .../ReverseComplementHandler.java | 2 +- .../ToggleInsertOverwriteHandler.java | 5 +- .../editor/molecular/AlignmentEditor.java | 68 +++++++++++++++---- 7 files changed, 186 insertions(+), 17 deletions(-) create mode 100644 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/alignmenteditor/CutPherogramLeftHandler.java create mode 100644 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/alignmenteditor/CutPherogramRightHandler.java diff --git a/.gitattributes b/.gitattributes index 743b58a7f..01647faa5 100644 --- a/.gitattributes +++ b/.gitattributes @@ -420,6 +420,8 @@ eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handle eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/SpecimenPropertyTester.java -text eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/TaxonParameterConverter.java -text eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/alignmenteditor/CreateConsensusSequenceHandler.java -text +eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/alignmenteditor/CutPherogramLeftHandler.java -text svneol=unset#text/plain +eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/alignmenteditor/CutPherogramRightHandler.java -text svneol=unset#text/plain eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/alignmenteditor/ReverseComplementHandler.java -text eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/alignmenteditor/ToggleInsertOverwriteHandler.java -text eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/alignmenteditor/ToggleLeftRightInsertionHandler.java -text diff --git a/eu.etaxonomy.taxeditor.editor/plugin.xml b/eu.etaxonomy.taxeditor.editor/plugin.xml index 3c5382273..d365557a5 100644 --- a/eu.etaxonomy.taxeditor.editor/plugin.xml +++ b/eu.etaxonomy.taxeditor.editor/plugin.xml @@ -997,6 +997,22 @@ label="Load Pherogram" style="push"> + + + + + + + + + + + + + + + + + + diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/alignmenteditor/CutPherogramLeftHandler.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/alignmenteditor/CutPherogramLeftHandler.java new file mode 100644 index 000000000..0b76ca9f0 --- /dev/null +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/alignmenteditor/CutPherogramLeftHandler.java @@ -0,0 +1,43 @@ +// $Id$ +/** +* Copyright (C) 2015 EDIT +* European Distributed Institute of Taxonomy +* http://www.e-taxonomy.eu +* +* The contents of this file are subject to the Mozilla Public License Version 1.1 +* See LICENSE.TXT at the top of this package for the full license terms. +*/ +package eu.etaxonomy.taxeditor.editor.handler.alignmenteditor; + + +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.ui.IEditorPart; + +import eu.etaxonomy.taxeditor.editor.molecular.AlignmentEditor; +import eu.etaxonomy.taxeditor.model.AbstractUtility; +import eu.etaxonomy.taxeditor.model.MessagingUtils; + + + +/** + * Handler that cuts the base call sequence of a pherogram attached to the current sequence on the left + * of the current selection or cursor position. + * + * @author Ben Stöver + * @date 15.06.2015 + */ +public class CutPherogramLeftHandler extends AbstractHandler { + @Override + public Object execute(ExecutionEvent event) throws ExecutionException { + IEditorPart activeEditor = AbstractUtility.getActiveEditor(); + if (activeEditor instanceof AlignmentEditor) { + String errorMessage = ((AlignmentEditor)activeEditor).cutPherogramLeft(); + if (errorMessage != null) { + MessagingUtils.errorDialog("Unable to cut base call sequence", this, errorMessage, "eu.etaxonomy.taxeditor.editor", null, false); //TODO set pluginID + } + } + return null; + } +} diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/alignmenteditor/CutPherogramRightHandler.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/alignmenteditor/CutPherogramRightHandler.java new file mode 100644 index 000000000..15c07fb58 --- /dev/null +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/alignmenteditor/CutPherogramRightHandler.java @@ -0,0 +1,43 @@ +// $Id$ +/** +* Copyright (C) 2015 EDIT +* European Distributed Institute of Taxonomy +* http://www.e-taxonomy.eu +* +* The contents of this file are subject to the Mozilla Public License Version 1.1 +* See LICENSE.TXT at the top of this package for the full license terms. +*/ +package eu.etaxonomy.taxeditor.editor.handler.alignmenteditor; + + +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.ui.IEditorPart; + +import eu.etaxonomy.taxeditor.editor.molecular.AlignmentEditor; +import eu.etaxonomy.taxeditor.model.AbstractUtility; +import eu.etaxonomy.taxeditor.model.MessagingUtils; + + + +/** + * Handler that cuts the base call sequence of a pherogram attached to the current sequence on the right + * of the current selection or cursor position. + * + * @author BenStoever + * @date 15.06.2015 + */ +public class CutPherogramRightHandler extends AbstractHandler { + @Override + public Object execute(ExecutionEvent event) throws ExecutionException { + IEditorPart activeEditor = AbstractUtility.getActiveEditor(); + if (activeEditor instanceof AlignmentEditor) { + String errorMessage = ((AlignmentEditor)activeEditor).cutPherogramRight(); + if (errorMessage != null) { + MessagingUtils.errorDialog("Unable to cut base call sequence", this, errorMessage, "eu.etaxonomy.taxeditor.editor", null, false); //TODO set pluginID + } + } + return null; + } +} diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/alignmenteditor/ReverseComplementHandler.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/alignmenteditor/ReverseComplementHandler.java index e3065ab67..d3da248a9 100644 --- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/alignmenteditor/ReverseComplementHandler.java +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/alignmenteditor/ReverseComplementHandler.java @@ -30,7 +30,7 @@ public class ReverseComplementHandler extends AbstractHandler { public Object execute(ExecutionEvent event) throws ExecutionException { IEditorPart activeEditor = AbstractUtility.getActiveEditor(); if (activeEditor instanceof AlignmentEditor) { - ((AlignmentEditor)activeEditor).reverseComplementSelection(); + ((AlignmentEditor)activeEditor).reverseComplementSelectedSequences(); } return null; } diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/alignmenteditor/ToggleInsertOverwriteHandler.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/alignmenteditor/ToggleInsertOverwriteHandler.java index 2d3ebb83f..56221f978 100644 --- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/alignmenteditor/ToggleInsertOverwriteHandler.java +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/alignmenteditor/ToggleInsertOverwriteHandler.java @@ -10,7 +10,6 @@ package eu.etaxonomy.taxeditor.editor.handler.alignmenteditor; -import java.util.HashMap; import java.util.Map; import org.eclipse.core.commands.AbstractHandler; @@ -49,8 +48,6 @@ public class ToggleInsertOverwriteHandler extends AbstractHandler implements IEl IEditorPart activeEditor = AbstractUtility.getActiveEditor(); if (activeEditor instanceof AlignmentEditor) { ((AlignmentEditor)activeEditor).toggleInsertOverwrite(); - ((ICommandService)PlatformUI.getWorkbench().getService(ICommandService.class)).refreshElements( - ToggleLeftRightInsertionHandler.COMMAND_ID, new HashMap()); } return null; } @@ -70,6 +67,8 @@ public class ToggleInsertOverwriteHandler extends AbstractHandler implements IEl element.setText("OVR"); element.setTooltip("Click to switch to insertion mode"); } + ((ICommandService)PlatformUI.getWorkbench().getService(ICommandService.class)).refreshElements( + ToggleLeftRightInsertionHandler.COMMAND_ID, null); } } } diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/molecular/AlignmentEditor.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/molecular/AlignmentEditor.java index 79d0ca257..087b59c22 100644 --- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/molecular/AlignmentEditor.java +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/molecular/AlignmentEditor.java @@ -23,7 +23,7 @@ import info.bioinfweb.libralign.editsettings.EditSettingsChangeEvent; import info.bioinfweb.libralign.editsettings.EditSettingsListener; import info.bioinfweb.libralign.model.AlignmentModel; import info.bioinfweb.libralign.model.AlignmentModelChangeListener; -import info.bioinfweb.libralign.model.SequenceUtils; +import info.bioinfweb.libralign.model.AlignmentModelUtils; import info.bioinfweb.libralign.model.adapters.StringAdapter; import info.bioinfweb.libralign.model.events.SequenceChangeEvent; import info.bioinfweb.libralign.model.events.SequenceRenamedEvent; @@ -277,7 +277,7 @@ public class AlignmentEditor extends EditorPart { // Set consensus sequence: AlignmentModel consensusProvider = getConsensusArea().getAlignmentModel(); int id = consensusProvider.addSequence(CONSENSUS_NAME); - consensusProvider.insertTokensAt(id, 0, SequenceUtils.stringToTokenList( + consensusProvider.insertTokensAt(id, 0, AlignmentModelUtils.charSequenceToTokenList( sequenceNode.getConsensusSequence().getString(), consensusProvider.getTokenSet())); //TODO Can the consensus sequence also be null? / Should it be created here, if nothing is in the DB? } @@ -461,18 +461,60 @@ public class AlignmentEditor extends EditorPart { } - public void reverseComplementSelection() { + private String cutPherogram(boolean left) { + SelectionModel selection = getReadsArea().getSelection(); + if (selection.getCursorHeight() != 1) { + return "Cutting pherograms is only possible if exactly one row is selected."; + } + else { + PherogramArea pherogramArea = + getPherogramArea(getReadsArea().getSequenceOrder().idByIndex(selection.getCursorRow())); + if (pherogramArea == null) { + return "There is no pherogram attached to the current sequence."; + } + else { + if (left) { + if (pherogramArea.setLeftCutPositionBySelection()) { + return null; + } + else { + return "The left end of the selection lies outside the pherogram attached to this sequence."; + } + } + else { + if (pherogramArea.setRightCutPositionBySelection()) { + return null; + } + else { + return "The right end of the selection lies outside the pherogram attached to this sequence."; + } + } + } + } + } + + + public String cutPherogramLeft() { + return cutPherogram(true); + } + + + public String cutPherogramRight() { + return cutPherogram(false); + } + + + public void reverseComplementSelectedSequences() { SelectionModel selection = getReadsArea().getSelection(); - AlignmentModel provider = getReadsArea().getAlignmentModel(); - for (int row = selection.getStartRow(); row < selection.getStartRow() + selection.getCursorHeight(); row++) { + AlignmentModel model = getReadsArea().getAlignmentModel(); + for (int row = selection.getFirstRow(); row < selection.getFirstRow() + selection.getCursorHeight(); row++) { int sequenceID = getReadsArea().getSequenceOrder().idByIndex(row); - //TODO rc edited sequence - - if (getPherogramArea(sequenceID).getPherogramModel() instanceof ReverseComplementPherogramModel) { - //getPherogramArea(sequenceID). - //TODO Allow to set new provider in PherogramArea or create new PherogramArea - //TODO Reposition pherogram according to previous position in edited sequence and length - } + PherogramArea area = getPherogramArea(sequenceID); + PherogramAlignmentModel pherogramAlignmentModel = area.getPherogramAlignmentModel(); + AlignmentModelUtils.reverseComplement(model, sequenceID, + pherogramAlignmentModel.editableIndexByBaseCallIndex(area.getLeftCutPosition()).getBeforeValidIndex(), + pherogramAlignmentModel.editableIndexByBaseCallIndex(area.getRightCutPosition()).getAfterValidIndex()); + area.reverseComplement(); } } @@ -539,7 +581,7 @@ public class AlignmentEditor extends EditorPart { // Set edited sequence: Collection tokens; // First save tokens in a collection to avoid GUI updated for each token. if (editedSequence != null) { - tokens = SequenceUtils.stringToTokenList(editedSequence, provider.getTokenSet()); + tokens = AlignmentModelUtils.charSequenceToTokenList(editedSequence, provider.getTokenSet()); } else { // Copy base call sequence into alignment: tokens = new ArrayList(); -- 2.34.1