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