-/*
- * 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.AlignmentI;
-import jalview.datamodel.SequenceI;
-
-import java.awt.Color;
-import java.awt.Dimension;
-import java.awt.Frame;
-import java.awt.Graphics;
-import java.awt.Image;
-import java.awt.Panel;
-import java.awt.event.ComponentAdapter;
-import java.awt.event.ComponentEvent;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
-import java.awt.event.MouseMotionListener;
-
-public class OverviewPanel extends Panel implements Runnable,
- MouseMotionListener, MouseListener
-{
- Image miniMe;
-
- Image offscreen;
-
- AlignViewport av;
-
- AlignmentPanel ap;
-
- float scalew = 1f;
-
- float scaleh = 1f;
-
- public int width, sequencesHeight;
-
- int graphHeight = 20;
-
- int boxX = -1, boxY = -1, boxWidth = -1, boxHeight = -1;
-
- boolean resizing = false;
-
- // Can set different properties in this seqCanvas than
- // main visible SeqCanvas
- SequenceRenderer sr;
-
- FeatureRenderer fr;
-
- Frame nullFrame;
-
- public OverviewPanel(AlignmentPanel ap)
- {
- this.av = ap.av;
- this.ap = ap;
- setLayout(null);
- nullFrame = new Frame();
- nullFrame.addNotify();
-
- sr = new SequenceRenderer(av);
- sr.graphics = nullFrame.getGraphics();
- sr.renderGaps = false;
- sr.forOverview = true;
- fr = new FeatureRenderer(av);
-
- // scale the initial size of overviewpanel to shape of alignment
- float initialScale = (float) av.getAlignment().getWidth()
- / (float) av.getAlignment().getHeight();
-
- if (av.getSequenceConsensusHash() == null)
- {
- graphHeight = 0;
- }
-
- if (av.getAlignment().getWidth() > av.getAlignment().getHeight())
- {
- // wider
- width = 400;
- sequencesHeight = (int) (400f / initialScale);
- if (sequencesHeight < 40)
- {
- sequencesHeight = 40;
- }
- }
- else
- {
- // taller
- width = (int) (400f * initialScale);
- sequencesHeight = 300;
- if (width < 120)
- {
- width = 120;
- }
- }
-
- setSize(new Dimension(width, sequencesHeight + graphHeight));
- addComponentListener(new ComponentAdapter()
- {
-
- @Override
- public void componentResized(ComponentEvent evt)
- {
- if (getSize().width != width
- || getSize().height != sequencesHeight + graphHeight)
- {
- updateOverviewImage();
- }
- }
- });
-
- addMouseMotionListener(this);
-
- addMouseListener(this);
-
- updateOverviewImage();
-
- }
-
- @Override
- public void mouseEntered(MouseEvent evt)
- {
- }
-
- @Override
- public void mouseExited(MouseEvent evt)
- {
- }
-
- @Override
- public void mouseClicked(MouseEvent evt)
- {
- }
-
- @Override
- public void mouseMoved(MouseEvent evt)
- {
- }
-
- @Override
- public void mousePressed(MouseEvent evt)
- {
- boxX = evt.getX();
- boxY = evt.getY();
- checkValid();
- }
-
- @Override
- public void mouseReleased(MouseEvent evt)
- {
- boxX = evt.getX();
- boxY = evt.getY();
- checkValid();
- }
-
- @Override
- public void mouseDragged(MouseEvent evt)
- {
- boxX = evt.getX();
- boxY = evt.getY();
- checkValid();
- }
-
- void checkValid()
- {
- if (boxY < 0)
- {
- boxY = 0;
- }
-
- if (boxY > (sequencesHeight - boxHeight))
- {
- boxY = sequencesHeight - boxHeight + 1;
- }
-
- if (boxX < 0)
- {
- boxX = 0;
- }
-
- if (boxX > (width - boxWidth))
- {
- if (av.hasHiddenColumns())
- {
- // Try smallest possible box
- boxWidth = (int) ((av.endRes - av.startRes + 1) * av.getCharWidth() * scalew);
- }
- boxX = width - boxWidth;
- }
-
- int col = (int) (boxX / scalew / av.getCharWidth());
- int row = (int) (boxY / scaleh / av.getCharHeight());
-
- if (av.hasHiddenColumns())
- {
- if (!av.getColumnSelection().isVisible(col))
- {
- return;
- }
-
- col = av.getColumnSelection().findColumnPosition(col);
- }
-
- if (av.hasHiddenRows())
- {
- row = av.getAlignment().getHiddenSequences()
- .findIndexWithoutHiddenSeqs(row);
- }
-
- ap.setScrollValues(col, row);
- ap.paintAlignment(false);
- }
-
- /**
- * DOCUMENT ME!
- */
- public void updateOverviewImage()
- {
- if (resizing)
- {
- resizeAgain = true;
- return;
- }
-
- if (av.isShowSequenceFeatures())
- {
- fr.transferSettings(ap.seqPanel.seqCanvas.fr);
- }
-
- resizing = true;
-
- if ((getSize().width > 0) && (getSize().height > 0))
- {
- width = getSize().width;
- sequencesHeight = getSize().height - graphHeight;
- }
- setSize(new Dimension(width, sequencesHeight + graphHeight));
-
- Thread thread = new Thread(this);
- thread.start();
- repaint();
- }
-
- // This is set true if the user resizes whilst
- // the overview is being calculated
- boolean resizeAgain = false;
-
- @Override
- public void run()
- {
- miniMe = null;
- int alwidth = av.getAlignment().getWidth();
- int alheight = av.getAlignment().getHeight();
-
- if (av.isShowSequenceFeatures())
- {
- fr.transferSettings(ap.seqPanel.seqCanvas.getFeatureRenderer());
- }
-
- if (getSize().width > 0 && getSize().height > 0)
- {
- width = getSize().width;
- sequencesHeight = getSize().height - graphHeight;
- }
-
- setSize(new Dimension(width, sequencesHeight + graphHeight));
-
- int fullsizeWidth = alwidth * av.getCharWidth();
- int fullsizeHeight = alheight * av.getCharHeight();
-
- scalew = (float) width / (float) fullsizeWidth;
- scaleh = (float) sequencesHeight / (float) fullsizeHeight;
-
- miniMe = nullFrame.createImage(width, sequencesHeight + graphHeight);
- offscreen = nullFrame.createImage(width, sequencesHeight + graphHeight);
-
- Graphics mg = miniMe.getGraphics();
- float sampleCol = (float) alwidth / (float) width;
- float sampleRow = (float) alheight / (float) sequencesHeight;
-
- int lastcol = 0, lastrow = 0;
- int xstart = 0, ystart = 0;
- Color color = Color.yellow;
- int row, col, sameRow = 0, sameCol = 0;
- SequenceI seq;
- final boolean hasHiddenRows = av.hasHiddenRows(), hasHiddenCols = av
- .hasHiddenColumns();
- boolean hiddenRow = false;
- AlignmentI alignment = av.getAlignment();
- for (row = 0; row <= sequencesHeight; row++)
- {
- if ((int) (row * sampleRow) == lastrow)
- {
- sameRow++;
- continue;
- }
-
- hiddenRow = false;
- if (hasHiddenRows)
- {
- seq = alignment.getHiddenSequences().getHiddenSequence(lastrow);
- if (seq == null)
- {
- int index = alignment.getHiddenSequences()
- .findIndexWithoutHiddenSeqs(lastrow);
-
- seq = alignment.getSequenceAt(index);
- }
- else
- {
- hiddenRow = true;
- }
- }
- else
- {
- seq = alignment.getSequenceAt(lastrow);
- }
-
- for (col = 0; col < width; col++)
- {
- if ((int) (col * sampleCol) == lastcol
- && (int) (row * sampleRow) == lastrow)
- {
- sameCol++;
- continue;
- }
-
- lastcol = (int) (col * sampleCol);
-
- if (seq.getLength() > lastcol)
- {
- color = sr.getResidueBoxColour(seq, lastcol);
-
- if (av.isShowSequenceFeatures())
- {
- color = fr.findFeatureColour(color, seq, lastcol);
- }
- }
- else
- {
- color = Color.white; // White
- }
-
- if (hiddenRow
- || (hasHiddenCols && !av.getColumnSelection()
- .isVisible(lastcol)))
- {
- color = color.darker().darker();
- }
-
- mg.setColor(color);
- if (sameCol == 1 && sameRow == 1)
- {
- mg.drawLine(xstart, ystart, xstart, ystart);
- }
- else
- {
- mg.fillRect(xstart, ystart, sameCol, sameRow);
- }
-
- xstart = col;
- sameCol = 1;
- }
- lastrow = (int) (row * sampleRow);
- ystart = row;
- sameRow = 1;
- }
-
- if (av.getAlignmentConservationAnnotation() != null)
- {
- for (col = 0; col < width; col++)
- {
- lastcol = (int) (col * sampleCol);
- {
- mg.translate(col, sequencesHeight);
- ap.annotationPanel.renderer.drawGraph(mg,
- av.getAlignmentConservationAnnotation(),
- av.getAlignmentConservationAnnotation().annotations,
- (int) (sampleCol) + 1, graphHeight,
- (int) (col * sampleCol), (int) (col * sampleCol) + 1);
- mg.translate(-col, -sequencesHeight);
- }
- }
- }
- System.gc();
-
- resizing = false;
-
- setBoxPosition();
-
- if (resizeAgain)
- {
- resizeAgain = false;
- updateOverviewImage();
- }
- }
-
- public void setBoxPosition()
- {
- int fullsizeWidth = av.getAlignment().getWidth() * av.getCharWidth();
- int fullsizeHeight = (av.getAlignment().getHeight() + av.getAlignment()
- .getHiddenSequences().getSize())
- * av.getCharHeight();
-
- int startRes = av.getStartRes();
- int endRes = av.getEndRes();
-
- if (av.hasHiddenColumns())
- {
- startRes = av.getColumnSelection().adjustForHiddenColumns(startRes);
- endRes = av.getColumnSelection().adjustForHiddenColumns(endRes);
- }
-
- int startSeq = av.startSeq;
- int endSeq = av.endSeq;
-
- if (av.hasHiddenRows())
- {
- startSeq = av.getAlignment().getHiddenSequences()
- .adjustForHiddenSeqs(startSeq);
-
- endSeq = av.getAlignment().getHiddenSequences()
- .adjustForHiddenSeqs(endSeq);
-
- }
-
- scalew = (float) width / (float) fullsizeWidth;
- scaleh = (float) sequencesHeight / (float) fullsizeHeight;
-
- boxX = (int) (startRes * av.getCharWidth() * scalew);
- boxY = (int) (startSeq * av.getCharHeight() * scaleh);
-
- if (av.hasHiddenColumns())
- {
- boxWidth = (int) ((endRes - startRes + 1) * av.getCharWidth() * scalew);
- }
- else
- {
- boxWidth = (int) ((endRes - startRes + 1) * av.getCharWidth() * scalew);
- }
-
- boxHeight = (int) ((endSeq - startSeq) * av.getCharHeight() * scaleh);
-
- repaint();
- }
-
- @Override
- public void update(Graphics g)
- {
- paint(g);
- }
-
- @Override
- public void paint(Graphics g)
- {
- Graphics og = offscreen.getGraphics();
- if (miniMe != null)
- {
- og.drawImage(miniMe, 0, 0, this);
- og.setColor(Color.red);
- og.drawRect(boxX, boxY, boxWidth, boxHeight);
- og.drawRect(boxX + 1, boxY + 1, boxWidth - 2, boxHeight - 2);
- g.drawImage(offscreen, 0, 0, this);
- }
- }
-
-}
+/*\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.AlignmentI;\r
+import jalview.datamodel.SequenceI;\r
+\r
+import java.awt.Color;\r
+import java.awt.Dimension;\r
+import java.awt.Frame;\r
+import java.awt.Graphics;\r
+import java.awt.Image;\r
+import java.awt.Panel;\r
+import java.awt.event.ComponentAdapter;\r
+import java.awt.event.ComponentEvent;\r
+import java.awt.event.MouseEvent;\r
+import java.awt.event.MouseListener;\r
+import java.awt.event.MouseMotionListener;\r
+\r
+public class OverviewPanel extends Panel implements Runnable,\r
+ MouseMotionListener, MouseListener\r
+{\r
+ Image miniMe;\r
+\r
+ Image offscreen;\r
+\r
+ AlignViewport av;\r
+\r
+ AlignmentPanel ap;\r
+\r
+ float scalew = 1f;\r
+\r
+ float scaleh = 1f;\r
+\r
+ public int width, sequencesHeight;\r
+\r
+ int graphHeight = 20;\r
+\r
+ int boxX = -1, boxY = -1, boxWidth = -1, boxHeight = -1;\r
+\r
+ boolean resizing = false;\r
+\r
+ // Can set different properties in this seqCanvas than\r
+ // main visible SeqCanvas\r
+ SequenceRenderer sr;\r
+\r
+ FeatureRenderer fr;\r
+\r
+ Frame nullFrame;\r
+\r
+ public OverviewPanel(AlignmentPanel ap)\r
+ {\r
+ this.av = ap.av;\r
+ this.ap = ap;\r
+ setLayout(null);\r
+ nullFrame = new Frame();\r
+ nullFrame.addNotify();\r
+\r
+ sr = new SequenceRenderer(av);\r
+ sr.graphics = nullFrame.getGraphics();\r
+ sr.renderGaps = false;\r
+ sr.forOverview = true;\r
+ fr = new FeatureRenderer(av);\r
+\r
+ // scale the initial size of overviewpanel to shape of alignment\r
+ float initialScale = (float) av.getAlignment().getWidth()\r
+ / (float) av.getAlignment().getHeight();\r
+\r
+ if (av.getSequenceConsensusHash() == null)\r
+ {\r
+ graphHeight = 0;\r
+ }\r
+\r
+ if (av.getAlignment().getWidth() > av.getAlignment().getHeight())\r
+ {\r
+ // wider\r
+ width = 400;\r
+ sequencesHeight = (int) (400f / initialScale);\r
+ if (sequencesHeight < 40)\r
+ {\r
+ sequencesHeight = 40;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ // taller\r
+ width = (int) (400f * initialScale);\r
+ sequencesHeight = 300;\r
+ if (width < 120)\r
+ {\r
+ width = 120;\r
+ }\r
+ }\r
+\r
+ setSize(new Dimension(width, sequencesHeight + graphHeight));\r
+ addComponentListener(new ComponentAdapter()\r
+ {\r
+\r
+ @Override\r
+ public void componentResized(ComponentEvent evt)\r
+ {\r
+ if (getSize().width != width\r
+ || getSize().height != sequencesHeight + graphHeight)\r
+ {\r
+ updateOverviewImage();\r
+ }\r
+ }\r
+ });\r
+\r
+ addMouseMotionListener(this);\r
+\r
+ addMouseListener(this);\r
+\r
+ updateOverviewImage();\r
+\r
+ }\r
+\r
+ @Override\r
+ public void mouseEntered(MouseEvent evt)\r
+ {\r
+ }\r
+\r
+ @Override\r
+ public void mouseExited(MouseEvent evt)\r
+ {\r
+ }\r
+\r
+ @Override\r
+ public void mouseClicked(MouseEvent evt)\r
+ {\r
+ }\r
+\r
+ @Override\r
+ public void mouseMoved(MouseEvent evt)\r
+ {\r
+ }\r
+\r
+ @Override\r
+ public void mousePressed(MouseEvent evt)\r
+ {\r
+ boxX = evt.getX();\r
+ boxY = evt.getY();\r
+ checkValid();\r
+ }\r
+\r
+ @Override\r
+ public void mouseReleased(MouseEvent evt)\r
+ {\r
+ boxX = evt.getX();\r
+ boxY = evt.getY();\r
+ checkValid();\r
+ }\r
+\r
+ @Override\r
+ public void mouseDragged(MouseEvent evt)\r
+ {\r
+ boxX = evt.getX();\r
+ boxY = evt.getY();\r
+ checkValid();\r
+ }\r
+\r
+ void checkValid()\r
+ {\r
+ if (boxY < 0)\r
+ {\r
+ boxY = 0;\r
+ }\r
+\r
+ if (boxY > (sequencesHeight - boxHeight))\r
+ {\r
+ boxY = sequencesHeight - boxHeight + 1;\r
+ }\r
+\r
+ if (boxX < 0)\r
+ {\r
+ boxX = 0;\r
+ }\r
+\r
+ if (boxX > (width - boxWidth))\r
+ {\r
+ if (av.hasHiddenColumns())\r
+ {\r
+ // Try smallest possible box\r
+ boxWidth = (int) ((av.endRes - av.startRes + 1) * av.getCharWidth() * scalew);\r
+ }\r
+ boxX = width - boxWidth;\r
+ }\r
+\r
+ int col = (int) (boxX / scalew / av.getCharWidth());\r
+ int row = (int) (boxY / scaleh / av.getCharHeight());\r
+\r
+ if (av.hasHiddenColumns())\r
+ {\r
+ if (!av.getColumnSelection().isVisible(col))\r
+ {\r
+ return;\r
+ }\r
+\r
+ col = av.getColumnSelection().findColumnPosition(col);\r
+ }\r
+\r
+ if (av.hasHiddenRows())\r
+ {\r
+ row = av.getAlignment().getHiddenSequences()\r
+ .findIndexWithoutHiddenSeqs(row);\r
+ }\r
+\r
+ ap.setScrollValues(col, row);\r
+ ap.paintAlignment(false);\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ */\r
+ public void updateOverviewImage()\r
+ {\r
+ if (resizing)\r
+ {\r
+ resizeAgain = true;\r
+ return;\r
+ }\r
+\r
+ if (av.isShowSequenceFeatures())\r
+ {\r
+ fr.transferSettings(ap.seqPanel.seqCanvas.fr);\r
+ }\r
+\r
+ resizing = true;\r
+\r
+ if ((getSize().width > 0) && (getSize().height > 0))\r
+ {\r
+ width = getSize().width;\r
+ sequencesHeight = getSize().height - graphHeight;\r
+ }\r
+ setSize(new Dimension(width, sequencesHeight + graphHeight));\r
+\r
+ Thread thread = new Thread(this);\r
+ thread.start();\r
+ repaint();\r
+ }\r
+\r
+ // This is set true if the user resizes whilst\r
+ // the overview is being calculated\r
+ boolean resizeAgain = false;\r
+\r
+ @Override\r
+ public void run()\r
+ {\r
+ miniMe = null;\r
+ int alwidth = av.getAlignment().getWidth();\r
+ int alheight = av.getAlignment().getHeight();\r
+\r
+ if (av.isShowSequenceFeatures())\r
+ {\r
+ fr.transferSettings(ap.seqPanel.seqCanvas.getFeatureRenderer());\r
+ }\r
+\r
+ if (getSize().width > 0 && getSize().height > 0)\r
+ {\r
+ width = getSize().width;\r
+ sequencesHeight = getSize().height - graphHeight;\r
+ }\r
+\r
+ setSize(new Dimension(width, sequencesHeight + graphHeight));\r
+\r
+ int fullsizeWidth = alwidth * av.getCharWidth();\r
+ int fullsizeHeight = alheight * av.getCharHeight();\r
+\r
+ scalew = (float) width / (float) fullsizeWidth;\r
+ scaleh = (float) sequencesHeight / (float) fullsizeHeight;\r
+\r
+ miniMe = nullFrame.createImage(width, sequencesHeight + graphHeight);\r
+ offscreen = nullFrame.createImage(width, sequencesHeight + graphHeight);\r
+\r
+ Graphics mg = miniMe.getGraphics();\r
+ float sampleCol = (float) alwidth / (float) width;\r
+ float sampleRow = (float) alheight / (float) sequencesHeight;\r
+\r
+ int lastcol = 0, lastrow = 0;\r
+ int xstart = 0, ystart = 0;\r
+ Color color = Color.yellow;\r
+ int row, col, sameRow = 0, sameCol = 0;\r
+ SequenceI seq;\r
+ final boolean hasHiddenRows = av.hasHiddenRows(), hasHiddenCols = av\r
+ .hasHiddenColumns();\r
+ boolean hiddenRow = false;\r
+ AlignmentI alignment = av.getAlignment();\r
+ for (row = 0; row <= sequencesHeight; row++)\r
+ {\r
+ if ((int) (row * sampleRow) == lastrow)\r
+ {\r
+ sameRow++;\r
+ continue;\r
+ }\r
+\r
+ hiddenRow = false;\r
+ if (hasHiddenRows)\r
+ {\r
+ seq = alignment.getHiddenSequences().getHiddenSequence(lastrow);\r
+ if (seq == null)\r
+ {\r
+ int index = alignment.getHiddenSequences()\r
+ .findIndexWithoutHiddenSeqs(lastrow);\r
+\r
+ seq = alignment.getSequenceAt(index);\r
+ }\r
+ else\r
+ {\r
+ hiddenRow = true;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ seq = alignment.getSequenceAt(lastrow);\r
+ }\r
+\r
+ for (col = 0; col < width; col++)\r
+ {\r
+ if ((int) (col * sampleCol) == lastcol\r
+ && (int) (row * sampleRow) == lastrow)\r
+ {\r
+ sameCol++;\r
+ continue;\r
+ }\r
+\r
+ lastcol = (int) (col * sampleCol);\r
+\r
+ if (seq.getLength() > lastcol)\r
+ {\r
+ color = sr.getResidueBoxColour(seq, lastcol);\r
+\r
+ if (av.isShowSequenceFeatures())\r
+ {\r
+ color = fr.findFeatureColour(color, seq, lastcol);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ color = Color.white; // White\r
+ }\r
+\r
+ if (hiddenRow\r
+ || (hasHiddenCols && !av.getColumnSelection()\r
+ .isVisible(lastcol)))\r
+ {\r
+ color = color.darker().darker();\r
+ }\r
+\r
+ mg.setColor(color);\r
+ if (sameCol == 1 && sameRow == 1)\r
+ {\r
+ mg.drawLine(xstart, ystart, xstart, ystart);\r
+ }\r
+ else\r
+ {\r
+ mg.fillRect(xstart, ystart, sameCol, sameRow);\r
+ }\r
+\r
+ xstart = col;\r
+ sameCol = 1;\r
+ }\r
+ lastrow = (int) (row * sampleRow);\r
+ ystart = row;\r
+ sameRow = 1;\r
+ }\r
+\r
+ if (av.getAlignmentConservationAnnotation() != null)\r
+ {\r
+ for (col = 0; col < width; col++)\r
+ {\r
+ lastcol = (int) (col * sampleCol);\r
+ {\r
+ mg.translate(col, sequencesHeight);\r
+ ap.annotationPanel.renderer.drawGraph(mg,\r
+ av.getAlignmentConservationAnnotation(),\r
+ av.getAlignmentConservationAnnotation().annotations,\r
+ (int) (sampleCol) + 1, graphHeight,\r
+ (int) (col * sampleCol), (int) (col * sampleCol) + 1);\r
+ mg.translate(-col, -sequencesHeight);\r
+ }\r
+ }\r
+ }\r
+ System.gc();\r
+\r
+ resizing = false;\r
+\r
+ setBoxPosition();\r
+\r
+ if (resizeAgain)\r
+ {\r
+ resizeAgain = false;\r
+ updateOverviewImage();\r
+ }\r
+ }\r
+\r
+ public void setBoxPosition()\r
+ {\r
+ int fullsizeWidth = av.getAlignment().getWidth() * av.getCharWidth();\r
+ int fullsizeHeight = (av.getAlignment().getHeight() + av.getAlignment()\r
+ .getHiddenSequences().getSize())\r
+ * av.getCharHeight();\r
+\r
+ int startRes = av.getStartRes();\r
+ int endRes = av.getEndRes();\r
+\r
+ if (av.hasHiddenColumns())\r
+ {\r
+ startRes = av.getColumnSelection().adjustForHiddenColumns(startRes);\r
+ endRes = av.getColumnSelection().adjustForHiddenColumns(endRes);\r
+ }\r
+\r
+ int startSeq = av.startSeq;\r
+ int endSeq = av.endSeq;\r
+\r
+ if (av.hasHiddenRows())\r
+ {\r
+ startSeq = av.getAlignment().getHiddenSequences()\r
+ .adjustForHiddenSeqs(startSeq);\r
+\r
+ endSeq = av.getAlignment().getHiddenSequences()\r
+ .adjustForHiddenSeqs(endSeq);\r
+\r
+ }\r
+\r
+ scalew = (float) width / (float) fullsizeWidth;\r
+ scaleh = (float) sequencesHeight / (float) fullsizeHeight;\r
+\r
+ boxX = (int) (startRes * av.getCharWidth() * scalew);\r
+ boxY = (int) (startSeq * av.getCharHeight() * scaleh);\r
+\r
+ if (av.hasHiddenColumns())\r
+ {\r
+ boxWidth = (int) ((endRes - startRes + 1) * av.getCharWidth() * scalew);\r
+ }\r
+ else\r
+ {\r
+ boxWidth = (int) ((endRes - startRes + 1) * av.getCharWidth() * scalew);\r
+ }\r
+\r
+ boxHeight = (int) ((endSeq - startSeq) * av.getCharHeight() * scaleh);\r
+\r
+ repaint();\r
+ }\r
+\r
+ @Override\r
+ public void update(Graphics g)\r
+ {\r
+ paint(g);\r
+ }\r
+\r
+ @Override\r
+ public void paint(Graphics g)\r
+ {\r
+ Graphics og = offscreen.getGraphics();\r
+ if (miniMe != null)\r
+ {\r
+ og.drawImage(miniMe, 0, 0, this);\r
+ og.setColor(Color.red);\r
+ og.drawRect(boxX, boxY, boxWidth, boxHeight);\r
+ og.drawRect(boxX + 1, boxY + 1, boxWidth - 2, boxHeight - 2);\r
+ g.drawImage(offscreen, 0, 0, this);\r
+ }\r
+ }\r
+\r
+}\r