2 * Jalview - A Sequence Alignment Editor and Viewer
\r
3 * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
\r
5 * This program is free software; you can redistribute it and/or
\r
6 * modify it under the terms of the GNU General Public License
\r
7 * as published by the Free Software Foundation; either version 2
\r
8 * of the License, or (at your option) any later version.
\r
10 * This program is distributed in the hope that it will be useful,
\r
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
13 * GNU General Public License for more details.
\r
15 * You should have received a copy of the GNU General Public License
\r
16 * along with this program; if not, write to the Free Software
\r
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
\r
19 package jalview.gui;
\r
21 import jalview.datamodel.*;
\r
23 import jalview.io.*;
\r
25 import jalview.jbgui.*;
\r
27 import jalview.schemes.*;
\r
30 import java.awt.event.*;
\r
36 import javax.swing.*;
\r
37 import javax.swing.event.*;
\r
45 * @version $Revision$
\r
47 public class UserDefinedColours extends GUserDefinedColours
\r
48 implements ChangeListener
\r
51 SequenceGroup seqGroup;
\r
52 Vector selectedButtons;
\r
53 ColourSchemeI oldColourScheme;
\r
54 JInternalFrame frame;
\r
57 * Creates a new UserDefinedColours object.
\r
59 * @param ap DOCUMENT ME!
\r
60 * @param sg DOCUMENT ME!
\r
62 public UserDefinedColours(AlignmentPanel ap, SequenceGroup sg)
\r
65 frame = new JInternalFrame();
\r
66 frame.setContentPane(this);
\r
67 Desktop.addInternalFrame(frame, "User Defined Colours", 720, 370, true);
\r
69 if (System.getProperty("os.name").startsWith("Mac"))
\r
71 frame.setSize(760, 370);
\r
76 frame.setTitle(frame.getTitle() + " (" + sg.getName() + ")");
\r
79 colorChooser.getSelectionModel().addChangeListener(this);
\r
84 if (seqGroup != null)
\r
86 oldColourScheme = seqGroup.cs;
\r
90 oldColourScheme = ap.av.getGlobalColourScheme();
\r
93 if (oldColourScheme instanceof UserColourScheme)
\r
95 schemeName.setText( ( (UserColourScheme) oldColourScheme).getName());
\r
97 for (int i = 0; i < 20; i++)
\r
99 makeButton(ResidueProperties.aa2Triplet.get(ResidueProperties.aa[i]) +
\r
100 "", ResidueProperties.aa[i]);
\r
103 makeButton("B", "B");
\r
104 makeButton("Z", "Z");
\r
105 makeButton("X", "X");
\r
106 makeButton("Gap", "-");
\r
112 * @param evt DOCUMENT ME!
\r
114 public void stateChanged(ChangeEvent evt)
\r
116 if (selectedButtons != null)
\r
119 for(int i=0; i<selectedButtons.size(); i++)
\r
121 button = (JButton)selectedButtons.elementAt(i);
\r
122 button.setBackground(colorChooser.getColor());
\r
123 button.setForeground( button.getBackground().brighter().brighter().brighter());
\r
131 * @param e DOCUMENT ME!
\r
133 public void colourButtonPressed(MouseEvent e)
\r
135 if(selectedButtons == null)
\r
136 selectedButtons = new Vector();
\r
138 JButton pressed = (JButton) e.getSource();
\r
140 if(e.isShiftDown())
\r
142 JButton start, end = (JButton) e.getSource();
\r
143 if(selectedButtons.size()>1)
\r
144 start = (JButton)selectedButtons.elementAt(selectedButtons.size()-1);
\r
146 start = (JButton) e.getSource();
\r
148 int startIndex=0, endIndex=0;
\r
149 for(int b=0; b<buttonPanel.getComponentCount(); b++)
\r
151 if(buttonPanel.getComponent(b)==start)
\r
153 if(buttonPanel.getComponent(b)==end)
\r
157 if(startIndex > endIndex)
\r
159 int temp = startIndex;
\r
160 startIndex = endIndex;
\r
164 for(int b=startIndex; b<=endIndex; b++)
\r
166 JButton button = (JButton)buttonPanel.getComponent(b);
\r
167 if(!selectedButtons.contains(button))
\r
169 button.setForeground(button.getBackground().brighter().brighter());
\r
170 selectedButtons.add(button);
\r
174 else if(!e.isControlDown())
\r
176 for(int b=0; b<selectedButtons.size(); b++)
\r
178 JButton button = (JButton)selectedButtons.elementAt(b);
\r
179 button.setForeground(button.getBackground().darker().darker());
\r
181 selectedButtons.clear();
\r
182 pressed.setForeground( pressed.getBackground().brighter().brighter());
\r
183 selectedButtons.addElement(pressed);
\r
186 else if(e.isControlDown())
\r
188 if(selectedButtons.contains(pressed))
\r
190 pressed.setForeground(pressed.getBackground().darker().darker());
\r
191 selectedButtons.remove(pressed);
\r
195 pressed.setForeground( pressed.getBackground().brighter().brighter());
\r
196 selectedButtons.addElement(pressed);
\r
200 if(selectedButtons.size()>0)
\r
201 colorChooser.setColor( ((JButton)selectedButtons.elementAt(0)).getBackground());
\r
207 * @param label DOCUMENT ME!
\r
208 * @param aa DOCUMENT ME!
\r
210 void makeButton(String label, String aa)
\r
212 final JButton button = new JButton();
\r
213 Color col = Color.white;
\r
217 col = oldColourScheme.findColour(aa, -1);
\r
219 catch (Exception ex)
\r
221 // ex.printStackTrace();
\r
224 button.setBackground(col);
\r
225 button.setText(label);
\r
226 button.setForeground(col.darker().darker().darker());
\r
227 button.setFont(new java.awt.Font("Verdana", 1, 10));
\r
228 button.addMouseListener(new java.awt.event.MouseAdapter()
\r
230 public void mouseClicked(MouseEvent e)
\r
232 colourButtonPressed(e);
\r
236 buttonPanel.add(button, null);
\r
242 * @param e DOCUMENT ME!
\r
244 protected void okButton_actionPerformed(ActionEvent e)
\r
246 applyButton_actionPerformed(null);
\r
250 frame.setClosed(true);
\r
252 catch (Exception ex)
\r
260 * @param e DOCUMENT ME!
\r
262 protected void applyButton_actionPerformed(ActionEvent e)
\r
264 UserColourScheme ucs = getSchemeFromGUI();
\r
265 ucs.setName(schemeName.getText());
\r
267 if (seqGroup != null)
\r
274 ap.alignFrame.changeColour(ucs);
\r
278 UserColourScheme getSchemeFromGUI()
\r
280 Color[] newColours = new Color[24];
\r
282 for (int i = 0; i < 24; i++)
\r
284 JButton button = (JButton) buttonPanel.getComponent(i);
\r
285 newColours[i] = button.getBackground();
\r
288 UserColourScheme ucs = new UserColourScheme(newColours);
\r
289 ucs.setThreshold(0, ap.av.getIgnoreGapsConsensus());
\r
299 * @param e DOCUMENT ME!
\r
301 protected void loadbutton_actionPerformed(ActionEvent e)
\r
303 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.getProperty(
\r
304 "LAST_DIRECTORY"), new String[] { "jc" },
\r
305 new String[] { "Jalview User Colours" }, "Jalview User Colours");
\r
306 chooser.setFileView(new jalview.io.JalviewFileView());
\r
307 chooser.setDialogTitle("Load colour scheme");
\r
308 chooser.setToolTipText("Load");
\r
310 int value = chooser.showOpenDialog(this);
\r
312 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
314 File choice = chooser.getSelectedFile();
\r
315 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice.getParent());
\r
316 String defaultColours = jalview.bin.Cache.getDefault("USER_DEFINED_COLOURS",
\r
318 if (defaultColours.indexOf(choice.getPath()) == -1)
\r
319 defaultColours = defaultColours.concat("|").concat(choice.getPath());
\r
321 jalview.bin.Cache.setProperty("USER_DEFINED_COLOURS", defaultColours);
\r
324 UserColourScheme ucs = loadColours(choice.getAbsolutePath());
\r
325 Color[] colors = ucs.getColours();
\r
326 schemeName.setText(ucs.getName());
\r
328 for (int i = 0; i < colors.length; i++)
\r
330 JButton button = (JButton) buttonPanel.getComponent(i);
\r
331 button.setBackground(colors[i]);
\r
339 * @return DOCUMENT ME!
\r
341 public static UserColourScheme loadDefaultColours()
\r
343 UserColourScheme ret = null;
\r
345 String colours = jalview.bin.Cache.getProperty("USER_DEFINED_COLOURS");
\r
346 if ( colours != null )
\r
348 if(colours.indexOf("|")>-1)
\r
349 colours = colours.substring(0, colours.indexOf("|"));
\r
351 ret = loadColours(colours);
\r
356 Color[] newColours = new Color[24];
\r
357 for (int i = 0; i < 24; i++)
\r
359 newColours[i] = Color.white;
\r
361 ret = new UserColourScheme(newColours);
\r
370 * @param file DOCUMENT ME!
\r
372 * @return DOCUMENT ME!
\r
374 static UserColourScheme loadColours(String file)
\r
376 UserColourScheme ucs = null;
\r
377 Color[] newColours = null;
\r
381 InputStreamReader in = new InputStreamReader(new FileInputStream(
\r
384 jalview.binding.JalviewUserColours jucs = new jalview.binding.JalviewUserColours();
\r
385 jucs = (jalview.binding.JalviewUserColours) jucs.unmarshal(in);
\r
387 newColours = new Color[jucs.getColourCount()];
\r
389 for (int i = 0; i < 24; i++)
\r
391 newColours[i] = new Color(Integer.parseInt(
\r
392 jucs.getColour(i).getRGB(), 16));
\r
394 if (newColours != null)
\r
396 ucs = new UserColourScheme(newColours);
\r
397 ucs.setName( jucs.getSchemeName() );
\r
401 catch (Exception ex)
\r
403 System.out.println("Error loading User ColourFile\n"+ex);
\r
413 * @param e DOCUMENT ME!
\r
415 protected void savebutton_actionPerformed(ActionEvent e)
\r
417 if(schemeName.getText().trim().length()<1)
\r
419 JOptionPane.showInternalMessageDialog(Desktop.desktop,
\r
420 "User colour scheme must have a name!",
\r
421 "No name for colour scheme",
\r
422 JOptionPane.WARNING_MESSAGE);
\r
426 if(userColourSchemes!=null && userColourSchemes.containsKey(schemeName.getText()) )
\r
428 int reply = JOptionPane.showInternalConfirmDialog(Desktop.desktop, "Colour scheme "+schemeName.getText()+ " exists."
\r
429 +"\nContinue saving colour scheme as "+schemeName.getText()+"?",
\r
430 "Duplicate scheme name", JOptionPane.YES_NO_OPTION);
\r
431 if(reply != JOptionPane.YES_OPTION)
\r
434 userColourSchemes.remove(schemeName.getText());
\r
436 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.getProperty(
\r
437 "LAST_DIRECTORY"), new String[] { "jc" },
\r
438 new String[] { "Jalview User Colours" }, "Jalview User Colours");
\r
440 chooser.setFileView(new jalview.io.JalviewFileView());
\r
441 chooser.setDialogTitle("Save colour scheme");
\r
442 chooser.setToolTipText("Save");
\r
444 int value = chooser.showSaveDialog(this);
\r
446 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
448 String choice = chooser.getSelectedFile().getPath();
\r
449 String defaultColours = jalview.bin.Cache.getDefault("USER_DEFINED_COLOURS", choice);
\r
450 if(defaultColours.indexOf(choice)==-1)
\r
452 if(defaultColours.length()>0)
\r
453 defaultColours = defaultColours.concat("|");
\r
454 defaultColours = defaultColours.concat(choice);
\r
457 userColourSchemes.put(schemeName.getText(), getSchemeFromGUI());
\r
459 ap.alignFrame.updateUserColourMenu();
\r
461 jalview.bin.Cache.setProperty("USER_DEFINED_COLOURS", defaultColours);
\r
463 jalview.binding.JalviewUserColours ucs = new jalview.binding.JalviewUserColours();
\r
464 ucs.setSchemeName(schemeName.getText());
\r
467 PrintWriter out = new PrintWriter(new OutputStreamWriter(
\r
468 new FileOutputStream(choice), "UTF-8"));
\r
470 for (int i = 0; i < 24; i++)
\r
472 JButton button = (JButton) buttonPanel.getComponent(i);
\r
473 jalview.binding.Colour col = new jalview.binding.Colour();
\r
474 col.setName(button.getText());
\r
475 col.setRGB(jalview.util.Format.getHexString(
\r
476 button.getBackground()));
\r
477 ucs.addColour(col);
\r
483 catch (Exception ex)
\r
485 ex.printStackTrace();
\r
493 * @param e DOCUMENT ME!
\r
495 protected void cancelButton_actionPerformed(ActionEvent e)
\r
497 if (seqGroup != null)
\r
499 seqGroup.cs = oldColourScheme;
\r
503 ap.av.setGlobalColourScheme(oldColourScheme);
\r
510 frame.setClosed(true);
\r
512 catch (Exception ex)
\r
518 static Hashtable userColourSchemes;
\r
520 public static Hashtable getUserColourSchemes()
\r
522 return userColourSchemes;
\r
525 public static void initUserColourSchemes(String files)
\r
527 userColourSchemes = new Hashtable();
\r
529 if(files==null || files.length()==0)
\r
533 // In case colours can't be loaded, we'll remove them
\r
534 // from the default list here.
\r
535 StringBuffer coloursFound = new StringBuffer();
\r
536 StringTokenizer st = new StringTokenizer(files, "|");
\r
537 while (st.hasMoreElements())
\r
539 String file = st.nextToken();
\r
542 UserColourScheme ucs = loadColours(file);
\r
545 if (coloursFound.length() > 0)
\r
546 coloursFound.append("|");
\r
547 coloursFound.append(file);
\r
548 userColourSchemes.put(ucs.getName(), ucs);
\r
551 catch (Exception ex)
\r
553 System.out.println("Error loading User ColourFile\n" + ex);
\r
556 if (!files.equals(coloursFound.toString()))
\r
558 if (coloursFound.toString().length() > 1)
\r
559 jalview.bin.Cache.setProperty("USER_DEFINED_COLOURS",
\r
560 coloursFound.toString());
\r
562 jalview.bin.Cache.applicationProperties.remove("USER_DEFINED_COLOURS");
\r
566 public static void removeColourFromDefaults(String target)
\r
568 // The only way to find colours by name is to load them in
\r
569 // In case colours can't be loaded, we'll remove them
\r
570 // from the default list here.
\r
572 userColourSchemes = new Hashtable();
\r
574 StringBuffer coloursFound = new StringBuffer();
\r
575 StringTokenizer st = new StringTokenizer(
\r
576 jalview.bin.Cache.getProperty("USER_DEFINED_COLOURS"), "|");
\r
578 while (st.hasMoreElements())
\r
580 String file = st.nextToken();
\r
583 UserColourScheme ucs = loadColours(file);
\r
584 if (ucs != null && !ucs.getName().equals(target))
\r
586 if (coloursFound.length() > 0)
\r
587 coloursFound.append("|");
\r
588 coloursFound.append(file);
\r
589 userColourSchemes.put(ucs.getName(), ucs);
\r
592 catch (Exception ex)
\r
594 System.out.println("Error loading User ColourFile\n" + ex);
\r
598 if (coloursFound.toString().length() > 1)
\r
599 jalview.bin.Cache.setProperty("USER_DEFINED_COLOURS", coloursFound.toString());
\r
601 jalview.bin.Cache.applicationProperties.remove("USER_DEFINED_COLOURS");
\r