added description of alignment quality scores and separated
[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 /**\r
25  * NOTE: Columns are zero based.\r
26  */\r
27 public class ColumnSelection\r
28 {\r
29     Vector selected = new Vector();\r
30 \r
31     //Vector of int [] {startCol, endCol}\r
32     Vector hiddenColumns;\r
33 \r
34     /**\r
35      * DOCUMENT ME!\r
36      *\r
37      * @param col DOCUMENT ME!\r
38      */\r
39     public void addElement(int col)\r
40     {\r
41         if (!selected.contains(new Integer(col)))\r
42         {\r
43             selected.addElement(new Integer(col));\r
44         }\r
45     }\r
46 \r
47     /**\r
48      * DOCUMENT ME!\r
49      */\r
50     public void clear()\r
51     {\r
52         selected.removeAllElements();\r
53     }\r
54 \r
55     /**\r
56      * DOCUMENT ME!\r
57      *\r
58      * @param col DOCUMENT ME!\r
59      */\r
60     public void removeElement(int col)\r
61     {\r
62         Integer colInt = new Integer(col);\r
63 \r
64         if (selected.contains(colInt))\r
65         {\r
66             selected.removeElement(colInt);\r
67         }\r
68     }\r
69 \r
70     public void removeElements(int start, int end)\r
71     {\r
72       Integer colInt;\r
73       for(int i=start; i<end; i++)\r
74       {\r
75         colInt = new Integer(i);\r
76         if (selected.contains(colInt))\r
77         {\r
78             selected.removeElement(colInt);\r
79         }\r
80       }\r
81     }\r
82 \r
83     /**\r
84      * DOCUMENT ME!\r
85      *\r
86      * @param col DOCUMENT ME!\r
87      *\r
88      * @return DOCUMENT ME!\r
89      */\r
90     public boolean contains(int col)\r
91     {\r
92         return selected.contains(new Integer(col));\r
93     }\r
94 \r
95     /**\r
96      * DOCUMENT ME!\r
97      *\r
98      * @param i DOCUMENT ME!\r
99      *\r
100      * @return DOCUMENT ME!\r
101      */\r
102     public int columnAt(int i)\r
103     {\r
104         return ((Integer) selected.elementAt(i)).intValue();\r
105     }\r
106 \r
107     /**\r
108      * DOCUMENT ME!\r
109      *\r
110      * @return DOCUMENT ME!\r
111      */\r
112     public int size()\r
113     {\r
114         return selected.size();\r
115     }\r
116 \r
117     /**\r
118      * DOCUMENT ME!\r
119      *\r
120      * @return DOCUMENT ME!\r
121      */\r
122     public int getMax()\r
123     {\r
124         int max = -1;\r
125 \r
126         for (int i = 0; i < selected.size(); i++)\r
127         {\r
128             if (columnAt(i) > max)\r
129             {\r
130                 max = columnAt(i);\r
131             }\r
132         }\r
133 \r
134         return max;\r
135     }\r
136 \r
137     /**\r
138      * DOCUMENT ME!\r
139      *\r
140      * @return DOCUMENT ME!\r
141      */\r
142     public int getMin()\r
143     {\r
144         int min = 1000000000;\r
145 \r
146         for (int i = 0; i < selected.size(); i++)\r
147         {\r
148             if (columnAt(i) < min)\r
149             {\r
150                 min = columnAt(i);\r
151             }\r
152         }\r
153 \r
154         return min;\r
155     }\r
156 \r
157 \r
158     /**\r
159      * DOCUMENT ME!\r
160      *\r
161      * @param start DOCUMENT ME!\r
162      * @param change DOCUMENT ME!\r
163      */\r
164     public void compensateForEdit(int start, int change)\r
165     {\r
166         for (int i = 0; i < size(); i++)\r
167         {\r
168             int temp = columnAt(i);\r
169 \r
170             if (temp >= start)\r
171             {\r
172                 selected.setElementAt(new Integer(temp - change), i);\r
173             }\r
174         }\r
175     }\r
176 \r
177     /**\r
178      * This Method is used to return all the HiddenColumn regions\r
179      * less than the given index.\r
180      * @param end int\r
181      * @return Vector\r
182      */\r
183     public Vector getHiddenColumns()\r
184     {\r
185       return hiddenColumns;\r
186     }\r
187 \r
188     public int adjustForHiddenColumns(int column)\r
189     {\r
190       int result = column;\r
191       if (hiddenColumns != null)\r
192       {\r
193         for (int i = 0; i < hiddenColumns.size(); i++)\r
194         {\r
195           int[] region = (int[]) hiddenColumns.elementAt(i);\r
196           if (result >= region[0])\r
197           {\r
198             result += region[1] - region[0] + 1;\r
199           }\r
200         }\r
201       }\r
202       return result;\r
203     }\r
204 \r
205     /**\r
206      * Use this method to find out where a visible column is in the alignment\r
207      * when hidden columns exist\r
208      * @param hiddenColumn int\r
209      * @return int\r
210      */\r
211     public int findColumnPosition(int hiddenColumn)\r
212     {\r
213       int result = hiddenColumn;\r
214       if (hiddenColumns != null)\r
215       {\r
216         int index = 0;\r
217         int gaps = 0;\r
218         do\r
219         {\r
220           int[] region = (int[]) hiddenColumns.elementAt(index);\r
221           if (hiddenColumn > region[1])\r
222           {\r
223             result -= region[1]+1-region[0];\r
224           }\r
225           index++;\r
226         }\r
227         while (index < hiddenColumns.size());\r
228 \r
229         result -= gaps;\r
230       }\r
231 \r
232       return result;\r
233     }\r
234 \r
235     /**\r
236      * Use this method to determine where the next hiddenRegion starts\r
237     */\r
238     public int findHiddenRegionPosition(int hiddenRegion)\r
239     {\r
240       int result = 0;\r
241       if (hiddenColumns != null)\r
242       {\r
243         int index = 0;\r
244         int gaps = 0;\r
245         do\r
246         {\r
247           int[] region = (int[]) hiddenColumns.elementAt(index);\r
248           if(hiddenRegion==0)\r
249           {\r
250             return region[0];\r
251           }\r
252 \r
253             gaps +=  region[1] +1 - region[0];\r
254             result = region[1] +1;\r
255             index++;\r
256         }\r
257         while(index < hiddenRegion+1);\r
258 \r
259         result -= gaps;\r
260       }\r
261 \r
262       return result;\r
263     }\r
264 \r
265 \r
266 \r
267     public void hideColumns(int res, AlignViewport av)\r
268     {\r
269       if(hiddenColumns==null)\r
270         hiddenColumns = new Vector();\r
271 \r
272       // First find out range of columns to hide\r
273       int min = res, max = res+1;\r
274       while( contains(min) )\r
275       {  removeElement(min); min --;  }\r
276 \r
277       while( contains(max) )\r
278       { removeElement(max);  max ++;  }\r
279 \r
280       min++; max--;\r
281 \r
282       boolean added = false;\r
283       for(int i=0; i<hiddenColumns.size(); i++)\r
284       {\r
285         int [] region = (int[])hiddenColumns.elementAt(i);\r
286         if( max < region[0])\r
287         {\r
288           hiddenColumns.insertElementAt(new int[]{min, max}, i);\r
289           added = true;\r
290           break;\r
291         }\r
292       }\r
293 \r
294       if(!added)\r
295         hiddenColumns.addElement(new int[]{min, max});\r
296 \r
297 \r
298       av.setSelectionGroup(null);\r
299       av.hasHiddenColumns = true;\r
300     }\r
301 \r
302     public void revealAllHiddenColumns(AlignViewport av)\r
303     {\r
304       av.hasHiddenColumns = false;\r
305       hiddenColumns = null;\r
306     }\r
307 \r
308     public void revealHiddenColumns(int res, AlignViewport av)\r
309     {\r
310       for(int i=0; i<hiddenColumns.size(); i++)\r
311       {\r
312         int [] region = (int[])hiddenColumns.elementAt(i);\r
313         if( res == region[0])\r
314         {\r
315           hiddenColumns.remove(region);\r
316           break;\r
317         }\r
318       }\r
319 \r
320 \r
321       if(hiddenColumns.size()<1)\r
322         av.hasHiddenColumns = false;\r
323     }\r
324 \r
325 }\r