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