recovery of identical dataset sequence object on undo (rather than creation of a...
[jalview.git] / src / jalview / appletgui / 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.appletgui;\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.removeElement(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 (!comp.isValid())\r
120       {\r
121         comps.removeElement(comp);\r
122       }\r
123       else if (validateSequences\r
124                && comp instanceof AlignmentPanel\r
125                && source instanceof AlignmentPanel)\r
126       {\r
127         validateSequences( ( (AlignmentPanel) source).av.alignment,\r
128                           ( (AlignmentPanel) comp).av.alignment);\r
129       }\r
130 \r
131       if (comp instanceof AlignmentPanel && alignmentChanged)\r
132       {\r
133         ( (AlignmentPanel) comp).alignmentChanged();\r
134       }\r
135 \r
136       comp.repaint();\r
137     }\r
138   }\r
139 \r
140   static void validateSequences(AlignmentI source, AlignmentI comp)\r
141   {\r
142     SequenceI[] a1;\r
143     if (source.getHiddenSequences().getSize() > 0)\r
144     {\r
145       a1 = source.getHiddenSequences().getFullAlignment().getSequencesArray();\r
146     }\r
147     else\r
148     {\r
149       a1 = source.getSequencesArray();\r
150     }\r
151 \r
152     SequenceI[] a2;\r
153     if (comp.getHiddenSequences().getSize() > 0)\r
154     {\r
155       a2 = comp.getHiddenSequences().getFullAlignment().getSequencesArray();\r
156     }\r
157     else\r
158     {\r
159       a2 = comp.getSequencesArray();\r
160     }\r
161 \r
162     int i, iSize = a1.length, j, jSize = a2.length;\r
163 \r
164     if (iSize == jSize)\r
165     {\r
166       return;\r
167     }\r
168 \r
169     boolean exists = false;\r
170     for (i = 0; i < iSize; i++)\r
171     {\r
172       exists = false;\r
173 \r
174       for (j = 0; j < jSize; j++)\r
175       {\r
176         if (a2[j] == a1[i])\r
177         {\r
178           exists = true;\r
179           break;\r
180         }\r
181       }\r
182 \r
183       if (!exists)\r
184       {\r
185         if (i < comp.getHeight())\r
186         {\r
187           comp.getSequences().insertElementAt(a1[i], i);\r
188         }\r
189         else\r
190         {\r
191           comp.addSequence(a1[i]);\r
192         }\r
193 \r
194         if (comp.getHiddenSequences().getSize() > 0)\r
195         {\r
196           a2 = comp.getHiddenSequences().getFullAlignment().getSequencesArray();\r
197         }\r
198         else\r
199         {\r
200           a2 = comp.getSequencesArray();\r
201         }\r
202 \r
203         jSize = a2.length;\r
204       }\r
205     }\r
206 \r
207     iSize = a1.length;\r
208     jSize = a2.length;\r
209 \r
210     for (j = 0; j < jSize; j++)\r
211     {\r
212       exists = false;\r
213       for (i = 0; i < iSize; i++)\r
214       {\r
215         if (a2[j] == a1[i])\r
216         {\r
217           exists = true;\r
218           break;\r
219         }\r
220       }\r
221 \r
222       if (!exists)\r
223       {\r
224         comp.deleteSequence(a2[j]);\r
225       }\r
226     }\r
227   }\r
228 }\r