+ void setCursorRow()\r
+ {\r
+ seqCanvas.cursorY = getKeyboardNo1() - 1;\r
+ scrollToVisible();\r
+ }\r
+\r
+ void setCursorColumn()\r
+ {\r
+ seqCanvas.cursorX = getKeyboardNo1() - 1;\r
+ scrollToVisible();\r
+ }\r
+\r
+ void setCursorRowAndColumn()\r
+ {\r
+ if (keyboardNo2 == null)\r
+ {\r
+ keyboardNo2 = new StringBuffer();\r
+ }\r
+ else\r
+ {\r
+ seqCanvas.cursorX = getKeyboardNo1() - 1;\r
+ seqCanvas.cursorY = getKeyboardNo2() - 1;\r
+ scrollToVisible();\r
+ }\r
+ }\r
+\r
+ void setCursorPosition()\r
+ {\r
+ SequenceI sequence =\r
+ (Sequence) av.getAlignment().getSequenceAt(seqCanvas.cursorY);\r
+\r
+ seqCanvas.cursorX = sequence.findIndex(\r
+ getKeyboardNo1() - 1\r
+ );\r
+ scrollToVisible();\r
+ }\r
+\r
+ void moveCursor(int dx, int dy)\r
+ {\r
+ seqCanvas.cursorX += dx;\r
+ seqCanvas.cursorY += dy;\r
+ if (av.hasHiddenColumns && !av.colSel.isVisible(seqCanvas.cursorX))\r
+ {\r
+ int original = seqCanvas.cursorX - dx;\r
+ int maxWidth = av.alignment.getWidth();\r
+\r
+ while (!av.colSel.isVisible(seqCanvas.cursorX)\r
+ && seqCanvas.cursorX < maxWidth\r
+ && seqCanvas.cursorX > 0)\r
+ {\r
+ seqCanvas.cursorX += dx;\r
+ }\r
+\r
+ if (seqCanvas.cursorX >= maxWidth\r
+ || !av.colSel.isVisible(seqCanvas.cursorX))\r
+ {\r
+ seqCanvas.cursorX = original;\r
+ }\r
+ }\r
+ scrollToVisible();\r
+ }\r
+\r
+ void scrollToVisible()\r
+ {\r
+ if (seqCanvas.cursorX < 0)\r
+ {\r
+ seqCanvas.cursorX = 0;\r
+ }\r
+ else if (seqCanvas.cursorX > av.alignment.getWidth() - 1)\r
+ {\r
+ seqCanvas.cursorX = av.alignment.getWidth() - 1;\r
+ }\r
+\r
+ if (seqCanvas.cursorY < 0)\r
+ {\r
+ seqCanvas.cursorY = 0;\r
+ }\r
+ else if (seqCanvas.cursorY > av.alignment.getHeight() - 1)\r
+ {\r
+ seqCanvas.cursorY = av.alignment.getHeight() - 1;\r
+ }\r
+\r
+ endEditing();\r
+ if (av.wrapAlignment)\r
+ {\r
+ ap.scrollToWrappedVisible(seqCanvas.cursorX);\r
+ }\r
+ else\r
+ {\r
+ while (seqCanvas.cursorY < av.startSeq)\r
+ {\r
+ ap.scrollUp(true);\r
+ }\r
+ while (seqCanvas.cursorY + 1 > av.endSeq)\r
+ {\r
+ ap.scrollUp(false);\r
+ }\r
+ while (seqCanvas.cursorX < av.colSel.adjustForHiddenColumns(av.startRes))\r
+ {\r
+\r
+ if (!ap.scrollRight(false))\r
+ {\r
+ break;\r
+ }\r
+ }\r
+ while (seqCanvas.cursorX > av.colSel.adjustForHiddenColumns(av.endRes))\r
+ {\r
+ if (!ap.scrollRight(true))\r
+ {\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ setStatusMessage(av.alignment.getSequenceAt(seqCanvas.cursorY),\r
+ seqCanvas.cursorX, seqCanvas.cursorY);\r
+\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
+ {\r
+ max = index;\r
+ }\r
+ if (index < min)\r
+ {\r
+ min = index;\r
+ }\r
+ }\r
+\r
+ max++;\r
+\r
+ if (topLeft)\r
+ {\r
+ sg.setStartRes(seqCanvas.cursorX);\r
+ if (sg.getEndRes() < seqCanvas.cursorX)\r
+ {\r
+ sg.setEndRes(seqCanvas.cursorX);\r
+ }\r
+\r
+ min = seqCanvas.cursorY;\r
+ }\r
+ else\r
+ {\r
+ sg.setEndRes(seqCanvas.cursorX);\r
+ if (sg.getStartRes() > seqCanvas.cursorX)\r
+ {\r
+ sg.setStartRes(seqCanvas.cursorX);\r
+ }\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.getSequences(null).removeAllElements();\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
+ ap.paintAlignment(false);\r
+ }\r
+\r
+ void insertGapAtCursor(boolean group)\r
+ {\r
+ groupEditing = group;\r
+ startseq = seqCanvas.cursorY;\r
+ lastres = seqCanvas.cursorX;\r
+ editSequence(true, seqCanvas.cursorX + getKeyboardNo1());\r
+ endEditing();\r
+ }\r
+\r
+ void deleteGapAtCursor(boolean group)\r
+ {\r
+ groupEditing = group;\r
+ startseq = seqCanvas.cursorY;\r
+ lastres = seqCanvas.cursorX + getKeyboardNo1();\r
+ editSequence(false, seqCanvas.cursorX);\r
+ endEditing();\r
+ }\r
+\r
+ void numberPressed(char value)\r
+ {\r
+ if (keyboardNo1 == null)\r
+ {\r
+ keyboardNo1 = new StringBuffer();\r
+ }\r
+\r
+ if (keyboardNo2 != null)\r
+ {\r
+ keyboardNo2.append(value);\r
+ }\r
+ else\r
+ {\r
+ keyboardNo1.append(value);\r
+ }\r
+ }\r
+\r
+ int getKeyboardNo1()\r
+ {\r
+ if (keyboardNo1 == null)\r
+ return 1;\r
+ else\r
+ {\r
+ int value = Integer.parseInt(keyboardNo1.toString());\r
+ keyboardNo1 = null;\r
+ return value;\r
+ }\r
+ }\r
+\r
+ int getKeyboardNo2()\r
+ {\r
+ if (keyboardNo2 == null)\r
+ return 1;\r
+ else\r
+ {\r
+ int value = Integer.parseInt(keyboardNo2.toString());\r
+ keyboardNo2 = null;\r
+ return value;\r
+ }\r
+ }\r
+\r
+\r
+ void setStatusMessage(SequenceI sequence, int res, int seq)\r
+ {\r
+ StringBuffer text = new StringBuffer("Sequence " + (seq + 1) + " ID: " +\r
+ sequence.getName());\r
+\r
+ Object obj = null;\r
+ if (av.alignment.isNucleotide())\r
+ {\r
+ obj = ResidueProperties.nucleotideName.get(sequence.getCharAt(res) +\r
+ "");\r
+ if (obj != null)\r
+ {\r
+ text.append(" Nucleotide: ");\r
+ }\r
+ }\r
+ else\r
+ {\r
+ obj = ResidueProperties.aa2Triplet.get(sequence.getCharAt(res) + "");\r
+ if (obj != null)\r
+ {\r
+ text.append(" Residue: ");\r
+ }\r
+ }\r
+\r
+ if (obj != null)\r
+ {\r
+\r
+ if (obj != "")\r
+ {\r
+ text.append(obj + " (" + sequence.findPosition(res) +\r
+ ")");\r
+ }\r
+ }\r
+\r
+ ap.alignFrame.statusBar.setText(text.toString());\r
+\r
+ }\r
+\r
+ public void mousePressed(MouseEvent evt)\r
+ {\r
+ lastMousePress = evt.getPoint();\r
+\r
+ //For now, ignore the mouseWheel font resizing on Macs\r
+ //As the Button2_mask always seems to be true\r
+ if ( (evt.getModifiers() & InputEvent.BUTTON2_MASK) ==\r
+ InputEvent.BUTTON2_MASK && !av.MAC)\r
+ {\r
+ mouseWheelPressed = true;\r
+ return;\r
+ }\r
+\r
+ if (evt.isShiftDown()\r
+ || evt.isControlDown()\r
+ || evt.isAltDown())\r
+ {\r
+ if (evt.isControlDown() || evt.isAltDown())\r
+ {\r
+ groupEditing = true;\r
+ }\r
+ editingSeqs = true;\r
+ }\r
+ else\r
+ {\r
+ doMousePressedDefineMode(evt);\r
+ return;\r
+ }\r
+\r
+ int seq = findSeq(evt);\r
+ int res = findRes(evt);\r
+\r
+ if (seq < 0 || res < 0)\r
+ {\r
+ return;\r
+ }\r
+\r
+ if ( (seq < av.getAlignment().getHeight()) &&\r
+ (res < av.getAlignment().getSequenceAt(seq).getLength()))\r
+ {\r
+ startseq = seq;\r
+ lastres = res;\r
+ }\r
+ else\r
+ {\r
+ startseq = -1;\r
+ lastres = -1;\r
+ }\r