Merge branch 'develop' into feature/JAL-2611
[jalview.git] / src / jalview / viewmodel / OverviewDimensionsHideHidden.java
1 package jalview.viewmodel;
2
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;
10
11 public class OverviewDimensionsHideHidden extends OverviewDimensions
12 {
13   private ViewportRanges ranges;
14
15   private int xdiff; // when dragging, difference in alignment units between
16                      // start residue and original mouse click position
17
18   private int ydiff; // when dragging, difference in alignment units between
19                      // start sequence and original mouse click position
20
21   public OverviewDimensionsHideHidden(ViewportRanges vpranges,
22           boolean showAnnotationPanel)
23   {
24     super(vpranges, showAnnotationPanel);
25     ranges = vpranges;
26     resetAlignmentDims();
27   }
28
29   @Override
30   public void updateViewportFromMouse(int mousex, int mousey,
31           HiddenSequences hiddenSeqs, HiddenColumns hiddenCols)
32   {
33     int xAsRes = getLeftXFromCentreX(mousex, hiddenCols);
34     int yAsSeq = getTopYFromCentreY(mousey, hiddenSeqs);
35
36     updateViewportFromTopLeft(xAsRes, yAsSeq, hiddenSeqs, hiddenCols);
37
38   }
39
40   @Override
41   public void adjustViewportFromMouse(int mousex, int mousey,
42           HiddenSequences hiddenSeqs, HiddenColumns hiddenCols)
43   {
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);
49
50     updateViewportFromTopLeft(vpx + xdiff, vpy + ydiff, hiddenSeqs,
51             hiddenCols);
52
53   }
54
55   @Override
56   protected void updateViewportFromTopLeft(int leftx, int topy,
57           HiddenSequences hiddenSeqs, HiddenColumns hiddenCols)
58   {
59     int xAsRes = leftx;
60     int yAsSeq = topy;
61     resetAlignmentDims();
62
63     if (xAsRes < 0)
64     {
65       xAsRes = 0;
66     }
67
68     if (yAsSeq < 0)
69     {
70       yAsSeq = 0;
71     }
72
73     if (ranges.isWrappedMode())
74     {
75       yAsSeq = 0; // sorry, no vertical scroll when wrapped
76     }
77
78     // get viewport width in residues
79     int vpwidth = ranges.getViewportWidth();
80
81     if (xAsRes + vpwidth > alwidth)
82     {
83       // went past the end of the alignment, adjust backwards
84
85       // if last position was before the end of the alignment, need to update
86       if (ranges.getStartRes() < alwidth)
87       {
88         xAsRes = alwidth - vpwidth;
89       }
90       else
91       {
92         xAsRes = ranges.getStartRes();
93       }
94     }
95
96     // Determine where scrollRow should be, given visYAsSeq
97
98     // get viewport height in sequences
99     // add 1 because height includes both endSeq and startSeq
100     int vpheight = ranges.getViewportHeight();
101
102     if (yAsSeq + vpheight > alheight)
103     {
104       // went past the end of the alignment, adjust backwards
105       if (ranges.getEndSeq() < alheight)
106       {
107         yAsSeq = alheight - vpheight;
108       }
109       else
110       {
111         yAsSeq = ranges.getStartSeq();
112       }
113     }
114
115     // update viewport
116     ranges.setStartRes(xAsRes);
117     ranges.setStartSeq(yAsSeq);
118   }
119
120   @Override
121   public void setBoxPosition(HiddenSequences hiddenSeqs,
122           HiddenColumns hiddenCols)
123   {
124     setBoxPosition(ranges.getStartRes(), ranges.getStartSeq(),
125             ranges.getViewportWidth(), ranges.getViewportHeight());
126   }
127
128   @Override
129   public AlignmentColsCollectionI getColumns(AlignmentI al)
130   {
131     return new VisibleColsCollection(0,
132             ranges.getAbsoluteAlignmentWidth() - 1, al);
133   }
134
135   @Override
136   public AlignmentRowsCollectionI getRows(AlignmentI al)
137   {
138     return new VisibleRowsCollection(0,
139             ranges.getAbsoluteAlignmentHeight() - 1, al);
140   }
141
142   @Override
143   protected void resetAlignmentDims()
144   {
145     alwidth = ranges.getVisibleAlignmentWidth();
146     alheight = ranges.getVisibleAlignmentHeight();
147   }
148
149   @Override
150   protected int getLeftXFromCentreX(int mousex, HiddenColumns hidden)
151   {
152     int vpx = Math.round((float) mousex * alwidth / width);
153     return vpx - ranges.getViewportWidth() / 2;
154   }
155
156   @Override
157   protected int getTopYFromCentreY(int mousey, HiddenSequences hidden)
158   {
159     int vpy = Math.round((float) mousey * alheight / sequencesHeight);
160     return vpy - ranges.getViewportHeight() / 2;
161   }
162
163   @Override
164   public void setDragPoint(int x, int y, HiddenSequences hiddenSeqs,
165           HiddenColumns hiddenCols)
166   {
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);
171
172     xdiff = ranges.getStartRes() - vpx;
173     ydiff = ranges.getStartSeq() - vpy;
174   }
175
176 }