X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fviewmodel%2FOverviewDimensions.java;h=60b4ee988a031030bce8fc22a0abfa0307183759;hb=1ab6f120162b85abfb50046444199f2638f966ac;hp=fe9f4dbc8f7ee492341429bd7f0e2ac870c08586;hpb=571d15a897c11bdc2dda76ce03686604596f220d;p=jalview.git diff --git a/src/jalview/viewmodel/OverviewDimensions.java b/src/jalview/viewmodel/OverviewDimensions.java index fe9f4db..60b4ee9 100644 --- a/src/jalview/viewmodel/OverviewDimensions.java +++ b/src/jalview/viewmodel/OverviewDimensions.java @@ -20,7 +20,8 @@ */ package jalview.viewmodel; -import jalview.api.AlignViewportI; +import jalview.datamodel.ColumnSelection; +import jalview.datamodel.HiddenSequences; import java.awt.Graphics; @@ -37,14 +38,6 @@ public class OverviewDimensions private static final int MAX_SEQ_HEIGHT = 300; - private AlignViewportI av; - - private ViewportPositionProps posProps; - - private float scalew = 1f; - - private float scaleh = 1f; - // width of the overview panel private int width; @@ -67,28 +60,34 @@ public class OverviewDimensions // height of box private int boxHeight = -1; + // scroll position in viewport corresponding to boxX private int scrollCol = -1; + // scroll position in viewport corresponding to boxY private int scrollRow = -1; - public OverviewDimensions(AlignViewportI avi) + /** + * Create an OverviewDimensions object + * + * @param props + * positional properties of the viewport + * @param showAnnotationPanel + * true if the annotation panel is to be shown, false otherwise + */ + public OverviewDimensions(ViewportPositionProps props, + boolean showAnnotationPanel) { - this.av = avi; - this.posProps = av.getPosProps(); - // scale the initial size of overviewpanel to shape of alignment - float initialScale = (float) posProps.getAlignmentWidthInCols() - / (float) posProps.getAlignmentHeightInRows(); + float initialScale = (float) props.getAbsoluteAlignmentWidth() + / (float) props.getAbsoluteAlignmentHeight(); - // TODO: in applet this was getSequenceConsensusHash() - // check if it makes any functional difference - if (av.getAlignmentConservationAnnotation() == null) + if (!showAnnotationPanel) { graphHeight = 0; } - if (posProps.getAlignmentWidthInCols() > posProps - .getAlignmentHeightInRows()) + if (props.getAbsoluteAlignmentWidth() > props + .getAbsoluteAlignmentHeight()) { // wider width = MAX_WIDTH; @@ -113,82 +112,157 @@ public class OverviewDimensions /** * Check box dimensions and scroll positions and correct if necessary + * + * @param mousex + * x position in overview panel + * @param mousey + * y position in overview panel + * @param hiddenSeqs + * hidden sequences + * @param hiddenCols + * hidden columns + * @param props + * viewport position properties */ - public void setBoxPositionByMouse(int x, int y) + public void updateViewportFromMouse(int mousex, int mousey, + HiddenSequences hiddenSeqs, ColumnSelection hiddenCols, + ViewportPositionProps props) { - int alwidth = av.getAlignment().getWidth(); - int alheight = av.getAlignment().getAbsoluteHeight(); + int x = mousex; + int y = mousey; - boxX = x; - boxY = y; - if (boxY < 0) - { - boxY = 0; - } - else if (boxY > (sequencesHeight - boxHeight)) + int alwidth = props.getAbsoluteAlignmentWidth(); + int alheight = props.getAbsoluteAlignmentHeight(); + + if (x < 0) { - boxY = sequencesHeight - boxHeight; + x = 0; } - if (boxX < 0) + if (y < 0) { - boxX = 0; + y = 0; } - else if (boxX > (width - boxWidth)) + + // + // Convert x value to residue position + // + + // need to determine where scrollCol should be, given x + // to do this also need to know width of viewport, and some hidden column + // correction + + // convert x to residues - this is an absolute position + int xAsRes = Math.round((float) x * alwidth / width); + + // get viewport width in residues + int vpwidth = props.getEndRes() - props.getStartRes() + 1; + + // get where x should be when accounting for hidden cols + // if x is in a hidden col region, shift to left - but we still need + // absolute position + // so convert back after getting visible region position + int visXAsRes = hiddenCols.findColumnPosition(xAsRes); + + // check in case we went off the edge of the alignment + int visAlignWidth = hiddenCols.findColumnPosition(alwidth - 1); + if (visXAsRes + vpwidth - 1 > visAlignWidth) { - if (av.hasHiddenColumns()) + // went past the end of the alignment, adjust backwards + + // if last position was before the end of the alignment, need to update + if ((scrollCol + vpwidth - 1) < visAlignWidth) { - // Try smallest possible box - boxWidth = Math.round((float) (posProps.getEndRes() - - posProps.getStartRes() + 1) - * width / alwidth); + visXAsRes = hiddenCols.findColumnNToLeft(vpwidth - 1, alwidth - 1); + } + else + { + visXAsRes = scrollCol; } - boxX = width - boxWidth; } - scrollCol = Math.round((float) boxX * alwidth / width); - scrollRow = Math.round((float) boxY * alheight / sequencesHeight); + // + // Convert y value to sequence position + // - if (av.hasHiddenColumns()) - { - // doesn't seem to do anything useful - /*if (!av.getColumnSelection().isVisible(scrollCol)) - { - return; - }*/ + // convert y to residues + int yAsSeq = Math.round((float) y * alheight / sequencesHeight); - scrollCol = av.getColumnSelection().findColumnPosition(scrollCol); - } + // get viewport height in sequences + // add 1 because height includes both endSeq and startSeq + int vpheight = props.getEndSeq() - props.getStartSeq() + 1; - if (av.hasHiddenRows()) + // get where y should be when accounting for hidden rows + // if y is in a hidden row region, shift up - but we still need absolute + // position, + // so convert back after getting visible region position + yAsSeq = hiddenSeqs.adjustForHiddenSeqs(hiddenSeqs + .findIndexWithoutHiddenSeqs(yAsSeq)); + + // get where end seq should be by adding the viewport height on + int endSeq = yAsSeq + vpheight - 1; + + // check in case we went off the edge of the alignment + int visAlignHeight = hiddenSeqs.findIndexWithoutHiddenSeqs(alheight); + int visYAsRes = hiddenSeqs.findIndexWithoutHiddenSeqs(yAsSeq); + if (hiddenSeqs.findIndexWithoutHiddenSeqs(endSeq) > visAlignHeight) { - scrollRow = av.getAlignment().getHiddenSequences() - .findIndexWithoutHiddenSeqs(scrollRow); + // went past the end of the alignment, adjust backwards + if ((scrollRow + vpheight - 1) < visAlignHeight) + { + visYAsRes = hiddenSeqs + .findIndexNAboveRow(vpheight - 1, alheight - 1); + } + else + { + visYAsRes = scrollRow; + } } + + // convert absolute positions back to visible alignment positions for + // viewport scrolling + scrollCol = visXAsRes; + scrollRow = visYAsRes; // hiddenSeqs.findIndexWithoutHiddenSeqs(yAsSeq); + } /** * Update the overview panel box when the associated alignment panel is * changed * + * @param hiddenSeqs + * hidden sequences + * @param hiddenCols + * hidden columns + * @param props + * viewport position properties */ - public void setBoxPosition() + public void setBoxPosition(HiddenSequences hiddenSeqs, + ColumnSelection hiddenCols, ViewportPositionProps props) { - int alwidth = av.getAlignment().getWidth(); - int alheight = av.getAlignment().getAbsoluteHeight(); + int alwidth = props.getAbsoluteAlignmentWidth(); + int alheight = props.getAbsoluteAlignmentHeight(); - int startRes = av.getPosProps().getAbsoluteStartRes(); - int endRes = av.getPosProps().getAbsoluteEndRes(); + // work with absolute values of startRes and endRes + int startRes = hiddenCols.adjustForHiddenColumns(props.getStartRes()); + int endRes = hiddenCols.adjustForHiddenColumns(props.getEndRes()); - int startSeq = av.getPosProps().getAbsoluteStartSeq(); - int endSeq = av.getPosProps().getAbsoluteEndSeq(); + // work with absolute values of startSeq and endSeq + int startSeq = hiddenSeqs.adjustForHiddenSeqs(props.getStartSeq()); + int endSeq = hiddenSeqs.adjustForHiddenSeqs(props.getEndSeq()); + // boxX, boxY is the x,y location equivalent to startRes, startSeq boxX = Math.round((float) startRes * width / alwidth); boxY = Math.round((float) startSeq * sequencesHeight / alheight); + // boxWidth is the width in residues translated to pixels + // since the box includes both the start and end residues, add 1 to the + // difference boxWidth = Math .round((float) (endRes - startRes + 1) * width / alwidth); - boxHeight = Math.round((float) (endSeq - startSeq) * sequencesHeight + // boxHeight is the height in sequences translated to pixels + boxHeight = Math.round((float) (endSeq - startSeq + 1) + * sequencesHeight / alheight); } @@ -241,16 +315,6 @@ public class OverviewDimensions return boxHeight; } - public void setBoxX(int x) - { - boxX = x; - } - - public void setBoxY(int y) - { - boxY = y; - } - public void setWidth(int w) { width = w;