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