2 * Jalview - A Sequence Alignment Editor and Viewer
3 * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
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.
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.
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
21 import jalview.datamodel.*;
25 import jalview.jbgui.*;
27 import jalview.schemes.*;
30 import java.awt.event.*;
37 import javax.swing.event.*;
47 public class UserDefinedColours extends GUserDefinedColours
48 implements ChangeListener
51 SequenceGroup seqGroup;
52 Vector selectedButtons;
53 ColourSchemeI oldColourScheme;
55 MCview.PDBCanvas pdbcanvas;
56 Vector upperCaseButtons;
57 Vector lowerCaseButtons;
61 * Creates a new UserDefinedColours object.
63 * @param ap DOCUMENT ME!
64 * @param sg DOCUMENT ME!
66 public UserDefinedColours(AlignmentPanel ap, SequenceGroup sg)
69 lcaseColour.setEnabled(false);
75 oldColourScheme = seqGroup.cs;
77 oldColourScheme = ap.av.getGlobalColourScheme();
79 if (oldColourScheme instanceof UserColourScheme)
81 schemeName.setText( ( (UserColourScheme) oldColourScheme).getName());
82 if(( (UserColourScheme) oldColourScheme).getLowerCaseColours()!=null)
84 caseSensitive.setSelected(true);
85 lcaseColour.setEnabled(true);
86 resetButtonPanel(true);
89 resetButtonPanel(false);
92 resetButtonPanel(false);
97 public UserDefinedColours(MCview.PDBCanvas pdb, ColourSchemeI oldcs)
102 colorChooser.getSelectionModel().addChangeListener(this);
104 oldColourScheme = oldcs;
106 if (oldColourScheme instanceof UserColourScheme)
108 schemeName.setText( ( (UserColourScheme) oldColourScheme).getName());
111 resetButtonPanel(false);
119 colorChooser.getSelectionModel().addChangeListener(this);
120 frame = new JInternalFrame();
121 frame.setContentPane(this);
122 Desktop.addInternalFrame(frame, "User Defined Colours", 720, 370, true);
124 if (seqGroup != null)
125 frame.setTitle(frame.getTitle() + " (" + seqGroup.getName() + ")");
127 if (System.getProperty("os.name").startsWith("Mac"))
129 frame.setSize(760, 370);
133 void resetButtonPanel(boolean caseSensitive)
135 buttonPanel.removeAll();
138 if(upperCaseButtons==null)
139 upperCaseButtons = new Vector();
143 for (int i = 0; i < 20; i++)
146 label = ResidueProperties.aa[i];
148 label = ResidueProperties.aa2Triplet.get
149 (ResidueProperties.aa[i]).toString();
151 button = makeButton(label,
152 ResidueProperties.aa[i],
153 upperCaseButtons, i);
155 buttonPanel.add(button);
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));
165 gridLayout.setRows(6);
166 gridLayout.setColumns(4);
170 gridLayout.setRows(7);
172 gridLayout.setColumns(cols+1);
174 if(lowerCaseButtons==null)
175 lowerCaseButtons = new Vector();
178 for (int i = 0; i < 20; i++)
180 int row = i / cols + 1;
181 int index = (row * cols) + i;
183 ResidueProperties.aa[i].toLowerCase(),
184 ResidueProperties.aa[i].toLowerCase(),
188 buttonPanel.add(button, index);
195 buttonPanel.add(makeButton("b", "b", lowerCaseButtons, 20));
196 buttonPanel.add(makeButton("z", "z", lowerCaseButtons, 21));
197 buttonPanel.add(makeButton("x", "x", lowerCaseButtons, 22));
200 buttonPanel.validate();
208 * @param evt DOCUMENT ME!
210 public void stateChanged(ChangeEvent evt)
212 if (selectedButtons != null)
215 for(int i=0; i<selectedButtons.size(); i++)
217 button = (JButton)selectedButtons.elementAt(i);
218 button.setBackground(colorChooser.getColor());
219 button.setForeground( button.getBackground().brighter().brighter().brighter());
221 if(button==lcaseColour)
223 for(int i=0; i<lowerCaseButtons.size(); i++)
225 button = (JButton)lowerCaseButtons.elementAt(i);
226 button.setBackground(colorChooser.getColor());
227 button.setForeground( button.getBackground().brighter().brighter().brighter());
236 * @param e DOCUMENT ME!
238 public void colourButtonPressed(MouseEvent e)
240 if(selectedButtons == null)
241 selectedButtons = new Vector();
243 JButton pressed = (JButton) e.getSource();
247 JButton start, end = (JButton) e.getSource();
248 if(selectedButtons.size()>0)
249 start = (JButton)selectedButtons.elementAt(selectedButtons.size()-1);
251 start = (JButton) e.getSource();
253 int startIndex=0, endIndex=0;
254 for(int b=0; b<buttonPanel.getComponentCount(); b++)
256 if(buttonPanel.getComponent(b)==start)
258 if(buttonPanel.getComponent(b)==end)
262 if(startIndex > endIndex)
264 int temp = startIndex;
265 startIndex = endIndex;
269 for(int b=startIndex; b<=endIndex; b++)
271 JButton button = (JButton)buttonPanel.getComponent(b);
272 if(!selectedButtons.contains(button))
274 button.setForeground(button.getBackground().brighter().brighter());
275 selectedButtons.add(button);
279 else if(!e.isControlDown())
281 for(int b=0; b<selectedButtons.size(); b++)
283 JButton button = (JButton)selectedButtons.elementAt(b);
284 button.setForeground(button.getBackground().darker().darker());
286 selectedButtons.clear();
287 pressed.setForeground( pressed.getBackground().brighter().brighter());
288 selectedButtons.addElement(pressed);
291 else if(e.isControlDown())
293 if(selectedButtons.contains(pressed))
295 pressed.setForeground(pressed.getBackground().darker().darker());
296 selectedButtons.remove(pressed);
300 pressed.setForeground( pressed.getBackground().brighter().brighter());
301 selectedButtons.addElement(pressed);
305 if(selectedButtons.size()>0)
306 colorChooser.setColor( ((JButton)selectedButtons.elementAt(0)).getBackground());
312 * @param label DOCUMENT ME!
313 * @param aa DOCUMENT ME!
315 JButton makeButton(String label,
317 Vector caseSensitiveButtons,
320 final JButton button;
323 if(buttonIndex<caseSensitiveButtons.size())
325 button = (JButton) caseSensitiveButtons.elementAt(buttonIndex);
326 col = button.getBackground();
330 button = new JButton();
331 button.addMouseListener(new java.awt.event.MouseAdapter()
333 public void mouseClicked(MouseEvent e)
335 colourButtonPressed(e);
339 caseSensitiveButtons.addElement(button);
345 col = oldColourScheme.findColour(aa, -1);
351 if(caseSensitive.isSelected())
352 button.setMargin(new java.awt.Insets(2,2,2,2));
354 button.setMargin(new java.awt.Insets(2,14,2,14));
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));
367 * @param e DOCUMENT ME!
369 protected void okButton_actionPerformed(ActionEvent e)
371 applyButton_actionPerformed(null);
375 frame.setClosed(true);
385 * @param e DOCUMENT ME!
387 protected void applyButton_actionPerformed(ActionEvent e)
389 UserColourScheme ucs = getSchemeFromButtons();
390 ucs.setName(schemeName.getText());
392 if (seqGroup != null)
399 ap.alignFrame.changeColour(ucs);
401 else if(pdbcanvas!=null)
403 pdbcanvas.pdb.setColours(ucs);
404 pdbcanvas.updateSeqColours();
408 UserColourScheme getSchemeFromButtons()
411 Color[] newColours = new Color[24];
413 for (int i = 0; i < 24; i++)
415 JButton button = (JButton) upperCaseButtons.elementAt(i);
416 newColours[i] = button.getBackground();
419 UserColourScheme ucs = new UserColourScheme(newColours);
422 if(caseSensitive.isSelected())
424 newColours = new Color[23];
425 for (int i = 0; i < 23; i++)
427 JButton button = (JButton) lowerCaseButtons.elementAt(i);
428 newColours[i] = button.getBackground();
430 ucs.setLowerCaseColours(newColours);
434 ucs.setThreshold(0, ap.av.getIgnoreGapsConsensus());
445 * @param e DOCUMENT ME!
447 protected void loadbutton_actionPerformed(ActionEvent e)
449 upperCaseButtons = new Vector();
450 lowerCaseButtons = new Vector();
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");
459 int value = chooser.showOpenDialog(this);
461 if (value == JalviewFileChooser.APPROVE_OPTION)
463 File choice = chooser.getSelectedFile();
464 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice.getParent());
465 String defaultColours = jalview.bin.Cache.getDefault("USER_DEFINED_COLOURS",
467 if (defaultColours.indexOf(choice.getPath()) == -1)
468 defaultColours = defaultColours.concat("|").concat(choice.getPath());
470 jalview.bin.Cache.setProperty("USER_DEFINED_COLOURS", defaultColours);
473 UserColourScheme ucs = loadColours(choice.getAbsolutePath());
474 Color[] colors = ucs.getColours();
475 schemeName.setText(ucs.getName());
477 if(ucs.getLowerCaseColours()!=null)
479 caseSensitive.setSelected(true);
480 lcaseColour.setEnabled(true);
481 resetButtonPanel(true);
482 for (int i = 0; i < lowerCaseButtons.size(); i++)
484 JButton button = (JButton) lowerCaseButtons.elementAt(i);
485 button.setBackground(ucs.getLowerCaseColours()[i]);
491 caseSensitive.setSelected(false);
492 lcaseColour.setEnabled(false);
493 resetButtonPanel(false);
496 for (int i = 0; i < upperCaseButtons.size(); i++)
498 JButton button = (JButton) upperCaseButtons.elementAt(i);
499 button.setBackground(colors[i]);
508 * @return DOCUMENT ME!
510 public static UserColourScheme loadDefaultColours()
512 UserColourScheme ret = null;
514 String colours = jalview.bin.Cache.getProperty("USER_DEFINED_COLOURS");
515 if ( colours != null )
517 if(colours.indexOf("|")>-1)
518 colours = colours.substring(0, colours.indexOf("|"));
520 ret = loadColours(colours);
525 Color[] newColours = new Color[24];
526 for (int i = 0; i < 24; i++)
528 newColours[i] = Color.white;
530 ret = new UserColourScheme(newColours);
539 * @param file DOCUMENT ME!
541 * @return DOCUMENT ME!
543 static UserColourScheme loadColours(String file)
545 UserColourScheme ucs = null;
546 Color[] newColours = null;
549 InputStreamReader in = new InputStreamReader(new FileInputStream(
552 jalview.schemabinding.version2.JalviewUserColours jucs
553 = new jalview.schemabinding.version2.JalviewUserColours();
555 org.exolab.castor.xml.Unmarshaller unmar
556 = new org.exolab.castor.xml.Unmarshaller(jucs);
557 jucs = (jalview.schemabinding.version2.JalviewUserColours) unmar.unmarshal( in );
559 newColours = new Color[24];
561 Color [] lowerCase = null;
562 boolean caseSensitive = false;
567 for (int i = 0; i < jucs.getColourCount(); i++)
569 name = jucs.getColour(i).getName();
570 if(ResidueProperties.aa3Hash.containsKey(name))
572 index = ((Integer)ResidueProperties.aa3Hash.get(name)).intValue();
576 index = ((Integer)ResidueProperties.aaHash.get(name)).intValue();
581 if(name.toLowerCase().equals(name))
584 lowerCase = new Color[23];
585 caseSensitive = true;
586 lowerCase[index] = new Color(Integer.parseInt(
587 jucs.getColour(i).getRGB(), 16));
591 newColours[index] = new Color(Integer.parseInt(
592 jucs.getColour(i).getRGB(), 16));
596 if (newColours != null)
598 ucs = new UserColourScheme(newColours);
599 ucs.setName( jucs.getSchemeName() );
602 ucs.setLowerCaseColours(lowerCase);
609 //Could be Archive Jalview format
611 InputStreamReader in = new InputStreamReader(new FileInputStream(
614 jalview.binding.JalviewUserColours jucs
615 = new jalview.binding.JalviewUserColours();
617 jucs = (jalview.binding.JalviewUserColours) jucs.unmarshal(in);
619 newColours = new Color[jucs.getColourCount()];
621 for (int i = 0; i < 24; i++)
623 newColours[i] = new Color(Integer.parseInt(
624 jucs.getColour(i).getRGB(), 16));
626 if (newColours != null)
628 ucs = new UserColourScheme(newColours);
629 ucs.setName(jucs.getSchemeName());
631 }catch(Exception ex2)
632 { ex2.printStackTrace(); }
635 System.out.println("Error loading User ColourFile\n"+ex);
644 * @param e DOCUMENT ME!
646 protected void savebutton_actionPerformed(ActionEvent e)
648 if(schemeName.getText().trim().length()<1)
650 JOptionPane.showInternalMessageDialog(Desktop.desktop,
651 "User colour scheme must have a name!",
652 "No name for colour scheme",
653 JOptionPane.WARNING_MESSAGE);
657 if(userColourSchemes!=null && userColourSchemes.containsKey(schemeName.getText()) )
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)
665 userColourSchemes.remove(schemeName.getText());
667 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.getProperty(
668 "LAST_DIRECTORY"), new String[] { "jc" },
669 new String[] { "Jalview User Colours" }, "Jalview User Colours");
671 chooser.setFileView(new jalview.io.JalviewFileView());
672 chooser.setDialogTitle("Save colour scheme");
673 chooser.setToolTipText("Save");
675 int value = chooser.showSaveDialog(this);
677 if (value == JalviewFileChooser.APPROVE_OPTION)
679 String choice = chooser.getSelectedFile().getPath();
680 String defaultColours = jalview.bin.Cache.getDefault("USER_DEFINED_COLOURS", choice);
681 if(defaultColours.indexOf(choice)==-1)
683 if(defaultColours.length()>0)
684 defaultColours = defaultColours.concat("|");
685 defaultColours = defaultColours.concat(choice);
688 userColourSchemes.put(schemeName.getText(), getSchemeFromButtons());
690 ap.alignFrame.updateUserColourMenu();
692 jalview.bin.Cache.setProperty("USER_DEFINED_COLOURS", defaultColours);
694 jalview.schemabinding.version2.JalviewUserColours ucs
695 = new jalview.schemabinding.version2.JalviewUserColours();
697 ucs.setSchemeName(schemeName.getText());
700 PrintWriter out = new PrintWriter(new OutputStreamWriter(
701 new FileOutputStream(choice), "UTF-8"));
703 for (int i = 0; i < buttonPanel.getComponentCount(); i++)
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()));
719 ex.printStackTrace();
727 * @param e DOCUMENT ME!
729 protected void cancelButton_actionPerformed(ActionEvent e)
733 if (seqGroup != null)
735 seqGroup.cs = oldColourScheme;
739 ap.av.setGlobalColourScheme(oldColourScheme);
746 pdbcanvas.pdb.setColours(oldColourScheme);
751 frame.setClosed(true);
759 static Hashtable userColourSchemes;
761 public static Hashtable getUserColourSchemes()
763 return userColourSchemes;
766 public static void initUserColourSchemes(String files)
768 userColourSchemes = new Hashtable();
770 if(files==null || files.length()==0)
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())
780 String file = st.nextToken();
783 UserColourScheme ucs = loadColours(file);
786 if (coloursFound.length() > 0)
787 coloursFound.append("|");
788 coloursFound.append(file);
789 userColourSchemes.put(ucs.getName(), ucs);
794 System.out.println("Error loading User ColourFile\n" + ex);
797 if (!files.equals(coloursFound.toString()))
799 if (coloursFound.toString().length() > 1)
800 jalview.bin.Cache.setProperty("USER_DEFINED_COLOURS",
801 coloursFound.toString());
803 jalview.bin.Cache.applicationProperties.remove("USER_DEFINED_COLOURS");
807 public static void removeColourFromDefaults(String target)
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.
813 userColourSchemes = new Hashtable();
815 StringBuffer coloursFound = new StringBuffer();
816 StringTokenizer st = new StringTokenizer(
817 jalview.bin.Cache.getProperty("USER_DEFINED_COLOURS"), "|");
819 while (st.hasMoreElements())
821 String file = st.nextToken();
824 UserColourScheme ucs = loadColours(file);
825 if (ucs != null && !ucs.getName().equals(target))
827 if (coloursFound.length() > 0)
828 coloursFound.append("|");
829 coloursFound.append(file);
830 userColourSchemes.put(ucs.getName(), ucs);
835 System.out.println("Error loading User ColourFile\n" + ex);
839 if (coloursFound.toString().length() > 1)
840 jalview.bin.Cache.setProperty("USER_DEFINED_COLOURS", coloursFound.toString());
842 jalview.bin.Cache.applicationProperties.remove("USER_DEFINED_COLOURS");
846 public void caseSensitive_actionPerformed(ActionEvent e)
848 resetButtonPanel(caseSensitive.isSelected());
849 lcaseColour.setEnabled(caseSensitive.isSelected());
852 public void lcaseColour_actionPerformed(ActionEvent e)
854 if(selectedButtons==null)
855 selectedButtons = new Vector();
857 selectedButtons.clear();
858 selectedButtons.add(lcaseColour);