+ }\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
+ if (obj != "")\r
+ {\r
+ text.append(obj + " (" + sequence.findPosition(res) + ")");\r
+ }\r
+ }\r
+\r
+ ap.alignFrame.statusBar.setText(text.toString());\r
+\r
+ StringBuffer tooltipText = new StringBuffer();\r
+ SequenceGroup[] groups = av.alignment.findAllGroups(sequence);\r
+ if (groups != null)\r
+ {\r
+ for (int g = 0; g < groups.length; g++)\r
+ {\r
+ if (groups[g].getStartRes() <= res && groups[g].getEndRes() >= res)\r
+ {\r
+ if (!groups[g].getName().startsWith("JTreeGroup") &&\r
+ !groups[g].getName().startsWith("JGroup"))\r
+ {\r
+ tooltipText.append(groups[g].getName() + " ");\r
+ }\r
+ if (groups[g].getDescription() != null)\r
+ {\r
+ tooltipText.append(groups[g].getDescription());\r
+ }\r
+ tooltipText.append("\n");\r
+ }\r
+ }\r
+ }\r
+\r
+ // use aa to see if the mouse pointer is on a\r
+ SequenceFeature [] allFeatures = findFeaturesAtRes(sequence,\r
+ sequence.findPosition(res));\r
+\r
+ int index = 0;\r
+ while (index < allFeatures.length)\r
+ {\r
+ SequenceFeature sf = allFeatures[index];\r
+\r
+ tooltipText.append(sf.getType() + " " + sf.begin + ":" + sf.end);\r
+\r
+ if (sf.getDescription() != null)\r
+ {\r
+ tooltipText.append(" " + sf.getDescription());\r
+ }\r
+\r
+ if (sf.getValue("status") != null)\r
+ {\r
+ String status = sf.getValue("status").toString();\r
+ if (status.length() > 0)\r
+ {\r
+ tooltipText.append(" (" + sf.getValue("status") + ")");\r
+ }\r
+ }\r
+ tooltipText.append("\n");\r
+\r
+ index++;\r
+ }\r
+\r
+ if (tooltip == null)\r
+ {\r
+ tooltip = new Tooltip(tooltipText.toString(), seqCanvas);\r
+ }\r
+ else\r
+ {\r
+ tooltip.setTip(tooltipText.toString());\r
+ }\r
+ }\r
+\r
+ SequenceFeature[] findFeaturesAtRes(SequenceI sequence, int res)\r
+ {\r
+ Vector tmp = new Vector();\r
+ SequenceFeature[] features = sequence.getSequenceFeatures();\r
+ if (features != null)\r
+ {\r
+ for (int i = 0; i < features.length; i++)\r
+ {\r
+ if (av.featuresDisplayed == null\r
+ || !av.featuresDisplayed.containsKey(features[i].getType()))\r
+ {\r
+ continue;\r
+ }\r
+\r
+ if ( (features[i].getBegin() <= res) &&\r
+ (features[i].getEnd() >= res))\r
+ {\r
+ tmp.addElement(features[i]);\r
+ }\r
+ }\r
+ }\r
+\r
+ features = new SequenceFeature[tmp.size()];\r
+ tmp.copyInto(features);\r
+\r
+ return features;\r
+ }\r
+\r
+\r
+ Tooltip tooltip;\r
+\r
+ public void mouseDragged(MouseEvent evt)\r
+ {\r
+ if (mouseWheelPressed)\r
+ {\r
+ int oldWidth = av.charWidth;\r
+\r
+ //Which is bigger, left-right or up-down?\r
+ if (Math.abs(evt.getY() - lastMousePress.y)\r
+ > Math.abs(evt.getX() - lastMousePress.x))\r
+ {\r
+ int fontSize = av.font.getSize();\r
+\r
+ if (evt.getY() < lastMousePress.y && av.charHeight > 1)\r
+ {\r
+ fontSize--;\r
+ }\r
+ else if (evt.getY() > lastMousePress.y)\r
+ {\r
+ fontSize++;\r
+ }\r
+\r
+ if (fontSize < 1)\r
+ {\r
+ fontSize = 1;\r
+ }\r
+\r
+ av.setFont(new Font(av.font.getName(), av.font.getStyle(), fontSize));\r
+ av.charWidth = oldWidth;\r
+ }\r
+ else\r
+ {\r
+ if (evt.getX() < lastMousePress.x && av.charWidth > 1)\r
+ {\r
+ av.charWidth--;\r
+ }\r
+ else if (evt.getX() > lastMousePress.x)\r
+ {\r
+ av.charWidth++;\r
+ }\r
+\r
+ if (av.charWidth < 1)\r
+ {\r
+ av.charWidth = 1;\r
+ }\r
+ }\r
+\r
+ ap.fontChanged();\r
+\r
+ FontMetrics fm = getFontMetrics(av.getFont());\r
+ av.validCharWidth = fm.charWidth('M') <= av.charWidth;\r
+\r
+ lastMousePress = evt.getPoint();\r
+\r
+ ap.paintAlignment(false);\r
+ ap.annotationPanel.image = null;\r
+ return;\r
+ }\r
+\r
+ if (!editingSeqs)\r
+ {\r
+ doMouseDraggedDefineMode(evt);\r
+ return;\r
+ }\r
+\r
+ int res = findRes(evt);\r
+\r
+ if (res < 0)\r
+ {\r
+ res = 0;\r
+ }\r
+\r
+ if ( (lastres == -1) || (lastres == res))\r
+ {\r
+ return;\r
+ }\r
+\r
+ if ( (res < av.getAlignment().getWidth()) && (res < lastres))\r
+ {\r
+ // dragLeft, delete gap\r
+ editSequence(false, res);\r
+ }\r
+ else\r
+ {\r
+ editSequence(true, res);\r
+ }\r
+\r
+ mouseDragging = true;\r
+ if (scrollThread != null)\r
+ {\r
+ scrollThread.setEvent(evt);\r
+ }\r
+\r
+ }\r
+\r
+ synchronized void editSequence(boolean insertGap, int startres)\r
+ {\r
+ int fixedLeft = -1;\r
+ int fixedRight = -1;\r
+ boolean fixedColumns = false;\r
+ SequenceGroup sg = av.getSelectionGroup();\r
+\r
+ SequenceI seq = av.alignment.getSequenceAt(startseq);\r
+\r
+ if (!groupEditing && av.hasHiddenRows)\r
+ {\r
+ if (av.hiddenRepSequences != null\r
+ && av.hiddenRepSequences.containsKey(seq))\r
+ {\r
+ sg = (SequenceGroup) av.hiddenRepSequences.get(seq);\r
+ groupEditing = true;\r
+ }\r
+ }\r
+\r
+ StringBuffer message = new StringBuffer();\r
+ if (groupEditing)\r
+ {\r
+ message.append("Edit group:");\r
+ if (editCommand == null)\r
+ {\r
+ editCommand = new EditCommand("Edit Group");\r
+ }\r
+ }\r
+ else\r
+ {\r
+ message.append("Edit sequence: " + seq.getName());\r
+ String label = seq.getName();\r
+ if (label.length() > 10)\r
+ {\r
+ label = label.substring(0, 10);\r
+ }\r
+ if (editCommand == null)\r
+ {\r
+ editCommand = new EditCommand("Edit " + label);\r
+ }\r