+\r
+ void moveCursor(int dx, int dy)\r
+ {\r
+ seqCanvas.cursorX += dx;\r
+ seqCanvas.cursorY += dy;\r
+\r
+ if(seqCanvas.cursorX<0)\r
+ seqCanvas.cursorX = 0;\r
+ else if(seqCanvas.cursorX>av.alignment.getWidth()-1)\r
+ seqCanvas.cursorX = av.alignment.getWidth()-1;\r
+ if(seqCanvas.cursorX<av.startRes)\r
+ ap.scrollRight(false);\r
+ else if(seqCanvas.cursorX>av.endRes)\r
+ ap.scrollRight(true);\r
+\r
+ if(seqCanvas.cursorY<0)\r
+ seqCanvas.cursorY=0;\r
+ else if(seqCanvas.cursorY>av.alignment.getHeight()-1)\r
+ seqCanvas.cursorY = av.alignment.getHeight()-1;\r
+ if(seqCanvas.cursorY<av.startSeq)\r
+ ap.scrollUp(true);\r
+ else if(seqCanvas.cursorY+1>av.endSeq)\r
+ ap.scrollUp(false);\r
+\r
+ setStatusMessage(av.alignment.getSequenceAt(seqCanvas.cursorY),\r
+ seqCanvas.cursorX, seqCanvas.cursorY);\r
+ seqCanvas.repaint();\r
+ }\r
+\r
+ void setSelectionAreaAtCursor(boolean topLeft)\r
+ {\r
+ SequenceI sequence =\r
+ (Sequence) av.getAlignment().getSequenceAt(seqCanvas.cursorY);\r
+\r
+ if(av.getSelectionGroup()!=null)\r
+ {\r
+ SequenceGroup sg = av.selectionGroup;\r
+ //Find the top and bottom of this group\r
+ int min = av.alignment.getHeight(), max = 0;\r
+ for(int i=0; i<sg.getSize(); i++)\r
+ {\r
+ int index = av.alignment.findIndex( sg.getSequenceAt(i) );\r
+ if(index > max)\r
+ max = index;\r
+ if(index < min)\r
+ min = index;\r
+ }\r
+\r
+ max ++;\r
+\r
+ if(topLeft)\r
+ {\r
+ sg.setStartRes(seqCanvas.cursorX);\r
+ if(sg.getEndRes()<seqCanvas.cursorX)\r
+ sg.setEndRes(seqCanvas.cursorX);\r
+\r
+ min = seqCanvas.cursorY;\r
+ }\r
+ else\r
+ {\r
+ sg.setEndRes(seqCanvas.cursorX);\r
+ if(sg.getStartRes()>seqCanvas.cursorX)\r
+ sg.setStartRes(seqCanvas.cursorX);\r
+\r
+ max = seqCanvas.cursorY+1;\r
+ }\r
+\r
+ if(min>max)\r
+ {\r
+ // Only the user can do this\r
+ av.setSelectionGroup(null);\r
+ }\r
+ else\r
+ {\r
+ // Now add any sequences between min and max\r
+ sg.sequences.clear();\r
+ for (int i = min; i < max; i++)\r
+ {\r
+ sg.addSequence(av.alignment.getSequenceAt(i), false);\r
+ }\r
+ }\r
+ }\r
+\r
+ if (av.getSelectionGroup() == null)\r
+ {\r
+ SequenceGroup sg = new SequenceGroup();\r
+ sg.setStartRes(seqCanvas.cursorX);\r
+ sg.setEndRes(seqCanvas.cursorX);\r
+ sg.addSequence(sequence, false);\r
+ av.setSelectionGroup(sg);\r
+ }\r
+\r
+\r
+ ap.repaint();\r
+ }\r
+\r
+ void insertGapAtCursor(boolean group)\r
+ {\r
+ ap.alignFrame.addHistoryItem(new HistoryItem("Edit Sequence",\r
+ av.alignment, HistoryItem.EDIT));\r
+ groupEditing = group;\r
+ startseq = seqCanvas.cursorY;\r
+ lastres = seqCanvas.cursorX;\r
+ editSequence(true, seqCanvas.cursorX+getKeyboardGaps());\r
+ editOccurred();\r
+ }\r
+\r
+ void deleteGapAtCursor(boolean group)\r
+ {\r
+ ap.alignFrame.addHistoryItem(new HistoryItem("Edit Sequence",\r
+ av.alignment, HistoryItem.EDIT));\r
+ groupEditing = group;\r
+ startseq = seqCanvas.cursorY;\r
+ lastres = seqCanvas.cursorX+getKeyboardGaps();\r
+ editSequence(false, seqCanvas.cursorX);\r
+ editOccurred();\r
+ }\r
+\r
+ void numberPressed(char value)\r
+ {\r
+ if(keyboardGaps==null)\r
+ keyboardGaps = new StringBuffer();\r
+\r
+ keyboardGaps.append(value);\r
+ }\r
+\r
+ StringBuffer keyboardGaps;\r
+ int getKeyboardGaps()\r
+ {\r
+ if(keyboardGaps==null)\r
+ return 1;\r
+ else\r
+ return Integer.parseInt(keyboardGaps.toString());\r
+ }\r
+\r
+\r