-/*
- * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
- * Copyright (C) $$Year-Rel$$ The Jalview Authors
- *
- * This file is part of Jalview.
- *
- * Jalview is free software: you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation, either version 3
- * of the License, or (at your option) any later version.
- *
- * Jalview is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE. See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
- * The Jalview Authors are detailed in the 'AUTHORS' file.
- */
-package jalview.appletgui;
-
-import jalview.datamodel.SequenceI;
-
-import java.awt.Color;
-import java.awt.Font;
-import java.awt.Graphics;
-import java.awt.Image;
-import javax.swing.JPanel;
-import java.util.List;
-
-public class IdCanvas extends JPanel
-{
- protected AlignViewport av;
-
- protected boolean showScores = true;
-
- protected int maxIdLength = -1;
-
- protected String maxIdStr = null;
-
- Image image;
-
- Graphics gg;
-
- int imgHeight = 0;
-
- boolean fastPaint = false;
-
- List<SequenceI> searchResults;
-
- public IdCanvas(AlignViewport av)
- {
- setLayout(null);
- this.av = av;
- PaintRefresher.Register(this, av.getSequenceSetId());
- }
-
- public void drawIdString(Graphics gg, boolean hiddenRows, SequenceI s,
- int i, int starty,
- int ypos)
- {
- int charHeight = av.getCharHeight();
-
- if (searchResults != null && searchResults.contains(s))
- {
- gg.setColor(Color.black);
- gg.fillRect(0, ((i - starty) * charHeight) + ypos, getSize().width,
- charHeight);
- gg.setColor(Color.white);
- }
- else if (av.getSelectionGroup() != null
- && av.getSelectionGroup().getSequences(null).contains(s))
- {
- gg.setColor(Color.lightGray);
- gg.fillRect(0, ((i - starty) * charHeight) + ypos, getSize().width,
- charHeight);
- gg.setColor(Color.white);
- }
- else
- {
- gg.setColor(av.getSequenceColour(s));
- gg.fillRect(0, ((i - starty) * charHeight) + ypos, getSize().width,
- charHeight);
- gg.setColor(Color.black);
- }
-
- gg.drawString(s.getDisplayId(av.getShowJVSuffix()), 0,
- ((i - starty) * charHeight) + ypos + charHeight
- - (charHeight / 5));
-
- if (hiddenRows)
- {
- drawMarker(i, starty, ypos);
- }
-
- }
-
- public void fastPaint(int vertical)
- {
- if (gg == null)
- {
- repaint();
- return;
- }
-
- gg.copyArea(0, 0, getSize().width, imgHeight, 0,
- -vertical * av.getCharHeight());
-
- int ss = av.startSeq, es = av.endSeq, transY = 0;
- if (vertical > 0) // scroll down
- {
- ss = es - vertical;
- if (ss < av.startSeq) // ie scrolling too fast, more than a page at a time
- {
- ss = av.startSeq;
- }
- else
- {
- transY = imgHeight - vertical * av.getCharHeight();
- }
- }
- else if (vertical < 0)
- {
- es = ss - vertical;
- if (es > av.endSeq)
- {
- es = av.endSeq;
- }
- }
-
- gg.translate(0, transY);
-
- drawIds(ss, es);
-
- gg.translate(0, -transY);
-
- fastPaint = true;
- repaint();
- }
-
- public void update(Graphics g)
- {
- paint(g);
- }
-
- public void paint(Graphics g)
- {
- if (getSize().height < 0 || getSize().width < 0)
- {
- return;
- }
- if (fastPaint)
- {
- fastPaint = false;
- g.drawImage(image, 0, 0, this);
- return;
- }
-
- imgHeight = getSize().height;
- imgHeight -= imgHeight % av.getCharHeight();
-
- if (imgHeight < 1)
- {
- return;
- }
-
- if (image == null || imgHeight != image.getHeight(this))
- {
- image = createImage(getSize().width, imgHeight);
- gg = image.getGraphics();
- gg.setFont(av.getFont());
- }
-
- // Fill in the background
- gg.setColor(Color.white);
- Font italic = new Font(av.getFont().getName(), Font.ITALIC, av
- .getFont().getSize());
- gg.setFont(italic);
-
- gg.fillRect(0, 0, getSize().width, getSize().height);
- drawIds(av.startSeq, av.endSeq);
- g.drawImage(image, 0, 0, this);
- }
-
- /**
- * local copy of av.getCharHeight set at top of drawIds
- */
- private int avcharHeight;
- void drawIds(int starty, int endy)
- {
- // hardwired italic IDs in applet currently
- Font italic = new Font(av.getFont().getName(), Font.ITALIC, av
- .getFont().getSize());
- // temp variable for speed
- avcharHeight = av.getCharHeight();
-
- gg.setFont(italic);
-
- Color currentColor = Color.white;
- Color currentTextColor = Color.black;
-
- final boolean doHiddenCheck = av.isDisplayReferenceSeq()
- || av.hasHiddenRows(), hiddenRows = av.hasHiddenRows()
- && av.getShowHiddenMarkers();
-
- if (av.getWrapAlignment())
- {
- int maxwidth = av.getAlignment().getWidth();
- int alheight = av.getAlignment().getHeight();
-
- if (av.hasHiddenColumns())
- {
- maxwidth = av.getColumnSelection().findColumnPosition(maxwidth) - 1;
- }
-
- int annotationHeight = 0;
- AnnotationLabels labels = null;
-
- if (av.isShowAnnotation())
- {
- AnnotationPanel ap = new AnnotationPanel(av);
- annotationHeight = ap.adjustPanelHeight();
- labels = new AnnotationLabels(av);
- }
- int hgap = avcharHeight;
- if (av.getScaleAboveWrapped())
- {
- hgap += avcharHeight;
- }
-
- int cHeight = alheight * avcharHeight + hgap + annotationHeight;
-
- int rowSize = av.getEndRes() - av.getStartRes();
- // Draw the rest of the panels
- for (int ypos = hgap, row = av.startRes; (ypos <= getSize().height)
- && (row < maxwidth); ypos += cHeight, row += rowSize)
- {
- for (int i = starty; i < alheight; i++)
- {
-
- SequenceI s = av.getAlignment().getSequenceAt(i);
- gg.setFont(italic);
- if (doHiddenCheck)
- {
- setHiddenFont(s);
- }
- drawIdString(gg, hiddenRows, s, i, 0, ypos);
- }
-
- if (labels != null)
- {
- gg.translate(0, ypos + (alheight * avcharHeight));
- labels.drawComponent(gg, getSize().width);
- gg.translate(0, -ypos - (alheight * avcharHeight));
- }
-
- }
- }
- else
- {
- // Now draw the id strings
- SequenceI seq;
- for (int i = starty; i < endy; i++)
- {
-
- seq = av.getAlignment().getSequenceAt(i);
- if (seq == null)
- {
- continue;
- }
- gg.setFont(italic);
- // boolean isrep=false;
- if (doHiddenCheck)
- {
- // isrep =
- setHiddenFont(seq);
- }
-
- // Selected sequence colours
- if ((searchResults != null) && searchResults.contains(seq))
- {
- currentColor = Color.black;
- currentTextColor = Color.white;
- }
- else if ((av.getSelectionGroup() != null)
- && av.getSelectionGroup().getSequences(null).contains(seq))
- {
- currentColor = Color.lightGray;
- currentTextColor = Color.black;
- }
- else
- {
- currentColor = av.getSequenceColour(seq);
- currentTextColor = Color.black;
- }
-
- gg.setColor(currentColor);
- // TODO: isrep could be used to highlight the representative in a
- // different way
- gg.fillRect(0, (i - starty) * avcharHeight, getSize().width,
- avcharHeight);
- gg.setColor(currentTextColor);
-
- gg.drawString(seq.getDisplayId(av.getShowJVSuffix()), 0,
- (((i - starty) * avcharHeight) + avcharHeight)
- - (avcharHeight / 5));
-
- if (hiddenRows)
- {
- drawMarker(i, starty, 0);
- }
- }
- }
- }
-
- public void setHighlighted(List<SequenceI> list)
- {
- searchResults = list;
- repaint();
- }
-
- void drawMarker(int i, int starty, int yoffset)
- {
- SequenceI[] hseqs = av.getAlignment().getHiddenSequences().hiddenSequences;
- // Use this method here instead of calling hiddenSeq adjust
- // 3 times.
- int hSize = hseqs.length;
-
- int hiddenIndex = i;
- int lastIndex = i - 1;
- int nextIndex = i + 1;
-
- for (int j = 0; j < hSize; j++)
- {
- if (hseqs[j] != null)
- {
- if (j - 1 < hiddenIndex)
- {
- hiddenIndex++;
- }
- if (j - 1 < lastIndex)
- {
- lastIndex++;
- }
- if (j - 1 < nextIndex)
- {
- nextIndex++;
- }
- }
- }
-
- boolean below = (hiddenIndex > lastIndex + 1);
- boolean above = (nextIndex > hiddenIndex + 1);
-
- gg.setColor(Color.blue);
- if (below)
- {
- gg.fillPolygon(new int[]
- { getSize().width - avcharHeight, getSize().width - avcharHeight,
- getSize().width }, new int[]
- { (i - starty) * avcharHeight + yoffset,
- (i - starty) * avcharHeight + yoffset + avcharHeight / 4,
- (i - starty) * avcharHeight + yoffset }, 3);
- }
- if (above)
- {
- gg.fillPolygon(new int[]
- { getSize().width - avcharHeight, getSize().width - avcharHeight,
- getSize().width }, new int[]
- { (i - starty + 1) * avcharHeight + yoffset,
- (i - starty + 1) * avcharHeight + yoffset - avcharHeight / 4,
- (i - starty + 1) * avcharHeight + yoffset }, 3);
-
- }
- }
-
- boolean setHiddenFont(SequenceI seq)
- {
- Font bold = new Font(av.getFont().getName(), Font.BOLD, av.getFont()
- .getSize());
-
- if (av.isHiddenRepSequence(seq))
- {
- gg.setFont(bold);
- return true;
- }
- return false;
- }
-}
+/*\r
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)\r
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors\r
+ * \r
+ * This file is part of Jalview.\r
+ * \r
+ * Jalview is free software: you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License \r
+ * as published by the Free Software Foundation, either version 3\r
+ * of the License, or (at your option) any later version.\r
+ * \r
+ * Jalview is distributed in the hope that it will be useful, but \r
+ * WITHOUT ANY WARRANTY; without even the implied warranty \r
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR \r
+ * PURPOSE. See the GNU General Public License for more details.\r
+ * \r
+ * You should have received a copy of the GNU General Public License\r
+ * along with Jalview. If not, see <http://www.gnu.org/licenses/>.\r
+ * The Jalview Authors are detailed in the 'AUTHORS' file.\r
+ */\r
+package jalview.appletgui;\r
+\r
+import jalview.datamodel.SequenceI;\r
+\r
+import java.awt.Color;\r
+import java.awt.Font;\r
+import java.awt.Graphics;\r
+import java.awt.Image;\r
+import javax.swing.JPanel;\r
+import java.util.List;\r
+\r
+public class IdCanvas extends JPanel\r
+{\r
+ protected AlignViewport av;\r
+\r
+ protected boolean showScores = true;\r
+\r
+ protected int maxIdLength = -1;\r
+\r
+ protected String maxIdStr = null;\r
+\r
+ Image image;\r
+\r
+ Graphics gg;\r
+\r
+ int imgHeight = 0;\r
+\r
+ boolean fastPaint = false;\r
+\r
+ List<SequenceI> searchResults;\r
+\r
+ public IdCanvas(AlignViewport av)\r
+ {\r
+ setLayout(null);\r
+ this.av = av;\r
+ PaintRefresher.Register(this, av.getSequenceSetId());\r
+ }\r
+\r
+ public void drawIdString(Graphics gg, boolean hiddenRows, SequenceI s,\r
+ int i, int starty,\r
+ int ypos)\r
+ {\r
+ int charHeight = av.getCharHeight();\r
+\r
+ if (searchResults != null && searchResults.contains(s))\r
+ {\r
+ gg.setColor(Color.black);\r
+ gg.fillRect(0, ((i - starty) * charHeight) + ypos, getSize().width,\r
+ charHeight);\r
+ gg.setColor(Color.white);\r
+ }\r
+ else if (av.getSelectionGroup() != null\r
+ && av.getSelectionGroup().getSequences(null).contains(s))\r
+ {\r
+ gg.setColor(Color.lightGray);\r
+ gg.fillRect(0, ((i - starty) * charHeight) + ypos, getSize().width,\r
+ charHeight);\r
+ gg.setColor(Color.white);\r
+ }\r
+ else\r
+ {\r
+ gg.setColor(av.getSequenceColour(s));\r
+ gg.fillRect(0, ((i - starty) * charHeight) + ypos, getSize().width,\r
+ charHeight);\r
+ gg.setColor(Color.black);\r
+ }\r
+\r
+ gg.drawString(s.getDisplayId(av.getShowJVSuffix()), 0,\r
+ ((i - starty) * charHeight) + ypos + charHeight\r
+ - (charHeight / 5));\r
+\r
+ if (hiddenRows)\r
+ {\r
+ drawMarker(i, starty, ypos);\r
+ }\r
+\r
+ }\r
+\r
+ public void fastPaint(int vertical)\r
+ {\r
+ if (gg == null)\r
+ {\r
+ repaint();\r
+ return;\r
+ }\r
+\r
+ gg.copyArea(0, 0, getSize().width, imgHeight, 0,\r
+ -vertical * av.getCharHeight());\r
+\r
+ int ss = av.startSeq, es = av.endSeq, transY = 0;\r
+ if (vertical > 0) // scroll down\r
+ {\r
+ ss = es - vertical;\r
+ if (ss < av.startSeq) // ie scrolling too fast, more than a page at a time\r
+ {\r
+ ss = av.startSeq;\r
+ }\r
+ else\r
+ {\r
+ transY = imgHeight - vertical * av.getCharHeight();\r
+ }\r
+ }\r
+ else if (vertical < 0)\r
+ {\r
+ es = ss - vertical;\r
+ if (es > av.endSeq)\r
+ {\r
+ es = av.endSeq;\r
+ }\r
+ }\r
+\r
+ gg.translate(0, transY);\r
+\r
+ drawIds(ss, es);\r
+\r
+ gg.translate(0, -transY);\r
+\r
+ fastPaint = true;\r
+ repaint();\r
+ }\r
+\r
+ public void update(Graphics g)\r
+ {\r
+ paint(g);\r
+ }\r
+\r
+ public void paint(Graphics g)\r
+ {\r
+ if (getSize().height < 0 || getSize().width < 0)\r
+ {\r
+ return;\r
+ }\r
+ if (fastPaint)\r
+ {\r
+ fastPaint = false;\r
+ g.drawImage(image, 0, 0, this);\r
+ return;\r
+ }\r
+\r
+ imgHeight = getSize().height;\r
+ imgHeight -= imgHeight % av.getCharHeight();\r
+\r
+ if (imgHeight < 1)\r
+ {\r
+ return;\r
+ }\r
+\r
+ if (image == null || imgHeight != image.getHeight(this))\r
+ {\r
+ image = createImage(getSize().width, imgHeight);\r
+ gg = image.getGraphics();\r
+ gg.setFont(av.getFont());\r
+ }\r
+\r
+ // Fill in the background\r
+ gg.setColor(Color.white);\r
+ Font italic = new Font(av.getFont().getName(), Font.ITALIC, av\r
+ .getFont().getSize());\r
+ gg.setFont(italic);\r
+\r
+ gg.fillRect(0, 0, getSize().width, getSize().height);\r
+ drawIds(av.startSeq, av.endSeq);\r
+ g.drawImage(image, 0, 0, this);\r
+ }\r
+\r
+ /**\r
+ * local copy of av.getCharHeight set at top of drawIds\r
+ */\r
+ private int avcharHeight;\r
+ void drawIds(int starty, int endy)\r
+ {\r
+ // hardwired italic IDs in applet currently\r
+ Font italic = new Font(av.getFont().getName(), Font.ITALIC, av\r
+ .getFont().getSize());\r
+ // temp variable for speed\r
+ avcharHeight = av.getCharHeight();\r
+\r
+ gg.setFont(italic);\r
+\r
+ Color currentColor = Color.white;\r
+ Color currentTextColor = Color.black;\r
+\r
+ final boolean doHiddenCheck = av.isDisplayReferenceSeq()\r
+ || av.hasHiddenRows(), hiddenRows = av.hasHiddenRows()\r
+ && av.getShowHiddenMarkers();\r
+\r
+ if (av.getWrapAlignment())\r
+ {\r
+ int maxwidth = av.getAlignment().getWidth();\r
+ int alheight = av.getAlignment().getHeight();\r
+\r
+ if (av.hasHiddenColumns())\r
+ {\r
+ maxwidth = av.getColumnSelection().findColumnPosition(maxwidth) - 1;\r
+ }\r
+\r
+ int annotationHeight = 0;\r
+ AnnotationLabels labels = null;\r
+\r
+ if (av.isShowAnnotation())\r
+ {\r
+ AnnotationPanel ap = new AnnotationPanel(av);\r
+ annotationHeight = ap.adjustPanelHeight();\r
+ labels = new AnnotationLabels(av);\r
+ }\r
+ int hgap = avcharHeight;\r
+ if (av.getScaleAboveWrapped())\r
+ {\r
+ hgap += avcharHeight;\r
+ }\r
+\r
+ int cHeight = alheight * avcharHeight + hgap + annotationHeight;\r
+\r
+ int rowSize = av.getEndRes() - av.getStartRes();\r
+ // Draw the rest of the panels\r
+ for (int ypos = hgap, row = av.startRes; (ypos <= getSize().height)\r
+ && (row < maxwidth); ypos += cHeight, row += rowSize)\r
+ {\r
+ for (int i = starty; i < alheight; i++)\r
+ {\r
+\r
+ SequenceI s = av.getAlignment().getSequenceAt(i);\r
+ gg.setFont(italic);\r
+ if (doHiddenCheck)\r
+ {\r
+ setHiddenFont(s);\r
+ }\r
+ drawIdString(gg, hiddenRows, s, i, 0, ypos);\r
+ }\r
+\r
+ if (labels != null)\r
+ {\r
+ gg.translate(0, ypos + (alheight * avcharHeight));\r
+ labels.drawComponent(gg, getSize().width);\r
+ gg.translate(0, -ypos - (alheight * avcharHeight));\r
+ }\r
+\r
+ }\r
+ }\r
+ else\r
+ {\r
+ // Now draw the id strings\r
+ SequenceI seq;\r
+ for (int i = starty; i < endy; i++)\r
+ {\r
+\r
+ seq = av.getAlignment().getSequenceAt(i);\r
+ if (seq == null)\r
+ {\r
+ continue;\r
+ }\r
+ gg.setFont(italic);\r
+ // boolean isrep=false;\r
+ if (doHiddenCheck)\r
+ {\r
+ // isrep =\r
+ setHiddenFont(seq);\r
+ }\r
+\r
+ // Selected sequence colours\r
+ if ((searchResults != null) && searchResults.contains(seq))\r
+ {\r
+ currentColor = Color.black;\r
+ currentTextColor = Color.white;\r
+ }\r
+ else if ((av.getSelectionGroup() != null)\r
+ && av.getSelectionGroup().getSequences(null).contains(seq))\r
+ {\r
+ currentColor = Color.lightGray;\r
+ currentTextColor = Color.black;\r
+ }\r
+ else\r
+ {\r
+ currentColor = av.getSequenceColour(seq);\r
+ currentTextColor = Color.black;\r
+ }\r
+\r
+ gg.setColor(currentColor);\r
+ // TODO: isrep could be used to highlight the representative in a\r
+ // different way\r
+ gg.fillRect(0, (i - starty) * avcharHeight, getSize().width,\r
+ avcharHeight);\r
+ gg.setColor(currentTextColor);\r
+\r
+ gg.drawString(seq.getDisplayId(av.getShowJVSuffix()), 0,\r
+ (((i - starty) * avcharHeight) + avcharHeight)\r
+ - (avcharHeight / 5));\r
+\r
+ if (hiddenRows)\r
+ {\r
+ drawMarker(i, starty, 0);\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ public void setHighlighted(List<SequenceI> list)\r
+ {\r
+ searchResults = list;\r
+ repaint();\r
+ }\r
+\r
+ void drawMarker(int i, int starty, int yoffset)\r
+ {\r
+ SequenceI[] hseqs = av.getAlignment().getHiddenSequences().hiddenSequences;\r
+ // Use this method here instead of calling hiddenSeq adjust\r
+ // 3 times.\r
+ int hSize = hseqs.length;\r
+\r
+ int hiddenIndex = i;\r
+ int lastIndex = i - 1;\r
+ int nextIndex = i + 1;\r
+\r
+ for (int j = 0; j < hSize; j++)\r
+ {\r
+ if (hseqs[j] != null)\r
+ {\r
+ if (j - 1 < hiddenIndex)\r
+ {\r
+ hiddenIndex++;\r
+ }\r
+ if (j - 1 < lastIndex)\r
+ {\r
+ lastIndex++;\r
+ }\r
+ if (j - 1 < nextIndex)\r
+ {\r
+ nextIndex++;\r
+ }\r
+ }\r
+ }\r
+\r
+ boolean below = (hiddenIndex > lastIndex + 1);\r
+ boolean above = (nextIndex > hiddenIndex + 1);\r
+\r
+ gg.setColor(Color.blue);\r
+ if (below)\r
+ {\r
+ gg.fillPolygon(new int[]\r
+ { getSize().width - avcharHeight, getSize().width - avcharHeight,\r
+ getSize().width }, new int[]\r
+ { (i - starty) * avcharHeight + yoffset,\r
+ (i - starty) * avcharHeight + yoffset + avcharHeight / 4,\r
+ (i - starty) * avcharHeight + yoffset }, 3);\r
+ }\r
+ if (above)\r
+ {\r
+ gg.fillPolygon(new int[]\r
+ { getSize().width - avcharHeight, getSize().width - avcharHeight,\r
+ getSize().width }, new int[]\r
+ { (i - starty + 1) * avcharHeight + yoffset,\r
+ (i - starty + 1) * avcharHeight + yoffset - avcharHeight / 4,\r
+ (i - starty + 1) * avcharHeight + yoffset }, 3);\r
+\r
+ }\r
+ }\r
+\r
+ boolean setHiddenFont(SequenceI seq)\r
+ {\r
+ Font bold = new Font(av.getFont().getName(), Font.BOLD, av.getFont()\r
+ .getSize());\r
+\r
+ if (av.isHiddenRepSequence(seq))\r
+ {\r
+ gg.setFont(bold);\r
+ return true;\r
+ }\r
+ return false;\r
+ }\r
+}\r