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