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