JAL-4273 actually pass startSeq etc on to rendering code when rendering for image...
[jalview.git] / src / jalview / gui / IdCanvas.java
index a925227..76020c7 100755 (executable)
@@ -22,6 +22,7 @@ package jalview.gui;
 
 import java.awt.BorderLayout;
 import java.awt.Color;
+import java.awt.Dimension;
 import java.awt.Font;
 import java.awt.FontMetrics;
 import java.awt.Graphics;
@@ -55,7 +56,7 @@ public class IdCanvas extends JPanel implements ViewportListenerI
 
   BufferedImage image;
 
-  Graphics2D gg;
+  // Graphics2D gg;
 
   int imgHeight = 0;
 
@@ -79,7 +80,7 @@ public class IdCanvas extends JPanel implements ViewportListenerI
     this.av = av;
     PaintRefresher.Register(this, av.getSequenceSetId());
     av.getRanges().addPropertyChangeListener(this);
-    }
+  }
 
   /**
    * DOCUMENT ME!
@@ -152,10 +153,11 @@ public class IdCanvas extends JPanel implements ViewportListenerI
    */
   public void fastPaint(int vertical)
   {
+
     /*
      * for now, not attempting fast paint of wrapped ids...
      */
-    if (gg == null || av.getWrapAlignment())
+    if (image == null || av.getWrapAlignment())
     {
       repaint();
 
@@ -164,6 +166,7 @@ public class IdCanvas extends JPanel implements ViewportListenerI
 
     ViewportRanges ranges = av.getRanges();
 
+    Graphics2D gg = image.createGraphics();
     gg.copyArea(0, 0, getWidth(), imgHeight, 0,
             -vertical * av.getCharHeight());
 
@@ -196,10 +199,12 @@ public class IdCanvas extends JPanel implements ViewportListenerI
 
     gg.translate(0, transY);
 
-    drawIds(gg, av, ss, es, searchResults);
+    drawIds(gg, av, ss, es, searchResults, true, getWidth());
 
     gg.translate(0, -transY);
 
+    gg.dispose();
+
     fastPaint = true;
 
     // Call repaint on alignment panel so that repaints from other alignment
@@ -217,43 +222,44 @@ public class IdCanvas extends JPanel implements ViewportListenerI
   @Override
   public void paintComponent(Graphics g)
   {
-    super.paintComponent(g);
-
     g.setColor(Color.white);
     g.fillRect(0, 0, getWidth(), getHeight());
-    
+
     if (fastPaint)
     {
       fastPaint = false;
       g.drawImage(image, 0, 0, this);
-    
+
       return;
     }
-    
+
     int oldHeight = imgHeight;
-    
+
     imgHeight = getHeight();
     imgHeight -= (imgHeight % av.getCharHeight());
-    
+
     if (imgHeight < 1)
     {
       return;
     }
-    
+
     if (oldHeight != imgHeight || image.getWidth(this) != getWidth())
     {
-       image = new BufferedImage(getWidth(), imgHeight,
-                BufferedImage.TYPE_INT_RGB);
+      image = new BufferedImage(getWidth(), imgHeight,
+              BufferedImage.TYPE_INT_RGB);
     }
-    
-    gg = (Graphics2D) image.getGraphics();
-    
+
+    Graphics2D gg = image.createGraphics();
+
     // Fill in the background
     gg.setColor(Color.white);
     gg.fillRect(0, 0, getWidth(), imgHeight);
-    
-    drawIds(gg, av, av.getRanges().getStartSeq(), av.getRanges().getEndSeq(), searchResults);
-    
+
+    drawIds(gg, av, av.getRanges().getStartSeq(),
+            av.getRanges().getEndSeq(), searchResults, true, getWidth());
+
+    gg.dispose();
+
     g.drawImage(image, 0, 0, this);
   }
 
@@ -268,15 +274,21 @@ public class IdCanvas extends JPanel implements ViewportListenerI
    * @param startSeq
    * @param endSeq
    * @param selection
+   * @param forGUI
+   *          when false rendering for print
+   * @param panelWidth
+   *          width used to calculate righthand margin - usually
+   *          idCanvas.getWidth()
+   * 
    */
-  void drawIds(Graphics2D g, AlignViewport alignViewport, final int startSeq,
-          final int endSeq, List<SequenceI> selection)
+  void drawIds(Graphics2D g, AlignViewport alignViewport,
+          final int startSeq, final int endSeq, List<SequenceI> selection,
+          boolean forGUI, int panelWidth)
   {
     Font font = alignViewport.getFont();
     if (alignViewport.isSeqNameItalics())
     {
-      setIdfont(new Font(font.getName(), Font.ITALIC,
-              font.getSize()));
+      setIdfont(new Font(font.getName(), Font.ITALIC, font.getSize()));
     }
     else
     {
@@ -299,12 +311,12 @@ public class IdCanvas extends JPanel implements ViewportListenerI
 
     if (alignViewport.getWrapAlignment())
     {
-      drawIdsWrapped(g, alignViewport, startSeq, getHeight());
+      drawIdsWrapped(g, alignViewport, startSeq, getHeight(),
+              manuallyAdjusted ? panelWidth : -1, forGUI);
       return;
     }
 
     // Now draw the id strings
-    int panelWidth = getWidth();
     int xPos = 0;
 
     // Now draw the id strings
@@ -320,6 +332,7 @@ public class IdCanvas extends JPanel implements ViewportListenerI
       if (hasHiddenRows || alignViewport.isDisplayReferenceSeq())
       {
         g.setFont(getHiddenFont(sequence, alignViewport));
+        fm = g.getFontMetrics();
       }
 
       // Selected sequence colours
@@ -343,8 +356,7 @@ public class IdCanvas extends JPanel implements ViewportListenerI
       g.setColor(currentColor);
 
       int charHeight = alignViewport.getCharHeight();
-      g.fillRect(0, (i - startSeq) * charHeight,
-              getWidth(), charHeight);
+      g.fillRect(0, (i - startSeq) * charHeight, getWidth(), charHeight);
 
       g.setColor(currentTextColor);
 
@@ -356,8 +368,9 @@ public class IdCanvas extends JPanel implements ViewportListenerI
         xPos = panelWidth - fm.stringWidth(string) - 4;
       }
 
-      g.drawString(string, xPos, (((i - startSeq) * charHeight) + charHeight)
-              - (charHeight / 5));
+      g.drawString(string, xPos,
+              (((i - startSeq) * charHeight) + charHeight)
+                      - (charHeight / 5));
 
       if (hasHiddenRows && av.getShowHiddenMarkers())
       {
@@ -377,6 +390,26 @@ public class IdCanvas extends JPanel implements ViewportListenerI
   void drawIdsWrapped(Graphics2D g, AlignViewport alignViewport,
           int startSeq, int pageHeight)
   {
+    drawIdsWrapped(g, alignViewport, startSeq, pageHeight, -1, true);
+  }
+
+  /**
+   * render sequence IDs and annotation labels when wrapped - without GUI junk
+   * 
+   * @param g
+   * @param av2
+   * @param startSeq
+   * @param totalHeight
+   */
+  public void drawIdsWrappedNoGUI(Graphics2D g, AlignViewport av2,
+          int startSeq, int totalHeight)
+  {
+    drawIdsWrapped(g, av2, startSeq, totalHeight, -1, false);
+  }
+
+  public void drawIdsWrapped(Graphics2D g, AlignViewport alignViewport,
+          int startSeq, int pageHeight, int idWidth, boolean forGUI)
+  {
     int alignmentWidth = alignViewport.getAlignment().getWidth();
     final int alheight = alignViewport.getAlignment().getHeight();
 
@@ -391,6 +424,9 @@ public class IdCanvas extends JPanel implements ViewportListenerI
     AnnotationLabels labels = null;
     if (alignViewport.isShowAnnotation())
     {
+      // in wrapped mode, no alignPanel reference is available
+      // FIXME: make the renderer not create a new object in wrapped mode
+      // everytime!
       labels = new AnnotationLabels(alignViewport);
     }
 
@@ -423,8 +459,23 @@ public class IdCanvas extends JPanel implements ViewportListenerI
 
       if (labels != null && alignViewport.isShowAnnotation())
       {
+        int getWidth = getWidth();
+        int thisIdWidth = getWidth;
         g.translate(0, ypos + (alheight * charHeight));
-        labels.drawComponent(g, getWidth());
+        if (!isManuallyAdjusted())
+        {
+          int getAnnotationsIdWidth = labels.drawLabels(g, false, -1, false,
+                  forGUI, null, false);
+          thisIdWidth = idWidth < 0 ? getAnnotationsIdWidth : idWidth;
+          if (thisIdWidth > getWidth)
+          {
+            this.setPreferredSize(
+                    new Dimension(thisIdWidth, this.getHeight()));
+            this.repaint();
+            alignViewport.setIdWidth(thisIdWidth);
+          }
+        }
+        labels.drawComponent(g, false, thisIdWidth, forGUI);
         g.translate(0, -ypos - (alheight * charHeight));
       }
 
@@ -443,7 +494,8 @@ public class IdCanvas extends JPanel implements ViewportListenerI
    * @param starty
    * @param yoffset
    */
-  void drawMarker(Graphics2D g, AlignViewport alignViewport, int seqIndex, int starty, int yoffset)
+  void drawMarker(Graphics2D g, AlignViewport alignViewport, int seqIndex,
+          int starty, int yoffset)
   {
     SequenceI[] hseqs = alignViewport.getAlignment()
             .getHiddenSequences().hiddenSequences;
@@ -486,8 +538,7 @@ public class IdCanvas extends JPanel implements ViewportListenerI
     /*
      * vertices of the triangle, below or above hidden seqs
      */
-    int[] xPoints = new int[]
-    { getWidth() - charHeight,
+    int[] xPoints = new int[] { getWidth() - charHeight,
         getWidth() - charHeight, getWidth() };
     int yShift = seqIndex - starty;
 
@@ -580,4 +631,17 @@ public class IdCanvas extends JPanel implements ViewportListenerI
       repaint();
     }
   }
+
+  private boolean manuallyAdjusted = false;
+
+  public boolean isManuallyAdjusted()
+  {
+    return manuallyAdjusted;
+  }
+
+  public void setManuallyAdjusted(boolean b)
+  {
+    manuallyAdjusted = b;
+  }
+
 }