X-Git-Url: http://source.jalview.org/gitweb/?p=jalviewjs.git;a=blobdiff_plain;f=bin%2Fjalview%2Fcommands%2FEditCommand.js;h=0839473efc80d9d8f1be2ae82306722f841aa5fe;hp=b556231cbe0f65b69eddeea3d4d35bf5ea79b3af;hb=8ffd05b3abe52c0b6b79b011c0966361f82d5fe6;hpb=6154cb57a6eac3bb1344b8342495f5bb701ee921 diff --git a/bin/jalview/commands/EditCommand.js b/bin/jalview/commands/EditCommand.js index b556231..0839473 100644 --- a/bin/jalview/commands/EditCommand.js +++ b/bin/jalview/commands/EditCommand.js @@ -1,661 +1,661 @@ -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 (); -}); +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 (); +});