/* * Jalview - A Sequence Alignment Editor and Viewer * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ package jalview.gui; import jalview.datamodel.*; import jalview.io.*; import jalview.jbgui.*; import jalview.schemes.*; import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.*; import javax.swing.*; import javax.swing.event.*; /** * DOCUMENT ME! * * @author $author$ * @version $Revision$ */ public class UserDefinedColours extends GUserDefinedColours implements ChangeListener { AlignmentPanel ap; SequenceGroup seqGroup; Vector selectedButtons; ColourSchemeI oldColourScheme; JInternalFrame frame; /** * Creates a new UserDefinedColours object. * * @param ap DOCUMENT ME! * @param sg DOCUMENT ME! */ public UserDefinedColours(AlignmentPanel ap, SequenceGroup sg) { super(); frame = new JInternalFrame(); frame.setContentPane(this); Desktop.addInternalFrame(frame, "User Defined Colours", 720, 370, true); if (System.getProperty("os.name").startsWith("Mac")) { frame.setSize(760, 370); } if (sg != null) { frame.setTitle(frame.getTitle() + " (" + sg.getName() + ")"); } colorChooser.getSelectionModel().addChangeListener(this); this.ap = ap; seqGroup = sg; if (seqGroup != null) { oldColourScheme = seqGroup.cs; } else { oldColourScheme = ap.av.getGlobalColourScheme(); } if (oldColourScheme instanceof UserColourScheme) { schemeName.setText( ( (UserColourScheme) oldColourScheme).getName()); } for (int i = 0; i < 20; i++) { makeButton(ResidueProperties.aa2Triplet.get(ResidueProperties.aa[i]) + "", ResidueProperties.aa[i]); } makeButton("B", "B"); makeButton("Z", "Z"); makeButton("X", "X"); makeButton("Gap", "-"); } /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ public void stateChanged(ChangeEvent evt) { if (selectedButtons != null) { JButton button; for(int i=0; i endIndex) { int temp = startIndex; startIndex = endIndex; endIndex = temp; } for(int b=startIndex; b<=endIndex; b++) { JButton button = (JButton)buttonPanel.getComponent(b); if(!selectedButtons.contains(button)) { button.setForeground(button.getBackground().brighter().brighter()); selectedButtons.add(button); } } } else if(!e.isControlDown()) { for(int b=0; b0) colorChooser.setColor( ((JButton)selectedButtons.elementAt(0)).getBackground()); } /** * DOCUMENT ME! * * @param label DOCUMENT ME! * @param aa DOCUMENT ME! */ void makeButton(String label, String aa) { final JButton button = new JButton(); Color col = Color.white; try { col = oldColourScheme.findColour(aa, -1); } catch (Exception ex) { // ex.printStackTrace(); } button.setBackground(col); button.setText(label); button.setForeground(col.darker().darker().darker()); button.setFont(new java.awt.Font("Verdana", 1, 10)); button.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(MouseEvent e) { colourButtonPressed(e); } }); buttonPanel.add(button, null); } /** * DOCUMENT ME! * * @param e DOCUMENT ME! */ protected void okButton_actionPerformed(ActionEvent e) { applyButton_actionPerformed(null); try { frame.setClosed(true); } catch (Exception ex) { } } /** * DOCUMENT ME! * * @param e DOCUMENT ME! */ protected void applyButton_actionPerformed(ActionEvent e) { UserColourScheme ucs = getSchemeFromGUI(); ucs.setName(schemeName.getText()); if (seqGroup != null) { seqGroup.cs = ucs; ap.repaint(); } else { ap.alignFrame.changeColour(ucs); } } UserColourScheme getSchemeFromGUI() { Color[] newColours = new Color[24]; for (int i = 0; i < 24; i++) { JButton button = (JButton) buttonPanel.getComponent(i); newColours[i] = button.getBackground(); } UserColourScheme ucs = new UserColourScheme(newColours); ucs.setThreshold(0, ap.av.getIgnoreGapsConsensus()); return ucs; } /** * DOCUMENT ME! * * @param e DOCUMENT ME! */ protected void loadbutton_actionPerformed(ActionEvent e) { JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.getProperty( "LAST_DIRECTORY"), new String[] { "jc" }, new String[] { "Jalview User Colours" }, "Jalview User Colours"); chooser.setFileView(new jalview.io.JalviewFileView()); chooser.setDialogTitle("Load colour scheme"); chooser.setToolTipText("Load"); int value = chooser.showOpenDialog(this); if (value == JalviewFileChooser.APPROVE_OPTION) { File choice = chooser.getSelectedFile(); jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice.getParent()); String defaultColours = jalview.bin.Cache.getDefault("USER_DEFINED_COLOURS", choice.getPath()); if (defaultColours.indexOf(choice.getPath()) == -1) defaultColours = defaultColours.concat("|").concat(choice.getPath()); jalview.bin.Cache.setProperty("USER_DEFINED_COLOURS", defaultColours); UserColourScheme ucs = loadColours(choice.getAbsolutePath()); Color[] colors = ucs.getColours(); schemeName.setText(ucs.getName()); for (int i = 0; i < colors.length; i++) { JButton button = (JButton) buttonPanel.getComponent(i); button.setBackground(colors[i]); } } } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public static UserColourScheme loadDefaultColours() { UserColourScheme ret = null; String colours = jalview.bin.Cache.getProperty("USER_DEFINED_COLOURS"); if ( colours != null ) { if(colours.indexOf("|")>-1) colours = colours.substring(0, colours.indexOf("|")); ret = loadColours(colours); } if(ret == null) { Color[] newColours = new Color[24]; for (int i = 0; i < 24; i++) { newColours[i] = Color.white; } ret = new UserColourScheme(newColours); } return ret; } /** * DOCUMENT ME! * * @param file DOCUMENT ME! * * @return DOCUMENT ME! */ static UserColourScheme loadColours(String file) { UserColourScheme ucs = null; Color[] newColours = null; try { InputStreamReader in = new InputStreamReader(new FileInputStream( file), "UTF-8"); jalview.binding.JalviewUserColours jucs = new jalview.binding.JalviewUserColours(); jucs = (jalview.binding.JalviewUserColours) jucs.unmarshal(in); newColours = new Color[jucs.getColourCount()]; for (int i = 0; i < 24; i++) { newColours[i] = new Color(Integer.parseInt( jucs.getColour(i).getRGB(), 16)); } if (newColours != null) { ucs = new UserColourScheme(newColours); ucs.setName( jucs.getSchemeName() ); } } catch (Exception ex) { System.out.println("Error loading User ColourFile\n"+ex); } return ucs; } /** * DOCUMENT ME! * * @param e DOCUMENT ME! */ protected void savebutton_actionPerformed(ActionEvent e) { if(schemeName.getText().trim().length()<1) { JOptionPane.showInternalMessageDialog(Desktop.desktop, "User colour scheme must have a name!", "No name for colour scheme", JOptionPane.WARNING_MESSAGE); return; } if(userColourSchemes!=null && userColourSchemes.containsKey(schemeName.getText()) ) { int reply = JOptionPane.showInternalConfirmDialog(Desktop.desktop, "Colour scheme "+schemeName.getText()+ " exists." +"\nContinue saving colour scheme as "+schemeName.getText()+"?", "Duplicate scheme name", JOptionPane.YES_NO_OPTION); if(reply != JOptionPane.YES_OPTION) return; userColourSchemes.remove(schemeName.getText()); } JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.getProperty( "LAST_DIRECTORY"), new String[] { "jc" }, new String[] { "Jalview User Colours" }, "Jalview User Colours"); chooser.setFileView(new jalview.io.JalviewFileView()); chooser.setDialogTitle("Save colour scheme"); chooser.setToolTipText("Save"); int value = chooser.showSaveDialog(this); if (value == JalviewFileChooser.APPROVE_OPTION) { String choice = chooser.getSelectedFile().getPath(); String defaultColours = jalview.bin.Cache.getDefault("USER_DEFINED_COLOURS", choice); if(defaultColours.indexOf(choice)==-1) { if(defaultColours.length()>0) defaultColours = defaultColours.concat("|"); defaultColours = defaultColours.concat(choice); } userColourSchemes.put(schemeName.getText(), getSchemeFromGUI()); ap.alignFrame.updateUserColourMenu(); jalview.bin.Cache.setProperty("USER_DEFINED_COLOURS", defaultColours); jalview.binding.JalviewUserColours ucs = new jalview.binding.JalviewUserColours(); ucs.setSchemeName(schemeName.getText()); try { PrintWriter out = new PrintWriter(new OutputStreamWriter( new FileOutputStream(choice), "UTF-8")); for (int i = 0; i < 24; i++) { JButton button = (JButton) buttonPanel.getComponent(i); jalview.binding.Colour col = new jalview.binding.Colour(); col.setName(button.getText()); col.setRGB(jalview.util.Format.getHexString( button.getBackground())); ucs.addColour(col); } ucs.marshal(out); out.close(); } catch (Exception ex) { ex.printStackTrace(); } } } /** * DOCUMENT ME! * * @param e DOCUMENT ME! */ protected void cancelButton_actionPerformed(ActionEvent e) { if (seqGroup != null) { seqGroup.cs = oldColourScheme; } else { ap.av.setGlobalColourScheme(oldColourScheme); } ap.repaint(); try { frame.setClosed(true); } catch (Exception ex) { } } static Hashtable userColourSchemes; public static Hashtable getUserColourSchemes() { return userColourSchemes; } public static void initUserColourSchemes(String files) { userColourSchemes = new Hashtable(); if(files==null || files.length()==0) return; // In case colours can't be loaded, we'll remove them // from the default list here. StringBuffer coloursFound = new StringBuffer(); StringTokenizer st = new StringTokenizer(files, "|"); while (st.hasMoreElements()) { String file = st.nextToken(); try { UserColourScheme ucs = loadColours(file); if (ucs != null) { if (coloursFound.length() > 0) coloursFound.append("|"); coloursFound.append(file); userColourSchemes.put(ucs.getName(), ucs); } } catch (Exception ex) { System.out.println("Error loading User ColourFile\n" + ex); } } if (!files.equals(coloursFound.toString())) { jalview.bin.Cache.setProperty("USER_DEFINED_COLOURS", coloursFound.toString()); } } public static void removeColourFromDefaults(String target) { // The only way to find colours by name is to load them in // In case colours can't be loaded, we'll remove them // from the default list here. userColourSchemes = new Hashtable(); StringBuffer coloursFound = new StringBuffer(); StringTokenizer st = new StringTokenizer( jalview.bin.Cache.getProperty("USER_DEFINED_COLOURS"), "|"); while (st.hasMoreElements()) { String file = st.nextToken(); try { UserColourScheme ucs = loadColours(file); if (ucs != null && !ucs.getName().equals(target)) { if (coloursFound.length() > 0) coloursFound.append("|"); coloursFound.append(file); userColourSchemes.put(ucs.getName(), ucs); } } catch (Exception ex) { System.out.println("Error loading User ColourFile\n" + ex); } } jalview.bin.Cache.setProperty("USER_DEFINED_COLOURS", coloursFound.toString()); } }