JAL-1807 Bob's JalviewJS prototype first commit
[jalviewjs.git] / site / j2s / jalview / commands / EditCommand.js
1 Clazz.declarePackage ("jalview.commands");\r
2 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
3 c$ = Clazz.decorateAsClass (function () {\r
4 this.edits = null;\r
5 this.description = null;\r
6 if (!Clazz.isClassDefined ("jalview.commands.EditCommand.Edit")) {\r
7 jalview.commands.EditCommand.$EditCommand$Edit$ ();\r
8 }\r
9 Clazz.instantialize (this, arguments);\r
10 }, jalview.commands, "EditCommand", null, jalview.commands.CommandI);\r
11 Clazz.prepareFields (c$, function () {\r
12 this.edits =  new java.util.ArrayList ();\r
13 });\r
14 Clazz.makeConstructor (c$, \r
15 function () {\r
16 });\r
17 Clazz.makeConstructor (c$, \r
18 function (description) {\r
19 this.description = description;\r
20 }, "~S");\r
21 Clazz.makeConstructor (c$, \r
22 function (description, command, seqs, position, number, al) {\r
23 this.description = description;\r
24 if (command === jalview.commands.EditCommand.Action.CUT || command === jalview.commands.EditCommand.Action.PASTE) {\r
25 this.setEdit (Clazz.innerTypeInstance (jalview.commands.EditCommand.Edit, this, null, command, seqs, position, number, al));\r
26 }this.performEdit (0, null);\r
27 }, "~S,jalview.commands.EditCommand.Action,~A,~N,~N,jalview.datamodel.AlignmentI");\r
28 Clazz.makeConstructor (c$, \r
29 function (description, command, replace, seqs, position, number, al) {\r
30 this.description = description;\r
31 if (command === jalview.commands.EditCommand.Action.REPLACE) {\r
32 this.setEdit (Clazz.innerTypeInstance (jalview.commands.EditCommand.Edit, this, null, command, seqs, position, number, al, replace));\r
33 }this.performEdit (0, null);\r
34 }, "~S,jalview.commands.EditCommand.Action,~S,~A,~N,~N,jalview.datamodel.AlignmentI");\r
35 Clazz.defineMethod (c$, "setEdit", \r
36 function (e) {\r
37 this.edits.clear ();\r
38 this.edits.add (e);\r
39 }, "jalview.commands.EditCommand.Edit");\r
40 Clazz.defineMethod (c$, "addEdit", \r
41 function (e) {\r
42 if (!jalview.commands.EditCommand.expandEdit (this.edits, e)) {\r
43 this.edits.add (e);\r
44 }}, "jalview.commands.EditCommand.Edit");\r
45 c$.expandEdit = Clazz.defineMethod (c$, "expandEdit", \r
46 function (edits, e) {\r
47 if (edits == null || edits.isEmpty ()) {\r
48 return false;\r
49 }var lastEdit = edits.get (edits.size () - 1);\r
50 var action = e.command;\r
51 if (lastEdit.command !== action) {\r
52 return false;\r
53 }if (lastEdit.seqs.length != e.seqs.length) {\r
54 return false;\r
55 }for (var i = 0; i < e.seqs.length; i++) {\r
56 if (lastEdit.seqs[i].getDatasetSequence () !== e.seqs[i].getDatasetSequence ()) {\r
57 return false;\r
58 }}\r
59 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
60 if (contiguous) {\r
61 lastEdit.number += e.number;\r
62 lastEdit.seqs = e.seqs;\r
63 if (action === jalview.commands.EditCommand.Action.DELETE_GAP) {\r
64 lastEdit.position--;\r
65 }return true;\r
66 }return false;\r
67 }, "java.util.List,jalview.commands.EditCommand.Edit");\r
68 Clazz.defineMethod (c$, "clearEdits", \r
69 function () {\r
70 this.edits.clear ();\r
71 });\r
72 Clazz.defineMethod (c$, "getEdit", \r
73 function (i) {\r
74 if (i >= 0 && i < this.edits.size ()) {\r
75 return this.edits.get (i);\r
76 }return null;\r
77 }, "~N");\r
78 Clazz.overrideMethod (c$, "getDescription", \r
79 function () {\r
80 return this.description;\r
81 });\r
82 Clazz.overrideMethod (c$, "getSize", \r
83 function () {\r
84 return this.edits.size ();\r
85 });\r
86 Clazz.defineMethod (c$, "getAlignment", \r
87 function () {\r
88 return (this.edits.isEmpty () ? null : this.edits.get (0).al);\r
89 });\r
90 Clazz.defineMethod (c$, "appendEdit", \r
91 function (command, seqs, position, number, al, performEdit) {\r
92 this.appendEdit (command, seqs, position, number, al, performEdit, null);\r
93 }, "jalview.commands.EditCommand.Action,~A,~N,~N,jalview.datamodel.AlignmentI,~B");\r
94 Clazz.defineMethod (c$, "appendEdit", \r
95 function (command, seqs, position, number, al, performEdit, views) {\r
96 var edit = Clazz.innerTypeInstance (jalview.commands.EditCommand.Edit, this, null, command, seqs, position, number, al.getGapCharacter ());\r
97 if (al.getHeight () == seqs.length) {\r
98 edit.al = al;\r
99 edit.fullAlignmentHeight = true;\r
100 }this.addEdit (edit);\r
101 if (performEdit) {\r
102 jalview.commands.EditCommand.performEdit (edit, views);\r
103 }}, "jalview.commands.EditCommand.Action,~A,~N,~N,jalview.datamodel.AlignmentI,~B,~A");\r
104 Clazz.defineMethod (c$, "appendEdit", \r
105 function (edit, al, performEdit, views) {\r
106 if (al.getHeight () == edit.seqs.length) {\r
107 edit.al = al;\r
108 edit.fullAlignmentHeight = true;\r
109 }this.addEdit (edit);\r
110 if (performEdit) {\r
111 jalview.commands.EditCommand.performEdit (edit, views);\r
112 }}, "jalview.commands.EditCommand.Edit,jalview.datamodel.AlignmentI,~B,~A");\r
113 Clazz.defineMethod (c$, "performEdit", \r
114 function (commandIndex, views) {\r
115 var iterator = this.edits.listIterator (commandIndex);\r
116 while (iterator.hasNext ()) {\r
117 var edit = iterator.next ();\r
118 jalview.commands.EditCommand.performEdit (edit, views);\r
119 }\r
120 }, "~N,~A");\r
121 c$.performEdit = Clazz.defineMethod (c$, "performEdit", \r
122 function (edit, views) {\r
123 switch (edit.command) {\r
124 case jalview.commands.EditCommand.Action.INSERT_GAP:\r
125 jalview.commands.EditCommand.insertGap (edit);\r
126 break;\r
127 case jalview.commands.EditCommand.Action.DELETE_GAP:\r
128 jalview.commands.EditCommand.deleteGap (edit);\r
129 break;\r
130 case jalview.commands.EditCommand.Action.CUT:\r
131 jalview.commands.EditCommand.cut (edit, views);\r
132 break;\r
133 case jalview.commands.EditCommand.Action.PASTE:\r
134 jalview.commands.EditCommand.paste (edit, views);\r
135 break;\r
136 case jalview.commands.EditCommand.Action.REPLACE:\r
137 jalview.commands.EditCommand.replace (edit);\r
138 break;\r
139 case jalview.commands.EditCommand.Action.INSERT_NUC:\r
140 break;\r
141 default:\r
142 break;\r
143 }\r
144 }, "jalview.commands.EditCommand.Edit,~A");\r
145 Clazz.overrideMethod (c$, "doCommand", \r
146 function (views) {\r
147 this.performEdit (0, views);\r
148 }, "~A");\r
149 Clazz.overrideMethod (c$, "undoCommand", \r
150 function (views) {\r
151 var iterator = this.edits.listIterator (this.edits.size ());\r
152 while (iterator.hasPrevious ()) {\r
153 var e = iterator.previous ();\r
154 switch (e.command) {\r
155 case jalview.commands.EditCommand.Action.INSERT_GAP:\r
156 jalview.commands.EditCommand.deleteGap (e);\r
157 break;\r
158 case jalview.commands.EditCommand.Action.DELETE_GAP:\r
159 jalview.commands.EditCommand.insertGap (e);\r
160 break;\r
161 case jalview.commands.EditCommand.Action.CUT:\r
162 jalview.commands.EditCommand.paste (e, views);\r
163 break;\r
164 case jalview.commands.EditCommand.Action.PASTE:\r
165 jalview.commands.EditCommand.cut (e, views);\r
166 break;\r
167 case jalview.commands.EditCommand.Action.REPLACE:\r
168 jalview.commands.EditCommand.replace (e);\r
169 break;\r
170 case jalview.commands.EditCommand.Action.INSERT_NUC:\r
171 break;\r
172 default:\r
173 break;\r
174 }\r
175 }\r
176 }, "~A");\r
177 c$.insertGap = Clazz.defineMethod (c$, "insertGap", \r
178  function (command) {\r
179 for (var s = 0; s < command.seqs.length; s++) {\r
180 command.seqs[s].insertCharAt (command.position, command.number, command.gapChar);\r
181 }\r
182 jalview.commands.EditCommand.adjustAnnotations (command, true, false, null);\r
183 }, "jalview.commands.EditCommand.Edit");\r
184 c$.deleteGap = Clazz.defineMethod (c$, "deleteGap", \r
185  function (command) {\r
186 for (var s = 0; s < command.seqs.length; s++) {\r
187 command.seqs[s].deleteChars (command.position, command.position + command.number);\r
188 }\r
189 jalview.commands.EditCommand.adjustAnnotations (command, false, false, null);\r
190 }, "jalview.commands.EditCommand.Edit");\r
191 c$.cut = Clazz.defineMethod (c$, "cut", \r
192 function (command, views) {\r
193 var seqDeleted = false;\r
194 command.string =  Clazz.newCharArray (command.seqs.length, '\0');\r
195 for (var i = 0; i < command.seqs.length; i++) {\r
196 var sequence = command.seqs[i];\r
197 if (sequence.getLength () > command.position) {\r
198 command.string[i] = sequence.getSequence (command.position, command.position + command.number);\r
199 var oldds = sequence.getDatasetSequence ();\r
200 if (command.oldds != null && command.oldds[i] != null) {\r
201 sequence.setDatasetSequence (null);\r
202 }sequence.deleteChars (command.position, command.position + command.number);\r
203 if (command.oldds != null && command.oldds[i] != null) {\r
204 sequence.setDatasetSequence (command.oldds[i]);\r
205 command.oldds[i] = oldds;\r
206 } else {\r
207 if (oldds !== sequence.getDatasetSequence () || sequence.getSequenceFeatures () != null) {\r
208 if (command.oldds == null) {\r
209 command.oldds =  new Array (command.seqs.length);\r
210 }command.oldds[i] = oldds;\r
211 jalview.commands.EditCommand.adjustFeatures (command, i, sequence.findPosition (command.position), sequence.findPosition (command.position + command.number), false);\r
212 }}}if (sequence.getLength () < 1) {\r
213 command.al.deleteSequence (sequence);\r
214 seqDeleted = true;\r
215 }}\r
216 jalview.commands.EditCommand.adjustAnnotations (command, false, seqDeleted, views);\r
217 }, "jalview.commands.EditCommand.Edit,~A");\r
218 c$.paste = Clazz.defineMethod (c$, "paste", \r
219 function (command, views) {\r
220 var tmp;\r
221 var newDSNeeded;\r
222 var newDSWasNeeded;\r
223 var newstart;\r
224 var newend;\r
225 var seqWasDeleted = false;\r
226 var start = 0;\r
227 var end = 0;\r
228 for (var i = 0; i < command.seqs.length; i++) {\r
229 newDSNeeded = false;\r
230 newDSWasNeeded = command.oldds != null && command.oldds[i] != null;\r
231 if (command.seqs[i].getLength () < 1) {\r
232 if (command.alIndex[i] < command.al.getHeight ()) {\r
233 var sequences;\r
234 {\r
235 if (!(command.alIndex[i] < 0)) {\r
236 sequences.add (command.alIndex[i], command.seqs[i]);\r
237 }}} else {\r
238 command.al.addSequence (command.seqs[i]);\r
239 }seqWasDeleted = true;\r
240 }newstart = command.seqs[i].getStart ();\r
241 newend = command.seqs[i].getEnd ();\r
242 tmp =  new StringBuffer ();\r
243 tmp.append (command.seqs[i].getSequence ());\r
244 if (command.string != null && command.string[i] != null) {\r
245 if (command.position >= tmp.length ()) {\r
246 var length = command.position - tmp.length ();\r
247 while (length > 0) {\r
248 tmp.append (command.gapChar);\r
249 length--;\r
250 }\r
251 }tmp.insert (command.position, command.string[i]);\r
252 for (var s = 0; s < command.string[i].length; s++) {\r
253 if (jalview.schemes.ResidueProperties.aaIndex[command.string[i][s].charCodeAt (0)] != 23) {\r
254 if (!newDSNeeded) {\r
255 newDSNeeded = true;\r
256 start = command.seqs[i].findPosition (command.position);\r
257 end = command.seqs[i].findPosition (command.position + command.number);\r
258 }if (command.seqs[i].getStart () == start) {\r
259 newstart--;\r
260 } else {\r
261 newend++;\r
262 }}}\r
263 command.string[i] = null;\r
264 }command.seqs[i].setSequence (tmp.toString ());\r
265 command.seqs[i].setStart (newstart);\r
266 command.seqs[i].setEnd (newend);\r
267 if (newDSNeeded) {\r
268 if (command.seqs[i].getDatasetSequence () != null) {\r
269 var ds;\r
270 if (newDSWasNeeded) {\r
271 ds = command.oldds[i];\r
272 } else {\r
273 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
274 ds.setDescription (command.seqs[i].getDescription ());\r
275 }if (command.oldds == null) {\r
276 command.oldds =  new Array (command.seqs.length);\r
277 }command.oldds[i] = command.seqs[i].getDatasetSequence ();\r
278 command.seqs[i].setDatasetSequence (ds);\r
279 }jalview.commands.EditCommand.adjustFeatures (command, i, start, end, true);\r
280 }}\r
281 jalview.commands.EditCommand.adjustAnnotations (command, true, seqWasDeleted, views);\r
282 command.string = null;\r
283 }, "jalview.commands.EditCommand.Edit,~A");\r
284 c$.replace = Clazz.defineMethod (c$, "replace", \r
285 function (command) {\r
286 var tmp;\r
287 var oldstring;\r
288 var start = command.position;\r
289 var end = command.number;\r
290 command.number = start + command.string[0].length;\r
291 for (var i = 0; i < command.seqs.length; i++) {\r
292 var newDSWasNeeded = command.oldds != null && command.oldds[i] != null;\r
293 oldstring = command.seqs[i].getSequenceAsString ();\r
294 tmp =  new StringBuffer (oldstring.substring (0, start));\r
295 tmp.append (command.string[i]);\r
296 var nogaprep = jalview.analysis.AlignSeq.extractGaps (jalview.util.Comparison.GapChars,  String.instantialize (command.string[i]));\r
297 var ipos = command.seqs[i].findPosition (start) - command.seqs[i].getStart ();\r
298 tmp.append (oldstring.substring (end));\r
299 command.seqs[i].setSequence (tmp.toString ());\r
300 command.string[i] = oldstring.substring (start, end).toCharArray ();\r
301 var nogapold = jalview.analysis.AlignSeq.extractGaps (jalview.util.Comparison.GapChars,  String.instantialize (command.string[i]));\r
302 if (!nogaprep.toLowerCase ().equals (nogapold.toLowerCase ())) {\r
303 if (newDSWasNeeded) {\r
304 var oldds = command.seqs[i].getDatasetSequence ();\r
305 command.seqs[i].setDatasetSequence (command.oldds[i]);\r
306 command.oldds[i] = oldds;\r
307 } else {\r
308 if (command.oldds == null) {\r
309 command.oldds =  new Array (command.seqs.length);\r
310 }command.oldds[i] = command.seqs[i].getDatasetSequence ();\r
311 var newds =  new jalview.datamodel.Sequence (command.seqs[i].getDatasetSequence ());\r
312 var fullseq;\r
313 var osp = newds.getSequenceAsString ();\r
314 fullseq = osp.substring (0, ipos) + nogaprep + osp.substring (ipos + nogaprep.length);\r
315 newds.setSequence (fullseq.toUpperCase ());\r
316 command.seqs[i].setDatasetSequence (newds);\r
317 }}tmp = null;\r
318 oldstring = null;\r
319 }\r
320 }, "jalview.commands.EditCommand.Edit");\r
321 c$.adjustAnnotations = Clazz.defineMethod (c$, "adjustAnnotations", \r
322 function (command, insert, modifyVisibility, views) {\r
323 var annotations = null;\r
324 if (modifyVisibility && !insert) {\r
325 command.deletedAnnotationRows =  new java.util.Hashtable ();\r
326 }if (command.fullAlignmentHeight) {\r
327 annotations = command.al.getAlignmentAnnotation ();\r
328 } else {\r
329 var aSize = 0;\r
330 var tmp;\r
331 for (var s = 0; s < command.seqs.length; s++) {\r
332 if (modifyVisibility) {\r
333 if (!insert) {\r
334 tmp = command.seqs[s].getAnnotation ();\r
335 if (tmp != null) {\r
336 var alen = tmp.length;\r
337 for (var aa = 0; aa < tmp.length; aa++) {\r
338 if (!command.al.deleteAnnotation (tmp[aa])) {\r
339 tmp[aa] = null;\r
340 alen--;\r
341 }}\r
342 command.seqs[s].setAlignmentAnnotation (null);\r
343 if (alen != tmp.length) {\r
344 var saved =  new Array (alen);\r
345 for (var aa = 0, aapos = 0; aa < tmp.length; aa++) {\r
346 if (tmp[aa] != null) {\r
347 saved[aapos++] = tmp[aa];\r
348 tmp[aa] = null;\r
349 }}\r
350 tmp = saved;\r
351 command.deletedAnnotationRows.put (command.seqs[s], saved);\r
352 for (var alview = 0; views != null && alview < views.length; alview++) {\r
353 if (views[alview] !== command.al) {\r
354 var toremove = views[alview].getAlignmentAnnotation ();\r
355 if (toremove == null || toremove.length == 0) {\r
356 continue;\r
357 }for (var aa = 0; aa < toremove.length; aa++) {\r
358 if (toremove[aa].sequenceRef === command.seqs[s]) {\r
359 views[alview].deleteAnnotation (toremove[aa]);\r
360 }}\r
361 }}\r
362 } else {\r
363 command.deletedAnnotationRows.put (command.seqs[s], tmp);\r
364 }}} else {\r
365 if (command.deletedAnnotationRows != null && command.deletedAnnotationRows.containsKey (command.seqs[s])) {\r
366 var revealed = command.deletedAnnotationRows.get (command.seqs[s]);\r
367 command.seqs[s].setAlignmentAnnotation (revealed);\r
368 if (revealed != null) {\r
369 for (var aa = 0; aa < revealed.length; aa++) {\r
370 command.al.addAnnotation (revealed[aa]);\r
371 }\r
372 for (var aa = 0; aa < revealed.length; aa++) {\r
373 command.al.setAnnotationIndex (revealed[aa], aa);\r
374 }\r
375 for (var vnum = 0; views != null && vnum < views.length; vnum++) {\r
376 if (views[vnum] !== command.al) {\r
377 var avwidth = views[vnum].getWidth () + 1;\r
378 for (var a = 0; a < revealed.length; a++) {\r
379 var newann =  new jalview.datamodel.AlignmentAnnotation (revealed[a]);\r
380 command.seqs[s].addAlignmentAnnotation (newann);\r
381 newann.padAnnotation (avwidth);\r
382 views[vnum].addAnnotation (newann);\r
383 views[vnum].setAnnotationIndex (newann, a);\r
384 }\r
385 }}\r
386 }}}continue;\r
387 }if (command.seqs[s].getAnnotation () == null) {\r
388 continue;\r
389 }if (aSize == 0) {\r
390 annotations = command.seqs[s].getAnnotation ();\r
391 } else {\r
392 tmp =  new Array (aSize + command.seqs[s].getAnnotation ().length);\r
393 System.arraycopy (annotations, 0, tmp, 0, aSize);\r
394 System.arraycopy (command.seqs[s].getAnnotation (), 0, tmp, aSize, command.seqs[s].getAnnotation ().length);\r
395 annotations = tmp;\r
396 }aSize = annotations.length;\r
397 }\r
398 }if (annotations == null) {\r
399 return;\r
400 }if (!insert) {\r
401 command.deletedAnnotations =  new java.util.Hashtable ();\r
402 }var aSize;\r
403 var temp;\r
404 for (var a = 0; a < annotations.length; a++) {\r
405 if (annotations[a].autoCalculated || annotations[a].annotations == null) {\r
406 continue;\r
407 }var tSize = 0;\r
408 aSize = annotations[a].annotations.length;\r
409 if (insert) {\r
410 temp =  new Array (aSize + command.number);\r
411 if (annotations[a].padGaps) {\r
412 for (var aa = 0; aa < temp.length; aa++) {\r
413 temp[aa] =  new jalview.datamodel.Annotation (command.gapChar + "", null, ' ', 0);\r
414 }\r
415 }} else {\r
416 if (command.position < aSize) {\r
417 if (command.position + command.number >= aSize) {\r
418 tSize = aSize;\r
419 } else {\r
420 tSize = aSize - command.number;\r
421 }} else {\r
422 tSize = aSize;\r
423 }if (tSize < 0) {\r
424 tSize = aSize;\r
425 }temp =  new Array (tSize);\r
426 }if (insert) {\r
427 if (command.position < annotations[a].annotations.length) {\r
428 System.arraycopy (annotations[a].annotations, 0, temp, 0, command.position);\r
429 if (command.deletedAnnotations != null && command.deletedAnnotations.containsKey (annotations[a].annotationId)) {\r
430 var restore = command.deletedAnnotations.get (annotations[a].annotationId);\r
431 System.arraycopy (restore, 0, temp, command.position, command.number);\r
432 }System.arraycopy (annotations[a].annotations, command.position, temp, command.position + command.number, aSize - command.position);\r
433 } else {\r
434 if (command.deletedAnnotations != null && command.deletedAnnotations.containsKey (annotations[a].annotationId)) {\r
435 var restore = command.deletedAnnotations.get (annotations[a].annotationId);\r
436 temp =  new Array (annotations[a].annotations.length + restore.length);\r
437 System.arraycopy (annotations[a].annotations, 0, temp, 0, annotations[a].annotations.length);\r
438 System.arraycopy (restore, 0, temp, annotations[a].annotations.length, restore.length);\r
439 } else {\r
440 temp = annotations[a].annotations;\r
441 }}} else {\r
442 if (tSize != aSize || command.position < 2) {\r
443 var copylen = Math.min (command.position, annotations[a].annotations.length);\r
444 if (copylen > 0) {\r
445 System.arraycopy (annotations[a].annotations, 0, temp, 0, copylen);\r
446 }var deleted =  new Array (command.number);\r
447 if (copylen >= command.position) {\r
448 copylen = Math.min (command.number, annotations[a].annotations.length - command.position);\r
449 if (copylen > 0) {\r
450 System.arraycopy (annotations[a].annotations, command.position, deleted, 0, copylen);\r
451 }}command.deletedAnnotations.put (annotations[a].annotationId, deleted);\r
452 if (annotations[a].annotations.length > command.position + command.number) {\r
453 System.arraycopy (annotations[a].annotations, command.position + command.number, temp, command.position, annotations[a].annotations.length - command.position - command.number);\r
454 }} else {\r
455 var dSize = aSize - command.position;\r
456 if (dSize > 0) {\r
457 var deleted =  new Array (command.number);\r
458 System.arraycopy (annotations[a].annotations, command.position, deleted, 0, dSize);\r
459 command.deletedAnnotations.put (annotations[a].annotationId, deleted);\r
460 tSize = Math.min (annotations[a].annotations.length, command.position);\r
461 temp =  new Array (tSize);\r
462 System.arraycopy (annotations[a].annotations, 0, temp, 0, tSize);\r
463 } else {\r
464 temp = annotations[a].annotations;\r
465 }}}annotations[a].annotations = temp;\r
466 }\r
467 }, "jalview.commands.EditCommand.Edit,~B,~B,~A");\r
468 c$.adjustFeatures = Clazz.defineMethod (c$, "adjustFeatures", \r
469 function (command, index, i, j, insert) {\r
470 var seq = command.seqs[index];\r
471 var sequence = seq.getDatasetSequence ();\r
472 if (sequence == null) {\r
473 sequence = seq;\r
474 }if (insert) {\r
475 if (command.editedFeatures != null && command.editedFeatures.containsKey (seq)) {\r
476 sequence.setSequenceFeatures (command.editedFeatures.get (seq));\r
477 }return;\r
478 }var sf = sequence.getSequenceFeatures ();\r
479 if (sf == null) {\r
480 return;\r
481 }var oldsf =  new Array (sf.length);\r
482 var cSize = j - i;\r
483 for (var s = 0; s < sf.length; s++) {\r
484 var copy =  new jalview.datamodel.SequenceFeature (sf[s]);\r
485 oldsf[s] = copy;\r
486 if (sf[s].getEnd () < i) {\r
487 continue;\r
488 }if (sf[s].getBegin () > j) {\r
489 sf[s].setBegin (copy.getBegin () - cSize);\r
490 sf[s].setEnd (copy.getEnd () - cSize);\r
491 continue;\r
492 }if (sf[s].getBegin () >= i) {\r
493 sf[s].setBegin (i);\r
494 }if (sf[s].getEnd () < j) {\r
495 sf[s].setEnd (j - 1);\r
496 }sf[s].setEnd (sf[s].getEnd () - (cSize));\r
497 if (sf[s].getBegin () > sf[s].getEnd ()) {\r
498 sequence.deleteFeature (sf[s]);\r
499 }}\r
500 if (command.editedFeatures == null) {\r
501 command.editedFeatures =  new java.util.Hashtable ();\r
502 }command.editedFeatures.put (seq, oldsf);\r
503 }, "jalview.commands.EditCommand.Edit,~N,~N,~N,~B");\r
504 Clazz.defineMethod (c$, "getEdits", \r
505 function () {\r
506 return this.edits;\r
507 });\r
508 Clazz.defineMethod (c$, "priorState", \r
509 function (forUndo) {\r
510 var result =  new java.util.HashMap ();\r
511 if (this.getEdits () == null) {\r
512 return result;\r
513 }if (forUndo) {\r
514 for (var e, $e = this.getEdits ().iterator (); $e.hasNext () && ((e = $e.next ()) || true);) {\r
515 for (var seq, $seq = 0, $$seq = e.getSequences (); $seq < $$seq.length && ((seq = $$seq[$seq]) || true); $seq++) {\r
516 var ds = seq.getDatasetSequence ();\r
517 var preEdit = result.get (ds);\r
518 if (preEdit == null) {\r
519 preEdit =  new jalview.datamodel.Sequence ("", seq.getSequenceAsString ());\r
520 preEdit.setDatasetSequence (ds);\r
521 result.put (ds, preEdit);\r
522 }}\r
523 }\r
524 return result;\r
525 }var edits =  new jalview.util.ReverseListIterator (this.getEdits ());\r
526 while (edits.hasNext ()) {\r
527 var oldEdit = edits.next ();\r
528 var action = oldEdit.getAction ();\r
529 var position = oldEdit.getPosition ();\r
530 var number = oldEdit.getNumber ();\r
531 var gap = oldEdit.getGapCharacter ();\r
532 for (var seq, $seq = 0, $$seq = oldEdit.getSequences (); $seq < $$seq.length && ((seq = $$seq[$seq]) || true); $seq++) {\r
533 var ds = seq.getDatasetSequence ();\r
534 var preEdit = result.get (ds);\r
535 if (preEdit == null) {\r
536 preEdit =  new jalview.datamodel.Sequence ("", seq.getSequenceAsString ());\r
537 preEdit.setDatasetSequence (ds);\r
538 result.put (ds, preEdit);\r
539 }if (ds != null) {\r
540 if (action === jalview.commands.EditCommand.Action.DELETE_GAP) {\r
541 preEdit.setSequence ( String.instantialize (jalview.util.StringUtils.insertCharAt (preEdit.getSequence (), position, number, gap)));\r
542 } else if (action === jalview.commands.EditCommand.Action.INSERT_GAP) {\r
543 preEdit.setSequence ( String.instantialize (jalview.util.StringUtils.deleteChars (preEdit.getSequence (), position, position + number)));\r
544 } else {\r
545 System.err.println ("Can't undo edit action " + action);\r
546 }}}\r
547 }\r
548 return result;\r
549 }, "~B");\r
550 Clazz.defineMethod (c$, "getEditIterator", \r
551 function (forwards) {\r
552 if (forwards) {\r
553 return this.getEdits ().iterator ();\r
554 } else {\r
555 return  new jalview.util.ReverseListIterator (this.getEdits ());\r
556 }}, "~B");\r
557 c$.$EditCommand$Edit$ = function () {\r
558 Clazz.pu$h(self.c$);\r
559 c$ = Clazz.decorateAsClass (function () {\r
560 Clazz.prepareCallback (this, arguments);\r
561 this.oldds = null;\r
562 this.fullAlignmentHeight = false;\r
563 this.deletedAnnotationRows = null;\r
564 this.deletedAnnotations = null;\r
565 this.editedFeatures = null;\r
566 this.al = null;\r
567 this.command = null;\r
568 this.string = null;\r
569 this.seqs = null;\r
570 this.alIndex = null;\r
571 this.position = 0;\r
572 this.number = 0;\r
573 this.gapChar = '\0';\r
574 Clazz.instantialize (this, arguments);\r
575 }, jalview.commands.EditCommand, "Edit");\r
576 Clazz.makeConstructor (c$, \r
577 function (a, b, c, d, e) {\r
578 this.command = a;\r
579 this.seqs = b;\r
580 this.position = c;\r
581 this.number = d;\r
582 this.gapChar = e;\r
583 }, "jalview.commands.EditCommand.Action,~A,~N,~N,~S");\r
584 Clazz.makeConstructor (c$, \r
585 function (a, b, c, d, e) {\r
586 this.gapChar = e.getGapCharacter ();\r
587 this.command = a;\r
588 this.seqs = b;\r
589 this.position = c;\r
590 this.number = d;\r
591 this.al = e;\r
592 this.alIndex =  Clazz.newIntArray (b.length, 0);\r
593 for (var f = 0; f < b.length; f++) {\r
594 this.alIndex[f] = e.findIndex (b[f]);\r
595 }\r
596 this.fullAlignmentHeight = (e.getHeight () == b.length);\r
597 }, "jalview.commands.EditCommand.Action,~A,~N,~N,jalview.datamodel.AlignmentI");\r
598 Clazz.makeConstructor (c$, \r
599 function (a, b, c, d, e, f) {\r
600 this.command = a;\r
601 this.seqs = b;\r
602 this.position = c;\r
603 this.number = d;\r
604 this.al = e;\r
605 this.gapChar = e.getGapCharacter ();\r
606 this.string =  Clazz.newCharArray (b.length, '\0');\r
607 for (var g = 0; g < b.length; g++) {\r
608 this.string[g] = f.toCharArray ();\r
609 }\r
610 this.fullAlignmentHeight = (e.getHeight () == b.length);\r
611 }, "jalview.commands.EditCommand.Action,~A,~N,~N,jalview.datamodel.AlignmentI,~S");\r
612 Clazz.defineMethod (c$, "getSequences", \r
613 function () {\r
614 return this.seqs;\r
615 });\r
616 Clazz.defineMethod (c$, "getPosition", \r
617 function () {\r
618 return this.position;\r
619 });\r
620 Clazz.defineMethod (c$, "getAction", \r
621 function () {\r
622 return this.command;\r
623 });\r
624 Clazz.defineMethod (c$, "getNumber", \r
625 function () {\r
626 return this.number;\r
627 });\r
628 Clazz.defineMethod (c$, "getGapCharacter", \r
629 function () {\r
630 return this.gapChar;\r
631 });\r
632 c$ = Clazz.p0p ();\r
633 };\r
634 Clazz.pu$h(self.c$);\r
635 c$ = Clazz.declareType (jalview.commands.EditCommand, "Action", Enum);\r
636 Clazz.defineMethod (c$, "getUndoAction", \r
637 function () {\r
638 switch (this) {\r
639 case jalview.commands.EditCommand.Action.INSERT_GAP:\r
640 return jalview.commands.EditCommand.Action.DELETE_GAP;\r
641 case jalview.commands.EditCommand.Action.CUT:\r
642 return jalview.commands.EditCommand.Action.PASTE;\r
643 case jalview.commands.EditCommand.Action.DELETE_GAP:\r
644 return jalview.commands.EditCommand.Action.INSERT_GAP;\r
645 case jalview.commands.EditCommand.Action.INSERT_NUC:\r
646 return null;\r
647 case jalview.commands.EditCommand.Action.PASTE:\r
648 return jalview.commands.EditCommand.Action.CUT;\r
649 case jalview.commands.EditCommand.Action.REPLACE:\r
650 return jalview.commands.EditCommand.Action.REPLACE;\r
651 }\r
652 return null;\r
653 });\r
654 Clazz.defineEnumConstant (c$, "INSERT_GAP", 0, []);\r
655 Clazz.defineEnumConstant (c$, "DELETE_GAP", 1, []);\r
656 Clazz.defineEnumConstant (c$, "CUT", 2, []);\r
657 Clazz.defineEnumConstant (c$, "PASTE", 3, []);\r
658 Clazz.defineEnumConstant (c$, "REPLACE", 4, []);\r
659 Clazz.defineEnumConstant (c$, "INSERT_NUC", 5, []);\r
660 c$ = Clazz.p0p ();\r
661 });\r