\r
import jalview.datamodel.*;\r
\r
+import java.util.Hashtable;\r
+\r
/**\r
*\r
* <p>Title: EditCommmand</p>\r
SequenceI[] seqs,\r
int position,\r
int number,\r
- char gapChar,\r
+ AlignmentI al,\r
boolean performEdit)\r
{\r
- Edit edit = new Edit(command, seqs, position, number, gapChar);\r
+ Edit edit = new Edit(command, seqs, position, number, al.getGapCharacter());\r
+ if(al.getHeight()==seqs.length)\r
+ {\r
+ edit.al = al;\r
+ edit.fullAlignmentHeight = true;\r
+ }\r
\r
if (edits != null)\r
{\r
command.number,\r
command.gapChar);\r
}\r
+\r
+ if (command.fullAlignmentHeight)\r
+ {\r
+ adjustAnnotations(command, true);\r
+ }\r
}\r
\r
void deleteGap(Edit command)\r
{\r
command.seqs[s].deleteChars(command.position, command.position+command.number);\r
}\r
+\r
+ if (command.fullAlignmentHeight)\r
+ {\r
+ adjustAnnotations(command, false);\r
+ }\r
}\r
\r
void cut(Edit command)\r
{\r
command.al.deleteSequence(command.seqs[i]);\r
}\r
+ }\r
\r
-\r
+ if (command.fullAlignmentHeight)\r
+ {\r
+ adjustAnnotations(command, false);\r
}\r
+\r
}\r
\r
void paste(Edit command)\r
command.string[i] = null;\r
}\r
command.seqs[i].setSequence(tmp.toString());\r
+ }\r
\r
-\r
-\r
+ if (command.fullAlignmentHeight)\r
+ {\r
+ adjustAnnotations(command, true);\r
}\r
\r
command.string = null;\r
}\r
\r
+\r
+ void adjustAnnotations(Edit command, boolean insert)\r
+ {\r
+ AlignmentAnnotation [] annotations = command.al.getAlignmentAnnotation();\r
+ if(annotations!=null)\r
+ {\r
+ if(!insert)\r
+ command.deletedAnnotations = new Hashtable();\r
+\r
+ int aSize, tSize;\r
+ Annotation [] temp;\r
+ for (int a = 0; a < annotations.length; a++)\r
+ {\r
+ if(annotations[a].autoCalculated)\r
+ {\r
+ continue;\r
+ }\r
+\r
+ aSize = annotations[a].annotations.length;\r
+ if(insert)\r
+ tSize = aSize + command.number;\r
+ else\r
+ tSize = aSize - command.number;\r
+\r
+ temp = new Annotation[tSize];\r
+\r
+ if(insert)\r
+ {\r
+ System.arraycopy(annotations[a].annotations,\r
+ 0, temp, 0, command.position);\r
+\r
+ if(command.deletedAnnotations!=null\r
+ && command.deletedAnnotations.containsKey(annotations[a].annotationId))\r
+ {\r
+ Annotation [] restore = (Annotation [])\r
+ command.deletedAnnotations.get(annotations[a].annotationId);\r
+\r
+ System.arraycopy(restore,\r
+ 0,\r
+ temp,\r
+ command.position,\r
+ command.number);\r
+\r
+ }\r
+\r
+ System.arraycopy(annotations[a].annotations,\r
+ command.position, temp,\r
+ command.position+command.number,\r
+ aSize - command.position);\r
+ }\r
+ else\r
+ {\r
+ if(command.position < annotations[a].annotations.length)\r
+ {\r
+ System.arraycopy(annotations[a].annotations,\r
+ 0, temp, 0, command.position);\r
+\r
+ Annotation[] deleted = new Annotation[command.number];\r
+ System.arraycopy(annotations[a].annotations,\r
+ command.position, deleted, 0, command.number);\r
+\r
+ command.deletedAnnotations.put(annotations[a].annotationId,\r
+ deleted);\r
+\r
+ System.arraycopy(annotations[a].annotations,\r
+ command.position + command.number,\r
+ temp, command.position,\r
+ aSize - command.position - command.number);\r
+ }\r
+ else\r
+ temp = annotations[a].annotations;\r
+ }\r
+\r
+ annotations[a].annotations = temp;\r
+ }\r
+ }\r
+ }\r
+\r
+\r
class Edit\r
{\r
+ boolean fullAlignmentHeight = false;\r
+ Hashtable deletedAnnotations;\r
AlignmentI al;\r
int command;\r
char [][] string;\r
alIndex = new int[seqs.length];\r
for(int i=0; i<seqs.length; i++)\r
alIndex[i] = al.findIndex(seqs[i]);\r
+\r
+ fullAlignmentHeight = (al.getHeight()==seqs.length);\r
+\r
}\r
\r
}\r
public class RemoveGapsCommand extends EditCommand\r
{\r
public RemoveGapsCommand( String description,\r
- SequenceI[] seqs, char gapChar)\r
+ SequenceI[] seqs, AlignmentI al)\r
{\r
this.description = description;\r
int width = 0;\r
if(seqs[i].getLength()>width)\r
width = seqs[i].getLength();\r
\r
- findGaps(seqs, 0, width, gapChar);\r
+ findGaps(seqs, 0, width, al);\r
}\r
\r
public RemoveGapsCommand( String description,\r
SequenceI[] seqs,\r
- int start, int end, char gapChar)\r
+ int start, int end, AlignmentI al)\r
{\r
this.description = description;\r
- findGaps(seqs, start, end, gapChar);\r
+ findGaps(seqs, start, end, al);\r
}\r
\r
- void findGaps(SequenceI [] seqs, int start, int end, char gapChar)\r
+ void findGaps(SequenceI [] seqs, int start, int end, AlignmentI al)\r
{\r
\r
int startCol = -1, endCol = -1;\r
this.appendEdit(DELETE_GAP, new SequenceI[]{seqs[s]},\r
start + startCol - deletedCols,\r
endCol - startCol,\r
- gapChar,\r
+ al,\r
false);\r
\r
deletedCols += (endCol - startCol);\r
this.appendEdit(DELETE_GAP, new SequenceI[]{seqs[s]},\r
start + startCol - deletedCols,\r
jSize - startCol,\r
- gapChar,\r
+ al,\r
false);\r
}\r
\r
}
- public void adjustSequenceAnnotations(int position,
- int number,
- boolean insert)
- {
- if(annotations!=null)
- {
- int aSize, tSize;
- Annotation [] temp;
- for (int a = 0; a < annotations.length; a++)
- {
- if(annotations[a].autoCalculated)
- {
- System.out.println("ignore "+annotations[a].label);
- continue;
- }
- aSize = annotations[a].annotations.length;
- if(insert)
- tSize = aSize + number;
- else
- tSize = aSize - number;
-
- temp = new Annotation[tSize];
-
- if(insert)
- {
- System.arraycopy(annotations[a].annotations,
- 0, temp, 0, position);
-
- System.arraycopy(annotations[a].annotations,
- position, temp, position+number, aSize - position);
- }
- else
- {
- System.arraycopy(annotations[a].annotations,
- 0, temp, 0, position);
-
- System.arraycopy(annotations[a].annotations,
- position + number, temp, position,
- aSize - position - number);
- }
-
- annotations[a].annotations = temp;
-
-
- // if (annotations[a].sequenceRef != null)
- {
- // annotations[a].adjustForAlignment();
- }
- }
- }
- }
-
/**
* DOCUMENT ME!
*