JAL-2611 Tidies, initial unit tests
[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     // Determine where scrollCol should be, given visXAsRes
74
75     // get viewport width in residues
76     int vpwidth = ranges.getViewportWidth();
77
78     if (xAsRes + vpwidth > alwidth)
79     {
80       // went past the end of the alignment, adjust backwards
81
82       // if last position was before the end of the alignment, need to update
83       if (ranges.getStartRes() < alwidth)
84       {
85         xAsRes = alwidth - vpwidth;
86       }
87       else
88       {
89         xAsRes = ranges.getStartRes();
90       }
91     }
92
93     // Determine where scrollRow should be, given visYAsSeq
94
95     // get viewport height in sequences
96     // add 1 because height includes both endSeq and startSeq
97     int vpheight = ranges.getViewportHeight();
98
99     if (yAsSeq + vpheight > alheight)
100     {
101       // went past the end of the alignment, adjust backwards
102       if (ranges.getEndSeq() < alheight)
103       {
104         yAsSeq = alheight - vpheight;
105       }
106       else
107       {
108         yAsSeq = ranges.getStartSeq();
109       }
110     }
111
112     // update viewport
113     ranges.setStartRes(xAsRes);
114     ranges.setStartSeq(yAsSeq);
115   }
116
117   @Override
118   public void setBoxPosition(HiddenSequences hiddenSeqs,
119           HiddenColumns hiddenCols)
120   {
121     setBoxPosition(ranges.getStartRes(), ranges.getStartSeq(),
122             ranges.getViewportWidth(), ranges.getViewportHeight());
123   }
124
125   @Override
126   public AlignmentColsCollectionI getColumns(AlignmentI al)
127   {
128     return new VisibleColsCollection(0,
129             ranges.getAbsoluteAlignmentWidth() - 1, al);
130   }
131
132   @Override
133   public AlignmentRowsCollectionI getRows(AlignmentI al)
134   {
135     return new VisibleRowsCollection(0,
136             ranges.getAbsoluteAlignmentHeight() - 1, al);
137   }
138
139   @Override
140   protected void resetAlignmentDims()
141   {
142     alwidth = ranges.getVisibleAlignmentWidth();
143     alheight = ranges.getVisibleAlignmentHeight();
144   }
145
146   @Override
147   protected int getLeftXFromCentreX(int mousex, HiddenColumns hidden)
148   {
149     int vpx = Math.round((float) mousex * alwidth / width);
150     return vpx - ranges.getViewportWidth() / 2;
151   }
152
153   @Override
154   protected int getTopYFromCentreY(int mousey, HiddenSequences hidden)
155   {
156     int vpy = Math.round((float) mousey * alheight / sequencesHeight);
157     return vpy - ranges.getViewportHeight() / 2;
158   }
159
160   @Override
161   public void setDragPoint(int x, int y, HiddenSequences hiddenSeqs,
162           HiddenColumns hiddenCols)
163   {
164     // get alignment position of x and box (can get directly from vpranges) and
165     // calculate difference between the positions
166     int vpx = Math.round((float) x * alwidth / width);
167     int vpy = Math.round((float) y * alheight / sequencesHeight);
168
169     xdiff = ranges.getStartRes() - vpx;
170     ydiff = ranges.getStartSeq() - vpy;
171   }
172
173 }