Formatting
[jalview.git] / src / jalview / datamodel / HiddenSequences.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2007 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 \r
20 package jalview.datamodel;\r
21 \r
22 import java.util.*;\r
23 \r
24 public class HiddenSequences\r
25 {\r
26   public SequenceI[] hiddenSequences;\r
27   AlignmentI alignment;\r
28 \r
29   public HiddenSequences(AlignmentI al)\r
30   {\r
31     alignment = al;\r
32   }\r
33 \r
34   public int getSize()\r
35   {\r
36     if (hiddenSequences == null)\r
37     {\r
38       return 0;\r
39     }\r
40     int count = 0;\r
41     for (int i = 0; i < hiddenSequences.length; i++)\r
42     {\r
43       if (hiddenSequences[i] != null)\r
44       {\r
45         count++;\r
46       }\r
47     }\r
48 \r
49     return count;\r
50   }\r
51 \r
52   public int getWidth()\r
53   {\r
54     int width = 0;\r
55     for (int i = 0; i < hiddenSequences.length; i++)\r
56     {\r
57       if (hiddenSequences[i] != null && hiddenSequences[i].getLength() > width)\r
58       {\r
59         width = hiddenSequences[i].getLength();\r
60       }\r
61     }\r
62 \r
63     return width;\r
64   }\r
65 \r
66   /**\r
67    * Call this method if sequences are removed from the\r
68    * main alignment\r
69    */\r
70   public void adjustHeightSequenceDeleted(int seqIndex)\r
71   {\r
72     if (hiddenSequences == null)\r
73     {\r
74       return;\r
75     }\r
76 \r
77     int alHeight = alignment.getHeight();\r
78 \r
79     SequenceI[] tmp = new SequenceI[alHeight + getSize()];\r
80     int deletionIndex = adjustForHiddenSeqs(seqIndex);\r
81 \r
82     for (int i = 0; i < hiddenSequences.length; i++)\r
83     {\r
84       if (hiddenSequences[i] == null)\r
85       {\r
86         continue;\r
87       }\r
88 \r
89       if (i > deletionIndex)\r
90       {\r
91         tmp[i - 1] = hiddenSequences[i];\r
92       }\r
93       else\r
94       {\r
95         tmp[i] = hiddenSequences[i];\r
96       }\r
97     }\r
98 \r
99     hiddenSequences = tmp;\r
100 \r
101   }\r
102 \r
103   /**\r
104    * Call this method if sequences are added to or removed from the\r
105    * main alignment\r
106    */\r
107   public void adjustHeightSequenceAdded()\r
108   {\r
109     if (hiddenSequences == null)\r
110     {\r
111       return;\r
112     }\r
113 \r
114     int alHeight = alignment.getHeight();\r
115 \r
116     SequenceI[] tmp = new SequenceI[alHeight + getSize()];\r
117     System.arraycopy(hiddenSequences, 0, tmp, 0, hiddenSequences.length);\r
118     hiddenSequences = tmp;\r
119   }\r
120 \r
121   public void hideSequence(SequenceI sequence)\r
122   {\r
123     if (hiddenSequences == null)\r
124     {\r
125       hiddenSequences = new SequenceI[alignment.getHeight()];\r
126     }\r
127 \r
128     int alignmentIndex = alignment.findIndex(sequence);\r
129     alignmentIndex = adjustForHiddenSeqs(alignmentIndex);\r
130 \r
131     if (hiddenSequences[alignmentIndex] != null)\r
132     {\r
133       System.out.println("ERROR!!!!!!!!!!!");\r
134     }\r
135 \r
136     hiddenSequences[alignmentIndex] = sequence;\r
137 \r
138     alignment.deleteSequence(sequence);\r
139   }\r
140 \r
141   public Vector showAll(Hashtable hiddenReps)\r
142   {\r
143     Vector revealedSeqs = new Vector();\r
144     for (int i = 0; i < hiddenSequences.length; i++)\r
145     {\r
146       if (hiddenSequences[i] != null)\r
147       {\r
148         Vector tmp = showSequence(i, hiddenReps);\r
149         for (int t = 0; t < tmp.size(); t++)\r
150         {\r
151           revealedSeqs.addElement(tmp.elementAt(t));\r
152         }\r
153       }\r
154     }\r
155     return revealedSeqs;\r
156   }\r
157 \r
158   public Vector showSequence(int alignmentIndex, Hashtable hiddenReps)\r
159   {\r
160     Vector revealedSeqs = new Vector();\r
161     SequenceI repSequence = alignment.getSequenceAt(alignmentIndex);\r
162     if (repSequence != null &&\r
163         hiddenReps != null\r
164         && hiddenReps.containsKey(repSequence))\r
165     {\r
166       hiddenReps.remove(repSequence);\r
167       revealedSeqs.addElement(repSequence);\r
168     }\r
169 \r
170     int start = adjustForHiddenSeqs(alignmentIndex - 1);\r
171     int end = adjustForHiddenSeqs(alignmentIndex);\r
172     if (end >= hiddenSequences.length)\r
173     {\r
174       end = hiddenSequences.length - 1;\r
175     }\r
176 \r
177     for (int index = end; index > start; index--)\r
178     {\r
179       SequenceI seq = hiddenSequences[index];\r
180       hiddenSequences[index] = null;\r
181 \r
182       if (seq != null)\r
183       {\r
184         if (seq.getLength() > 0)\r
185         {\r
186           revealedSeqs.addElement(seq);\r
187           alignment.getSequences().insertElementAt(seq, alignmentIndex);\r
188         }\r
189         else\r
190         {\r
191           System.out.println(seq.getName() + " has been deleted whilst hidden");\r
192         }\r
193       }\r
194 \r
195     }\r
196 \r
197     return revealedSeqs;\r
198   }\r
199 \r
200   public SequenceI getHiddenSequence(int alignmentIndex)\r
201   {\r
202     return hiddenSequences[alignmentIndex];\r
203   }\r
204 \r
205   public int findIndexWithoutHiddenSeqs(int alignmentIndex)\r
206   {\r
207     int index = 0;\r
208     int hiddenSeqs = 0;\r
209     if (hiddenSequences.length <= alignmentIndex)\r
210     {\r
211       alignmentIndex = hiddenSequences.length - 1;\r
212     }\r
213 \r
214     while (index <= alignmentIndex)\r
215     {\r
216       if (hiddenSequences[index] != null)\r
217       {\r
218         hiddenSeqs++;\r
219       }\r
220       index++;\r
221     }\r
222     ;\r
223 \r
224     return (alignmentIndex - hiddenSeqs);\r
225   }\r
226 \r
227   public int adjustForHiddenSeqs(int alignmentIndex)\r
228   {\r
229     int index = 0;\r
230     int hSize = hiddenSequences.length;\r
231     while (index <= alignmentIndex && index < hSize)\r
232     {\r
233       if (hiddenSequences[index] != null)\r
234       {\r
235         alignmentIndex++;\r
236       }\r
237       index++;\r
238     }\r
239     ;\r
240 \r
241     return alignmentIndex;\r
242   }\r
243 \r
244   public AlignmentI getFullAlignment()\r
245   {\r
246     int isize = hiddenSequences.length;\r
247     SequenceI[] seq = new Sequence[isize];\r
248 \r
249     int index = 0;\r
250     for (int i = 0; i < hiddenSequences.length; i++)\r
251     {\r
252       if (hiddenSequences[i] != null)\r
253       {\r
254         seq[i] = hiddenSequences[i];\r
255       }\r
256       else\r
257       {\r
258         seq[i] = alignment.getSequenceAt(index);\r
259         index++;\r
260       }\r
261     }\r
262 \r
263     return new Alignment(seq);\r
264   }\r
265 \r
266   public boolean isHidden(SequenceI seq)\r
267   {\r
268     for (int i = 0; i < hiddenSequences.length; i++)\r
269     {\r
270       if (hiddenSequences[i] != null && hiddenSequences[i] == seq)\r
271       {\r
272         return true;\r
273       }\r
274     }\r
275 \r
276     return false;\r
277   }\r
278 }\r