be7dbe209481c7a6c6e1ee36fc14581bc47e7071
[jalview.git] / src / jalview / datamodel / HiddenSequences.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer
3  * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
18  */
19
20 package jalview.datamodel;
21
22 import java.util.*;
23
24 public class HiddenSequences
25 {
26   Hashtable hiddenSequences;
27   AlignmentI alignment;
28
29   public HiddenSequences(AlignmentI al)
30   {
31     alignment = al;
32   }
33
34   public int getSize()
35   {
36     return hiddenSequences == null ? 0 : hiddenSequences.size();
37   }
38
39   public int getWidth()
40   {
41     Enumeration en = hiddenSequences.elements();
42     int width = 0;
43     while(en.hasMoreElements())
44     {
45       SequenceI seq = (SequenceI)en.nextElement();
46       if(seq.getLength()>width)
47         width = seq.getLength();
48     }
49     return width;
50   }
51
52   public void hideSequence(SequenceI sequence)
53   {
54     if(hiddenSequences==null)
55       hiddenSequences = new Hashtable();
56
57     int alignmentIndex = alignment.findIndex(sequence);
58     alignmentIndex = adjustForHiddenSeqs(alignmentIndex);
59
60     hiddenSequences.put(new Integer(alignmentIndex), sequence);
61
62     alignment.deleteSequence(sequence);
63   }
64
65   public Vector showAll()
66   {
67    Vector revealedSeqs = new Vector();
68    for(int i=0; i<alignment.getHeight()+hiddenSequences.size(); i++)
69     {
70       Vector tmp = showSequence(i);
71       for(int t=0; t<tmp.size(); t++)
72         revealedSeqs.addElement(tmp.elementAt(t));
73     }
74     return revealedSeqs;
75   }
76
77   public Vector showSequence(int alignmentIndex)
78   {
79     Vector revealedSeqs = new Vector();
80     SequenceI repSequence = alignment.getSequenceAt(alignmentIndex);
81     if(repSequence!=null
82        && repSequence.getHiddenSequences()==null
83        && alignmentIndex>0)
84       repSequence = alignment.getSequenceAt(alignmentIndex-1);
85
86     if(repSequence!=null
87        && repSequence.getHiddenSequences()==null)
88       repSequence = null;
89
90     int start = adjustForHiddenSeqs(alignmentIndex-1);
91     int end = adjustForHiddenSeqs(alignmentIndex);
92
93     for(int index = end; index > start; index--)
94     {
95       SequenceI seq =  (SequenceI)hiddenSequences.remove(new Integer(
96           index));
97
98
99       if(seq!=null)
100       {
101         revealedSeqs.addElement(seq);
102         alignment.getSequences().insertElementAt(seq, alignmentIndex);
103         if(repSequence!=null)
104         {
105           repSequence.showHiddenSequence(seq);
106         }
107       }
108     }
109
110     return revealedSeqs;
111   }
112
113   public Hashtable getHiddenSequences()
114   {
115     return hiddenSequences;
116   }
117
118   public SequenceI getHiddenSequence(int alignmentIndex)
119   {
120     return (SequenceI)hiddenSequences.get(new Integer(alignmentIndex));
121   }
122
123   public int findIndexWithoutHiddenSeqs(int alignmentIndex)
124   {
125     int index = 0;
126     int hiddenSeqs = 0;
127     while(index <= alignmentIndex)
128     {
129      if(hiddenSequences.containsKey(new Integer(index)))
130      {
131        hiddenSeqs ++;
132      }
133       index ++;
134     };
135
136     return (alignmentIndex - hiddenSeqs) ;
137   }
138
139   public int adjustForHiddenSeqs(int alignmentIndex)
140   {
141     int index = 0;
142     while(index <= alignmentIndex)
143     {
144      if(hiddenSequences.containsKey(new Integer(index)))
145      {
146        alignmentIndex ++;
147      }
148       index ++;
149     };
150
151     return alignmentIndex ;
152   }
153
154   public AlignmentI getFullAlignment()
155   {
156     int isize = alignment.getHeight()+hiddenSequences.size();
157     SequenceI [] seq = new Sequence[isize];
158
159     Enumeration en = hiddenSequences.keys();
160     while(en.hasMoreElements())
161     {
162       Integer key = (Integer)en.nextElement();
163       seq[key.intValue()] = (SequenceI)hiddenSequences.get(key);
164     }
165
166     int index = 0;
167     for(int i=0; i<isize; i++)
168     {
169       if(seq[i]!=null)
170       {
171         continue;
172       }
173
174       seq[i] = alignment.getSequenceAt(index);
175       index++;
176     }
177
178     return new Alignment(seq);
179   }
180
181   public boolean isHidden(SequenceI seq)
182   {
183     return hiddenSequences.contains(seq);
184   }
185 }