/* * 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 . * The Jalview Authors are detailed in the 'AUTHORS' file. */ package jalview.renderer; import jalview.api.AlignViewportI; import jalview.datamodel.SequenceI; import java.util.ArrayList; import java.util.List; /** * Calculate and display alignment rulers * * @author jprocter * */ public class ScaleRenderer { /** * Represents one major or minor scale mark */ public final class ScaleMark { /** * true for a major scale mark, false for minor */ public final boolean major; /** * visible column position (0..) e.g. 19 */ public final int column; /** * text (if any) to show e.g. "20" */ public final String text; ScaleMark(boolean isMajor, int col, String txt) { major = isMajor; column = col; text = txt; } /** * String representation for inspection when debugging only */ @Override public String toString() { return String.format("%s:%d:%s", major ? "major" : "minor", column, text); } } /** * Calculates position markers on the alignment ruler * * @param av * @param startx * left-most column in visible view (0..) * @param endx * - right-most column in visible view (0..) * @return */ public List calculateMarks(AlignViewportI av, int startx, int endx) { int scalestartx = (startx / 10) * 10; SequenceI refSeq = av.getAlignment().getSeqrep(); int refSp = 0, refStartI = 0, refEndI = -1; if (refSeq != null) { // find bounds and set origin appopriately // locate first visible position for this sequence int[] refbounds = av.getAlignment().getHiddenColumns() .locateVisibleBoundsOfSequence(refSeq); refSp = refbounds[0]; refStartI = refbounds[4]; refEndI = refbounds[5]; scalestartx = refSp + ((scalestartx - refSp) / 10) * 10; } if (refSeq == null && scalestartx % 10 == 0) { scalestartx += 5; } List marks = new ArrayList(); // todo: add a 'reference origin column' to set column number relative to for (int i = scalestartx; i <= endx; i += 5) { if (((i - refSp) % 10) == 0) { String text; if (refSeq == null) { int iadj = av.getAlignment().getHiddenColumns() .adjustForHiddenColumns(i - 1) + 1; text = String.valueOf(iadj); } else { int iadj = av.getAlignment().getHiddenColumns() .adjustForHiddenColumns(i - 1); int refN = refSeq.findPosition(iadj); // TODO show bounds if position is a gap // - ie L--R -> "1L|2R" for // marker if (iadj < refStartI) { text = String.valueOf(iadj - refStartI); } else if (iadj > refEndI) { text = "+" + String.valueOf(iadj - refEndI); } else { text = String.valueOf(refN) + refSeq.getCharAt(iadj); } } marks.add(new ScaleMark(true, i - startx - 1, text)); } else { marks.add(new ScaleMark(false, i - startx - 1, null)); } } return marks; } }