Rename AppJMol to AppJmol - also AppJmol works with independant sequence sets
[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   AppJmol jmol;\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(AppJmol jmol, ColourSchemeI oldcs)\r
99   {\r
100     super();\r
101     this.jmol = jmol;\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.paintAlignment(true);\r
422     }\r
423     else if (ap != null)\r
424     {\r
425       ap.alignFrame.changeColour(ucs);\r
426     }\r
427     else if (jmol != null)\r
428     {\r
429       jmol.setJalviewColourScheme(ucs);\r
430     }\r
431   }\r
432 \r
433   UserColourScheme getSchemeFromButtons()\r
434   {\r
435 \r
436     Color[] newColours = new Color[24];\r
437 \r
438     for (int i = 0; i < 24; i++)\r
439     {\r
440       JButton button = (JButton) upperCaseButtons.elementAt(i);\r
441       newColours[i] = button.getBackground();\r
442     }\r
443 \r
444     UserColourScheme ucs = new UserColourScheme(newColours);\r
445 \r
446     if (caseSensitive.isSelected())\r
447     {\r
448       newColours = new Color[23];\r
449       for (int i = 0; i < 23; i++)\r
450       {\r
451         JButton button = (JButton) lowerCaseButtons.elementAt(i);\r
452         newColours[i] = button.getBackground();\r
453       }\r
454       ucs.setLowerCaseColours(newColours);\r
455     }\r
456 \r
457     if (ap != null)\r
458     {\r
459       ucs.setThreshold(0, ap.av.getIgnoreGapsConsensus());\r
460     }\r
461 \r
462     return ucs;\r
463   }\r
464 \r
465   /**\r
466    * DOCUMENT ME!\r
467    *\r
468    * @param e DOCUMENT ME!\r
469    */\r
470   protected void loadbutton_actionPerformed(ActionEvent e)\r
471   {\r
472     upperCaseButtons = new Vector();\r
473     lowerCaseButtons = new Vector();\r
474 \r
475     JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.\r
476         getProperty(\r
477             "LAST_DIRECTORY"), new String[]\r
478         {"jc"},\r
479         new String[]\r
480         {"Jalview User Colours"}, "Jalview User Colours");\r
481     chooser.setFileView(new jalview.io.JalviewFileView());\r
482     chooser.setDialogTitle("Load colour scheme");\r
483     chooser.setToolTipText("Load");\r
484 \r
485     int value = chooser.showOpenDialog(this);\r
486 \r
487     if (value == JalviewFileChooser.APPROVE_OPTION)\r
488     {\r
489       File choice = chooser.getSelectedFile();\r
490       jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice.getParent());\r
491       String defaultColours = jalview.bin.Cache.getDefault(\r
492           "USER_DEFINED_COLOURS",\r
493           choice.getPath());\r
494       if (defaultColours.indexOf(choice.getPath()) == -1)\r
495       {\r
496         defaultColours = defaultColours.concat("|").concat(choice.getPath());\r
497       }\r
498 \r
499       jalview.bin.Cache.setProperty("USER_DEFINED_COLOURS", defaultColours);\r
500 \r
501       UserColourScheme ucs = loadColours(choice.getAbsolutePath());\r
502       Color[] colors = ucs.getColours();\r
503       schemeName.setText(ucs.getName());\r
504 \r
505       if (ucs.getLowerCaseColours() != null)\r
506       {\r
507         caseSensitive.setSelected(true);\r
508         lcaseColour.setEnabled(true);\r
509         resetButtonPanel(true);\r
510         for (int i = 0; i < lowerCaseButtons.size(); i++)\r
511         {\r
512           JButton button = (JButton) lowerCaseButtons.elementAt(i);\r
513           button.setBackground(ucs.getLowerCaseColours()[i]);\r
514         }\r
515 \r
516       }\r
517       else\r
518       {\r
519         caseSensitive.setSelected(false);\r
520         lcaseColour.setEnabled(false);\r
521         resetButtonPanel(false);\r
522       }\r
523 \r
524       for (int i = 0; i < upperCaseButtons.size(); i++)\r
525       {\r
526         JButton button = (JButton) upperCaseButtons.elementAt(i);\r
527         button.setBackground(colors[i]);\r
528       }\r
529 \r
530     }\r
531   }\r
532 \r
533   /**\r
534    * DOCUMENT ME!\r
535    *\r
536    * @return DOCUMENT ME!\r
537    */\r
538   public static UserColourScheme loadDefaultColours()\r
539   {\r
540     UserColourScheme ret = null;\r
541 \r
542     String colours = jalview.bin.Cache.getProperty("USER_DEFINED_COLOURS");\r
543     if (colours != null)\r
544     {\r
545       if (colours.indexOf("|") > -1)\r
546       {\r
547         colours = colours.substring(0, colours.indexOf("|"));\r
548       }\r
549 \r
550       ret = loadColours(colours);\r
551     }\r
552 \r
553     if (ret == null)\r
554     {\r
555       Color[] newColours = new Color[24];\r
556       for (int i = 0; i < 24; i++)\r
557       {\r
558         newColours[i] = Color.white;\r
559       }\r
560       ret = new UserColourScheme(newColours);\r
561     }\r
562 \r
563     return ret;\r
564   }\r
565 \r
566   /**\r
567    * DOCUMENT ME!\r
568    *\r
569    * @param file DOCUMENT ME!\r
570    *\r
571    * @return DOCUMENT ME!\r
572    */\r
573   static UserColourScheme loadColours(String file)\r
574   {\r
575     UserColourScheme ucs = null;\r
576     Color[] newColours = null;\r
577     try\r
578     {\r
579       InputStreamReader in = new InputStreamReader(new FileInputStream(\r
580           file), "UTF-8");\r
581 \r
582       jalview.schemabinding.version2.JalviewUserColours jucs\r
583           = new jalview.schemabinding.version2.JalviewUserColours();\r
584 \r
585       org.exolab.castor.xml.Unmarshaller unmar\r
586           = new org.exolab.castor.xml.Unmarshaller(jucs);\r
587       jucs = (jalview.schemabinding.version2.JalviewUserColours) unmar.\r
588           unmarshal(in);\r
589 \r
590       newColours = new Color[24];\r
591 \r
592       Color[] lowerCase = null;\r
593       boolean caseSensitive = false;\r
594 \r
595       String name;\r
596       int index;\r
597       for (int i = 0; i < jucs.getColourCount(); i++)\r
598       {\r
599         name = jucs.getColour(i).getName();\r
600         if (ResidueProperties.aa3Hash.containsKey(name))\r
601         {\r
602           index = ( (Integer) ResidueProperties.aa3Hash.get(name)).intValue();\r
603         }\r
604         else\r
605         {\r
606           index = ResidueProperties.aaIndex[name.charAt(0)];\r
607         }\r
608         if (index == -1)\r
609         {\r
610           continue;\r
611         }\r
612 \r
613         if (name.toLowerCase().equals(name))\r
614         {\r
615           if (lowerCase == null)\r
616           {\r
617             lowerCase = new Color[23];\r
618           }\r
619           caseSensitive = true;\r
620           lowerCase[index] = new Color(Integer.parseInt(\r
621               jucs.getColour(i).getRGB(), 16));\r
622         }\r
623         else\r
624         {\r
625           newColours[index] = new Color(Integer.parseInt(\r
626               jucs.getColour(i).getRGB(), 16));\r
627         }\r
628       }\r
629 \r
630       if (newColours != null)\r
631       {\r
632         ucs = new UserColourScheme(newColours);\r
633         ucs.setName(jucs.getSchemeName());\r
634         if (caseSensitive)\r
635         {\r
636           ucs.setLowerCaseColours(lowerCase);\r
637         }\r
638       }\r
639 \r
640     }\r
641     catch (Exception ex)\r
642     {\r
643       //Could be Archive Jalview format\r
644       try\r
645       {\r
646         InputStreamReader in = new InputStreamReader(new FileInputStream(\r
647             file), "UTF-8");\r
648 \r
649         jalview.binding.JalviewUserColours jucs\r
650             = new jalview.binding.JalviewUserColours();\r
651 \r
652         jucs = (jalview.binding.JalviewUserColours) jucs.unmarshal(in);\r
653 \r
654         newColours = new Color[jucs.getColourCount()];\r
655 \r
656         for (int i = 0; i < 24; i++)\r
657         {\r
658           newColours[i] = new Color(Integer.parseInt(\r
659               jucs.getColour(i).getRGB(), 16));\r
660         }\r
661         if (newColours != null)\r
662         {\r
663           ucs = new UserColourScheme(newColours);\r
664           ucs.setName(jucs.getSchemeName());\r
665         }\r
666       }\r
667       catch (Exception ex2)\r
668       {\r
669         ex2.printStackTrace();\r
670       }\r
671 \r
672       if (newColours == null)\r
673       {\r
674         System.out.println("Error loading User ColourFile\n" + ex);\r
675       }\r
676     }\r
677 \r
678     return ucs;\r
679   }\r
680 \r
681   /**\r
682    * DOCUMENT ME!\r
683    *\r
684    * @param e DOCUMENT ME!\r
685    */\r
686   protected void savebutton_actionPerformed(ActionEvent e)\r
687   {\r
688     if (schemeName.getText().trim().length() < 1)\r
689     {\r
690       JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
691                                             "User colour scheme must have a name!",\r
692                                             "No name for colour scheme",\r
693                                             JOptionPane.WARNING_MESSAGE);\r
694       return;\r
695     }\r
696 \r
697     if (userColourSchemes != null &&\r
698         userColourSchemes.containsKey(schemeName.getText()))\r
699     {\r
700       int reply = JOptionPane.showInternalConfirmDialog(Desktop.desktop,\r
701           "Colour scheme " + schemeName.getText() + " exists."\r
702           + "\nContinue saving colour scheme as " + schemeName.getText() + "?",\r
703           "Duplicate scheme name", JOptionPane.YES_NO_OPTION);\r
704       if (reply != JOptionPane.YES_OPTION)\r
705       {\r
706         return;\r
707       }\r
708 \r
709       userColourSchemes.remove(schemeName.getText());\r
710     }\r
711     JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.\r
712         getProperty(\r
713             "LAST_DIRECTORY"), new String[]\r
714         {"jc"},\r
715         new String[]\r
716         {"Jalview User Colours"}, "Jalview User Colours");\r
717 \r
718     chooser.setFileView(new jalview.io.JalviewFileView());\r
719     chooser.setDialogTitle("Save colour scheme");\r
720     chooser.setToolTipText("Save");\r
721 \r
722     int value = chooser.showSaveDialog(this);\r
723 \r
724     if (value == JalviewFileChooser.APPROVE_OPTION)\r
725     {\r
726       String choice = chooser.getSelectedFile().getPath();\r
727       String defaultColours = jalview.bin.Cache.getDefault(\r
728           "USER_DEFINED_COLOURS", choice);\r
729       if (defaultColours.indexOf(choice) == -1)\r
730       {\r
731         if (defaultColours.length() > 0)\r
732         {\r
733           defaultColours = defaultColours.concat("|");\r
734         }\r
735         defaultColours = defaultColours.concat(choice);\r
736       }\r
737 \r
738       userColourSchemes.put(schemeName.getText(), getSchemeFromButtons());\r
739 \r
740       ap.alignFrame.updateUserColourMenu();\r
741 \r
742       jalview.bin.Cache.setProperty("USER_DEFINED_COLOURS", defaultColours);\r
743 \r
744       jalview.schemabinding.version2.JalviewUserColours ucs\r
745           = new jalview.schemabinding.version2.JalviewUserColours();\r
746 \r
747       ucs.setSchemeName(schemeName.getText());\r
748       try\r
749       {\r
750         PrintWriter out = new PrintWriter(new OutputStreamWriter(\r
751             new FileOutputStream(choice), "UTF-8"));\r
752 \r
753         for (int i = 0; i < buttonPanel.getComponentCount(); i++)\r
754         {\r
755           JButton button = (JButton) buttonPanel.getComponent(i);\r
756           jalview.schemabinding.version2.Colour col\r
757               = new jalview.schemabinding.version2.Colour();\r
758           col.setName(button.getText());\r
759           col.setRGB(jalview.util.Format.getHexString(\r
760               button.getBackground()));\r
761           ucs.addColour(col);\r
762         }\r
763 \r
764         ucs.marshal(out);\r
765         out.close();\r
766       }\r
767       catch (Exception ex)\r
768       {\r
769         ex.printStackTrace();\r
770       }\r
771     }\r
772   }\r
773 \r
774   /**\r
775    * DOCUMENT ME!\r
776    *\r
777    * @param e DOCUMENT ME!\r
778    */\r
779   protected void cancelButton_actionPerformed(ActionEvent e)\r
780   {\r
781     if (ap != null)\r
782     {\r
783       if (seqGroup != null)\r
784       {\r
785         seqGroup.cs = oldColourScheme;\r
786       }\r
787       else if (ap != null)\r
788       {\r
789         ap.av.setGlobalColourScheme(oldColourScheme);\r
790       }\r
791       ap.paintAlignment(true);\r
792     }\r
793 \r
794     if (jmol != null)\r
795     {\r
796       jmol.setJalviewColourScheme(oldColourScheme);\r
797     }\r
798 \r
799     try\r
800     {\r
801       frame.setClosed(true);\r
802     }\r
803     catch (Exception ex)\r
804     {\r
805     }\r
806   }\r
807 \r
808   static Hashtable userColourSchemes;\r
809 \r
810   public static Hashtable getUserColourSchemes()\r
811   {\r
812     return userColourSchemes;\r
813   }\r
814 \r
815   public static void initUserColourSchemes(String files)\r
816   {\r
817     userColourSchemes = new Hashtable();\r
818 \r
819     if (files == null || files.length() == 0)\r
820     {\r
821       return;\r
822     }\r
823 \r
824     // In case colours can't be loaded, we'll remove them\r
825     // from the default list here.\r
826     StringBuffer coloursFound = new StringBuffer();\r
827     StringTokenizer st = new StringTokenizer(files, "|");\r
828     while (st.hasMoreElements())\r
829     {\r
830       String file = st.nextToken();\r
831       try\r
832       {\r
833         UserColourScheme ucs = loadColours(file);\r
834         if (ucs != null)\r
835         {\r
836           if (coloursFound.length() > 0)\r
837           {\r
838             coloursFound.append("|");\r
839           }\r
840           coloursFound.append(file);\r
841           userColourSchemes.put(ucs.getName(), ucs);\r
842         }\r
843       }\r
844       catch (Exception ex)\r
845       {\r
846         System.out.println("Error loading User ColourFile\n" + ex);\r
847       }\r
848     }\r
849     if (!files.equals(coloursFound.toString()))\r
850     {\r
851       if (coloursFound.toString().length() > 1)\r
852       {\r
853         jalview.bin.Cache.setProperty("USER_DEFINED_COLOURS",\r
854                                       coloursFound.toString());\r
855       }\r
856       else\r
857       {\r
858         jalview.bin.Cache.applicationProperties.remove("USER_DEFINED_COLOURS");\r
859       }\r
860     }\r
861   }\r
862 \r
863   public static void removeColourFromDefaults(String target)\r
864   {\r
865     // The only way to find colours by name is to load them in\r
866     // In case colours can't be loaded, we'll remove them\r
867     // from the default list here.\r
868 \r
869     userColourSchemes = new Hashtable();\r
870 \r
871     StringBuffer coloursFound = new StringBuffer();\r
872     StringTokenizer st = new StringTokenizer(\r
873         jalview.bin.Cache.getProperty("USER_DEFINED_COLOURS"), "|");\r
874 \r
875     while (st.hasMoreElements())\r
876     {\r
877       String file = st.nextToken();\r
878       try\r
879       {\r
880         UserColourScheme ucs = loadColours(file);\r
881         if (ucs != null && !ucs.getName().equals(target))\r
882         {\r
883           if (coloursFound.length() > 0)\r
884           {\r
885             coloursFound.append("|");\r
886           }\r
887           coloursFound.append(file);\r
888           userColourSchemes.put(ucs.getName(), ucs);\r
889         }\r
890       }\r
891       catch (Exception ex)\r
892       {\r
893         System.out.println("Error loading User ColourFile\n" + ex);\r
894       }\r
895     }\r
896 \r
897     if (coloursFound.toString().length() > 1)\r
898     {\r
899       jalview.bin.Cache.setProperty("USER_DEFINED_COLOURS",\r
900                                     coloursFound.toString());\r
901     }\r
902     else\r
903     {\r
904       jalview.bin.Cache.applicationProperties.remove("USER_DEFINED_COLOURS");\r
905     }\r
906 \r
907   }\r
908 \r
909   public void caseSensitive_actionPerformed(ActionEvent e)\r
910   {\r
911     resetButtonPanel(caseSensitive.isSelected());\r
912     lcaseColour.setEnabled(caseSensitive.isSelected());\r
913   }\r
914 \r
915   public void lcaseColour_actionPerformed(ActionEvent e)\r
916   {\r
917     if (selectedButtons == null)\r
918     {\r
919       selectedButtons = new Vector();\r
920     }\r
921     else\r
922     {\r
923       selectedButtons.clear();\r
924     }\r
925     selectedButtons.add(lcaseColour);\r
926   }\r
927 \r
928 }\r