isVisible and hiddenboundary added
[jalview.git] / src / jalview / gui / ColumnSelection.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  *\r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  *\r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 package jalview.gui;\r
20 \r
21 import java.util.*;\r
22 \r
23 /**\r
24  * NOTE: Columns are zero based.\r
25  */\r
26 public class ColumnSelection\r
27 {\r
28     Vector selected = new Vector();\r
29 \r
30     //Vector of int [] {startCol, endCol}\r
31     Vector hiddenColumns;\r
32 \r
33     /**\r
34      * DOCUMENT ME!\r
35      *\r
36      * @param col DOCUMENT ME!\r
37      */\r
38     public void addElement(int col)\r
39     {\r
40         if (!selected.contains(new Integer(col)))\r
41         {\r
42             selected.addElement(new Integer(col));\r
43         }\r
44     }\r
45 \r
46     /**\r
47      * DOCUMENT ME!\r
48      */\r
49     public void clear()\r
50     {\r
51         selected.removeAllElements();\r
52     }\r
53 \r
54     /**\r
55      * DOCUMENT ME!\r
56      *\r
57      * @param col DOCUMENT ME!\r
58      */\r
59     public void removeElement(int col)\r
60     {\r
61         Integer colInt = new Integer(col);\r
62 \r
63         if (selected.contains(colInt))\r
64         {\r
65             selected.removeElement(colInt);\r
66         }\r
67     }\r
68 \r
69     public void removeElements(int start, int end)\r
70     {\r
71       Integer colInt;\r
72       for(int i=start; i<end; i++)\r
73       {\r
74         colInt = new Integer(i);\r
75         if (selected.contains(colInt))\r
76         {\r
77             selected.removeElement(colInt);\r
78         }\r
79       }\r
80     }\r
81 \r
82     /**\r
83      * DOCUMENT ME!\r
84      *\r
85      * @param col DOCUMENT ME!\r
86      *\r
87      * @return DOCUMENT ME!\r
88      */\r
89     public boolean contains(int col)\r
90     {\r
91         return selected.contains(new Integer(col));\r
92     }\r
93 \r
94     /**\r
95      * DOCUMENT ME!\r
96      *\r
97      * @param i DOCUMENT ME!\r
98      *\r
99      * @return DOCUMENT ME!\r
100      */\r
101     public int columnAt(int i)\r
102     {\r
103         return ((Integer) selected.elementAt(i)).intValue();\r
104     }\r
105 \r
106     /**\r
107      * DOCUMENT ME!\r
108      *\r
109      * @return DOCUMENT ME!\r
110      */\r
111     public int size()\r
112     {\r
113         return selected.size();\r
114     }\r
115 \r
116     /**\r
117      * DOCUMENT ME!\r
118      *\r
119      * @return DOCUMENT ME!\r
120      */\r
121     public int getMax()\r
122     {\r
123         int max = -1;\r
124 \r
125         for (int i = 0; i < selected.size(); i++)\r
126         {\r
127             if (columnAt(i) > max)\r
128             {\r
129                 max = columnAt(i);\r
130             }\r
131         }\r
132 \r
133         return max;\r
134     }\r
135 \r
136     /**\r
137      * DOCUMENT ME!\r
138      *\r
139      * @return DOCUMENT ME!\r
140      */\r
141     public int getMin()\r
142     {\r
143         int min = 1000000000;\r
144 \r
145         for (int i = 0; i < selected.size(); i++)\r
146         {\r
147             if (columnAt(i) < min)\r
148             {\r
149                 min = columnAt(i);\r
150             }\r
151         }\r
152 \r
153         return min;\r
154     }\r
155 \r
156 \r
157     /**\r
158      * DOCUMENT ME!\r
159      *\r
160      * @param start DOCUMENT ME!\r
161      * @param change DOCUMENT ME!\r
162      */\r
163     public void compensateForEdit(int start, int change)\r
164     {\r
165         for (int i = 0; i < size(); i++)\r
166         {\r
167             int temp = columnAt(i);\r
168 \r
169             if (temp >= start)\r
170             {\r
171                 selected.setElementAt(new Integer(temp - change), i);\r
172             }\r
173         }\r
174     }\r
175 \r
176     /**\r
177      * This Method is used to return all the HiddenColumn regions\r
178      * less than the given index.\r
179      * @param end int\r
180      * @return Vector\r
181      */\r
182     public Vector getHiddenColumns()\r
183     {\r
184       return hiddenColumns;\r
185     }\r
186 \r
187     public int adjustForHiddenColumns(int column)\r
188     {\r
189       int result = column;\r
190       if (hiddenColumns != null)\r
191       {\r
192         for (int i = 0; i < hiddenColumns.size(); i++)\r
193         {\r
194           int[] region = (int[]) hiddenColumns.elementAt(i);\r
195           if (result >= region[0])\r
196           {\r
197             result += region[1] - region[0] + 1;\r
198           }\r
199         }\r
200       }\r
201       return result;\r
202     }\r
203 \r
204     /**\r
205      * Use this method to find out where a visible column is in the alignment\r
206      * when hidden columns exist\r
207      * @param hiddenColumn int\r
208      * @return int\r
209      */\r
210     public int findColumnPosition(int hiddenColumn)\r
211     {\r
212       int result = hiddenColumn;\r
213       if (hiddenColumns != null)\r
214       {\r
215         int index = 0;\r
216         int gaps = 0;\r
217         do\r
218         {\r
219           int[] region = (int[]) hiddenColumns.elementAt(index);\r
220           if (hiddenColumn > region[1])\r
221           {\r
222             result -= region[1]+1-region[0];\r
223           }\r
224           index++;\r
225         }\r
226         while (index < hiddenColumns.size());\r
227 \r
228         result -= gaps;\r
229       }\r
230 \r
231       return result;\r
232     }\r
233 \r
234     /**\r
235      * Use this method to determine where the next hiddenRegion starts\r
236     */\r
237     public int findHiddenRegionPosition(int hiddenRegion)\r
238     {\r
239       int result = 0;\r
240       if (hiddenColumns != null)\r
241       {\r
242         int index = 0;\r
243         int gaps = 0;\r
244         do\r
245         {\r
246           int[] region = (int[]) hiddenColumns.elementAt(index);\r
247           if(hiddenRegion==0)\r
248           {\r
249             return region[0];\r
250           }\r
251 \r
252             gaps +=  region[1] +1 - region[0];\r
253             result = region[1] +1;\r
254             index++;\r
255         }\r
256         while(index < hiddenRegion+1);\r
257 \r
258         result -= gaps;\r
259       }\r
260 \r
261       return result;\r
262     }\r
263 \r
264     /**\r
265      * THis method returns the rightmost limit of a\r
266      * region of an alignment with hidden columns.\r
267      * In otherwords, the next hidden column.\r
268      * @param index int\r
269      */\r
270     public int getHiddenRegionBoundary(int alPos)\r
271     {\r
272       if (hiddenColumns != null)\r
273       {\r
274         int index = 0;\r
275         do\r
276         {\r
277           int[] region = (int[]) hiddenColumns.elementAt(index);\r
278           if(alPos < region[0])\r
279             return region[0];\r
280 \r
281           index++;\r
282         }\r
283         while(index < hiddenColumns.size());\r
284       }\r
285 \r
286       return alPos;\r
287 \r
288     }\r
289 \r
290 \r
291     public void hideColumns(int res, AlignViewport av)\r
292     {\r
293       if(hiddenColumns==null)\r
294         hiddenColumns = new Vector();\r
295 \r
296       // First find out range of columns to hide\r
297       int min = res, max = res+1;\r
298       while( contains(min) )\r
299       {  removeElement(min); min --;  }\r
300 \r
301       while( contains(max) )\r
302       { removeElement(max);  max ++;  }\r
303 \r
304       min++; max--;\r
305 \r
306       boolean added = false;\r
307       for(int i=0; i<hiddenColumns.size(); i++)\r
308       {\r
309         int [] region = (int[])hiddenColumns.elementAt(i);\r
310         if( max < region[0])\r
311         {\r
312           hiddenColumns.insertElementAt(new int[]{min, max}, i);\r
313           added = true;\r
314           break;\r
315         }\r
316       }\r
317 \r
318       if(!added)\r
319         hiddenColumns.addElement(new int[]{min, max});\r
320 \r
321 \r
322       av.setSelectionGroup(null);\r
323       av.hasHiddenColumns = true;\r
324     }\r
325 \r
326     public void revealAllHiddenColumns(AlignViewport av)\r
327     {\r
328       av.hasHiddenColumns = false;\r
329       hiddenColumns = null;\r
330     }\r
331 \r
332     public void revealHiddenColumns(int res, AlignViewport av)\r
333     {\r
334       for(int i=0; i<hiddenColumns.size(); i++)\r
335       {\r
336         int [] region = (int[])hiddenColumns.elementAt(i);\r
337         if( res == region[0])\r
338         {\r
339           hiddenColumns.remove(region);\r
340           break;\r
341         }\r
342       }\r
343 \r
344 \r
345       if(hiddenColumns.size()<1)\r
346         av.hasHiddenColumns = false;\r
347     }\r
348 \r
349     public boolean isVisible(int column)\r
350     {\r
351       for(int i=0; i<hiddenColumns.size(); i++)\r
352       {\r
353         int [] region = (int[])hiddenColumns.elementAt(i);\r
354         if( column >= region[0] && column <= region[1])\r
355         {\r
356           return false;\r
357         }\r
358       }\r
359       return true;\r
360     }\r
361 \r
362 }\r