Formatting
[jalview.git] / src / jalview / gui / UserDefinedColours.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.io.*;\r
22 import java.util.*;\r
23 \r
24 import java.awt.*;\r
25 import java.awt.event.*;\r
26 import javax.swing.*;\r
27 import javax.swing.event.*;\r
28 \r
29 import jalview.datamodel.*;\r
30 import jalview.io.*;\r
31 import jalview.jbgui.*;\r
32 import jalview.schemes.*;\r
33 \r
34 /**\r
35  * DOCUMENT ME!\r
36  *\r
37  * @author $author$\r
38  * @version $Revision$\r
39  */\r
40 public class UserDefinedColours\r
41     extends GUserDefinedColours implements ChangeListener\r
42 {\r
43   AlignmentPanel ap;\r
44   SequenceGroup seqGroup;\r
45   Vector selectedButtons;\r
46   ColourSchemeI oldColourScheme;\r
47   JInternalFrame frame;\r
48   MCview.PDBCanvas pdbcanvas;\r
49   Vector upperCaseButtons;\r
50   Vector lowerCaseButtons;\r
51 \r
52   /**\r
53    * Creates a new UserDefinedColours object.\r
54    *\r
55    * @param ap DOCUMENT ME!\r
56    * @param sg DOCUMENT ME!\r
57    */\r
58   public UserDefinedColours(AlignmentPanel ap, SequenceGroup sg)\r
59   {\r
60     super();\r
61 \r
62     lcaseColour.setEnabled(false);\r
63 \r
64     this.ap = ap;\r
65     seqGroup = sg;\r
66 \r
67     if (seqGroup != null)\r
68     {\r
69       oldColourScheme = seqGroup.cs;\r
70     }\r
71     else\r
72     {\r
73       oldColourScheme = ap.av.getGlobalColourScheme();\r
74     }\r
75 \r
76     if (oldColourScheme instanceof UserColourScheme)\r
77     {\r
78       schemeName.setText( ( (UserColourScheme) oldColourScheme).getName());\r
79       if ( ( (UserColourScheme) oldColourScheme).getLowerCaseColours() != null)\r
80       {\r
81         caseSensitive.setSelected(true);\r
82         lcaseColour.setEnabled(true);\r
83         resetButtonPanel(true);\r
84       }\r
85       else\r
86       {\r
87         resetButtonPanel(false);\r
88       }\r
89     }\r
90     else\r
91     {\r
92       resetButtonPanel(false);\r
93     }\r
94 \r
95     showFrame();\r
96   }\r
97 \r
98   public UserDefinedColours(MCview.PDBCanvas pdb, ColourSchemeI oldcs)\r
99   {\r
100     super();\r
101     pdbcanvas = pdb;\r
102 \r
103     colorChooser.getSelectionModel().addChangeListener(this);\r
104 \r
105     oldColourScheme = oldcs;\r
106 \r
107     if (oldColourScheme instanceof UserColourScheme)\r
108     {\r
109       schemeName.setText( ( (UserColourScheme) oldColourScheme).getName());\r
110     }\r
111 \r
112     resetButtonPanel(false);\r
113 \r
114     showFrame();\r
115 \r
116   }\r
117 \r
118   void showFrame()\r
119   {\r
120     colorChooser.getSelectionModel().addChangeListener(this);\r
121     frame = new JInternalFrame();\r
122     frame.setContentPane(this);\r
123     Desktop.addInternalFrame(frame, "User Defined Colours", 720, 370, true);\r
124 \r
125     if (seqGroup != null)\r
126     {\r
127       frame.setTitle(frame.getTitle() + " (" + seqGroup.getName() + ")");\r
128     }\r
129 \r
130     if (System.getProperty("os.name").startsWith("Mac"))\r
131     {\r
132       frame.setSize(760, 370);\r
133     }\r
134   }\r
135 \r
136   void resetButtonPanel(boolean caseSensitive)\r
137   {\r
138     buttonPanel.removeAll();\r
139 \r
140     if (upperCaseButtons == null)\r
141     {\r
142       upperCaseButtons = new Vector();\r
143     }\r
144 \r
145     JButton button;\r
146     String label;\r
147     for (int i = 0; i < 20; i++)\r
148     {\r
149       if (caseSensitive)\r
150       {\r
151         label = ResidueProperties.aa[i];\r
152       }\r
153       else\r
154       {\r
155         label = ResidueProperties.aa2Triplet.get\r
156             (ResidueProperties.aa[i]).toString();\r
157       }\r
158 \r
159       button = makeButton(label,\r
160                           ResidueProperties.aa[i],\r
161                           upperCaseButtons, i);\r
162 \r
163       buttonPanel.add(button);\r
164     }\r
165 \r
166     buttonPanel.add(makeButton("B", "B", upperCaseButtons, 20));\r
167     buttonPanel.add(makeButton("Z", "Z", upperCaseButtons, 21));\r
168     buttonPanel.add(makeButton("X", "X", upperCaseButtons, 22));\r
169     buttonPanel.add(makeButton("Gap", "-", upperCaseButtons, 23));\r
170 \r
171     if (!caseSensitive)\r
172     {\r
173       gridLayout.setRows(6);\r
174       gridLayout.setColumns(4);\r
175     }\r
176     else\r
177     {\r
178       gridLayout.setRows(7);\r
179       int cols = 7;\r
180       gridLayout.setColumns(cols + 1);\r
181 \r
182       if (lowerCaseButtons == null)\r
183       {\r
184         lowerCaseButtons = new Vector();\r
185       }\r
186 \r
187       for (int i = 0; i < 20; i++)\r
188       {\r
189         int row = i / cols + 1;\r
190         int index = (row * cols) + i;\r
191         button = makeButton(\r
192             ResidueProperties.aa[i].toLowerCase(),\r
193             ResidueProperties.aa[i].toLowerCase(),\r
194             lowerCaseButtons,\r
195             i);\r
196 \r
197         buttonPanel.add(button, index);\r
198       }\r
199     }\r
200 \r
201     if (caseSensitive)\r
202     {\r
203       buttonPanel.add(makeButton("b", "b", lowerCaseButtons, 20));\r
204       buttonPanel.add(makeButton("z", "z", lowerCaseButtons, 21));\r
205       buttonPanel.add(makeButton("x", "x", lowerCaseButtons, 22));\r
206     }\r
207 \r
208     buttonPanel.validate();\r
209     validate();\r
210   }\r
211 \r
212   /**\r
213    * DOCUMENT ME!\r
214    *\r
215    * @param evt DOCUMENT ME!\r
216    */\r
217   public void stateChanged(ChangeEvent evt)\r
218   {\r
219     if (selectedButtons != null)\r
220     {\r
221       JButton button = null;\r
222       for (int i = 0; i < selectedButtons.size(); i++)\r
223       {\r
224         button = (JButton) selectedButtons.elementAt(i);\r
225         button.setBackground(colorChooser.getColor());\r
226         button.setForeground(button.getBackground().brighter().brighter().\r
227                              brighter());\r
228       }\r
229       if (button == lcaseColour)\r
230       {\r
231         for (int i = 0; i < lowerCaseButtons.size(); i++)\r
232         {\r
233           button = (JButton) lowerCaseButtons.elementAt(i);\r
234           button.setBackground(colorChooser.getColor());\r
235           button.setForeground(button.getBackground().brighter().brighter().\r
236                                brighter());\r
237         }\r
238       }\r
239     }\r
240   }\r
241 \r
242   /**\r
243    * DOCUMENT ME!\r
244    *\r
245    * @param e DOCUMENT ME!\r
246    */\r
247   public void colourButtonPressed(MouseEvent e)\r
248   {\r
249     if (selectedButtons == null)\r
250     {\r
251       selectedButtons = new Vector();\r
252     }\r
253 \r
254     JButton pressed = (JButton) e.getSource();\r
255 \r
256     if (e.isShiftDown())\r
257     {\r
258       JButton start, end = (JButton) e.getSource();\r
259       if (selectedButtons.size() > 0)\r
260       {\r
261         start = (JButton) selectedButtons.elementAt(selectedButtons.size() - 1);\r
262       }\r
263       else\r
264       {\r
265         start = (JButton) e.getSource();\r
266       }\r
267 \r
268       int startIndex = 0, endIndex = 0;\r
269       for (int b = 0; b < buttonPanel.getComponentCount(); b++)\r
270       {\r
271         if (buttonPanel.getComponent(b) == start)\r
272         {\r
273           startIndex = b;\r
274         }\r
275         if (buttonPanel.getComponent(b) == end)\r
276         {\r
277           endIndex = b;\r
278         }\r
279       }\r
280 \r
281       if (startIndex > endIndex)\r
282       {\r
283         int temp = startIndex;\r
284         startIndex = endIndex;\r
285         endIndex = temp;\r
286       }\r
287 \r
288       for (int b = startIndex; b <= endIndex; b++)\r
289       {\r
290         JButton button = (JButton) buttonPanel.getComponent(b);\r
291         if (!selectedButtons.contains(button))\r
292         {\r
293           button.setForeground(button.getBackground().brighter().brighter());\r
294           selectedButtons.add(button);\r
295         }\r
296       }\r
297     }\r
298     else if (!e.isControlDown())\r
299     {\r
300       for (int b = 0; b < selectedButtons.size(); b++)\r
301       {\r
302         JButton button = (JButton) selectedButtons.elementAt(b);\r
303         button.setForeground(button.getBackground().darker().darker());\r
304       }\r
305       selectedButtons.clear();\r
306       pressed.setForeground(pressed.getBackground().brighter().brighter());\r
307       selectedButtons.addElement(pressed);\r
308 \r
309     }\r
310     else if (e.isControlDown())\r
311     {\r
312       if (selectedButtons.contains(pressed))\r
313       {\r
314         pressed.setForeground(pressed.getBackground().darker().darker());\r
315         selectedButtons.remove(pressed);\r
316       }\r
317       else\r
318       {\r
319         pressed.setForeground(pressed.getBackground().brighter().brighter());\r
320         selectedButtons.addElement(pressed);\r
321       }\r
322     }\r
323 \r
324     if (selectedButtons.size() > 0)\r
325     {\r
326       colorChooser.setColor( ( (JButton) selectedButtons.elementAt(0)).\r
327                             getBackground());\r
328     }\r
329   }\r
330 \r
331   /**\r
332    * DOCUMENT ME!\r
333    *\r
334    * @param label DOCUMENT ME!\r
335    * @param aa DOCUMENT ME!\r
336    */\r
337   JButton makeButton(String label,\r
338                      String aa,\r
339                      Vector caseSensitiveButtons,\r
340                      int buttonIndex)\r
341   {\r
342     final JButton button;\r
343     Color col;\r
344 \r
345     if (buttonIndex < caseSensitiveButtons.size())\r
346     {\r
347       button = (JButton) caseSensitiveButtons.elementAt(buttonIndex);\r
348       col = button.getBackground();\r
349     }\r
350     else\r
351     {\r
352       button = new JButton();\r
353       button.addMouseListener(new java.awt.event.MouseAdapter()\r
354       {\r
355         public void mouseClicked(MouseEvent e)\r
356         {\r
357           colourButtonPressed(e);\r
358         }\r
359       });\r
360 \r
361       caseSensitiveButtons.addElement(button);\r
362 \r
363       col = Color.white;\r
364 \r
365       try\r
366       {\r
367         col = oldColourScheme.findColour(aa.charAt(0), -1);\r
368       }\r
369       catch (Exception ex)\r
370       {}\r
371     }\r
372 \r
373     if (caseSensitive.isSelected())\r
374     {\r
375       button.setMargin(new java.awt.Insets(2, 2, 2, 2));\r
376     }\r
377     else\r
378     {\r
379       button.setMargin(new java.awt.Insets(2, 14, 2, 14));\r
380     }\r
381 \r
382     button.setBackground(col);\r
383     button.setText(label);\r
384     button.setForeground(col.darker().darker().darker());\r
385     button.setFont(new java.awt.Font("Verdana", Font.BOLD, 10));\r
386 \r
387     return button;\r
388   }\r
389 \r
390   /**\r
391    * DOCUMENT ME!\r
392    *\r
393    * @param e DOCUMENT ME!\r
394    */\r
395   protected void okButton_actionPerformed(ActionEvent e)\r
396   {\r
397     applyButton_actionPerformed(null);\r
398 \r
399     try\r
400     {\r
401       frame.setClosed(true);\r
402     }\r
403     catch (Exception ex)\r
404     {\r
405     }\r
406   }\r
407 \r
408   /**\r
409    * DOCUMENT ME!\r
410    *\r
411    * @param e DOCUMENT ME!\r
412    */\r
413   protected void applyButton_actionPerformed(ActionEvent e)\r
414   {\r
415     UserColourScheme ucs = getSchemeFromButtons();\r
416     ucs.setName(schemeName.getText());\r
417 \r
418     if (seqGroup != null)\r
419     {\r
420       seqGroup.cs = ucs;\r
421       ap.repaint();\r
422     }\r
423     else if (ap != null)\r
424     {\r
425       ap.alignFrame.changeColour(ucs);\r
426     }\r
427     else if (pdbcanvas != null)\r
428     {\r
429       pdbcanvas.pdb.setColours(ucs);\r
430       pdbcanvas.updateSeqColours();\r
431     }\r
432   }\r
433 \r
434   UserColourScheme getSchemeFromButtons()\r
435   {\r
436 \r
437     Color[] newColours = new Color[24];\r
438 \r
439     for (int i = 0; i < 24; i++)\r
440     {\r
441       JButton button = (JButton) upperCaseButtons.elementAt(i);\r
442       newColours[i] = button.getBackground();\r
443     }\r
444 \r
445     UserColourScheme ucs = new UserColourScheme(newColours);\r
446 \r
447     if (caseSensitive.isSelected())\r
448     {\r
449       newColours = new Color[23];\r
450       for (int i = 0; i < 23; i++)\r
451       {\r
452         JButton button = (JButton) lowerCaseButtons.elementAt(i);\r
453         newColours[i] = button.getBackground();\r
454       }\r
455       ucs.setLowerCaseColours(newColours);\r
456     }\r
457 \r
458     if (ap != null)\r
459     {\r
460       ucs.setThreshold(0, ap.av.getIgnoreGapsConsensus());\r
461     }\r
462 \r
463     return ucs;\r
464   }\r
465 \r
466   /**\r
467    * DOCUMENT ME!\r
468    *\r
469    * @param e DOCUMENT ME!\r
470    */\r
471   protected void loadbutton_actionPerformed(ActionEvent e)\r
472   {\r
473     upperCaseButtons = new Vector();\r
474     lowerCaseButtons = new Vector();\r
475 \r
476     JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.\r
477         getProperty(\r
478             "LAST_DIRECTORY"), new String[]\r
479         {"jc"},\r
480         new String[]\r
481         {"Jalview User Colours"}, "Jalview User Colours");\r
482     chooser.setFileView(new jalview.io.JalviewFileView());\r
483     chooser.setDialogTitle("Load colour scheme");\r
484     chooser.setToolTipText("Load");\r
485 \r
486     int value = chooser.showOpenDialog(this);\r
487 \r
488     if (value == JalviewFileChooser.APPROVE_OPTION)\r
489     {\r
490       File choice = chooser.getSelectedFile();\r
491       jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice.getParent());\r
492       String defaultColours = jalview.bin.Cache.getDefault(\r
493           "USER_DEFINED_COLOURS",\r
494           choice.getPath());\r
495       if (defaultColours.indexOf(choice.getPath()) == -1)\r
496       {\r
497         defaultColours = defaultColours.concat("|").concat(choice.getPath());\r
498       }\r
499 \r
500       jalview.bin.Cache.setProperty("USER_DEFINED_COLOURS", defaultColours);\r
501 \r
502       UserColourScheme ucs = loadColours(choice.getAbsolutePath());\r
503       Color[] colors = ucs.getColours();\r
504       schemeName.setText(ucs.getName());\r
505 \r
506       if (ucs.getLowerCaseColours() != null)\r
507       {\r
508         caseSensitive.setSelected(true);\r
509         lcaseColour.setEnabled(true);\r
510         resetButtonPanel(true);\r
511         for (int i = 0; i < lowerCaseButtons.size(); i++)\r
512         {\r
513           JButton button = (JButton) lowerCaseButtons.elementAt(i);\r
514           button.setBackground(ucs.getLowerCaseColours()[i]);\r
515         }\r
516 \r
517       }\r
518       else\r
519       {\r
520         caseSensitive.setSelected(false);\r
521         lcaseColour.setEnabled(false);\r
522         resetButtonPanel(false);\r
523       }\r
524 \r
525       for (int i = 0; i < upperCaseButtons.size(); i++)\r
526       {\r
527         JButton button = (JButton) upperCaseButtons.elementAt(i);\r
528         button.setBackground(colors[i]);\r
529       }\r
530 \r
531     }\r
532   }\r
533 \r
534   /**\r
535    * DOCUMENT ME!\r
536    *\r
537    * @return DOCUMENT ME!\r
538    */\r
539   public static UserColourScheme loadDefaultColours()\r
540   {\r
541     UserColourScheme ret = null;\r
542 \r
543     String colours = jalview.bin.Cache.getProperty("USER_DEFINED_COLOURS");\r
544     if (colours != null)\r
545     {\r
546       if (colours.indexOf("|") > -1)\r
547       {\r
548         colours = colours.substring(0, colours.indexOf("|"));\r
549       }\r
550 \r
551       ret = loadColours(colours);\r
552     }\r
553 \r
554     if (ret == null)\r
555     {\r
556       Color[] newColours = new Color[24];\r
557       for (int i = 0; i < 24; i++)\r
558       {\r
559         newColours[i] = Color.white;\r
560       }\r
561       ret = new UserColourScheme(newColours);\r
562     }\r
563 \r
564     return ret;\r
565   }\r
566 \r
567   /**\r
568    * DOCUMENT ME!\r
569    *\r
570    * @param file DOCUMENT ME!\r
571    *\r
572    * @return DOCUMENT ME!\r
573    */\r
574   static UserColourScheme loadColours(String file)\r
575   {\r
576     UserColourScheme ucs = null;\r
577     Color[] newColours = null;\r
578     try\r
579     {\r
580       InputStreamReader in = new InputStreamReader(new FileInputStream(\r
581           file), "UTF-8");\r
582 \r
583       jalview.schemabinding.version2.JalviewUserColours jucs\r
584           = new jalview.schemabinding.version2.JalviewUserColours();\r
585 \r
586       org.exolab.castor.xml.Unmarshaller unmar\r
587           = new org.exolab.castor.xml.Unmarshaller(jucs);\r
588       jucs = (jalview.schemabinding.version2.JalviewUserColours) unmar.\r
589           unmarshal(in);\r
590 \r
591       newColours = new Color[24];\r
592 \r
593       Color[] lowerCase = null;\r
594       boolean caseSensitive = false;\r
595 \r
596       String name;\r
597       int index;\r
598       for (int i = 0; i < jucs.getColourCount(); i++)\r
599       {\r
600         name = jucs.getColour(i).getName();\r
601         if (ResidueProperties.aa3Hash.containsKey(name))\r
602         {\r
603           index = ( (Integer) ResidueProperties.aa3Hash.get(name)).intValue();\r
604         }\r
605         else\r
606         {\r
607           index = ResidueProperties.aaIndex[name.charAt(0)];\r
608         }\r
609         if (index == -1)\r
610         {\r
611           continue;\r
612         }\r
613 \r
614         if (name.toLowerCase().equals(name))\r
615         {\r
616           if (lowerCase == null)\r
617           {\r
618             lowerCase = new Color[23];\r
619           }\r
620           caseSensitive = true;\r
621           lowerCase[index] = new Color(Integer.parseInt(\r
622               jucs.getColour(i).getRGB(), 16));\r
623         }\r
624         else\r
625         {\r
626           newColours[index] = new Color(Integer.parseInt(\r
627               jucs.getColour(i).getRGB(), 16));\r
628         }\r
629       }\r
630 \r
631       if (newColours != null)\r
632       {\r
633         ucs = new UserColourScheme(newColours);\r
634         ucs.setName(jucs.getSchemeName());\r
635         if (caseSensitive)\r
636         {\r
637           ucs.setLowerCaseColours(lowerCase);\r
638         }\r
639       }\r
640 \r
641     }\r
642     catch (Exception ex)\r
643     {\r
644       //Could be Archive Jalview format\r
645       try\r
646       {\r
647         InputStreamReader in = new InputStreamReader(new FileInputStream(\r
648             file), "UTF-8");\r
649 \r
650         jalview.binding.JalviewUserColours jucs\r
651             = new jalview.binding.JalviewUserColours();\r
652 \r
653         jucs = (jalview.binding.JalviewUserColours) jucs.unmarshal(in);\r
654 \r
655         newColours = new Color[jucs.getColourCount()];\r
656 \r
657         for (int i = 0; i < 24; i++)\r
658         {\r
659           newColours[i] = new Color(Integer.parseInt(\r
660               jucs.getColour(i).getRGB(), 16));\r
661         }\r
662         if (newColours != null)\r
663         {\r
664           ucs = new UserColourScheme(newColours);\r
665           ucs.setName(jucs.getSchemeName());\r
666         }\r
667       }\r
668       catch (Exception ex2)\r
669       {\r
670         ex2.printStackTrace();\r
671       }\r
672 \r
673       if (newColours == null)\r
674       {\r
675         System.out.println("Error loading User ColourFile\n" + ex);\r
676       }\r
677     }\r
678 \r
679     return ucs;\r
680   }\r
681 \r
682   /**\r
683    * DOCUMENT ME!\r
684    *\r
685    * @param e DOCUMENT ME!\r
686    */\r
687   protected void savebutton_actionPerformed(ActionEvent e)\r
688   {\r
689     if (schemeName.getText().trim().length() < 1)\r
690     {\r
691       JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
692                                             "User colour scheme must have a name!",\r
693                                             "No name for colour scheme",\r
694                                             JOptionPane.WARNING_MESSAGE);\r
695       return;\r
696     }\r
697 \r
698     if (userColourSchemes != null &&\r
699         userColourSchemes.containsKey(schemeName.getText()))\r
700     {\r
701       int reply = JOptionPane.showInternalConfirmDialog(Desktop.desktop,\r
702           "Colour scheme " + schemeName.getText() + " exists."\r
703           + "\nContinue saving colour scheme as " + schemeName.getText() + "?",\r
704           "Duplicate scheme name", JOptionPane.YES_NO_OPTION);\r
705       if (reply != JOptionPane.YES_OPTION)\r
706       {\r
707         return;\r
708       }\r
709 \r
710       userColourSchemes.remove(schemeName.getText());\r
711     }\r
712     JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.\r
713         getProperty(\r
714             "LAST_DIRECTORY"), new String[]\r
715         {"jc"},\r
716         new String[]\r
717         {"Jalview User Colours"}, "Jalview User Colours");\r
718 \r
719     chooser.setFileView(new jalview.io.JalviewFileView());\r
720     chooser.setDialogTitle("Save colour scheme");\r
721     chooser.setToolTipText("Save");\r
722 \r
723     int value = chooser.showSaveDialog(this);\r
724 \r
725     if (value == JalviewFileChooser.APPROVE_OPTION)\r
726     {\r
727       String choice = chooser.getSelectedFile().getPath();\r
728       String defaultColours = jalview.bin.Cache.getDefault(\r
729           "USER_DEFINED_COLOURS", choice);\r
730       if (defaultColours.indexOf(choice) == -1)\r
731       {\r
732         if (defaultColours.length() > 0)\r
733         {\r
734           defaultColours = defaultColours.concat("|");\r
735         }\r
736         defaultColours = defaultColours.concat(choice);\r
737       }\r
738 \r
739       userColourSchemes.put(schemeName.getText(), getSchemeFromButtons());\r
740 \r
741       ap.alignFrame.updateUserColourMenu();\r
742 \r
743       jalview.bin.Cache.setProperty("USER_DEFINED_COLOURS", defaultColours);\r
744 \r
745       jalview.schemabinding.version2.JalviewUserColours ucs\r
746           = new jalview.schemabinding.version2.JalviewUserColours();\r
747 \r
748       ucs.setSchemeName(schemeName.getText());\r
749       try\r
750       {\r
751         PrintWriter out = new PrintWriter(new OutputStreamWriter(\r
752             new FileOutputStream(choice), "UTF-8"));\r
753 \r
754         for (int i = 0; i < buttonPanel.getComponentCount(); i++)\r
755         {\r
756           JButton button = (JButton) buttonPanel.getComponent(i);\r
757           jalview.schemabinding.version2.Colour col\r
758               = new jalview.schemabinding.version2.Colour();\r
759           col.setName(button.getText());\r
760           col.setRGB(jalview.util.Format.getHexString(\r
761               button.getBackground()));\r
762           ucs.addColour(col);\r
763         }\r
764 \r
765         ucs.marshal(out);\r
766         out.close();\r
767       }\r
768       catch (Exception ex)\r
769       {\r
770         ex.printStackTrace();\r
771       }\r
772     }\r
773   }\r
774 \r
775   /**\r
776    * DOCUMENT ME!\r
777    *\r
778    * @param e DOCUMENT ME!\r
779    */\r
780   protected void cancelButton_actionPerformed(ActionEvent e)\r
781   {\r
782     if (ap != null)\r
783     {\r
784       if (seqGroup != null)\r
785       {\r
786         seqGroup.cs = oldColourScheme;\r
787       }\r
788       else if (ap != null)\r
789       {\r
790         ap.av.setGlobalColourScheme(oldColourScheme);\r
791       }\r
792       ap.repaint();\r
793     }\r
794 \r
795     if (pdbcanvas != null)\r
796     {\r
797       pdbcanvas.pdb.setColours(oldColourScheme);\r
798     }\r
799 \r
800     try\r
801     {\r
802       frame.setClosed(true);\r
803     }\r
804     catch (Exception ex)\r
805     {\r
806     }\r
807   }\r
808 \r
809   static Hashtable userColourSchemes;\r
810 \r
811   public static Hashtable getUserColourSchemes()\r
812   {\r
813     return userColourSchemes;\r
814   }\r
815 \r
816   public static void initUserColourSchemes(String files)\r
817   {\r
818     userColourSchemes = new Hashtable();\r
819 \r
820     if (files == null || files.length() == 0)\r
821     {\r
822       return;\r
823     }\r
824 \r
825     // In case colours can't be loaded, we'll remove them\r
826     // from the default list here.\r
827     StringBuffer coloursFound = new StringBuffer();\r
828     StringTokenizer st = new StringTokenizer(files, "|");\r
829     while (st.hasMoreElements())\r
830     {\r
831       String file = st.nextToken();\r
832       try\r
833       {\r
834         UserColourScheme ucs = loadColours(file);\r
835         if (ucs != null)\r
836         {\r
837           if (coloursFound.length() > 0)\r
838           {\r
839             coloursFound.append("|");\r
840           }\r
841           coloursFound.append(file);\r
842           userColourSchemes.put(ucs.getName(), ucs);\r
843         }\r
844       }\r
845       catch (Exception ex)\r
846       {\r
847         System.out.println("Error loading User ColourFile\n" + ex);\r
848       }\r
849     }\r
850     if (!files.equals(coloursFound.toString()))\r
851     {\r
852       if (coloursFound.toString().length() > 1)\r
853       {\r
854         jalview.bin.Cache.setProperty("USER_DEFINED_COLOURS",\r
855                                       coloursFound.toString());\r
856       }\r
857       else\r
858       {\r
859         jalview.bin.Cache.applicationProperties.remove("USER_DEFINED_COLOURS");\r
860       }\r
861     }\r
862   }\r
863 \r
864   public static void removeColourFromDefaults(String target)\r
865   {\r
866     // The only way to find colours by name is to load them in\r
867     // In case colours can't be loaded, we'll remove them\r
868     // from the default list here.\r
869 \r
870     userColourSchemes = new Hashtable();\r
871 \r
872     StringBuffer coloursFound = new StringBuffer();\r
873     StringTokenizer st = new StringTokenizer(\r
874         jalview.bin.Cache.getProperty("USER_DEFINED_COLOURS"), "|");\r
875 \r
876     while (st.hasMoreElements())\r
877     {\r
878       String file = st.nextToken();\r
879       try\r
880       {\r
881         UserColourScheme ucs = loadColours(file);\r
882         if (ucs != null && !ucs.getName().equals(target))\r
883         {\r
884           if (coloursFound.length() > 0)\r
885           {\r
886             coloursFound.append("|");\r
887           }\r
888           coloursFound.append(file);\r
889           userColourSchemes.put(ucs.getName(), ucs);\r
890         }\r
891       }\r
892       catch (Exception ex)\r
893       {\r
894         System.out.println("Error loading User ColourFile\n" + ex);\r
895       }\r
896     }\r
897 \r
898     if (coloursFound.toString().length() > 1)\r
899     {\r
900       jalview.bin.Cache.setProperty("USER_DEFINED_COLOURS",\r
901                                     coloursFound.toString());\r
902     }\r
903     else\r
904     {\r
905       jalview.bin.Cache.applicationProperties.remove("USER_DEFINED_COLOURS");\r
906     }\r
907 \r
908   }\r
909 \r
910   public void caseSensitive_actionPerformed(ActionEvent e)\r
911   {\r
912     resetButtonPanel(caseSensitive.isSelected());\r
913     lcaseColour.setEnabled(caseSensitive.isSelected());\r
914   }\r
915 \r
916   public void lcaseColour_actionPerformed(ActionEvent e)\r
917   {\r
918     if (selectedButtons == null)\r
919     {\r
920       selectedButtons = new Vector();\r
921     }\r
922     else\r
923     {\r
924       selectedButtons.clear();\r
925     }\r
926     selectedButtons.add(lcaseColour);\r
927   }\r
928 \r
929 }\r