1 package jalview.viewmodel;
3 import jalview.api.AlignmentColsCollectionI;
4 import jalview.api.AlignmentRowsCollectionI;
5 import jalview.datamodel.AlignmentI;
6 import jalview.datamodel.HiddenColumns;
7 import jalview.datamodel.HiddenSequences;
8 import jalview.datamodel.VisibleColsCollection;
9 import jalview.datamodel.VisibleRowsCollection;
11 public class OverviewDimensionsHideHidden extends OverviewDimensions
13 private ViewportRanges ranges;
15 private int xdiff; // when dragging, difference in alignment units between
16 // start residue and original mouse click position
18 private int ydiff; // when dragging, difference in alignment units between
19 // start sequence and original mouse click position
21 public OverviewDimensionsHideHidden(ViewportRanges vpranges,
22 boolean showAnnotationPanel)
24 super(vpranges, showAnnotationPanel);
30 public void updateViewportFromMouse(int mousex, int mousey,
31 HiddenSequences hiddenSeqs, HiddenColumns hiddenCols)
33 int xAsRes = getLeftXFromCentreX(mousex, hiddenCols);
34 int yAsSeq = getTopYFromCentreY(mousey, hiddenSeqs);
36 updateViewportFromTopLeft(xAsRes, yAsSeq, hiddenSeqs, hiddenCols);
41 public void adjustViewportFromMouse(int mousex, int mousey,
42 HiddenSequences hiddenSeqs, HiddenColumns hiddenCols)
44 // calculate translation in pixel terms:
45 // get mouse location in viewport coords, add translation in viewport
46 // coords, and update viewport as usual
47 int vpx = Math.round((float) mousex * alwidth / width);
48 int vpy = Math.round((float) mousey * alheight / sequencesHeight);
50 updateViewportFromTopLeft(vpx + xdiff, vpy + ydiff, hiddenSeqs,
56 protected void updateViewportFromTopLeft(int leftx, int topy,
57 HiddenSequences hiddenSeqs, HiddenColumns hiddenCols)
73 if (ranges.isWrappedMode())
75 yAsSeq = 0; // sorry, no vertical scroll when wrapped
78 // get viewport width in residues
79 int vpwidth = ranges.getViewportWidth();
81 if (xAsRes + vpwidth > alwidth)
83 // went past the end of the alignment, adjust backwards
85 // if last position was before the end of the alignment, need to update
86 if (ranges.getStartRes() < alwidth)
88 xAsRes = alwidth - vpwidth;
92 xAsRes = ranges.getStartRes();
96 // Determine where scrollRow should be, given visYAsSeq
98 // get viewport height in sequences
99 // add 1 because height includes both endSeq and startSeq
100 int vpheight = ranges.getViewportHeight();
102 if (yAsSeq + vpheight > alheight)
104 // went past the end of the alignment, adjust backwards
105 if (ranges.getEndSeq() < alheight)
107 yAsSeq = alheight - vpheight;
111 yAsSeq = ranges.getStartSeq();
116 ranges.setStartRes(xAsRes);
117 ranges.setStartSeq(yAsSeq);
121 public void setBoxPosition(HiddenSequences hiddenSeqs,
122 HiddenColumns hiddenCols)
124 setBoxPosition(ranges.getStartRes(), ranges.getStartSeq(),
125 ranges.getViewportWidth(), ranges.getViewportHeight());
129 public AlignmentColsCollectionI getColumns(AlignmentI al)
131 return new VisibleColsCollection(0,
132 ranges.getAbsoluteAlignmentWidth() - 1, al);
136 public AlignmentRowsCollectionI getRows(AlignmentI al)
138 return new VisibleRowsCollection(0,
139 ranges.getAbsoluteAlignmentHeight() - 1, al);
143 protected void resetAlignmentDims()
145 alwidth = ranges.getVisibleAlignmentWidth();
146 alheight = ranges.getVisibleAlignmentHeight();
150 protected int getLeftXFromCentreX(int mousex, HiddenColumns hidden)
152 int vpx = Math.round((float) mousex * alwidth / width);
153 return vpx - ranges.getViewportWidth() / 2;
157 protected int getTopYFromCentreY(int mousey, HiddenSequences hidden)
159 int vpy = Math.round((float) mousey * alheight / sequencesHeight);
160 return vpy - ranges.getViewportHeight() / 2;
164 public void setDragPoint(int x, int y, HiddenSequences hiddenSeqs,
165 HiddenColumns hiddenCols)
167 // get alignment position of x and box (can get directly from vpranges) and
168 // calculate difference between the positions
169 int vpx = Math.round((float) x * alwidth / width);
170 int vpy = Math.round((float) y * alheight / sequencesHeight);
172 xdiff = ranges.getStartRes() - vpx;
173 ydiff = ranges.getStartSeq() - vpy;