ColumnSelection moved to datamodel
[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 void showAll()\r
66   {\r
67    for(int i=0; i<alignment.getHeight()+hiddenSequences.size(); i++)\r
68      showSequence(i);\r
69   }\r
70 \r
71   public void showSequence(int alignmentIndex)\r
72   {\r
73     SequenceI repSequence = alignment.getSequenceAt(alignmentIndex);\r
74     if(repSequence!=null\r
75        && repSequence.getHiddenSequences()==null\r
76        && alignmentIndex>0)\r
77       repSequence = alignment.getSequenceAt(alignmentIndex-1);\r
78 \r
79     if(repSequence!=null\r
80        && repSequence.getHiddenSequences()==null)\r
81       repSequence = null;\r
82 \r
83     int start = adjustForHiddenSeqs(alignmentIndex-1);\r
84     int end = adjustForHiddenSeqs(alignmentIndex);\r
85 \r
86     for(int index = end; index > start; index--)\r
87     {\r
88       SequenceI seq =  (SequenceI)hiddenSequences.remove(new Integer(\r
89           index));\r
90 \r
91       if(seq!=null)\r
92       {\r
93         alignment.getSequences().insertElementAt(seq, alignmentIndex);\r
94         if(repSequence!=null)\r
95         {\r
96           repSequence.showHiddenSequence(seq);\r
97         }\r
98       }\r
99     }\r
100   }\r
101 \r
102   public Hashtable getHiddenSequences()\r
103   {\r
104     return hiddenSequences;\r
105   }\r
106 \r
107   public SequenceI getHiddenSequence(int alignmentIndex)\r
108   {\r
109     return (SequenceI)hiddenSequences.get(new Integer(alignmentIndex));\r
110   }\r
111 \r
112   public int findIndexWithoutHiddenSeqs(int alignmentIndex)\r
113   {\r
114     int index = 0;\r
115     int hiddenSeqs = 0;\r
116     while(index <= alignmentIndex)\r
117     {\r
118      if(hiddenSequences.containsKey(new Integer(index)))\r
119      {\r
120        hiddenSeqs ++;\r
121      }\r
122       index ++;\r
123     };\r
124 \r
125     return (alignmentIndex - hiddenSeqs) ;\r
126   }\r
127 \r
128   public int adjustForHiddenSeqs(int alignmentIndex)\r
129   {\r
130     int index = 0;\r
131     while(index <= alignmentIndex)\r
132     {\r
133      if(hiddenSequences.containsKey(new Integer(index)))\r
134      {\r
135        alignmentIndex ++;\r
136      }\r
137       index ++;\r
138     };\r
139 \r
140     return alignmentIndex ;\r
141   }\r
142 \r
143   public AlignmentI getFullAlignment()\r
144   {\r
145     int isize = alignment.getHeight()+hiddenSequences.size();\r
146     SequenceI [] seq = new Sequence[isize];\r
147 \r
148     Enumeration en = hiddenSequences.keys();\r
149     while(en.hasMoreElements())\r
150     {\r
151       Integer key = (Integer)en.nextElement();\r
152       seq[key.intValue()] = (SequenceI)hiddenSequences.get(key);\r
153     }\r
154 \r
155     int index = 0;\r
156     for(int i=0; i<isize; i++)\r
157     {\r
158       if(seq[i]!=null)\r
159       {\r
160         continue;\r
161       }\r
162 \r
163       seq[i] = alignment.getSequenceAt(index);\r
164       index++;\r
165     }\r
166 \r
167     return new Alignment(seq);\r
168   }\r
169 \r
170   public boolean isHidden(SequenceI seq)\r
171   {\r
172     return hiddenSequences.contains(seq);\r
173   }\r
174 }\r