X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FScalePanel.java;h=8a3138d179f7b8f7eb70038a0650636d94ed9bcc;hb=b636f0007e76155876da1dd75310a4cb153815d7;hp=aedb15790680f89c891aa79e49da177313936e54;hpb=cea44c7306e8f7b81a3338f28fb676cd6f0e8c64;p=jalview.git diff --git a/src/jalview/gui/ScalePanel.java b/src/jalview/gui/ScalePanel.java index aedb157..8a3138d 100755 --- a/src/jalview/gui/ScalePanel.java +++ b/src/jalview/gui/ScalePanel.java @@ -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 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 calculateMarks(int startx, int endx) + { + new ArrayList(); + 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 marks = new ArrayList(); 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; } }