JAL-2446 merged to spike branch
[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   public OverviewDimensionsHideHidden(ViewportRanges vpranges,
16           boolean showAnnotationPanel)
17   {
18     super(vpranges, showAnnotationPanel);
19     ranges = vpranges;
20     resetAlignmentDims();
21   }
22
23   @Override
24   public void updateViewportFromMouse(int mousex, int mousey,
25           HiddenSequences hiddenSeqs, HiddenColumns hiddenCols)
26   {
27     resetAlignmentDims();
28
29     int x = mousex;
30     int y = mousey;
31
32     if (x < 0)
33     {
34       x = 0;
35     }
36
37     if (y < 0)
38     {
39       y = 0;
40     }
41
42     //
43     // Convert x value to residue position
44     //
45
46     // need to determine where scrollCol should be, given x
47     // to do this also need to know width of viewport, and some hidden column
48     // correction
49
50     // convert x to residues - this is an absolute position
51     int xAsRes = Math.round((float) x * alwidth / width);
52
53     // get viewport width in residues
54     int vpwidth = ranges.getViewportWidth();
55
56     if (xAsRes + vpwidth > alwidth)
57     {
58       // went past the end of the alignment, adjust backwards
59
60       // if last position was before the end of the alignment, need to update
61       if (ranges.getStartRes() < alwidth)
62       {
63         xAsRes = alwidth - vpwidth;
64       }
65       else
66       {
67         xAsRes = ranges.getStartRes();
68       }
69     }
70
71
72     //
73     // Convert y value to sequence position
74     //
75
76     // convert y to residues
77     int yAsSeq = Math.round((float) y * alheight / sequencesHeight);
78
79     // get viewport height in sequences
80     // add 1 because height includes both endSeq and startSeq
81     int vpheight = ranges.getViewportHeight();
82
83     if (yAsSeq + vpheight > alheight)
84     {
85       // went past the end of the alignment, adjust backwards
86       if (ranges.getEndSeq() < alheight)
87       {
88         yAsSeq = alheight - vpheight;
89       }
90       else
91       {
92         yAsSeq = ranges.getStartSeq();
93       }
94     }
95
96     // update viewport
97     ranges.setStartRes(xAsRes);
98     ranges.setStartSeq(yAsSeq);
99
100   }
101
102   @Override
103   public void setBoxPosition(HiddenSequences hiddenSeqs,
104           HiddenColumns hiddenCols)
105   {
106     setBoxPosition(ranges.getStartRes(), ranges.getStartSeq(),
107             ranges.getViewportWidth(), ranges.getViewportHeight());
108   }
109
110   @Override
111   public AlignmentColsCollectionI getColumns(AlignmentI al)
112   {
113     return new VisibleColsCollection(0,
114             ranges.getAbsoluteAlignmentWidth() - 1, al);
115   }
116
117   @Override
118   public AlignmentRowsCollectionI getRows(AlignmentI al)
119   {
120     return new VisibleRowsCollection(0,
121             ranges.getAbsoluteAlignmentHeight() - 1, al);
122   }
123
124   @Override
125   protected void resetAlignmentDims()
126   {
127     alwidth = ranges.getVisibleAlignmentWidth();
128     alheight = ranges.getVisibleAlignmentHeight();
129   }
130 }