X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fcommands%2FEditCommand.java;h=aece057c845053b69bfdfb59bee3c1e364ff8816;hb=a0205942210037198f48eb20480efe88d5eb951e;hp=052b212fed256fcc2efffbc1ab9fcb7361c2c8c0;hpb=537bad6655186ae1c9daf2dbe6746c7c7168aeb0;p=jalview.git diff --git a/src/jalview/commands/EditCommand.java b/src/jalview/commands/EditCommand.java index 052b212..aece057 100644 --- a/src/jalview/commands/EditCommand.java +++ b/src/jalview/commands/EditCommand.java @@ -44,6 +44,7 @@ public class EditCommand 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; @@ -72,7 +73,25 @@ public class EditCommand new Edit(command, seqs, position, number, al)}; } - performEdit(0); + performEdit(0, null); + } + + 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)}; + } + + performEdit(0, null); } final public String getDescription() @@ -90,12 +109,42 @@ public class EditCommand return edits[0].al; } + /** + * 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 + * @param number + * @param al + * @param 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 + * @param command + * @param seqs + * @param position + * @param number + * @param al + * @param performEdit + * @param views + */ final public void appendEdit(int command, SequenceI[] seqs, int position, int number, AlignmentI al, - boolean performEdit) + boolean performEdit, AlignmentI[] views) { Edit edit = new Edit(command, seqs, position, number, al.getGapCharacter()); if (al.getHeight() == seqs.length) @@ -120,59 +169,63 @@ public class EditCommand if (performEdit) { - performEdit(edits.length - 1); + performEdit(edits.length - 1, views); } } - final void performEdit(int commandIndex) + final void performEdit(int commandIndex, AlignmentI[] views) { int eSize = edits.length; for (int e = commandIndex; e < eSize; e++) { - if (edits[e].command == INSERT_GAP) + switch(edits[e].command) { + case INSERT_GAP: insertGap(edits[e]); - } - else if (edits[e].command == DELETE_GAP) - { + break; + case DELETE_GAP: deleteGap(edits[e]); - } - else if (edits[e].command == CUT) - { - cut(edits[e]); - } - else if (edits[e].command == PASTE) - { - paste(edits[e]); + break; + case CUT: + cut(edits[e], views); + break; + case PASTE: + paste(edits[e], views); + break; + case REPLACE: + replace(edits[e]); + break; } } } - final public void doCommand() + final public void doCommand(AlignmentI[] views) { - performEdit(0); + performEdit(0,views); } - final public void undoCommand() + final public void undoCommand(AlignmentI[] views) { int e = 0, eSize = edits.length; for (e = eSize - 1; e > -1; e--) { - if (edits[e].command == INSERT_GAP) + switch (edits[e].command) { + case INSERT_GAP: deleteGap(edits[e]); - } - else if (edits[e].command == DELETE_GAP) - { + break; + case DELETE_GAP: insertGap(edits[e]); - } - else if (edits[e].command == CUT) - { - paste(edits[e]); - } - else if (edits[e].command == PASTE) - { - cut(edits[e]); + break; + case CUT: + paste(edits[e], views); + break; + case PASTE: + cut(edits[e], views); + break; + case REPLACE: + replace(edits[e]); + break; } } } @@ -186,7 +239,7 @@ public class EditCommand command.gapChar); } - adjustAnnotations(command, true, false); + adjustAnnotations(command, true, false, null); } final void deleteGap(Edit command) @@ -197,10 +250,10 @@ public class EditCommand command.position + command.number); } - adjustAnnotations(command, false, false); + adjustAnnotations(command, false, false, null); } - void cut(Edit command) + void cut(Edit command, AlignmentI[] views) { boolean seqDeleted=false; command.string = new char[command.seqs.length][]; @@ -241,10 +294,10 @@ public class EditCommand } } - adjustAnnotations(command, false, seqDeleted); + adjustAnnotations(command, false, seqDeleted, views); } - void paste(Edit command) + void paste(Edit command, AlignmentI[] views) { StringBuffer tmp; boolean newDSNeeded; @@ -322,12 +375,33 @@ public class EditCommand adjustFeatures(command, i, start, end, true); } } - adjustAnnotations(command, true, seqWasDeleted); + adjustAnnotations(command, true, seqWasDeleted, views); command.string = null; } - final void adjustAnnotations(Edit command, boolean insert, boolean modifyVisibility) + void replace(Edit command) + { + StringBuffer tmp; + String oldstring; + int start = command.position; + int end = command.number; + + command.number = start + command.string[0].length; + for (int i = 0; i < command.seqs.length; i++) + { + oldstring = command.seqs[i].getSequenceAsString(); + tmp = new StringBuffer(oldstring.substring(0, start)); + tmp.append(command.string[i]); + tmp.append(oldstring.substring(end)); + command.seqs[i].setSequence(tmp.toString()); + command.string[i] = oldstring.substring(start, end).toCharArray(); + tmp = null; + oldstring = null; + } + } + + final void adjustAnnotations(Edit command, boolean insert, boolean modifyVisibility, AlignmentI[] views) { AlignmentAnnotation[] annotations = null; @@ -347,19 +421,62 @@ public class EditCommand AlignmentAnnotation[] tmp; for (int s = 0; s < command.seqs.length; s++) { - if (modifyVisibility) + if (modifyVisibility) { // Rows are only removed or added to sequence object. if (!insert) { // remove rows tmp = command.seqs[s].getAnnotation(); if (tmp!=null) { - command.deletedAnnotationRows.put(command.seqs[s], tmp); + int alen=tmp.length; for (int aa =0; aacommand.position) { + if (copylen>=command.position) { copylen = Math.min(command.number, annotations[a].annotations.length-command.position); if (copylen>0) { @@ -697,6 +843,27 @@ public class EditCommand fullAlignmentHeight = (al.getHeight() == seqs.length); } - } + Edit(int command, + SequenceI[] seqs, + int position, + int number, + AlignmentI al, + String replace) + { + this.command = command; + this.seqs = seqs; + this.position = position; + this.number = number; + this.al = al; + this.gapChar = al.getGapCharacter(); + string = new char[seqs.length][]; + for (int i = 0; i < seqs.length; i++) + { + string[i] = replace.toCharArray(); + } + + fullAlignmentHeight = (al.getHeight() == seqs.length); + } + } }