Select revealed seqs
[jalview.git] / src / jalview / datamodel / HiddenSequences.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2005 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   Hashtable 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     return hiddenSequences == null ? 0 : hiddenSequences.size();\r
37   }\r
38 \r
39   public int getWidth()\r
40   {\r
41     Enumeration en = hiddenSequences.elements();\r
42     int width = 0;\r
43     while(en.hasMoreElements())\r
44     {\r
45       SequenceI seq = (SequenceI)en.nextElement();\r
46       if(seq.getLength()>width)\r
47         width = seq.getLength();\r
48     }\r
49     return width;\r
50   }\r
51 \r
52   public void hideSequence(SequenceI sequence)\r
53   {\r
54     if(hiddenSequences==null)\r
55       hiddenSequences = new Hashtable();\r
56 \r
57     int alignmentIndex = alignment.findIndex(sequence);\r
58     alignmentIndex = adjustForHiddenSeqs(alignmentIndex);\r
59 \r
60     hiddenSequences.put(new Integer(alignmentIndex), sequence);\r
61 \r
62     alignment.deleteSequence(sequence);\r
63   }\r
64 \r
65   public Vector showAll()\r
66   {\r
67    Vector revealedSeqs = new Vector();\r
68    for(int i=0; i<alignment.getHeight()+hiddenSequences.size(); i++)\r
69     {\r
70       Vector tmp = showSequence(i);\r
71       for(int t=0; t<tmp.size(); t++)\r
72         revealedSeqs.addElement(tmp.elementAt(t));\r
73     }\r
74     return revealedSeqs;\r
75   }\r
76 \r
77   public Vector showSequence(int alignmentIndex)\r
78   {\r
79     Vector revealedSeqs = new Vector();\r
80     SequenceI repSequence = alignment.getSequenceAt(alignmentIndex);\r
81     if(repSequence!=null\r
82        && repSequence.getHiddenSequences()==null\r
83        && alignmentIndex>0)\r
84       repSequence = alignment.getSequenceAt(alignmentIndex-1);\r
85 \r
86     if(repSequence!=null\r
87        && repSequence.getHiddenSequences()==null)\r
88       repSequence = null;\r
89 \r
90     int start = adjustForHiddenSeqs(alignmentIndex-1);\r
91     int end = adjustForHiddenSeqs(alignmentIndex);\r
92 \r
93     for(int index = end; index > start; index--)\r
94     {\r
95       SequenceI seq =  (SequenceI)hiddenSequences.remove(new Integer(\r
96           index));\r
97 \r
98 \r
99       if(seq!=null)\r
100       {\r
101         revealedSeqs.addElement(seq);\r
102         alignment.getSequences().insertElementAt(seq, alignmentIndex);\r
103         if(repSequence!=null)\r
104         {\r
105           repSequence.showHiddenSequence(seq);\r
106         }\r
107       }\r
108     }\r
109 \r
110     return revealedSeqs;\r
111   }\r
112 \r
113   public Hashtable getHiddenSequences()\r
114   {\r
115     return hiddenSequences;\r
116   }\r
117 \r
118   public SequenceI getHiddenSequence(int alignmentIndex)\r
119   {\r
120     return (SequenceI)hiddenSequences.get(new Integer(alignmentIndex));\r
121   }\r
122 \r
123   public int findIndexWithoutHiddenSeqs(int alignmentIndex)\r
124   {\r
125     int index = 0;\r
126     int hiddenSeqs = 0;\r
127     while(index <= alignmentIndex)\r
128     {\r
129      if(hiddenSequences.containsKey(new Integer(index)))\r
130      {\r
131        hiddenSeqs ++;\r
132      }\r
133       index ++;\r
134     };\r
135 \r
136     return (alignmentIndex - hiddenSeqs) ;\r
137   }\r
138 \r
139   public int adjustForHiddenSeqs(int alignmentIndex)\r
140   {\r
141     int index = 0;\r
142     while(index <= alignmentIndex)\r
143     {\r
144      if(hiddenSequences.containsKey(new Integer(index)))\r
145      {\r
146        alignmentIndex ++;\r
147      }\r
148       index ++;\r
149     };\r
150 \r
151     return alignmentIndex ;\r
152   }\r
153 \r
154   public AlignmentI getFullAlignment()\r
155   {\r
156     int isize = alignment.getHeight()+hiddenSequences.size();\r
157     SequenceI [] seq = new Sequence[isize];\r
158 \r
159     Enumeration en = hiddenSequences.keys();\r
160     while(en.hasMoreElements())\r
161     {\r
162       Integer key = (Integer)en.nextElement();\r
163       seq[key.intValue()] = (SequenceI)hiddenSequences.get(key);\r
164     }\r
165 \r
166     int index = 0;\r
167     for(int i=0; i<isize; i++)\r
168     {\r
169       if(seq[i]!=null)\r
170       {\r
171         continue;\r
172       }\r
173 \r
174       seq[i] = alignment.getSequenceAt(index);\r
175       index++;\r
176     }\r
177 \r
178     return new Alignment(seq);\r
179   }\r
180 \r
181   public boolean isHidden(SequenceI seq)\r
182   {\r
183     return hiddenSequences.contains(seq);\r
184   }\r
185 }\r