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