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