X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fcommands%2FEditCommand.java;h=019e11eb4e2de0d9849d1ad56056976a25980e4e;hb=f2287ae5b61b6bf36ee90bd6bbf38d44331bf273;hp=e859e3efd0342adead51c7f389302b5af3e15a55;hpb=17f7dd1302e3337df9b04a811b5d45ab102ac02b;p=jalview.git diff --git a/src/jalview/commands/EditCommand.java b/src/jalview/commands/EditCommand.java index e859e3e..019e11e 100644 --- a/src/jalview/commands/EditCommand.java +++ b/src/jalview/commands/EditCommand.java @@ -1,17 +1,17 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer - * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle - * + * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1) + * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle + * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA @@ -23,27 +23,37 @@ import java.util.*; import jalview.datamodel.*; /** - * - *

Title: EditCommmand

- * - *

Description: Essential information for performing - * undo and redo for cut/paste insert/delete gap - * which can be stored in the HistoryList

- * - *

Copyright: Copyright (c) 2006

- * - *

Company: Dundee University

- * + * + *

+ * Title: EditCommmand + *

+ * + *

+ * Description: Essential information for performing undo and redo for cut/paste + * insert/delete gap which can be stored in the HistoryList + *

+ * + *

+ * Copyright: Copyright (c) 2006 + *

+ * + *

+ * Company: Dundee University + *

+ * * @author not attributable * @version 1.0 */ -public class EditCommand - implements CommandI +public class EditCommand implements CommandI { public static final int INSERT_GAP = 0; + public static final int DELETE_GAP = 1; + public static final int CUT = 2; + public static final int PASTE = 3; + public static final int REPLACE = 4; Edit[] edits; @@ -51,44 +61,35 @@ public class EditCommand String description; public EditCommand() - {} + { + } public EditCommand(String description) { this.description = description; } - public EditCommand(String description, - int command, - SequenceI[] seqs, - int position, - int number, - AlignmentI al) + public EditCommand(String description, int command, SequenceI[] seqs, + int position, int number, AlignmentI al) { this.description = description; if (command == CUT || command == PASTE) { edits = new Edit[] - { - new Edit(command, seqs, position, number, al)}; + { new Edit(command, seqs, position, number, al) }; } performEdit(0, null); } - public EditCommand(String description, - int command, - String replace, - SequenceI[] seqs, - int position, - int number, - AlignmentI al) + public EditCommand(String description, int command, String replace, + SequenceI[] seqs, int position, int number, AlignmentI al) { this.description = description; if (command == REPLACE) { edits = new Edit[] - { new Edit(command, seqs, position, number, al, replace)}; + { new Edit(command, seqs, position, number, al, replace) }; } performEdit(0, null); @@ -110,9 +111,11 @@ public class EditCommand } /** - * append a new editCommand - * Note. this shouldn't be called if the edit is an operation affects more alignment objects than the one referenced - * in al (for example, cut or pasting whole sequences). Use the form with an additional AlignmentI[] views parameter. + * append a new editCommand Note. this shouldn't be called if the edit is an + * operation affects more alignment objects than the one referenced in al (for + * example, cut or pasting whole sequences). Use the form with an additional + * AlignmentI[] views parameter. + * * @param command * @param seqs * @param position @@ -120,17 +123,16 @@ public class EditCommand * @param al * @param performEdit */ - final public void appendEdit(int command, - SequenceI[] seqs, - int position, - int number, - AlignmentI al, - boolean performEdit) + final public void appendEdit(int command, SequenceI[] seqs, int position, + int number, AlignmentI al, boolean performEdit) { appendEdit(command, seqs, position, number, al, performEdit, null); } + /** - * append a new edit command with a set of alignment views that may be operated on + * append a new edit command with a set of alignment views that may be + * operated on + * * @param command * @param seqs * @param position @@ -139,14 +141,11 @@ public class EditCommand * @param performEdit * @param views */ - final public void appendEdit(int command, - SequenceI[] seqs, - int position, - int number, - AlignmentI al, - boolean performEdit, AlignmentI[] views) + final public void appendEdit(int command, SequenceI[] seqs, int position, + int number, AlignmentI al, boolean performEdit, AlignmentI[] views) { - Edit edit = new Edit(command, seqs, position, number, al.getGapCharacter()); + Edit edit = new Edit(command, seqs, position, number, al + .getGapCharacter()); if (al.getHeight() == seqs.length) { edit.al = al; @@ -163,8 +162,7 @@ public class EditCommand else { edits = new Edit[] - { - edit}; + { edit }; } if (performEdit) @@ -178,30 +176,30 @@ public class EditCommand int eSize = edits.length; for (int e = commandIndex; e < eSize; e++) { - switch(edits[e].command) + switch (edits[e].command) { - case INSERT_GAP: + case INSERT_GAP: insertGap(edits[e]); - break; - case DELETE_GAP: + break; + case DELETE_GAP: deleteGap(edits[e]); - break; - case CUT: + break; + case CUT: cut(edits[e], views); - break; - case PASTE: + break; + case PASTE: paste(edits[e], views); - break; - case REPLACE: - replace(edits[e]); - break; + break; + case REPLACE: + replace(edits[e]); + break; } } } final public void doCommand(AlignmentI[] views) { - performEdit(0,views); + performEdit(0, views); } final public void undoCommand(AlignmentI[] views) @@ -211,21 +209,21 @@ public class EditCommand { switch (edits[e].command) { - case INSERT_GAP: + case INSERT_GAP: deleteGap(edits[e]); - break; - case DELETE_GAP: + break; + case DELETE_GAP: insertGap(edits[e]); - break; - case CUT: + break; + case CUT: paste(edits[e], views); - break; - case PASTE: + break; + case PASTE: cut(edits[e], views); - break; - case REPLACE: - replace(edits[e]); - break; + break; + case REPLACE: + replace(edits[e]); + break; } } } @@ -235,9 +233,8 @@ public class EditCommand for (int s = 0; s < command.seqs.length; s++) { - command.seqs[s].insertCharAt(command.position, - command.number, - command.gapChar); + command.seqs[s].insertCharAt(command.position, command.number, + command.gapChar); } adjustAnnotations(command, true, false, null); @@ -247,8 +244,8 @@ public class EditCommand { for (int s = 0; s < command.seqs.length; s++) { - command.seqs[s].deleteChars(command.position, - command.position + command.number); + command.seqs[s].deleteChars(command.position, command.position + + command.number); } adjustAnnotations(command, false, false, null); @@ -256,7 +253,7 @@ public class EditCommand void cut(Edit command, AlignmentI[] views) { - boolean seqDeleted=false; + boolean seqDeleted = false; command.string = new char[command.seqs.length][]; for (int i = 0; i < command.seqs.length; i++) @@ -264,35 +261,35 @@ public class EditCommand if (command.seqs[i].getLength() > command.position) { command.string[i] = command.seqs[i].getSequence(command.position, - command.position + command.number); + command.position + command.number); SequenceI oldds = command.seqs[i].getDatasetSequence(); - if (command.oldds!=null && command.oldds[i]!=null) + if (command.oldds != null && command.oldds[i] != null) { // we are redoing an undone cut. command.seqs[i].setDatasetSequence(null); } - command.seqs[i].deleteChars(command.position, - command.position + command.number); - if (command.oldds!=null && command.oldds[i]!=null) + command.seqs[i].deleteChars(command.position, command.position + + command.number); + if (command.oldds != null && command.oldds[i] != null) { // oldds entry contains the cut dataset sequence. command.seqs[i].setDatasetSequence(command.oldds[i]); command.oldds[i] = oldds; - } else { + } + else + { // modify the oldds if necessary - if (oldds!=command.seqs[i].getDatasetSequence() - || command.seqs[i].getSequenceFeatures() != null) + if (oldds != command.seqs[i].getDatasetSequence() + || command.seqs[i].getSequenceFeatures() != null) { - if (command.oldds==null) + if (command.oldds == null) { command.oldds = new SequenceI[command.seqs.length]; } command.oldds[i] = oldds; - adjustFeatures(command, i, - command.seqs[i].findPosition(command.position), - command.seqs[i].findPosition(command.position + - command.number), - false); + adjustFeatures(command, i, command.seqs[i] + .findPosition(command.position), command.seqs[i] + .findPosition(command.position + command.number), false); } } } @@ -300,7 +297,7 @@ public class EditCommand if (command.seqs[i].getLength() < 1) { command.al.deleteSequence(command.seqs[i]); - seqDeleted=true; + seqDeleted = true; } } @@ -312,14 +309,14 @@ public class EditCommand StringBuffer tmp; boolean newDSNeeded; boolean newDSWasNeeded; - int newstart,newend; - boolean seqWasDeleted=false; + int newstart, newend; + boolean seqWasDeleted = false; int start = 0, end = 0; for (int i = 0; i < command.seqs.length; i++) { newDSNeeded = false; - newDSWasNeeded = command.oldds!=null && command.oldds[i]!=null; + newDSWasNeeded = command.oldds != null && command.oldds[i] != null; if (command.seqs[i].getLength() < 1) { // ie this sequence was deleted, we need to @@ -327,27 +324,28 @@ public class EditCommand if (command.alIndex[i] < command.al.getHeight()) { command.al.getSequences().insertElementAt(command.seqs[i], - command.alIndex[i]); + command.alIndex[i]); } else { command.al.addSequence(command.seqs[i]); } - seqWasDeleted=true; + seqWasDeleted = true; } newstart = command.seqs[i].getStart(); newend = command.seqs[i].getEnd(); tmp = new StringBuffer(); tmp.append(command.seqs[i].getSequence()); - //Undo of a delete does not replace original dataset sequence on to alignment sequence. - + // Undo of a delete does not replace original dataset sequence on to + // alignment sequence. + if (command.string != null && command.string[i] != null) { if (command.position >= tmp.length()) { - //This occurs if padding is on, and residues - //are removed from end of alignment + // This occurs if padding is on, and residues + // are removed from end of alignment int length = command.position - tmp.length(); while (length > 0) { @@ -358,17 +356,16 @@ public class EditCommand tmp.insert(command.position, command.string[i]); for (int s = 0; s < command.string[i].length; s++) { - if (jalview.schemes.ResidueProperties.aaIndex[command.string[i][s]] != - 23) + if (jalview.schemes.ResidueProperties.aaIndex[command.string[i][s]] != 23) { if (!newDSNeeded) { newDSNeeded = true; start = command.seqs[i].findPosition(command.position); - end = command.seqs[i].findPosition(command.position + - command.number); + end = command.seqs[i].findPosition(command.position + + command.number); } - if (command.seqs[i].getStart()==start) + if (command.seqs[i].getStart() == start) newstart--; else newend++; @@ -383,28 +380,28 @@ public class EditCommand if (newDSNeeded) { if (command.seqs[i].getDatasetSequence() != null) - { + { SequenceI ds; if (newDSWasNeeded) { ds = command.oldds[i]; - } else { + } + else + { // make a new DS sequence // use new ds mechanism here - ds= new Sequence(command.seqs[i].getName(), - jalview.analysis.AlignSeq.extractGaps( - jalview.util.Comparison.GapChars, - command.seqs[i].getSequenceAsString() - ), - command.seqs[i].getStart(), - command.seqs[i].getEnd()); + ds = new Sequence(command.seqs[i].getName(), + jalview.analysis.AlignSeq.extractGaps( + jalview.util.Comparison.GapChars, + command.seqs[i].getSequenceAsString()), + command.seqs[i].getStart(), command.seqs[i].getEnd()); ds.setDescription(command.seqs[i].getDescription()); } - if (command.oldds==null) + if (command.oldds == null) { command.oldds = new SequenceI[command.seqs.length]; } - command.oldds[i]=command.seqs[i].getDatasetSequence(); + command.oldds[i] = command.seqs[i].getDatasetSequence(); command.seqs[i].setDatasetSequence(ds); } adjustFeatures(command, i, start, end, true); @@ -421,30 +418,23 @@ public class EditCommand String oldstring; int start = command.position; int end = command.number; - // TODO TUTORIAL - Fix for replacement with different length of sequence (or whole sequence) - // TODO Jalview 2.4 bugfix change to an aggregate command - original sequence string is cut, new string is pasted in. + // TODO TUTORIAL - Fix for replacement with different length of sequence (or + // whole sequence) + // TODO Jalview 2.4 bugfix change to an aggregate command - original + // sequence string is cut, new string is pasted in. command.number = start + command.string[0].length; for (int i = 0; i < command.seqs.length; i++) { - /** cut - * addHistoryItem(new EditCommand("Cut Sequences", - EditCommand.CUT, - cut, - sg.getStartRes(), - sg.getEndRes()-sg.getStartRes()+1, - viewport.alignment)); - + /** + * cut addHistoryItem(new EditCommand("Cut Sequences", EditCommand.CUT, + * cut, sg.getStartRes(), sg.getEndRes()-sg.getStartRes()+1, + * viewport.alignment)); + * */ - /** then - * addHistoryItem(new EditCommand( - "Add sequences", - EditCommand.PASTE, - sequences, - 0, - alignment.getWidth(), - alignment) - ); - + /** + * then addHistoryItem(new EditCommand( "Add sequences", + * EditCommand.PASTE, sequences, 0, alignment.getWidth(), alignment) ); + * */ oldstring = command.seqs[i].getSequenceAsString(); tmp = new StringBuffer(oldstring.substring(0, start)); @@ -457,7 +447,8 @@ public class EditCommand } } - final void adjustAnnotations(Edit command, boolean insert, boolean modifyVisibility, AlignmentI[] views) + final void adjustAnnotations(Edit command, boolean insert, + boolean modifyVisibility, AlignmentI[] views) { AlignmentAnnotation[] annotations = null; @@ -479,28 +470,31 @@ public class EditCommand if (modifyVisibility) { // Rows are only removed or added to sequence object. - if (!insert) { + if (!insert) + { // remove rows tmp = command.seqs[s].getAnnotation(); - if (tmp!=null) { - int alen=tmp.length; - for (int aa =0; aa0) - System.arraycopy(annotations[a].annotations, - 0, temp, 0, copylen); //command.position); + int copylen = Math.min(command.position, + annotations[a].annotations.length); + if (copylen > 0) + System.arraycopy(annotations[a].annotations, 0, temp, 0, + copylen); // command.position); Annotation[] deleted = new Annotation[command.number]; - if (copylen>=command.position) { - copylen = Math.min(command.number, annotations[a].annotations.length-command.position); - if (copylen>0) + if (copylen >= command.position) + { + copylen = Math.min(command.number, + annotations[a].annotations.length - command.position); + if (copylen > 0) { System.arraycopy(annotations[a].annotations, command.position, deleted, 0, copylen); // command.number); @@ -729,12 +728,14 @@ public class EditCommand } command.deletedAnnotations.put(annotations[a].annotationId, - deleted); - if (annotations[a].annotations.length>command.position+command.number) { - System.arraycopy(annotations[a].annotations, - command.position + command.number, - temp, command.position, - annotations[a].annotations.length - command.position - command.number); // aSize + deleted); + if (annotations[a].annotations.length > command.position + + command.number) + { + System.arraycopy(annotations[a].annotations, command.position + + command.number, temp, command.position, + annotations[a].annotations.length - command.position + - command.number); // aSize } } else @@ -744,17 +745,16 @@ public class EditCommand if (dSize > 0) { Annotation[] deleted = new Annotation[command.number]; - System.arraycopy(annotations[a].annotations, - command.position, deleted, 0, dSize); + System.arraycopy(annotations[a].annotations, command.position, + deleted, 0, dSize); command.deletedAnnotations.put(annotations[a].annotationId, - deleted); + deleted); tSize = Math.min(annotations[a].annotations.length, - command.position); + command.position); temp = new Annotation[tSize]; - System.arraycopy(annotations[a].annotations, - 0, temp, 0, tSize); + System.arraycopy(annotations[a].annotations, 0, temp, 0, tSize); } else { @@ -768,7 +768,7 @@ public class EditCommand } final void adjustFeatures(Edit command, int index, int i, int j, - boolean insert) + boolean insert) { SequenceI seq = command.seqs[index]; SequenceI sequence = seq.getDatasetSequence(); @@ -780,11 +780,11 @@ public class EditCommand if (insert) { if (command.editedFeatures != null - && command.editedFeatures.containsKey(seq)) + && command.editedFeatures.containsKey(seq)) { - sequence.setSequenceFeatures( - (SequenceFeature[]) command.editedFeatures.get(seq) - ); + sequence + .setSequenceFeatures((SequenceFeature[]) command.editedFeatures + .get(seq)); } return; @@ -849,23 +849,31 @@ public class EditCommand class Edit { public SequenceI[] oldds; + boolean fullAlignmentHeight = false; + Hashtable deletedAnnotationRows; + Hashtable deletedAnnotations; + Hashtable editedFeatures; + AlignmentI al; + int command; + char[][] string; + SequenceI[] seqs; + int[] alIndex; + int position, number; + char gapChar; - Edit(int command, - SequenceI[] seqs, - int position, - int number, - char gapChar) + Edit(int command, SequenceI[] seqs, int position, int number, + char gapChar) { this.command = command; this.seqs = seqs; @@ -874,11 +882,8 @@ public class EditCommand this.gapChar = gapChar; } - Edit(int command, - SequenceI[] seqs, - int position, - int number, - AlignmentI al) + Edit(int command, SequenceI[] seqs, int position, int number, + AlignmentI al) { this.gapChar = al.getGapCharacter(); this.command = command; @@ -896,12 +901,8 @@ public class EditCommand fullAlignmentHeight = (al.getHeight() == seqs.length); } - Edit(int command, - SequenceI[] seqs, - int position, - int number, - AlignmentI al, - String replace) + Edit(int command, SequenceI[] seqs, int position, int number, + AlignmentI al, String replace) { this.command = command; this.seqs = seqs;