JAL-1807 still testing
[jalviewjs.git] / unused / appletgui / PaintRefresher.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)\r
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors\r
4  * \r
5  * This file is part of Jalview.\r
6  * \r
7  * Jalview is free software: you can redistribute it and/or\r
8  * modify it under the terms of the GNU General Public License \r
9  * as published by the Free Software Foundation, either version 3\r
10  * of the License, or (at your option) any later version.\r
11  *  \r
12  * Jalview is distributed in the hope that it will be useful, but \r
13  * WITHOUT ANY WARRANTY; without even the implied warranty \r
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR \r
15  * PURPOSE.  See the GNU General Public License for more details.\r
16  * \r
17  * You should have received a copy of the GNU General Public License\r
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.\r
19  * The Jalview Authors are detailed in the 'AUTHORS' file.\r
20  */\r
21 package jalview.appletgui;\r
22 \r
23 import jalview.datamodel.AlignmentI;\r
24 import jalview.datamodel.SequenceI;\r
25 \r
26 import java.awt.Component;\r
27 import java.util.Enumeration;\r
28 import java.util.Hashtable;\r
29 import java.util.List;\r
30 import java.util.Vector;\r
31 \r
32 /**\r
33  * DOCUMENT ME!\r
34  * \r
35  * @author $author$\r
36  * @version $Revision$\r
37  */\r
38 public class PaintRefresher\r
39 {\r
40   static Hashtable components;\r
41 \r
42   /**\r
43    * DOCUMENT ME!\r
44    * \r
45    * @param comp\r
46    *          DOCUMENT ME!\r
47    * @param al\r
48    *          DOCUMENT ME!\r
49    */\r
50   public static void Register(Component comp, String seqSetId)\r
51   {\r
52     if (components == null)\r
53     {\r
54       components = new Hashtable();\r
55     }\r
56 \r
57     if (components.containsKey(seqSetId))\r
58     {\r
59       Vector comps = (Vector) components.get(seqSetId);\r
60       if (!comps.contains(comp))\r
61       {\r
62         comps.addElement(comp);\r
63       }\r
64     }\r
65     else\r
66     {\r
67       Vector vcoms = new Vector();\r
68       vcoms.addElement(comp);\r
69       components.put(seqSetId, vcoms);\r
70     }\r
71   }\r
72 \r
73   public static void RemoveComponent(Component comp)\r
74   {\r
75     if (components == null)\r
76     {\r
77       return;\r
78     }\r
79 \r
80     Enumeration en = components.keys();\r
81     while (en.hasMoreElements())\r
82     {\r
83       String id = en.nextElement().toString();\r
84       Vector comps = (Vector) components.get(id);\r
85       comps.removeElement(comp);\r
86       if (comps.size() == 0)\r
87       {\r
88         components.remove(id);\r
89       }\r
90     }\r
91   }\r
92 \r
93   public static void Refresh(Component source, String id)\r
94   {\r
95     Refresh(source, id, false, false);\r
96   }\r
97 \r
98   public static void Refresh(Component source, String id,\r
99           boolean alignmentChanged, boolean validateSequences)\r
100   {\r
101     if (components == null)\r
102     {\r
103       return;\r
104     }\r
105 \r
106     Component comp;\r
107     Vector comps = (Vector) components.get(id);\r
108 \r
109     if (comps == null)\r
110     {\r
111       return;\r
112     }\r
113 \r
114     Enumeration e = comps.elements();\r
115     while (e.hasMoreElements())\r
116     {\r
117       comp = (Component) e.nextElement();\r
118 \r
119       if (comp == source)\r
120       {\r
121         continue;\r
122       }\r
123 \r
124       if (!comp.isValid())\r
125       {\r
126         comps.removeElement(comp);\r
127       }\r
128       else if (validateSequences && comp instanceof AlignmentPanel\r
129               && source instanceof AlignmentPanel)\r
130       {\r
131         validateSequences(((AlignmentPanel) source).av.getAlignment(),\r
132                 ((AlignmentPanel) comp).av.getAlignment());\r
133       }\r
134 \r
135       if (comp instanceof AlignmentPanel && alignmentChanged)\r
136       {\r
137         ((AlignmentPanel) comp).alignmentChanged();\r
138       }\r
139 \r
140       comp.repaint();\r
141     }\r
142   }\r
143 \r
144   static void validateSequences(AlignmentI source, AlignmentI comp)\r
145   {\r
146     SequenceI[] a1;\r
147     if (source.getHiddenSequences().getSize() > 0)\r
148     {\r
149       a1 = source.getHiddenSequences().getFullAlignment()\r
150               .getSequencesArray();\r
151     }\r
152     else\r
153     {\r
154       a1 = source.getSequencesArray();\r
155     }\r
156 \r
157     SequenceI[] a2;\r
158     if (comp.getHiddenSequences().getSize() > 0)\r
159     {\r
160       a2 = comp.getHiddenSequences().getFullAlignment().getSequencesArray();\r
161     }\r
162     else\r
163     {\r
164       a2 = comp.getSequencesArray();\r
165     }\r
166 \r
167     int i, iSize = a1.length, j, jSize = a2.length;\r
168 \r
169     if (iSize == jSize)\r
170     {\r
171       return;\r
172     }\r
173 \r
174     boolean exists = false;\r
175     for (i = 0; i < iSize; i++)\r
176     {\r
177       exists = false;\r
178 \r
179       for (j = 0; j < jSize; j++)\r
180       {\r
181         if (a2[j] == a1[i])\r
182         {\r
183           exists = true;\r
184           break;\r
185         }\r
186       }\r
187 \r
188       if (!exists)\r
189       {\r
190         if (i < comp.getHeight())\r
191         {\r
192           // TODO: the following does not trigger any recalculation of\r
193           // height/etc, or maintain the dataset\r
194           List<SequenceI> alsq;\r
195           synchronized (alsq = comp.getSequences())\r
196           {\r
197             alsq.add(i, a1[i]);\r
198           }\r
199         }\r
200         else\r
201         {\r
202           comp.addSequence(a1[i]);\r
203         }\r
204 \r
205         if (comp.getHiddenSequences().getSize() > 0)\r
206         {\r
207           a2 = comp.getHiddenSequences().getFullAlignment()\r
208                   .getSequencesArray();\r
209         }\r
210         else\r
211         {\r
212           a2 = comp.getSequencesArray();\r
213         }\r
214 \r
215         jSize = a2.length;\r
216       }\r
217     }\r
218 \r
219     iSize = a1.length;\r
220     jSize = a2.length;\r
221 \r
222     for (j = 0; j < jSize; j++)\r
223     {\r
224       exists = false;\r
225       for (i = 0; i < iSize; i++)\r
226       {\r
227         if (a2[j] == a1[i])\r
228         {\r
229           exists = true;\r
230           break;\r
231         }\r
232       }\r
233 \r
234       if (!exists)\r
235       {\r
236         comp.deleteSequence(a2[j]);\r
237       }\r
238     }\r
239   }\r
240 \r
241   public static AlignmentPanel[] getAssociatedPanels(String id)\r
242   {\r
243     Vector comps = (Vector) components.get(id);\r
244     Vector tmp = new Vector();\r
245     int i, iSize = comps.size();\r
246     for (i = 0; i < iSize; i++)\r
247     {\r
248       if (comps.elementAt(i) instanceof AlignmentPanel)\r
249       {\r
250         tmp.addElement(comps.elementAt(i));\r
251       }\r
252     }\r
253     AlignmentPanel[] result = new AlignmentPanel[tmp.size()];\r
254     for (int ix = 0; ix < result.length; ix++)\r
255     {\r
256       result[ix] = (AlignmentPanel) tmp.elementAt(ix);\r
257     }\r
258 \r
259     return result;\r
260   }\r
261 \r
262 }\r