Check if hiddenSequence has been deleted
[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");\r
171          if (repSequence != null)\r
172          {\r
173            repSequence.showHiddenSequence(seq);\r
174          }\r
175       }\r
176 \r
177     }\r
178 \r
179     return revealedSeqs;\r
180   }\r
181 \r
182   public SequenceI getHiddenSequence(int alignmentIndex)\r
183   {\r
184     return hiddenSequences[alignmentIndex];\r
185   }\r
186 \r
187   public int findIndexWithoutHiddenSeqs(int alignmentIndex)\r
188   {\r
189     int index = 0;\r
190     int hiddenSeqs = 0;\r
191     if(hiddenSequences.length<=alignmentIndex)\r
192       alignmentIndex = hiddenSequences.length-1;\r
193 \r
194     while(index <= alignmentIndex)\r
195     {\r
196      if(hiddenSequences[index]!=null)\r
197      {\r
198        hiddenSeqs ++;\r
199      }\r
200       index ++;\r
201     };\r
202 \r
203     return (alignmentIndex - hiddenSeqs) ;\r
204   }\r
205 \r
206   public int adjustForHiddenSeqs(int alignmentIndex)\r
207   {\r
208     int index = 0;\r
209     int hSize = hiddenSequences.length;\r
210     while(index <= alignmentIndex && index<hSize)\r
211     {\r
212       if(hiddenSequences[index]!=null)\r
213       {\r
214         alignmentIndex ++;\r
215       }\r
216       index ++;\r
217     };\r
218 \r
219     return alignmentIndex ;\r
220   }\r
221 \r
222 \r
223   public AlignmentI getFullAlignment()\r
224   {\r
225     int isize = hiddenSequences.length;\r
226     SequenceI [] seq = new Sequence[isize];\r
227 \r
228     int index = 0;\r
229     for(int i=0; i<hiddenSequences.length; i++)\r
230     {\r
231       if(hiddenSequences[i]!=null)\r
232         seq[i] = hiddenSequences[i];\r
233       else\r
234       {\r
235         seq[i] = alignment.getSequenceAt(index);\r
236         index++;\r
237       }\r
238     }\r
239 \r
240     return new Alignment(seq);\r
241   }\r
242 \r
243   public boolean isHidden(SequenceI seq)\r
244   {\r
245     for(int i=0; i<hiddenSequences.length; i++)\r
246       if(hiddenSequences[i] !=null && hiddenSequences[i]==seq)\r
247         return true;\r
248 \r
249     return false;\r
250   }\r
251 }\r