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;
}
}
}
+
+ 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();
}
- 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
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;
}
}