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