patch to fix occasional arrayoutofbounds exception when working with hidden columns...
[jalview.git] / src / jalview / appletgui / PaintRefresher.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.4)
3  * Copyright (C) 2008 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 package jalview.appletgui;
20
21 import java.util.*;
22
23 import java.awt.*;
24
25 import jalview.datamodel.*;
26
27 /**
28  * DOCUMENT ME!
29  * 
30  * @author $author$
31  * @version $Revision$
32  */
33 public class PaintRefresher
34 {
35   static Hashtable components;
36
37   /**
38    * DOCUMENT ME!
39    * 
40    * @param comp
41    *                DOCUMENT ME!
42    * @param al
43    *                DOCUMENT ME!
44    */
45   public static void Register(Component comp, String seqSetId)
46   {
47     if (components == null)
48     {
49       components = new Hashtable();
50     }
51
52     if (components.containsKey(seqSetId))
53     {
54       Vector comps = (Vector) components.get(seqSetId);
55       if (!comps.contains(comp))
56       {
57         comps.addElement(comp);
58       }
59     }
60     else
61     {
62       Vector vcoms = new Vector();
63       vcoms.addElement(comp);
64       components.put(seqSetId, vcoms);
65     }
66   }
67
68   public static void RemoveComponent(Component comp)
69   {
70     if (components == null)
71     {
72       return;
73     }
74
75     Enumeration en = components.keys();
76     while (en.hasMoreElements())
77     {
78       String id = en.nextElement().toString();
79       Vector comps = (Vector) components.get(id);
80       comps.removeElement(comp);
81       if (comps.size() == 0)
82       {
83         components.remove(id);
84       }
85     }
86   }
87
88   public static void Refresh(Component source, String id)
89   {
90     Refresh(source, id, false, false);
91   }
92
93   public static void Refresh(Component source, String id,
94           boolean alignmentChanged, boolean validateSequences)
95   {
96     if (components == null)
97     {
98       return;
99     }
100
101     Component comp;
102     Vector comps = (Vector) components.get(id);
103
104     if (comps == null)
105     {
106       return;
107     }
108
109     Enumeration e = comps.elements();
110     while (e.hasMoreElements())
111     {
112       comp = (Component) e.nextElement();
113
114       if (comp == source)
115       {
116         continue;
117       }
118
119       if (!comp.isValid())
120       {
121         comps.removeElement(comp);
122       }
123       else if (validateSequences && comp instanceof AlignmentPanel
124               && source instanceof AlignmentPanel)
125       {
126         validateSequences(((AlignmentPanel) source).av.alignment,
127                 ((AlignmentPanel) comp).av.alignment);
128       }
129
130       if (comp instanceof AlignmentPanel && alignmentChanged)
131       {
132         ((AlignmentPanel) comp).alignmentChanged();
133       }
134
135       comp.repaint();
136     }
137   }
138
139   static void validateSequences(AlignmentI source, AlignmentI comp)
140   {
141     SequenceI[] a1;
142     if (source.getHiddenSequences().getSize() > 0)
143     {
144       a1 = source.getHiddenSequences().getFullAlignment()
145               .getSequencesArray();
146     }
147     else
148     {
149       a1 = source.getSequencesArray();
150     }
151
152     SequenceI[] a2;
153     if (comp.getHiddenSequences().getSize() > 0)
154     {
155       a2 = comp.getHiddenSequences().getFullAlignment().getSequencesArray();
156     }
157     else
158     {
159       a2 = comp.getSequencesArray();
160     }
161
162     int i, iSize = a1.length, j, jSize = a2.length;
163
164     if (iSize == jSize)
165     {
166       return;
167     }
168
169     boolean exists = false;
170     for (i = 0; i < iSize; i++)
171     {
172       exists = false;
173
174       for (j = 0; j < jSize; j++)
175       {
176         if (a2[j] == a1[i])
177         {
178           exists = true;
179           break;
180         }
181       }
182
183       if (!exists)
184       {
185         if (i < comp.getHeight())
186         {
187           comp.getSequences().insertElementAt(a1[i], i);
188         }
189         else
190         {
191           comp.addSequence(a1[i]);
192         }
193
194         if (comp.getHiddenSequences().getSize() > 0)
195         {
196           a2 = comp.getHiddenSequences().getFullAlignment()
197                   .getSequencesArray();
198         }
199         else
200         {
201           a2 = comp.getSequencesArray();
202         }
203
204         jSize = a2.length;
205       }
206     }
207
208     iSize = a1.length;
209     jSize = a2.length;
210
211     for (j = 0; j < jSize; j++)
212     {
213       exists = false;
214       for (i = 0; i < iSize; i++)
215       {
216         if (a2[j] == a1[i])
217         {
218           exists = true;
219           break;
220         }
221       }
222
223       if (!exists)
224       {
225         comp.deleteSequence(a2[j]);
226       }
227     }
228   }
229 }