JAL-192 JAL-2099 factored out calculation from rendering code #2
[jalview.git] / src / jalview / gui / ScalePanel.java
index aedb157..8a3138d 100755 (executable)
@@ -35,6 +35,8 @@ import java.awt.event.ActionListener;
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseListener;
 import java.awt.event.MouseMotionListener;
+import java.util.ArrayList;
+import java.util.List;
 
 import javax.swing.JMenuItem;
 import javax.swing.JPanel;
@@ -488,9 +490,90 @@ public class ScalePanel extends JPanel implements MouseMotionListener,
         }
       }
     }
+
+    int widthx = 1 + endx - startx;
+
+    FontMetrics fm = gg.getFontMetrics(av.getFont());
+    int y = avCharHeight, yOf = fm.getDescent();
+    y -= yOf;
+    if (av.hasHiddenColumns())
+    {
+      // draw any hidden column markers
+      gg.setColor(Color.blue);
+      int res;
+      if (av.getShowHiddenMarkers()
+              && av.getColumnSelection().getHiddenColumns() != null)
+      {
+        for (int i = 0; i < av.getColumnSelection().getHiddenColumns()
+                .size(); i++)
+        {
+          res = av.getColumnSelection().findHiddenRegionPosition(i)
+                  - startx;
+
+          if (res < 0 || res > widthx)
+          {
+            continue;
+          }
+
+          gg.fillPolygon(new int[] {
+              -1 + res * avCharWidth - avCharHeight / 4,
+              -1 + res * avCharWidth + avCharHeight / 4,
+              -1 + res * avCharWidth }, new int[] { y, y, y + 2 * yOf }, 3);
+
+        }
+      }
+    }
     // Draw the scale numbers
     gg.setColor(Color.black);
 
+    List<Object[]> marks = calculateMarks(startx, endx);
+    int maxX = 0;
+    for (Object[] mark : marks)
+    {
+      boolean major = Boolean.valueOf((Boolean) mark[0]);
+      int mpos = ((Integer) mark[1]).intValue(); // (i - startx - 1)
+      String mstring = (String) mark[2];
+      if (mstring != null)
+      {
+        if (mpos * avCharWidth > maxX)
+        {
+          gg.drawString(mstring, mpos * avCharWidth, y);
+          maxX = (mpos + 2) * avCharWidth + fm.stringWidth(mstring);
+        }
+      }
+      if (major)
+      {
+        gg.drawLine((mpos * avCharWidth) + (avCharWidth / 2), y + 2,
+                (mpos * avCharWidth) + (avCharWidth / 2), y + (yOf * 2));
+      }
+      else
+      {
+        gg.drawLine((mpos * avCharWidth) + (avCharWidth / 2), y + yOf,
+                (mpos * avCharWidth) + (avCharWidth / 2), y + (yOf * 2));
+      }
+    }
+    if (av.hasHiddenColumns())
+    {
+      if (reveal != null && reveal[0] > startx && reveal[0] < endx)
+      {
+        gg.drawString(MessageManager.getString("label.reveal_columns"),
+                reveal[0] * avCharWidth, 0);
+      }
+    }
+
+  }
+
+  /**
+   * calculate positions markers on the alignment ruler
+   * 
+   * @return List { Object { .. } } Boolean: true/false for major/minor mark,
+   *         Integer: marker position in alignment column coords, String: null
+   *         or a String to be rendered at the position.
+   */
+  public List<Object[]> calculateMarks(int startx, int endx)
+  {
+    new ArrayList<Object[]>();
+
     int scalestartx = (startx / 10) * 10;
 
     SequenceI refSeq = av.getAlignment().getSeqrep();
@@ -512,30 +595,27 @@ public class ScalePanel extends JPanel implements MouseMotionListener,
     }
 
 
-    int widthx = 1 + endx - startx;
-
-    FontMetrics fm = gg.getFontMetrics(av.getFont());
-    int y = avCharHeight - fm.getDescent();
-
     if (refSeq == null && scalestartx % 10 == 0)
     {
       scalestartx += 5;
     }
-
+    List<Object[]> marks = new ArrayList<Object[]>();
     String string;
     int maxX = 0, refN, iadj;
     // todo: add a 'reference origin column' to set column number relative to
     for (int i = scalestartx; i < endx; i += 5)
     {
+      Object[] amark = new Object[3];
       if (((i - refSp) % 10) == 0)
       {
-        iadj = av.getColumnSelection().adjustForHiddenColumns(i) - 1;
         if (refSeq == null)
         {
-          string = String.valueOf(iadj + 1);
+          iadj = av.getColumnSelection().adjustForHiddenColumns(i - 1) + 1;
+          string = String.valueOf(iadj);
         }
         else
         {
+          iadj = av.getColumnSelection().adjustForHiddenColumns(i - 1);
           refN = refSeq.findPosition(iadj);
           // TODO show bounds if position is a gap
           // - ie L--R -> "1L|2R" for
@@ -553,57 +633,19 @@ public class ScalePanel extends JPanel implements MouseMotionListener,
             string = String.valueOf(refN) + refSeq.getCharAt(iadj);
           }
         }
-        if ((i - startx - 1) * avCharWidth > maxX)
-        {
-          gg.drawString(string, (i - startx - 1) * avCharWidth, y);
-          maxX = (i - startx + 1) * avCharWidth + fm.stringWidth(string);
-        }
+        amark[0] = Boolean.TRUE;
+        amark[1] = Integer.valueOf(i - startx - 1);
+        amark[2] = string;
 
-        gg.drawLine(((i - startx - 1) * avCharWidth) + (avCharWidth / 2),
-                y + 2,
-                ((i - startx - 1) * avCharWidth) + (avCharWidth / 2), y
-                        + (fm.getDescent() * 2));
       }
       else
       {
-        gg.drawLine(((i - startx - 1) * avCharWidth) + (avCharWidth / 2), y
-                + fm.getDescent(), ((i - startx - 1) * avCharWidth)
-                + (avCharWidth / 2), y + (fm.getDescent() * 2));
+        amark[0] = Boolean.FALSE;
+        amark[1] = Integer.valueOf(i - startx - 1);
+        amark[2] = null;
       }
+      marks.add(amark);
     }
-
-    if (av.hasHiddenColumns())
-    {
-      gg.setColor(Color.blue);
-      int res;
-      if (av.getShowHiddenMarkers()
-              && av.getColumnSelection().getHiddenColumns() != null)
-      {
-        for (int i = 0; i < av.getColumnSelection().getHiddenColumns()
-                .size(); i++)
-        {
-          res = av.getColumnSelection().findHiddenRegionPosition(i)
-                  - startx;
-
-          if (res < 0 || res > widthx)
-          {
-            continue;
-          }
-
-          gg.fillPolygon(new int[] { res * avCharWidth - avCharHeight / 4,
-              res * avCharWidth + avCharHeight / 4, res * avCharWidth },
-                  new int[] { y - avCharHeight / 2, y - avCharHeight / 2,
-                      y + 8 }, 3);
-
-        }
-      }
-
-      if (reveal != null && reveal[0] > startx && reveal[0] < endx)
-      {
-        gg.drawString(MessageManager.getString("label.reveal_columns"),
-                reveal[0] * avCharWidth, 0);
-      }
-    }
-
+    return marks;
   }
 }