JAL-1807 test
[jalviewjs.git] / bin / jalview / commands / EditCommand.js
index b556231..0839473 100644 (file)
-Clazz.declarePackage ("jalview.commands");\r
-Clazz.load (["jalview.commands.CommandI", "java.lang.Enum", "java.util.ArrayList"], "jalview.commands.EditCommand", ["jalview.analysis.AlignSeq", "jalview.datamodel.AlignmentAnnotation", "$.Annotation", "$.Sequence", "$.SequenceFeature", "jalview.schemes.ResidueProperties", "jalview.util.Comparison", "$.ReverseListIterator", "$.StringUtils", "java.lang.StringBuffer", "java.util.HashMap", "$.Hashtable"], function () {\r
-c$ = Clazz.decorateAsClass (function () {\r
-this.edits = null;\r
-this.description = null;\r
-if (!Clazz.isClassDefined ("jalview.commands.EditCommand.Edit")) {\r
-jalview.commands.EditCommand.$EditCommand$Edit$ ();\r
-}\r
-Clazz.instantialize (this, arguments);\r
-}, jalview.commands, "EditCommand", null, jalview.commands.CommandI);\r
-Clazz.prepareFields (c$, function () {\r
-this.edits =  new java.util.ArrayList ();\r
-});\r
-Clazz.makeConstructor (c$, \r
-function () {\r
-});\r
-Clazz.makeConstructor (c$, \r
-function (description) {\r
-this.description = description;\r
-}, "~S");\r
-Clazz.makeConstructor (c$, \r
-function (description, command, seqs, position, number, al) {\r
-this.description = description;\r
-if (command === jalview.commands.EditCommand.Action.CUT || command === jalview.commands.EditCommand.Action.PASTE) {\r
-this.setEdit (Clazz.innerTypeInstance (jalview.commands.EditCommand.Edit, this, null, command, seqs, position, number, al));\r
-}this.performEdit (0, null);\r
-}, "~S,jalview.commands.EditCommand.Action,~A,~N,~N,jalview.datamodel.AlignmentI");\r
-Clazz.makeConstructor (c$, \r
-function (description, command, replace, seqs, position, number, al) {\r
-this.description = description;\r
-if (command === jalview.commands.EditCommand.Action.REPLACE) {\r
-this.setEdit (Clazz.innerTypeInstance (jalview.commands.EditCommand.Edit, this, null, command, seqs, position, number, al, replace));\r
-}this.performEdit (0, null);\r
-}, "~S,jalview.commands.EditCommand.Action,~S,~A,~N,~N,jalview.datamodel.AlignmentI");\r
-Clazz.defineMethod (c$, "setEdit", \r
-function (e) {\r
-this.edits.clear ();\r
-this.edits.add (e);\r
-}, "jalview.commands.EditCommand.Edit");\r
-Clazz.defineMethod (c$, "addEdit", \r
-function (e) {\r
-if (!jalview.commands.EditCommand.expandEdit (this.edits, e)) {\r
-this.edits.add (e);\r
-}}, "jalview.commands.EditCommand.Edit");\r
-c$.expandEdit = Clazz.defineMethod (c$, "expandEdit", \r
-function (edits, e) {\r
-if (edits == null || edits.isEmpty ()) {\r
-return false;\r
-}var lastEdit = edits.get (edits.size () - 1);\r
-var action = e.command;\r
-if (lastEdit.command !== action) {\r
-return false;\r
-}if (lastEdit.seqs.length != e.seqs.length) {\r
-return false;\r
-}for (var i = 0; i < e.seqs.length; i++) {\r
-if (lastEdit.seqs[i].getDatasetSequence () !== e.seqs[i].getDatasetSequence ()) {\r
-return false;\r
-}}\r
-var contiguous = (action === jalview.commands.EditCommand.Action.INSERT_GAP && e.position == lastEdit.position + lastEdit.number) || (action === jalview.commands.EditCommand.Action.DELETE_GAP && e.position + e.number == lastEdit.position);\r
-if (contiguous) {\r
-lastEdit.number += e.number;\r
-lastEdit.seqs = e.seqs;\r
-if (action === jalview.commands.EditCommand.Action.DELETE_GAP) {\r
-lastEdit.position--;\r
-}return true;\r
-}return false;\r
-}, "java.util.List,jalview.commands.EditCommand.Edit");\r
-Clazz.defineMethod (c$, "clearEdits", \r
-function () {\r
-this.edits.clear ();\r
-});\r
-Clazz.defineMethod (c$, "getEdit", \r
-function (i) {\r
-if (i >= 0 && i < this.edits.size ()) {\r
-return this.edits.get (i);\r
-}return null;\r
-}, "~N");\r
-Clazz.overrideMethod (c$, "getDescription", \r
-function () {\r
-return this.description;\r
-});\r
-Clazz.overrideMethod (c$, "getSize", \r
-function () {\r
-return this.edits.size ();\r
-});\r
-Clazz.defineMethod (c$, "getAlignment", \r
-function () {\r
-return (this.edits.isEmpty () ? null : this.edits.get (0).al);\r
-});\r
-Clazz.defineMethod (c$, "appendEdit", \r
-function (command, seqs, position, number, al, performEdit) {\r
-this.appendEdit (command, seqs, position, number, al, performEdit, null);\r
-}, "jalview.commands.EditCommand.Action,~A,~N,~N,jalview.datamodel.AlignmentI,~B");\r
-Clazz.defineMethod (c$, "appendEdit", \r
-function (command, seqs, position, number, al, performEdit, views) {\r
-var edit = Clazz.innerTypeInstance (jalview.commands.EditCommand.Edit, this, null, command, seqs, position, number, al.getGapCharacter ());\r
-if (al.getHeight () == seqs.length) {\r
-edit.al = al;\r
-edit.fullAlignmentHeight = true;\r
-}this.addEdit (edit);\r
-if (performEdit) {\r
-jalview.commands.EditCommand.performEdit (edit, views);\r
-}}, "jalview.commands.EditCommand.Action,~A,~N,~N,jalview.datamodel.AlignmentI,~B,~A");\r
-Clazz.defineMethod (c$, "appendEdit", \r
-function (edit, al, performEdit, views) {\r
-if (al.getHeight () == edit.seqs.length) {\r
-edit.al = al;\r
-edit.fullAlignmentHeight = true;\r
-}this.addEdit (edit);\r
-if (performEdit) {\r
-jalview.commands.EditCommand.performEdit (edit, views);\r
-}}, "jalview.commands.EditCommand.Edit,jalview.datamodel.AlignmentI,~B,~A");\r
-Clazz.defineMethod (c$, "performEdit", \r
-function (commandIndex, views) {\r
-var iterator = this.edits.listIterator (commandIndex);\r
-while (iterator.hasNext ()) {\r
-var edit = iterator.next ();\r
-jalview.commands.EditCommand.performEdit (edit, views);\r
-}\r
-}, "~N,~A");\r
-c$.performEdit = Clazz.defineMethod (c$, "performEdit", \r
-function (edit, views) {\r
-switch (edit.command) {\r
-case jalview.commands.EditCommand.Action.INSERT_GAP:\r
-jalview.commands.EditCommand.insertGap (edit);\r
-break;\r
-case jalview.commands.EditCommand.Action.DELETE_GAP:\r
-jalview.commands.EditCommand.deleteGap (edit);\r
-break;\r
-case jalview.commands.EditCommand.Action.CUT:\r
-jalview.commands.EditCommand.cut (edit, views);\r
-break;\r
-case jalview.commands.EditCommand.Action.PASTE:\r
-jalview.commands.EditCommand.paste (edit, views);\r
-break;\r
-case jalview.commands.EditCommand.Action.REPLACE:\r
-jalview.commands.EditCommand.replace (edit);\r
-break;\r
-case jalview.commands.EditCommand.Action.INSERT_NUC:\r
-break;\r
-default:\r
-break;\r
-}\r
-}, "jalview.commands.EditCommand.Edit,~A");\r
-Clazz.overrideMethod (c$, "doCommand", \r
-function (views) {\r
-this.performEdit (0, views);\r
-}, "~A");\r
-Clazz.overrideMethod (c$, "undoCommand", \r
-function (views) {\r
-var iterator = this.edits.listIterator (this.edits.size ());\r
-while (iterator.hasPrevious ()) {\r
-var e = iterator.previous ();\r
-switch (e.command) {\r
-case jalview.commands.EditCommand.Action.INSERT_GAP:\r
-jalview.commands.EditCommand.deleteGap (e);\r
-break;\r
-case jalview.commands.EditCommand.Action.DELETE_GAP:\r
-jalview.commands.EditCommand.insertGap (e);\r
-break;\r
-case jalview.commands.EditCommand.Action.CUT:\r
-jalview.commands.EditCommand.paste (e, views);\r
-break;\r
-case jalview.commands.EditCommand.Action.PASTE:\r
-jalview.commands.EditCommand.cut (e, views);\r
-break;\r
-case jalview.commands.EditCommand.Action.REPLACE:\r
-jalview.commands.EditCommand.replace (e);\r
-break;\r
-case jalview.commands.EditCommand.Action.INSERT_NUC:\r
-break;\r
-default:\r
-break;\r
-}\r
-}\r
-}, "~A");\r
-c$.insertGap = Clazz.defineMethod (c$, "insertGap", \r
-($fz = function (command) {\r
-for (var s = 0; s < command.seqs.length; s++) {\r
-command.seqs[s].insertCharAt (command.position, command.number, command.gapChar);\r
-}\r
-jalview.commands.EditCommand.adjustAnnotations (command, true, false, null);\r
-}, $fz.isPrivate = true, $fz), "jalview.commands.EditCommand.Edit");\r
-c$.deleteGap = Clazz.defineMethod (c$, "deleteGap", \r
-($fz = function (command) {\r
-for (var s = 0; s < command.seqs.length; s++) {\r
-command.seqs[s].deleteChars (command.position, command.position + command.number);\r
-}\r
-jalview.commands.EditCommand.adjustAnnotations (command, false, false, null);\r
-}, $fz.isPrivate = true, $fz), "jalview.commands.EditCommand.Edit");\r
-c$.cut = Clazz.defineMethod (c$, "cut", \r
-function (command, views) {\r
-var seqDeleted = false;\r
-command.string =  Clazz.newCharArray (command.seqs.length, '\0');\r
-for (var i = 0; i < command.seqs.length; i++) {\r
-var sequence = command.seqs[i];\r
-if (sequence.getLength () > command.position) {\r
-command.string[i] = sequence.getSequence (command.position, command.position + command.number);\r
-var oldds = sequence.getDatasetSequence ();\r
-if (command.oldds != null && command.oldds[i] != null) {\r
-sequence.setDatasetSequence (null);\r
-}sequence.deleteChars (command.position, command.position + command.number);\r
-if (command.oldds != null && command.oldds[i] != null) {\r
-sequence.setDatasetSequence (command.oldds[i]);\r
-command.oldds[i] = oldds;\r
-} else {\r
-if (oldds !== sequence.getDatasetSequence () || sequence.getSequenceFeatures () != null) {\r
-if (command.oldds == null) {\r
-command.oldds =  new Array (command.seqs.length);\r
-}command.oldds[i] = oldds;\r
-jalview.commands.EditCommand.adjustFeatures (command, i, sequence.findPosition (command.position), sequence.findPosition (command.position + command.number), false);\r
-}}}if (sequence.getLength () < 1) {\r
-command.al.deleteSequence (sequence);\r
-seqDeleted = true;\r
-}}\r
-jalview.commands.EditCommand.adjustAnnotations (command, false, seqDeleted, views);\r
-}, "jalview.commands.EditCommand.Edit,~A");\r
-c$.paste = Clazz.defineMethod (c$, "paste", \r
-function (command, views) {\r
-var tmp;\r
-var newDSNeeded;\r
-var newDSWasNeeded;\r
-var newstart;\r
-var newend;\r
-var seqWasDeleted = false;\r
-var start = 0;\r
-var end = 0;\r
-for (var i = 0; i < command.seqs.length; i++) {\r
-newDSNeeded = false;\r
-newDSWasNeeded = command.oldds != null && command.oldds[i] != null;\r
-if (command.seqs[i].getLength () < 1) {\r
-if (command.alIndex[i] < command.al.getHeight ()) {\r
-var sequences;\r
-{\r
-if (!(command.alIndex[i] < 0)) {\r
-sequences.add (command.alIndex[i], command.seqs[i]);\r
-}}} else {\r
-command.al.addSequence (command.seqs[i]);\r
-}seqWasDeleted = true;\r
-}newstart = command.seqs[i].getStart ();\r
-newend = command.seqs[i].getEnd ();\r
-tmp =  new StringBuffer ();\r
-tmp.append (command.seqs[i].getSequence ());\r
-if (command.string != null && command.string[i] != null) {\r
-if (command.position >= tmp.length ()) {\r
-var length = command.position - tmp.length ();\r
-while (length > 0) {\r
-tmp.append (command.gapChar);\r
-length--;\r
-}\r
-}tmp.insert (command.position, command.string[i]);\r
-for (var s = 0; s < command.string[i].length; s++) {\r
-if (jalview.schemes.ResidueProperties.aaIndex[command.string[i][s].charCodeAt (0)] != 23) {\r
-if (!newDSNeeded) {\r
-newDSNeeded = true;\r
-start = command.seqs[i].findPosition (command.position);\r
-end = command.seqs[i].findPosition (command.position + command.number);\r
-}if (command.seqs[i].getStart () == start) {\r
-newstart--;\r
-} else {\r
-newend++;\r
-}}}\r
-command.string[i] = null;\r
-}command.seqs[i].setSequence (tmp.toString ());\r
-command.seqs[i].setStart (newstart);\r
-command.seqs[i].setEnd (newend);\r
-if (newDSNeeded) {\r
-if (command.seqs[i].getDatasetSequence () != null) {\r
-var ds;\r
-if (newDSWasNeeded) {\r
-ds = command.oldds[i];\r
-} else {\r
-ds =  new jalview.datamodel.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 ());\r
-ds.setDescription (command.seqs[i].getDescription ());\r
-}if (command.oldds == null) {\r
-command.oldds =  new Array (command.seqs.length);\r
-}command.oldds[i] = command.seqs[i].getDatasetSequence ();\r
-command.seqs[i].setDatasetSequence (ds);\r
-}jalview.commands.EditCommand.adjustFeatures (command, i, start, end, true);\r
-}}\r
-jalview.commands.EditCommand.adjustAnnotations (command, true, seqWasDeleted, views);\r
-command.string = null;\r
-}, "jalview.commands.EditCommand.Edit,~A");\r
-c$.replace = Clazz.defineMethod (c$, "replace", \r
-function (command) {\r
-var tmp;\r
-var oldstring;\r
-var start = command.position;\r
-var end = command.number;\r
-command.number = start + command.string[0].length;\r
-for (var i = 0; i < command.seqs.length; i++) {\r
-var newDSWasNeeded = command.oldds != null && command.oldds[i] != null;\r
-oldstring = command.seqs[i].getSequenceAsString ();\r
-tmp =  new StringBuffer (oldstring.substring (0, start));\r
-tmp.append (command.string[i]);\r
-var nogaprep = jalview.analysis.AlignSeq.extractGaps (jalview.util.Comparison.GapChars,  String.instantialize (command.string[i]));\r
-var ipos = command.seqs[i].findPosition (start) - command.seqs[i].getStart ();\r
-tmp.append (oldstring.substring (end));\r
-command.seqs[i].setSequence (tmp.toString ());\r
-command.string[i] = oldstring.substring (start, end).toCharArray ();\r
-var nogapold = jalview.analysis.AlignSeq.extractGaps (jalview.util.Comparison.GapChars,  String.instantialize (command.string[i]));\r
-if (!nogaprep.toLowerCase ().equals (nogapold.toLowerCase ())) {\r
-if (newDSWasNeeded) {\r
-var oldds = command.seqs[i].getDatasetSequence ();\r
-command.seqs[i].setDatasetSequence (command.oldds[i]);\r
-command.oldds[i] = oldds;\r
-} else {\r
-if (command.oldds == null) {\r
-command.oldds =  new Array (command.seqs.length);\r
-}command.oldds[i] = command.seqs[i].getDatasetSequence ();\r
-var newds =  new jalview.datamodel.Sequence (command.seqs[i].getDatasetSequence ());\r
-var fullseq;\r
-var osp = newds.getSequenceAsString ();\r
-fullseq = osp.substring (0, ipos) + nogaprep + osp.substring (ipos + nogaprep.length);\r
-newds.setSequence (fullseq.toUpperCase ());\r
-command.seqs[i].setDatasetSequence (newds);\r
-}}tmp = null;\r
-oldstring = null;\r
-}\r
-}, "jalview.commands.EditCommand.Edit");\r
-c$.adjustAnnotations = Clazz.defineMethod (c$, "adjustAnnotations", \r
-function (command, insert, modifyVisibility, views) {\r
-var annotations = null;\r
-if (modifyVisibility && !insert) {\r
-command.deletedAnnotationRows =  new java.util.Hashtable ();\r
-}if (command.fullAlignmentHeight) {\r
-annotations = command.al.getAlignmentAnnotation ();\r
-} else {\r
-var aSize = 0;\r
-var tmp;\r
-for (var s = 0; s < command.seqs.length; s++) {\r
-if (modifyVisibility) {\r
-if (!insert) {\r
-tmp = command.seqs[s].getAnnotation ();\r
-if (tmp != null) {\r
-var alen = tmp.length;\r
-for (var aa = 0; aa < tmp.length; aa++) {\r
-if (!command.al.deleteAnnotation (tmp[aa])) {\r
-tmp[aa] = null;\r
-alen--;\r
-}}\r
-command.seqs[s].setAlignmentAnnotation (null);\r
-if (alen != tmp.length) {\r
-var saved =  new Array (alen);\r
-for (var aa = 0, aapos = 0; aa < tmp.length; aa++) {\r
-if (tmp[aa] != null) {\r
-saved[aapos++] = tmp[aa];\r
-tmp[aa] = null;\r
-}}\r
-tmp = saved;\r
-command.deletedAnnotationRows.put (command.seqs[s], saved);\r
-for (var alview = 0; views != null && alview < views.length; alview++) {\r
-if (views[alview] !== command.al) {\r
-var toremove = views[alview].getAlignmentAnnotation ();\r
-if (toremove == null || toremove.length == 0) {\r
-continue;\r
-}for (var aa = 0; aa < toremove.length; aa++) {\r
-if (toremove[aa].sequenceRef === command.seqs[s]) {\r
-views[alview].deleteAnnotation (toremove[aa]);\r
-}}\r
-}}\r
-} else {\r
-command.deletedAnnotationRows.put (command.seqs[s], tmp);\r
-}}} else {\r
-if (command.deletedAnnotationRows != null && command.deletedAnnotationRows.containsKey (command.seqs[s])) {\r
-var revealed = command.deletedAnnotationRows.get (command.seqs[s]);\r
-command.seqs[s].setAlignmentAnnotation (revealed);\r
-if (revealed != null) {\r
-for (var aa = 0; aa < revealed.length; aa++) {\r
-command.al.addAnnotation (revealed[aa]);\r
-}\r
-for (var aa = 0; aa < revealed.length; aa++) {\r
-command.al.setAnnotationIndex (revealed[aa], aa);\r
-}\r
-for (var vnum = 0; views != null && vnum < views.length; vnum++) {\r
-if (views[vnum] !== command.al) {\r
-var avwidth = views[vnum].getWidth () + 1;\r
-for (var a = 0; a < revealed.length; a++) {\r
-var newann =  new jalview.datamodel.AlignmentAnnotation (revealed[a]);\r
-command.seqs[s].addAlignmentAnnotation (newann);\r
-newann.padAnnotation (avwidth);\r
-views[vnum].addAnnotation (newann);\r
-views[vnum].setAnnotationIndex (newann, a);\r
-}\r
-}}\r
-}}}continue;\r
-}if (command.seqs[s].getAnnotation () == null) {\r
-continue;\r
-}if (aSize == 0) {\r
-annotations = command.seqs[s].getAnnotation ();\r
-} else {\r
-tmp =  new Array (aSize + command.seqs[s].getAnnotation ().length);\r
-System.arraycopy (annotations, 0, tmp, 0, aSize);\r
-System.arraycopy (command.seqs[s].getAnnotation (), 0, tmp, aSize, command.seqs[s].getAnnotation ().length);\r
-annotations = tmp;\r
-}aSize = annotations.length;\r
-}\r
-}if (annotations == null) {\r
-return;\r
-}if (!insert) {\r
-command.deletedAnnotations =  new java.util.Hashtable ();\r
-}var aSize;\r
-var temp;\r
-for (var a = 0; a < annotations.length; a++) {\r
-if (annotations[a].autoCalculated || annotations[a].annotations == null) {\r
-continue;\r
-}var tSize = 0;\r
-aSize = annotations[a].annotations.length;\r
-if (insert) {\r
-temp =  new Array (aSize + command.number);\r
-if (annotations[a].padGaps) {\r
-for (var aa = 0; aa < temp.length; aa++) {\r
-temp[aa] =  new jalview.datamodel.Annotation (command.gapChar + "", null, ' ', 0);\r
-}\r
-}} else {\r
-if (command.position < aSize) {\r
-if (command.position + command.number >= aSize) {\r
-tSize = aSize;\r
-} else {\r
-tSize = aSize - command.number;\r
-}} else {\r
-tSize = aSize;\r
-}if (tSize < 0) {\r
-tSize = aSize;\r
-}temp =  new Array (tSize);\r
-}if (insert) {\r
-if (command.position < annotations[a].annotations.length) {\r
-System.arraycopy (annotations[a].annotations, 0, temp, 0, command.position);\r
-if (command.deletedAnnotations != null && command.deletedAnnotations.containsKey (annotations[a].annotationId)) {\r
-var restore = command.deletedAnnotations.get (annotations[a].annotationId);\r
-System.arraycopy (restore, 0, temp, command.position, command.number);\r
-}System.arraycopy (annotations[a].annotations, command.position, temp, command.position + command.number, aSize - command.position);\r
-} else {\r
-if (command.deletedAnnotations != null && command.deletedAnnotations.containsKey (annotations[a].annotationId)) {\r
-var restore = command.deletedAnnotations.get (annotations[a].annotationId);\r
-temp =  new Array (annotations[a].annotations.length + restore.length);\r
-System.arraycopy (annotations[a].annotations, 0, temp, 0, annotations[a].annotations.length);\r
-System.arraycopy (restore, 0, temp, annotations[a].annotations.length, restore.length);\r
-} else {\r
-temp = annotations[a].annotations;\r
-}}} else {\r
-if (tSize != aSize || command.position < 2) {\r
-var copylen = Math.min (command.position, annotations[a].annotations.length);\r
-if (copylen > 0) {\r
-System.arraycopy (annotations[a].annotations, 0, temp, 0, copylen);\r
-}var deleted =  new Array (command.number);\r
-if (copylen >= command.position) {\r
-copylen = Math.min (command.number, annotations[a].annotations.length - command.position);\r
-if (copylen > 0) {\r
-System.arraycopy (annotations[a].annotations, command.position, deleted, 0, copylen);\r
-}}command.deletedAnnotations.put (annotations[a].annotationId, deleted);\r
-if (annotations[a].annotations.length > command.position + command.number) {\r
-System.arraycopy (annotations[a].annotations, command.position + command.number, temp, command.position, annotations[a].annotations.length - command.position - command.number);\r
-}} else {\r
-var dSize = aSize - command.position;\r
-if (dSize > 0) {\r
-var deleted =  new Array (command.number);\r
-System.arraycopy (annotations[a].annotations, command.position, deleted, 0, dSize);\r
-command.deletedAnnotations.put (annotations[a].annotationId, deleted);\r
-tSize = Math.min (annotations[a].annotations.length, command.position);\r
-temp =  new Array (tSize);\r
-System.arraycopy (annotations[a].annotations, 0, temp, 0, tSize);\r
-} else {\r
-temp = annotations[a].annotations;\r
-}}}annotations[a].annotations = temp;\r
-}\r
-}, "jalview.commands.EditCommand.Edit,~B,~B,~A");\r
-c$.adjustFeatures = Clazz.defineMethod (c$, "adjustFeatures", \r
-function (command, index, i, j, insert) {\r
-var seq = command.seqs[index];\r
-var sequence = seq.getDatasetSequence ();\r
-if (sequence == null) {\r
-sequence = seq;\r
-}if (insert) {\r
-if (command.editedFeatures != null && command.editedFeatures.containsKey (seq)) {\r
-sequence.setSequenceFeatures (command.editedFeatures.get (seq));\r
-}return;\r
-}var sf = sequence.getSequenceFeatures ();\r
-if (sf == null) {\r
-return;\r
-}var oldsf =  new Array (sf.length);\r
-var cSize = j - i;\r
-for (var s = 0; s < sf.length; s++) {\r
-var copy =  new jalview.datamodel.SequenceFeature (sf[s]);\r
-oldsf[s] = copy;\r
-if (sf[s].getEnd () < i) {\r
-continue;\r
-}if (sf[s].getBegin () > j) {\r
-sf[s].setBegin (copy.getBegin () - cSize);\r
-sf[s].setEnd (copy.getEnd () - cSize);\r
-continue;\r
-}if (sf[s].getBegin () >= i) {\r
-sf[s].setBegin (i);\r
-}if (sf[s].getEnd () < j) {\r
-sf[s].setEnd (j - 1);\r
-}sf[s].setEnd (sf[s].getEnd () - (cSize));\r
-if (sf[s].getBegin () > sf[s].getEnd ()) {\r
-sequence.deleteFeature (sf[s]);\r
-}}\r
-if (command.editedFeatures == null) {\r
-command.editedFeatures =  new java.util.Hashtable ();\r
-}command.editedFeatures.put (seq, oldsf);\r
-}, "jalview.commands.EditCommand.Edit,~N,~N,~N,~B");\r
-Clazz.defineMethod (c$, "getEdits", \r
-function () {\r
-return this.edits;\r
-});\r
-Clazz.defineMethod (c$, "priorState", \r
-function (forUndo) {\r
-var result =  new java.util.HashMap ();\r
-if (this.getEdits () == null) {\r
-return result;\r
-}if (forUndo) {\r
-for (var e, $e = this.getEdits ().iterator (); $e.hasNext () && ((e = $e.next ()) || true);) {\r
-for (var seq, $seq = 0, $$seq = e.getSequences (); $seq < $$seq.length && ((seq = $$seq[$seq]) || true); $seq++) {\r
-var ds = seq.getDatasetSequence ();\r
-var preEdit = result.get (ds);\r
-if (preEdit == null) {\r
-preEdit =  new jalview.datamodel.Sequence ("", seq.getSequenceAsString ());\r
-preEdit.setDatasetSequence (ds);\r
-result.put (ds, preEdit);\r
-}}\r
-}\r
-return result;\r
-}var edits =  new jalview.util.ReverseListIterator (this.getEdits ());\r
-while (edits.hasNext ()) {\r
-var oldEdit = edits.next ();\r
-var action = oldEdit.getAction ();\r
-var position = oldEdit.getPosition ();\r
-var number = oldEdit.getNumber ();\r
-var gap = oldEdit.getGapCharacter ();\r
-for (var seq, $seq = 0, $$seq = oldEdit.getSequences (); $seq < $$seq.length && ((seq = $$seq[$seq]) || true); $seq++) {\r
-var ds = seq.getDatasetSequence ();\r
-var preEdit = result.get (ds);\r
-if (preEdit == null) {\r
-preEdit =  new jalview.datamodel.Sequence ("", seq.getSequenceAsString ());\r
-preEdit.setDatasetSequence (ds);\r
-result.put (ds, preEdit);\r
-}if (ds != null) {\r
-if (action === jalview.commands.EditCommand.Action.DELETE_GAP) {\r
-preEdit.setSequence ( String.instantialize (jalview.util.StringUtils.insertCharAt (preEdit.getSequence (), position, number, gap)));\r
-} else if (action === jalview.commands.EditCommand.Action.INSERT_GAP) {\r
-preEdit.setSequence ( String.instantialize (jalview.util.StringUtils.deleteChars (preEdit.getSequence (), position, position + number)));\r
-} else {\r
-System.err.println ("Can't undo edit action " + action);\r
-}}}\r
-}\r
-return result;\r
-}, "~B");\r
-Clazz.defineMethod (c$, "getEditIterator", \r
-function (forwards) {\r
-if (forwards) {\r
-return this.getEdits ().iterator ();\r
-} else {\r
-return  new jalview.util.ReverseListIterator (this.getEdits ());\r
-}}, "~B");\r
-c$.$EditCommand$Edit$ = function () {\r
-Clazz.pu$h ();\r
-c$ = Clazz.decorateAsClass (function () {\r
-Clazz.prepareCallback (this, arguments);\r
-this.oldds = null;\r
-this.fullAlignmentHeight = false;\r
-this.deletedAnnotationRows = null;\r
-this.deletedAnnotations = null;\r
-this.editedFeatures = null;\r
-this.al = null;\r
-this.command = null;\r
-this.string = null;\r
-this.seqs = null;\r
-this.alIndex = null;\r
-this.position = 0;\r
-this.number = 0;\r
-this.gapChar = '\0';\r
-Clazz.instantialize (this, arguments);\r
-}, jalview.commands.EditCommand, "Edit");\r
-Clazz.makeConstructor (c$, \r
-function (a, b, c, d, e) {\r
-this.command = a;\r
-this.seqs = b;\r
-this.position = c;\r
-this.number = d;\r
-this.gapChar = e;\r
-}, "jalview.commands.EditCommand.Action,~A,~N,~N,~S");\r
-Clazz.makeConstructor (c$, \r
-function (a, b, c, d, e) {\r
-this.gapChar = e.getGapCharacter ();\r
-this.command = a;\r
-this.seqs = b;\r
-this.position = c;\r
-this.number = d;\r
-this.al = e;\r
-this.alIndex =  Clazz.newIntArray (b.length, 0);\r
-for (var f = 0; f < b.length; f++) {\r
-this.alIndex[f] = e.findIndex (b[f]);\r
-}\r
-this.fullAlignmentHeight = (e.getHeight () == b.length);\r
-}, "jalview.commands.EditCommand.Action,~A,~N,~N,jalview.datamodel.AlignmentI");\r
-Clazz.makeConstructor (c$, \r
-function (a, b, c, d, e, f) {\r
-this.command = a;\r
-this.seqs = b;\r
-this.position = c;\r
-this.number = d;\r
-this.al = e;\r
-this.gapChar = e.getGapCharacter ();\r
-this.string =  Clazz.newCharArray (b.length, '\0');\r
-for (var g = 0; g < b.length; g++) {\r
-this.string[g] = f.toCharArray ();\r
-}\r
-this.fullAlignmentHeight = (e.getHeight () == b.length);\r
-}, "jalview.commands.EditCommand.Action,~A,~N,~N,jalview.datamodel.AlignmentI,~S");\r
-Clazz.defineMethod (c$, "getSequences", \r
-function () {\r
-return this.seqs;\r
-});\r
-Clazz.defineMethod (c$, "getPosition", \r
-function () {\r
-return this.position;\r
-});\r
-Clazz.defineMethod (c$, "getAction", \r
-function () {\r
-return this.command;\r
-});\r
-Clazz.defineMethod (c$, "getNumber", \r
-function () {\r
-return this.number;\r
-});\r
-Clazz.defineMethod (c$, "getGapCharacter", \r
-function () {\r
-return this.gapChar;\r
-});\r
-c$ = Clazz.p0p ();\r
-};\r
-Clazz.pu$h ();\r
-c$ = Clazz.declareType (jalview.commands.EditCommand, "Action", Enum);\r
-Clazz.defineMethod (c$, "getUndoAction", \r
-function () {\r
-switch (this) {\r
-case jalview.commands.EditCommand.Action.INSERT_GAP:\r
-return jalview.commands.EditCommand.Action.DELETE_GAP;\r
-case jalview.commands.EditCommand.Action.CUT:\r
-return jalview.commands.EditCommand.Action.PASTE;\r
-case jalview.commands.EditCommand.Action.DELETE_GAP:\r
-return jalview.commands.EditCommand.Action.INSERT_GAP;\r
-case jalview.commands.EditCommand.Action.INSERT_NUC:\r
-return null;\r
-case jalview.commands.EditCommand.Action.PASTE:\r
-return jalview.commands.EditCommand.Action.CUT;\r
-case jalview.commands.EditCommand.Action.REPLACE:\r
-return jalview.commands.EditCommand.Action.REPLACE;\r
-}\r
-return null;\r
-});\r
-Clazz.defineEnumConstant (c$, "INSERT_GAP", 0, []);\r
-Clazz.defineEnumConstant (c$, "DELETE_GAP", 1, []);\r
-Clazz.defineEnumConstant (c$, "CUT", 2, []);\r
-Clazz.defineEnumConstant (c$, "PASTE", 3, []);\r
-Clazz.defineEnumConstant (c$, "REPLACE", 4, []);\r
-Clazz.defineEnumConstant (c$, "INSERT_NUC", 5, []);\r
-c$ = Clazz.p0p ();\r
-});\r
+Clazz.declarePackage ("jalview.commands");
+Clazz.load (["jalview.commands.CommandI", "java.lang.Enum", "java.util.ArrayList"], "jalview.commands.EditCommand", ["jalview.analysis.AlignSeq", "jalview.datamodel.AlignmentAnnotation", "$.Annotation", "$.Sequence", "$.SequenceFeature", "jalview.schemes.ResidueProperties", "jalview.util.Comparison", "$.ReverseListIterator", "$.StringUtils", "java.lang.StringBuffer", "java.util.HashMap", "$.Hashtable"], function () {
+c$ = Clazz.decorateAsClass (function () {
+this.edits = null;
+this.description = null;
+if (!Clazz.isClassDefined ("jalview.commands.EditCommand.Edit")) {
+jalview.commands.EditCommand.$EditCommand$Edit$ ();
+}
+Clazz.instantialize (this, arguments);
+}, jalview.commands, "EditCommand", null, jalview.commands.CommandI);
+Clazz.prepareFields (c$, function () {
+this.edits =  new java.util.ArrayList ();
+});
+Clazz.makeConstructor (c$, 
+function () {
+});
+Clazz.makeConstructor (c$, 
+function (description) {
+this.description = description;
+}, "~S");
+Clazz.makeConstructor (c$, 
+function (description, command, seqs, position, number, al) {
+this.description = description;
+if (command === jalview.commands.EditCommand.Action.CUT || command === jalview.commands.EditCommand.Action.PASTE) {
+this.setEdit (Clazz.innerTypeInstance (jalview.commands.EditCommand.Edit, this, null, command, seqs, position, number, al));
+}this.performEdit (0, null);
+}, "~S,jalview.commands.EditCommand.Action,~A,~N,~N,jalview.datamodel.AlignmentI");
+Clazz.makeConstructor (c$, 
+function (description, command, replace, seqs, position, number, al) {
+this.description = description;
+if (command === jalview.commands.EditCommand.Action.REPLACE) {
+this.setEdit (Clazz.innerTypeInstance (jalview.commands.EditCommand.Edit, this, null, command, seqs, position, number, al, replace));
+}this.performEdit (0, null);
+}, "~S,jalview.commands.EditCommand.Action,~S,~A,~N,~N,jalview.datamodel.AlignmentI");
+Clazz.defineMethod (c$, "setEdit", 
+function (e) {
+this.edits.clear ();
+this.edits.add (e);
+}, "jalview.commands.EditCommand.Edit");
+Clazz.defineMethod (c$, "addEdit", 
+function (e) {
+if (!jalview.commands.EditCommand.expandEdit (this.edits, e)) {
+this.edits.add (e);
+}}, "jalview.commands.EditCommand.Edit");
+c$.expandEdit = Clazz.defineMethod (c$, "expandEdit", 
+function (edits, e) {
+if (edits == null || edits.isEmpty ()) {
+return false;
+}var lastEdit = edits.get (edits.size () - 1);
+var action = e.command;
+if (lastEdit.command !== action) {
+return false;
+}if (lastEdit.seqs.length != e.seqs.length) {
+return false;
+}for (var i = 0; i < e.seqs.length; i++) {
+if (lastEdit.seqs[i].getDatasetSequence () !== e.seqs[i].getDatasetSequence ()) {
+return false;
+}}
+var contiguous = (action === jalview.commands.EditCommand.Action.INSERT_GAP && e.position == lastEdit.position + lastEdit.number) || (action === jalview.commands.EditCommand.Action.DELETE_GAP && e.position + e.number == lastEdit.position);
+if (contiguous) {
+lastEdit.number += e.number;
+lastEdit.seqs = e.seqs;
+if (action === jalview.commands.EditCommand.Action.DELETE_GAP) {
+lastEdit.position--;
+}return true;
+}return false;
+}, "java.util.List,jalview.commands.EditCommand.Edit");
+Clazz.defineMethod (c$, "clearEdits", 
+function () {
+this.edits.clear ();
+});
+Clazz.defineMethod (c$, "getEdit", 
+function (i) {
+if (i >= 0 && i < this.edits.size ()) {
+return this.edits.get (i);
+}return null;
+}, "~N");
+Clazz.overrideMethod (c$, "getDescription", 
+function () {
+return this.description;
+});
+Clazz.overrideMethod (c$, "getSize", 
+function () {
+return this.edits.size ();
+});
+Clazz.defineMethod (c$, "getAlignment", 
+function () {
+return (this.edits.isEmpty () ? null : this.edits.get (0).al);
+});
+Clazz.defineMethod (c$, "appendEdit", 
+function (command, seqs, position, number, al, performEdit) {
+this.appendEdit (command, seqs, position, number, al, performEdit, null);
+}, "jalview.commands.EditCommand.Action,~A,~N,~N,jalview.datamodel.AlignmentI,~B");
+Clazz.defineMethod (c$, "appendEdit", 
+function (command, seqs, position, number, al, performEdit, views) {
+var edit = Clazz.innerTypeInstance (jalview.commands.EditCommand.Edit, this, null, command, seqs, position, number, al.getGapCharacter ());
+if (al.getHeight () == seqs.length) {
+edit.al = al;
+edit.fullAlignmentHeight = true;
+}this.addEdit (edit);
+if (performEdit) {
+jalview.commands.EditCommand.performEdit (edit, views);
+}}, "jalview.commands.EditCommand.Action,~A,~N,~N,jalview.datamodel.AlignmentI,~B,~A");
+Clazz.defineMethod (c$, "appendEdit", 
+function (edit, al, performEdit, views) {
+if (al.getHeight () == edit.seqs.length) {
+edit.al = al;
+edit.fullAlignmentHeight = true;
+}this.addEdit (edit);
+if (performEdit) {
+jalview.commands.EditCommand.performEdit (edit, views);
+}}, "jalview.commands.EditCommand.Edit,jalview.datamodel.AlignmentI,~B,~A");
+Clazz.defineMethod (c$, "performEdit", 
+function (commandIndex, views) {
+var iterator = this.edits.listIterator (commandIndex);
+while (iterator.hasNext ()) {
+var edit = iterator.next ();
+jalview.commands.EditCommand.performEdit (edit, views);
+}
+}, "~N,~A");
+c$.performEdit = Clazz.defineMethod (c$, "performEdit", 
+function (edit, views) {
+switch (edit.command) {
+case jalview.commands.EditCommand.Action.INSERT_GAP:
+jalview.commands.EditCommand.insertGap (edit);
+break;
+case jalview.commands.EditCommand.Action.DELETE_GAP:
+jalview.commands.EditCommand.deleteGap (edit);
+break;
+case jalview.commands.EditCommand.Action.CUT:
+jalview.commands.EditCommand.cut (edit, views);
+break;
+case jalview.commands.EditCommand.Action.PASTE:
+jalview.commands.EditCommand.paste (edit, views);
+break;
+case jalview.commands.EditCommand.Action.REPLACE:
+jalview.commands.EditCommand.replace (edit);
+break;
+case jalview.commands.EditCommand.Action.INSERT_NUC:
+break;
+default:
+break;
+}
+}, "jalview.commands.EditCommand.Edit,~A");
+Clazz.overrideMethod (c$, "doCommand", 
+function (views) {
+this.performEdit (0, views);
+}, "~A");
+Clazz.overrideMethod (c$, "undoCommand", 
+function (views) {
+var iterator = this.edits.listIterator (this.edits.size ());
+while (iterator.hasPrevious ()) {
+var e = iterator.previous ();
+switch (e.command) {
+case jalview.commands.EditCommand.Action.INSERT_GAP:
+jalview.commands.EditCommand.deleteGap (e);
+break;
+case jalview.commands.EditCommand.Action.DELETE_GAP:
+jalview.commands.EditCommand.insertGap (e);
+break;
+case jalview.commands.EditCommand.Action.CUT:
+jalview.commands.EditCommand.paste (e, views);
+break;
+case jalview.commands.EditCommand.Action.PASTE:
+jalview.commands.EditCommand.cut (e, views);
+break;
+case jalview.commands.EditCommand.Action.REPLACE:
+jalview.commands.EditCommand.replace (e);
+break;
+case jalview.commands.EditCommand.Action.INSERT_NUC:
+break;
+default:
+break;
+}
+}
+}, "~A");
+c$.insertGap = Clazz.defineMethod (c$, "insertGap", 
+($fz = function (command) {
+for (var s = 0; s < command.seqs.length; s++) {
+command.seqs[s].insertCharAt (command.position, command.number, command.gapChar);
+}
+jalview.commands.EditCommand.adjustAnnotations (command, true, false, null);
+}, $fz.isPrivate = true, $fz), "jalview.commands.EditCommand.Edit");
+c$.deleteGap = Clazz.defineMethod (c$, "deleteGap", 
+($fz = function (command) {
+for (var s = 0; s < command.seqs.length; s++) {
+command.seqs[s].deleteChars (command.position, command.position + command.number);
+}
+jalview.commands.EditCommand.adjustAnnotations (command, false, false, null);
+}, $fz.isPrivate = true, $fz), "jalview.commands.EditCommand.Edit");
+c$.cut = Clazz.defineMethod (c$, "cut", 
+function (command, views) {
+var seqDeleted = false;
+command.string =  Clazz.newCharArray (command.seqs.length, '\0');
+for (var i = 0; i < command.seqs.length; i++) {
+var sequence = command.seqs[i];
+if (sequence.getLength () > command.position) {
+command.string[i] = sequence.getSequence (command.position, command.position + command.number);
+var oldds = sequence.getDatasetSequence ();
+if (command.oldds != null && command.oldds[i] != null) {
+sequence.setDatasetSequence (null);
+}sequence.deleteChars (command.position, command.position + command.number);
+if (command.oldds != null && command.oldds[i] != null) {
+sequence.setDatasetSequence (command.oldds[i]);
+command.oldds[i] = oldds;
+} else {
+if (oldds !== sequence.getDatasetSequence () || sequence.getSequenceFeatures () != null) {
+if (command.oldds == null) {
+command.oldds =  new Array (command.seqs.length);
+}command.oldds[i] = oldds;
+jalview.commands.EditCommand.adjustFeatures (command, i, sequence.findPosition (command.position), sequence.findPosition (command.position + command.number), false);
+}}}if (sequence.getLength () < 1) {
+command.al.deleteSequence (sequence);
+seqDeleted = true;
+}}
+jalview.commands.EditCommand.adjustAnnotations (command, false, seqDeleted, views);
+}, "jalview.commands.EditCommand.Edit,~A");
+c$.paste = Clazz.defineMethod (c$, "paste", 
+function (command, views) {
+var tmp;
+var newDSNeeded;
+var newDSWasNeeded;
+var newstart;
+var newend;
+var seqWasDeleted = false;
+var start = 0;
+var end = 0;
+for (var i = 0; i < command.seqs.length; i++) {
+newDSNeeded = false;
+newDSWasNeeded = command.oldds != null && command.oldds[i] != null;
+if (command.seqs[i].getLength () < 1) {
+if (command.alIndex[i] < command.al.getHeight ()) {
+var sequences;
+{
+if (!(command.alIndex[i] < 0)) {
+sequences.add (command.alIndex[i], command.seqs[i]);
+}}} else {
+command.al.addSequence (command.seqs[i]);
+}seqWasDeleted = true;
+}newstart = command.seqs[i].getStart ();
+newend = command.seqs[i].getEnd ();
+tmp =  new StringBuffer ();
+tmp.append (command.seqs[i].getSequence ());
+if (command.string != null && command.string[i] != null) {
+if (command.position >= tmp.length ()) {
+var length = command.position - tmp.length ();
+while (length > 0) {
+tmp.append (command.gapChar);
+length--;
+}
+}tmp.insert (command.position, command.string[i]);
+for (var s = 0; s < command.string[i].length; s++) {
+if (jalview.schemes.ResidueProperties.aaIndex[command.string[i][s].charCodeAt (0)] != 23) {
+if (!newDSNeeded) {
+newDSNeeded = true;
+start = command.seqs[i].findPosition (command.position);
+end = command.seqs[i].findPosition (command.position + command.number);
+}if (command.seqs[i].getStart () == start) {
+newstart--;
+} else {
+newend++;
+}}}
+command.string[i] = null;
+}command.seqs[i].setSequence (tmp.toString ());
+command.seqs[i].setStart (newstart);
+command.seqs[i].setEnd (newend);
+if (newDSNeeded) {
+if (command.seqs[i].getDatasetSequence () != null) {
+var ds;
+if (newDSWasNeeded) {
+ds = command.oldds[i];
+} else {
+ds =  new jalview.datamodel.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) {
+command.oldds =  new Array (command.seqs.length);
+}command.oldds[i] = command.seqs[i].getDatasetSequence ();
+command.seqs[i].setDatasetSequence (ds);
+}jalview.commands.EditCommand.adjustFeatures (command, i, start, end, true);
+}}
+jalview.commands.EditCommand.adjustAnnotations (command, true, seqWasDeleted, views);
+command.string = null;
+}, "jalview.commands.EditCommand.Edit,~A");
+c$.replace = Clazz.defineMethod (c$, "replace", 
+function (command) {
+var tmp;
+var oldstring;
+var start = command.position;
+var end = command.number;
+command.number = start + command.string[0].length;
+for (var i = 0; i < command.seqs.length; i++) {
+var newDSWasNeeded = command.oldds != null && command.oldds[i] != null;
+oldstring = command.seqs[i].getSequenceAsString ();
+tmp =  new StringBuffer (oldstring.substring (0, start));
+tmp.append (command.string[i]);
+var nogaprep = jalview.analysis.AlignSeq.extractGaps (jalview.util.Comparison.GapChars,  String.instantialize (command.string[i]));
+var ipos = command.seqs[i].findPosition (start) - command.seqs[i].getStart ();
+tmp.append (oldstring.substring (end));
+command.seqs[i].setSequence (tmp.toString ());
+command.string[i] = oldstring.substring (start, end).toCharArray ();
+var nogapold = jalview.analysis.AlignSeq.extractGaps (jalview.util.Comparison.GapChars,  String.instantialize (command.string[i]));
+if (!nogaprep.toLowerCase ().equals (nogapold.toLowerCase ())) {
+if (newDSWasNeeded) {
+var oldds = command.seqs[i].getDatasetSequence ();
+command.seqs[i].setDatasetSequence (command.oldds[i]);
+command.oldds[i] = oldds;
+} else {
+if (command.oldds == null) {
+command.oldds =  new Array (command.seqs.length);
+}command.oldds[i] = command.seqs[i].getDatasetSequence ();
+var newds =  new jalview.datamodel.Sequence (command.seqs[i].getDatasetSequence ());
+var fullseq;
+var osp = newds.getSequenceAsString ();
+fullseq = osp.substring (0, ipos) + nogaprep + osp.substring (ipos + nogaprep.length);
+newds.setSequence (fullseq.toUpperCase ());
+command.seqs[i].setDatasetSequence (newds);
+}}tmp = null;
+oldstring = null;
+}
+}, "jalview.commands.EditCommand.Edit");
+c$.adjustAnnotations = Clazz.defineMethod (c$, "adjustAnnotations", 
+function (command, insert, modifyVisibility, views) {
+var annotations = null;
+if (modifyVisibility && !insert) {
+command.deletedAnnotationRows =  new java.util.Hashtable ();
+}if (command.fullAlignmentHeight) {
+annotations = command.al.getAlignmentAnnotation ();
+} else {
+var aSize = 0;
+var tmp;
+for (var s = 0; s < command.seqs.length; s++) {
+if (modifyVisibility) {
+if (!insert) {
+tmp = command.seqs[s].getAnnotation ();
+if (tmp != null) {
+var alen = tmp.length;
+for (var aa = 0; aa < tmp.length; aa++) {
+if (!command.al.deleteAnnotation (tmp[aa])) {
+tmp[aa] = null;
+alen--;
+}}
+command.seqs[s].setAlignmentAnnotation (null);
+if (alen != tmp.length) {
+var saved =  new Array (alen);
+for (var aa = 0, aapos = 0; aa < tmp.length; aa++) {
+if (tmp[aa] != null) {
+saved[aapos++] = tmp[aa];
+tmp[aa] = null;
+}}
+tmp = saved;
+command.deletedAnnotationRows.put (command.seqs[s], saved);
+for (var alview = 0; views != null && alview < views.length; alview++) {
+if (views[alview] !== command.al) {
+var toremove = views[alview].getAlignmentAnnotation ();
+if (toremove == null || toremove.length == 0) {
+continue;
+}for (var aa = 0; aa < toremove.length; aa++) {
+if (toremove[aa].sequenceRef === command.seqs[s]) {
+views[alview].deleteAnnotation (toremove[aa]);
+}}
+}}
+} else {
+command.deletedAnnotationRows.put (command.seqs[s], tmp);
+}}} else {
+if (command.deletedAnnotationRows != null && command.deletedAnnotationRows.containsKey (command.seqs[s])) {
+var revealed = command.deletedAnnotationRows.get (command.seqs[s]);
+command.seqs[s].setAlignmentAnnotation (revealed);
+if (revealed != null) {
+for (var aa = 0; aa < revealed.length; aa++) {
+command.al.addAnnotation (revealed[aa]);
+}
+for (var aa = 0; aa < revealed.length; aa++) {
+command.al.setAnnotationIndex (revealed[aa], aa);
+}
+for (var vnum = 0; views != null && vnum < views.length; vnum++) {
+if (views[vnum] !== command.al) {
+var avwidth = views[vnum].getWidth () + 1;
+for (var a = 0; a < revealed.length; a++) {
+var newann =  new jalview.datamodel.AlignmentAnnotation (revealed[a]);
+command.seqs[s].addAlignmentAnnotation (newann);
+newann.padAnnotation (avwidth);
+views[vnum].addAnnotation (newann);
+views[vnum].setAnnotationIndex (newann, a);
+}
+}}
+}}}continue;
+}if (command.seqs[s].getAnnotation () == null) {
+continue;
+}if (aSize == 0) {
+annotations = command.seqs[s].getAnnotation ();
+} else {
+tmp =  new Array (aSize + command.seqs[s].getAnnotation ().length);
+System.arraycopy (annotations, 0, tmp, 0, aSize);
+System.arraycopy (command.seqs[s].getAnnotation (), 0, tmp, aSize, command.seqs[s].getAnnotation ().length);
+annotations = tmp;
+}aSize = annotations.length;
+}
+}if (annotations == null) {
+return;
+}if (!insert) {
+command.deletedAnnotations =  new java.util.Hashtable ();
+}var aSize;
+var temp;
+for (var a = 0; a < annotations.length; a++) {
+if (annotations[a].autoCalculated || annotations[a].annotations == null) {
+continue;
+}var tSize = 0;
+aSize = annotations[a].annotations.length;
+if (insert) {
+temp =  new Array (aSize + command.number);
+if (annotations[a].padGaps) {
+for (var aa = 0; aa < temp.length; aa++) {
+temp[aa] =  new jalview.datamodel.Annotation (command.gapChar + "", null, ' ', 0);
+}
+}} else {
+if (command.position < aSize) {
+if (command.position + command.number >= aSize) {
+tSize = aSize;
+} else {
+tSize = aSize - command.number;
+}} else {
+tSize = aSize;
+}if (tSize < 0) {
+tSize = aSize;
+}temp =  new Array (tSize);
+}if (insert) {
+if (command.position < annotations[a].annotations.length) {
+System.arraycopy (annotations[a].annotations, 0, temp, 0, command.position);
+if (command.deletedAnnotations != null && command.deletedAnnotations.containsKey (annotations[a].annotationId)) {
+var restore = command.deletedAnnotations.get (annotations[a].annotationId);
+System.arraycopy (restore, 0, temp, command.position, command.number);
+}System.arraycopy (annotations[a].annotations, command.position, temp, command.position + command.number, aSize - command.position);
+} else {
+if (command.deletedAnnotations != null && command.deletedAnnotations.containsKey (annotations[a].annotationId)) {
+var restore = command.deletedAnnotations.get (annotations[a].annotationId);
+temp =  new Array (annotations[a].annotations.length + restore.length);
+System.arraycopy (annotations[a].annotations, 0, temp, 0, annotations[a].annotations.length);
+System.arraycopy (restore, 0, temp, annotations[a].annotations.length, restore.length);
+} else {
+temp = annotations[a].annotations;
+}}} else {
+if (tSize != aSize || command.position < 2) {
+var copylen = Math.min (command.position, annotations[a].annotations.length);
+if (copylen > 0) {
+System.arraycopy (annotations[a].annotations, 0, temp, 0, copylen);
+}var deleted =  new Array (command.number);
+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.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);
+}} else {
+var dSize = aSize - command.position;
+if (dSize > 0) {
+var deleted =  new Array (command.number);
+System.arraycopy (annotations[a].annotations, command.position, deleted, 0, dSize);
+command.deletedAnnotations.put (annotations[a].annotationId, deleted);
+tSize = Math.min (annotations[a].annotations.length, command.position);
+temp =  new Array (tSize);
+System.arraycopy (annotations[a].annotations, 0, temp, 0, tSize);
+} else {
+temp = annotations[a].annotations;
+}}}annotations[a].annotations = temp;
+}
+}, "jalview.commands.EditCommand.Edit,~B,~B,~A");
+c$.adjustFeatures = Clazz.defineMethod (c$, "adjustFeatures", 
+function (command, index, i, j, insert) {
+var seq = command.seqs[index];
+var sequence = seq.getDatasetSequence ();
+if (sequence == null) {
+sequence = seq;
+}if (insert) {
+if (command.editedFeatures != null && command.editedFeatures.containsKey (seq)) {
+sequence.setSequenceFeatures (command.editedFeatures.get (seq));
+}return;
+}var sf = sequence.getSequenceFeatures ();
+if (sf == null) {
+return;
+}var oldsf =  new Array (sf.length);
+var cSize = j - i;
+for (var s = 0; s < sf.length; s++) {
+var copy =  new jalview.datamodel.SequenceFeature (sf[s]);
+oldsf[s] = copy;
+if (sf[s].getEnd () < i) {
+continue;
+}if (sf[s].getBegin () > j) {
+sf[s].setBegin (copy.getBegin () - cSize);
+sf[s].setEnd (copy.getEnd () - cSize);
+continue;
+}if (sf[s].getBegin () >= i) {
+sf[s].setBegin (i);
+}if (sf[s].getEnd () < j) {
+sf[s].setEnd (j - 1);
+}sf[s].setEnd (sf[s].getEnd () - (cSize));
+if (sf[s].getBegin () > sf[s].getEnd ()) {
+sequence.deleteFeature (sf[s]);
+}}
+if (command.editedFeatures == null) {
+command.editedFeatures =  new java.util.Hashtable ();
+}command.editedFeatures.put (seq, oldsf);
+}, "jalview.commands.EditCommand.Edit,~N,~N,~N,~B");
+Clazz.defineMethod (c$, "getEdits", 
+function () {
+return this.edits;
+});
+Clazz.defineMethod (c$, "priorState", 
+function (forUndo) {
+var result =  new java.util.HashMap ();
+if (this.getEdits () == null) {
+return result;
+}if (forUndo) {
+for (var e, $e = this.getEdits ().iterator (); $e.hasNext () && ((e = $e.next ()) || true);) {
+for (var seq, $seq = 0, $$seq = e.getSequences (); $seq < $$seq.length && ((seq = $$seq[$seq]) || true); $seq++) {
+var ds = seq.getDatasetSequence ();
+var preEdit = result.get (ds);
+if (preEdit == null) {
+preEdit =  new jalview.datamodel.Sequence ("", seq.getSequenceAsString ());
+preEdit.setDatasetSequence (ds);
+result.put (ds, preEdit);
+}}
+}
+return result;
+}var edits =  new jalview.util.ReverseListIterator (this.getEdits ());
+while (edits.hasNext ()) {
+var oldEdit = edits.next ();
+var action = oldEdit.getAction ();
+var position = oldEdit.getPosition ();
+var number = oldEdit.getNumber ();
+var gap = oldEdit.getGapCharacter ();
+for (var seq, $seq = 0, $$seq = oldEdit.getSequences (); $seq < $$seq.length && ((seq = $$seq[$seq]) || true); $seq++) {
+var ds = seq.getDatasetSequence ();
+var preEdit = result.get (ds);
+if (preEdit == null) {
+preEdit =  new jalview.datamodel.Sequence ("", seq.getSequenceAsString ());
+preEdit.setDatasetSequence (ds);
+result.put (ds, preEdit);
+}if (ds != null) {
+if (action === jalview.commands.EditCommand.Action.DELETE_GAP) {
+preEdit.setSequence ( String.instantialize (jalview.util.StringUtils.insertCharAt (preEdit.getSequence (), position, number, gap)));
+} else if (action === jalview.commands.EditCommand.Action.INSERT_GAP) {
+preEdit.setSequence ( String.instantialize (jalview.util.StringUtils.deleteChars (preEdit.getSequence (), position, position + number)));
+} else {
+System.err.println ("Can't undo edit action " + action);
+}}}
+}
+return result;
+}, "~B");
+Clazz.defineMethod (c$, "getEditIterator", 
+function (forwards) {
+if (forwards) {
+return this.getEdits ().iterator ();
+} else {
+return  new jalview.util.ReverseListIterator (this.getEdits ());
+}}, "~B");
+c$.$EditCommand$Edit$ = function () {
+Clazz.pu$h ();
+c$ = Clazz.decorateAsClass (function () {
+Clazz.prepareCallback (this, arguments);
+this.oldds = null;
+this.fullAlignmentHeight = false;
+this.deletedAnnotationRows = null;
+this.deletedAnnotations = null;
+this.editedFeatures = null;
+this.al = null;
+this.command = null;
+this.string = null;
+this.seqs = null;
+this.alIndex = null;
+this.position = 0;
+this.number = 0;
+this.gapChar = '\0';
+Clazz.instantialize (this, arguments);
+}, jalview.commands.EditCommand, "Edit");
+Clazz.makeConstructor (c$, 
+function (a, b, c, d, e) {
+this.command = a;
+this.seqs = b;
+this.position = c;
+this.number = d;
+this.gapChar = e;
+}, "jalview.commands.EditCommand.Action,~A,~N,~N,~S");
+Clazz.makeConstructor (c$, 
+function (a, b, c, d, e) {
+this.gapChar = e.getGapCharacter ();
+this.command = a;
+this.seqs = b;
+this.position = c;
+this.number = d;
+this.al = e;
+this.alIndex =  Clazz.newIntArray (b.length, 0);
+for (var f = 0; f < b.length; f++) {
+this.alIndex[f] = e.findIndex (b[f]);
+}
+this.fullAlignmentHeight = (e.getHeight () == b.length);
+}, "jalview.commands.EditCommand.Action,~A,~N,~N,jalview.datamodel.AlignmentI");
+Clazz.makeConstructor (c$, 
+function (a, b, c, d, e, f) {
+this.command = a;
+this.seqs = b;
+this.position = c;
+this.number = d;
+this.al = e;
+this.gapChar = e.getGapCharacter ();
+this.string =  Clazz.newCharArray (b.length, '\0');
+for (var g = 0; g < b.length; g++) {
+this.string[g] = f.toCharArray ();
+}
+this.fullAlignmentHeight = (e.getHeight () == b.length);
+}, "jalview.commands.EditCommand.Action,~A,~N,~N,jalview.datamodel.AlignmentI,~S");
+Clazz.defineMethod (c$, "getSequences", 
+function () {
+return this.seqs;
+});
+Clazz.defineMethod (c$, "getPosition", 
+function () {
+return this.position;
+});
+Clazz.defineMethod (c$, "getAction", 
+function () {
+return this.command;
+});
+Clazz.defineMethod (c$, "getNumber", 
+function () {
+return this.number;
+});
+Clazz.defineMethod (c$, "getGapCharacter", 
+function () {
+return this.gapChar;
+});
+c$ = Clazz.p0p ();
+};
+Clazz.pu$h ();
+c$ = Clazz.declareType (jalview.commands.EditCommand, "Action", Enum);
+Clazz.defineMethod (c$, "getUndoAction", 
+function () {
+switch (this) {
+case jalview.commands.EditCommand.Action.INSERT_GAP:
+return jalview.commands.EditCommand.Action.DELETE_GAP;
+case jalview.commands.EditCommand.Action.CUT:
+return jalview.commands.EditCommand.Action.PASTE;
+case jalview.commands.EditCommand.Action.DELETE_GAP:
+return jalview.commands.EditCommand.Action.INSERT_GAP;
+case jalview.commands.EditCommand.Action.INSERT_NUC:
+return null;
+case jalview.commands.EditCommand.Action.PASTE:
+return jalview.commands.EditCommand.Action.CUT;
+case jalview.commands.EditCommand.Action.REPLACE:
+return jalview.commands.EditCommand.Action.REPLACE;
+}
+return null;
+});
+Clazz.defineEnumConstant (c$, "INSERT_GAP", 0, []);
+Clazz.defineEnumConstant (c$, "DELETE_GAP", 1, []);
+Clazz.defineEnumConstant (c$, "CUT", 2, []);
+Clazz.defineEnumConstant (c$, "PASTE", 3, []);
+Clazz.defineEnumConstant (c$, "REPLACE", 4, []);
+Clazz.defineEnumConstant (c$, "INSERT_NUC", 5, []);
+c$ = Clazz.p0p ();
+});