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