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