+ /// Highlight search Results once all sequences have been drawn\r
+ //////////////////////////////////////////////////////////\r
+ if (searchResults != null)\r
+ {\r
+ int[] visibleResults = searchResults.getResults(nextSeq, startRes, endRes);\r
+ if (visibleResults != null)\r
+ for (int r = 0; r < visibleResults.length; r += 2)\r
+ {\r
+ sr.drawHighlightedText(nextSeq, visibleResults[r],\r
+ visibleResults[r + 1],\r
+ (visibleResults[r] - startRes) * av.charWidth,\r
+ offset + ( (i - startSeq) * av.charHeight));\r
+ }\r
+ }\r
+\r
+ if(av.cursorMode && cursorY==i\r
+ && cursorX>=startRes && cursorX<=endRes)\r
+ {\r
+ sr.drawCursor(nextSeq, cursorX, (cursorX - startRes) * av.charWidth,\r
+ offset + ( (i - startSeq) * av.charHeight));\r
+ }\r
+ }\r
+\r
+ if(av.getSelectionGroup()!=null || av.alignment.getGroups().size()>0)\r
+ drawGroupsBoundaries(g, startRes, endRes, startSeq, endSeq, offset);\r
+\r
+ }\r
+\r
+ void drawGroupsBoundaries(Graphics g1,\r
+ int startRes, int endRes,\r
+ int startSeq, int endSeq,\r
+ int offset)\r
+ {\r
+ Graphics2D g = (Graphics2D)g1;\r
+ //\r
+ /////////////////////////////////////\r
+ // Now outline any areas if necessary\r
+ /////////////////////////////////////\r
+ SequenceGroup group = av.getSelectionGroup();\r
+\r
+ int sx = -1;\r
+ int sy = -1;\r
+ int ex = -1;\r
+ int groupIndex = -1;\r
+ int visWidth = (endRes - startRes +1) * av.charWidth;\r
+\r
+ if ((group == null) && (av.alignment.getGroups().size() > 0))\r
+ {\r
+ group = (SequenceGroup) av.alignment.getGroups().elementAt(0);\r
+ groupIndex = 0;\r
+ }\r
+\r
+\r
+ if (group != null)\r
+ {\r
+ do\r
+ {\r
+ int oldY = -1;\r
+ int i = 0;\r
+ boolean inGroup = false;\r
+ int top = -1;\r
+ int bottom = -1;\r
+\r
+ for (i = startSeq; i < endSeq; i++)\r
+ {\r
+ sx = (group.getStartRes() - startRes) * av.charWidth;\r
+ sy = offset + ((i - startSeq) * av.charHeight);\r
+ ex = (((group.getEndRes() + 1) - group.getStartRes()) * av.charWidth) -\r
+ 1;\r
+\r
+ if(sx+ex<0 || sx>visWidth)\r
+ {\r
+ continue;\r
+ }\r
+\r
+ if ( (sx <= (endRes-startRes)*av.charWidth) &&\r
+ group.getSequences(false).\r
+ contains(av.alignment.getSequenceAt(i)))\r
+ {\r
+ if ((bottom == -1) &&\r
+ !group.getSequences(false).contains(\r
+ av.alignment.getSequenceAt(i + 1)))\r
+ {\r
+ bottom = sy + av.charHeight;\r
+ }\r
+\r
+ if (!inGroup)\r
+ {\r
+ if (((top == -1) && (i == 0)) ||\r
+ !group.getSequences(false).contains(\r
+ av.alignment.getSequenceAt(i - 1)))\r
+ {\r
+ top = sy;\r
+ }\r
+\r
+ oldY = sy;\r
+ inGroup = true;\r
+\r
+ if (group == av.getSelectionGroup())\r
+ {\r
+ g.setStroke(new BasicStroke(1,\r
+ BasicStroke.CAP_BUTT,\r
+ BasicStroke.JOIN_ROUND, 3f,\r
+ new float[] { 5f, 3f }, 0f));\r
+ g.setColor(Color.RED);\r
+ }\r
+ else\r
+ {\r
+ g.setStroke(new BasicStroke());\r
+ g.setColor(group.getOutlineColour());\r
+ }\r
+ }\r
+ }\r
+ else\r
+ {\r
+ if (inGroup)\r
+ {\r
+ if (sx >= 0 && sx < visWidth)\r
+ g.drawLine(sx, oldY, sx, sy);\r
+\r
+ if (sx + ex < visWidth)\r
+ g.drawLine(sx + ex, oldY, sx + ex, sy);\r
+\r
+ if (sx < 0)\r
+ {\r
+ ex += sx;\r
+ sx = 0;\r
+ }\r
+\r
+ if (sx + ex > visWidth)\r
+ ex = visWidth;\r
+\r
+ else if (sx + ex >= (endRes - startRes + 1) * av.charWidth)\r
+ ex = (endRes - startRes + 1) * av.charWidth;\r
+\r
+ if (top != -1)\r
+ {\r
+ g.drawLine(sx, top, sx + ex, top);\r
+ top = -1;\r
+ }\r
+\r
+ if (bottom != -1)\r
+ {\r
+ g.drawLine(sx, bottom, sx + ex, bottom);\r
+ bottom = -1;\r
+ }\r
+\r
+ inGroup = false;\r
+ }\r
+ }\r
+ }\r
+\r
+ if (inGroup)\r
+ {\r
+ sy = offset + ( (i - startSeq) * av.charHeight);\r
+ if (sx >= 0 && sx < visWidth)\r
+ g.drawLine(sx, oldY, sx, sy);\r
+\r
+ if (sx + ex < visWidth)\r
+ g.drawLine(sx + ex, oldY, sx + ex, sy);\r
+\r
+ if (sx < 0)\r
+ {\r
+ ex += sx;\r
+ sx = 0;\r
+ }\r
+\r
+ if (sx + ex > visWidth)\r
+ ex = visWidth;\r
+ else if (sx + ex >= (endRes - startRes + 1) * av.charWidth)\r
+ ex = (endRes - startRes + 1) * av.charWidth;\r
+\r
+ if (top != -1)\r
+ {\r
+ g.drawLine(sx, top, sx + ex, top);\r
+ top = -1;\r
+ }\r
+\r
+ if (bottom != -1)\r
+ {\r
+ g.drawLine(sx, bottom - 1, sx + ex, bottom - 1);\r
+ bottom = -1;\r
+ }\r
+\r
+ inGroup = false;\r
+ }\r
+\r
+ groupIndex++;\r
+\r
+ g.setStroke(new BasicStroke());\r
+\r
+ if (groupIndex >= av.alignment.getGroups().size())\r
+ {\r
+ break;\r
+ }\r
+\r
+ group = (SequenceGroup) av.alignment.getGroups().elementAt(groupIndex);\r
+\r
+\r
+ }\r
+ while (groupIndex < av.alignment.getGroups().size());\r
+\r
+ }\r
+\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param results DOCUMENT ME!\r
+ */\r
+ public void highlightSearchResults(SearchResults results)\r
+ {\r
+ img = null;\r
+\r
+ searchResults = results;\r
+\r
+ repaint();\r
+ }\r