JAL-1807 still testing
[jalviewjs.git] / unused / appletgui / OverviewPanel.java
index 5c5ae84..0c76046 100644 (file)
-/*
- * 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