3 import jalview.datamodel.AnnotatedCollectionI;
4 import jalview.schemes.ColourSchemeI;
5 import jalview.schemes.ColourSchemes;
6 import jalview.schemes.ResidueColourScheme;
7 import jalview.schemes.UserColourScheme;
8 import jalview.util.MessageManager;
10 import java.awt.Component;
11 import java.awt.event.ActionEvent;
12 import java.awt.event.ActionListener;
13 import java.awt.event.MouseAdapter;
14 import java.awt.event.MouseEvent;
16 import javax.swing.ButtonGroup;
17 import javax.swing.JMenu;
18 import javax.swing.JRadioButtonMenuItem;
20 public class ColourMenuHelper
22 public interface ColourChangeListener
24 void changeColour_actionPerformed(String name);
28 * Adds items to the colour menu, as mutually exclusive members of a button
29 * group. The callback handler is responsible for the action on selecting any
30 * of these options. The callback method receives the name of the selected
31 * colour, or "None" or "User Defined". This method returns the ButtonGroup to
32 * which items were added.
36 * <li>...other 'built-in' colours</li>
37 * <li>...any user-defined colours</li>
38 * <li>User Defined..</li>
42 * the menu to attach items to
44 * a callback to handle menu selection
46 * the data the menu is being built for
48 * if true, only simple per-residue colour schemes are included
50 public static ButtonGroup addMenuItems(final JMenu colourMenu,
51 final ColourChangeListener client, AnnotatedCollectionI coll,
55 * ButtonGroup groups those items whose
56 * selection is mutually exclusive
58 ButtonGroup colours = new ButtonGroup();
62 JRadioButtonMenuItem noColourmenuItem = new JRadioButtonMenuItem(
63 MessageManager.getString("label.none"));
64 noColourmenuItem.setName(ResidueColourScheme.NONE);
65 noColourmenuItem.addActionListener(new ActionListener()
68 public void actionPerformed(ActionEvent e)
70 client.changeColour_actionPerformed(ResidueColourScheme.NONE);
73 colourMenu.add(noColourmenuItem);
74 colours.add(noColourmenuItem);
78 * scan registered colour schemes (built-in or user-defined
79 * and add them to the menu (in the order they were added)
81 Iterable<ColourSchemeI> colourSchemes = ColourSchemes.getInstance()
83 for (ColourSchemeI scheme : colourSchemes)
85 if (simpleOnly && !scheme.isSimple())
91 * button text is i18n'd but the name is the canonical name of
92 * the colour scheme (inspected in setColourSelected())
94 final String name = scheme.getSchemeName();
95 String label = MessageManager.getStringOrReturn("label.colourScheme_"
96 + name.toLowerCase().replace(" ", "_"), name);
97 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(label);
98 radioItem.setName(name);
99 radioItem.setEnabled(scheme.isApplicableTo(coll));
100 if (scheme instanceof UserColourScheme)
103 * user-defined colour scheme loaded on startup or during the
104 * Jalview session; right-click on this offers the option to
105 * remove it as a colour choice
107 radioItem.addMouseListener(new MouseAdapter()
110 public void mousePressed(MouseEvent evt)
112 if (evt.isPopupTrigger()) // Mac
119 public void mouseReleased(MouseEvent evt)
121 if (evt.isPopupTrigger()) // Windows
129 ActionListener al = radioItem.getActionListeners()[0];
130 radioItem.removeActionListener(al);
131 int option = JvOptionPane.showInternalConfirmDialog(
132 Desktop.desktop, MessageManager
133 .getString("label.remove_from_default_list"),
135 .getString("label.remove_user_defined_colour"),
136 JvOptionPane.YES_NO_OPTION);
137 if (option == JvOptionPane.YES_OPTION)
139 UserDefinedColours.removeColourFromDefaults(radioItem
141 ColourSchemes.getInstance().removeColourScheme(
142 radioItem.getName());
143 colourMenu.remove(radioItem);
147 radioItem.addActionListener(al);
152 radioItem.addActionListener(new ActionListener()
155 public void actionPerformed(ActionEvent evt)
157 client.changeColour_actionPerformed(name);
160 colourMenu.add(radioItem);
161 colours.add(radioItem);
165 * only add the option to load/configure a user-defined colour
166 * to the AlignFrame colour menu
168 if (client instanceof AlignFrame)
170 final String label = MessageManager.getString("action.user_defined");
171 JRadioButtonMenuItem userDefinedColour = new JRadioButtonMenuItem(
173 userDefinedColour.addActionListener(new ActionListener()
176 public void actionPerformed(ActionEvent e)
178 client.changeColour_actionPerformed(ResidueColourScheme.USER_DEFINED);
181 colourMenu.add(userDefinedColour);
182 colours.add(userDefinedColour);
189 * Marks as selected the colour menu item matching the given name, or the
190 * first item ('None') if no match is found
195 public static void setColourSelected(JMenu colourMenu, String colourName)
197 if (colourName == null)
202 JRadioButtonMenuItem none = null;
205 * select the radio button whose name matches the colour name
206 * (not the button text, as it may be internationalised)
208 for (Component menuItem : colourMenu.getMenuComponents())
210 if (menuItem instanceof JRadioButtonMenuItem)
212 String buttonName = ((JRadioButtonMenuItem) menuItem).getName();
213 if (colourName.equals(buttonName))
215 ((JRadioButtonMenuItem) menuItem).setSelected(true);
218 if (ResidueColourScheme.NONE.equals(buttonName))
220 none = (JRadioButtonMenuItem) menuItem;
226 none.setSelected(true);
231 * Marks as selected the colour menu item matching the given colour scheme, or
232 * the first item ('None') if no match is found
237 public static void setColourSelected(JMenu colourMenu, ColourSchemeI cs)
239 setColourSelected(colourMenu, cs == null ? ResidueColourScheme.NONE
240 : cs.getSchemeName());