Hidden representatives moved from sequence to viewport
[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(Hashtable hiddenReps)\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, hiddenReps);\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, Hashtable hiddenReps)\r
140   {\r
141     Vector revealedSeqs = new Vector();\r
142     SequenceI repSequence = alignment.getSequenceAt(alignmentIndex);\r
143     if(repSequence !=null &&\r
144        hiddenReps!=null\r
145        && hiddenReps.containsKey(repSequence))\r
146     {\r
147       hiddenReps.remove(repSequence);\r
148       revealedSeqs.addElement(repSequence);\r
149     }\r
150 \r
151     int start = adjustForHiddenSeqs(alignmentIndex-1);\r
152     int end = adjustForHiddenSeqs(alignmentIndex);\r
153     if(end>=hiddenSequences.length)\r
154       end = hiddenSequences.length-1;\r
155 \r
156     for(int index = end; index > start; index--)\r
157     {\r
158       SequenceI seq =  hiddenSequences[index];\r
159       hiddenSequences[index] = null;\r
160 \r
161       if(seq!=null)\r
162       {\r
163         if(seq.getLength()>0)\r
164          {\r
165            revealedSeqs.addElement(seq);\r
166            alignment.getSequences().insertElementAt(seq, alignmentIndex);\r
167          }\r
168          else\r
169            System.out.println(seq.getName()+" has been deleted whilst hidden");\r
170       }\r
171 \r
172     }\r
173 \r
174     return revealedSeqs;\r
175   }\r
176 \r
177   public SequenceI getHiddenSequence(int alignmentIndex)\r
178   {\r
179     return hiddenSequences[alignmentIndex];\r
180   }\r
181 \r
182   public int findIndexWithoutHiddenSeqs(int alignmentIndex)\r
183   {\r
184     int index = 0;\r
185     int hiddenSeqs = 0;\r
186     if(hiddenSequences.length<=alignmentIndex)\r
187       alignmentIndex = hiddenSequences.length-1;\r
188 \r
189     while(index <= alignmentIndex)\r
190     {\r
191      if(hiddenSequences[index]!=null)\r
192      {\r
193        hiddenSeqs ++;\r
194      }\r
195       index ++;\r
196     };\r
197 \r
198     return (alignmentIndex - hiddenSeqs) ;\r
199   }\r
200 \r
201   public int adjustForHiddenSeqs(int alignmentIndex)\r
202   {\r
203     int index = 0;\r
204     int hSize = hiddenSequences.length;\r
205     while(index <= alignmentIndex && index<hSize)\r
206     {\r
207       if(hiddenSequences[index]!=null)\r
208       {\r
209         alignmentIndex ++;\r
210       }\r
211       index ++;\r
212     };\r
213 \r
214     return alignmentIndex ;\r
215   }\r
216 \r
217 \r
218   public AlignmentI getFullAlignment()\r
219   {\r
220     int isize = hiddenSequences.length;\r
221     SequenceI [] seq = new Sequence[isize];\r
222 \r
223     int index = 0;\r
224     for(int i=0; i<hiddenSequences.length; i++)\r
225     {\r
226       if(hiddenSequences[i]!=null)\r
227         seq[i] = hiddenSequences[i];\r
228       else\r
229       {\r
230         seq[i] = alignment.getSequenceAt(index);\r
231         index++;\r
232       }\r
233     }\r
234 \r
235     return new Alignment(seq);\r
236   }\r
237 \r
238   public boolean isHidden(SequenceI seq)\r
239   {\r
240     for(int i=0; i<hiddenSequences.length; i++)\r
241       if(hiddenSequences[i] !=null && hiddenSequences[i]==seq)\r
242         return true;\r
243 \r
244     return false;\r
245   }\r
246 }\r