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