014f076492e2be2ba69427e874a68ddf19cb2cc9
[jalview.git] / src / jalview / gui / PaintRefresher.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
3  * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
10  *  
11  * Jalview is distributed in the hope that it will be useful, but 
12  * WITHOUT ANY WARRANTY; without even the implied warranty 
13  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
14  * PURPOSE.  See the GNU General Public License for more details.
15  * 
16  * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
17  */
18 package jalview.gui;
19
20 import java.util.*;
21 import java.util.List;
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.remove(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 (validateSequences && comp instanceof AlignmentPanel
120               && source instanceof AlignmentPanel)
121       {
122         validateSequences(((AlignmentPanel) source).av.getAlignment(),
123                 ((AlignmentPanel) comp).av.getAlignment());
124       }
125
126       if (comp instanceof AlignmentPanel && alignmentChanged)
127       {
128         ((AlignmentPanel) comp).alignmentChanged();
129       }
130
131       comp.repaint();
132     }
133   }
134
135   static void validateSequences(AlignmentI source, AlignmentI comp)
136   {
137     SequenceI[] a1;
138     if (source.getHiddenSequences().getSize() > 0)
139     {
140       a1 = source.getHiddenSequences().getFullAlignment()
141               .getSequencesArray();
142     }
143     else
144     {
145       a1 = source.getSequencesArray();
146     }
147
148     SequenceI[] a2;
149     if (comp.getHiddenSequences().getSize() > 0)
150     {
151       a2 = comp.getHiddenSequences().getFullAlignment().getSequencesArray();
152     }
153     else
154     {
155       a2 = comp.getSequencesArray();
156     }
157
158     int i, iSize = a1.length, j, jSize = a2.length;
159
160     if (iSize == jSize)
161     {
162       return;
163     }
164
165     boolean exists = false;
166     for (i = 0; i < iSize; i++)
167     {
168       exists = false;
169
170       for (j = 0; j < jSize; j++)
171       {
172         if (a2[j] == a1[i])
173         {
174           exists = true;
175           break;
176         }
177       }
178
179       if (!exists)
180       {
181         if (i < comp.getHeight())
182         {
183           // TODO: the following does not trigger any recalculation of
184           // height/etc, or maintain the dataset
185           if (comp.getDataset() != source.getDataset())
186           {
187             // raise an implementation warning here - not sure if this situation
188             // will ever occur
189             System.err
190                     .println("IMPLEMENTATION PROBLEM: DATASET out of sync due to an insert whilst calling PaintRefresher.validateSequences(AlignmentI, ALignmentI)");
191           }
192           List<SequenceI> alsq;
193           synchronized (alsq = comp.getSequences())
194           {
195             alsq.add(i, a1[i]);
196           }
197         }
198         else
199         {
200           comp.addSequence(a1[i]);
201         }
202
203         if (comp.getHiddenSequences().getSize() > 0)
204         {
205           a2 = comp.getHiddenSequences().getFullAlignment()
206                   .getSequencesArray();
207         }
208         else
209         {
210           a2 = comp.getSequencesArray();
211         }
212
213         jSize = a2.length;
214       }
215     }
216
217     iSize = a1.length;
218     jSize = a2.length;
219
220     for (j = 0; j < jSize; j++)
221     {
222       exists = false;
223       for (i = 0; i < iSize; i++)
224       {
225         if (a2[j] == a1[i])
226         {
227           exists = true;
228           break;
229         }
230       }
231
232       if (!exists)
233       {
234         comp.deleteSequence(a2[j]);
235       }
236     }
237   }
238
239   static AlignmentPanel[] getAssociatedPanels(String id)
240   {
241     if (components == null)
242     {
243       return new AlignmentPanel[0];
244     }
245     ;
246     Vector comps = (Vector) components.get(id);
247     if (comps == null)
248     {
249       return new AlignmentPanel[0];
250     }
251     ;
252     Vector tmp = new Vector();
253     int i, iSize = comps.size();
254     for (i = 0; i < iSize; i++)
255     {
256       if (comps.elementAt(i) instanceof AlignmentPanel)
257       {
258         tmp.addElement(comps.elementAt(i));
259       }
260     }
261     AlignmentPanel[] result = new AlignmentPanel[tmp.size()];
262     tmp.toArray(result);
263
264     return result;
265   }
266
267 }