2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
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.
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.
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.
23 import jalview.datamodel.SequenceGroup;
24 import jalview.util.MessageManager;
26 import java.awt.BorderLayout;
27 import java.awt.Color;
28 import java.awt.Dimension;
29 import java.awt.event.MouseAdapter;
30 import java.awt.event.MouseEvent;
31 import java.util.HashMap;
34 import javax.swing.BorderFactory;
35 import javax.swing.JColorChooser;
36 import javax.swing.JLabel;
37 import javax.swing.JPanel;
38 import javax.swing.JSlider;
39 import javax.swing.event.ChangeEvent;
40 import javax.swing.event.ChangeListener;
42 public class TextColourChooser
48 Color original1, original2;
50 int originalThreshold;
52 Map<SequenceGroup, Color> groupColour1;
54 Map<SequenceGroup, Color> groupColour2;
56 Map<SequenceGroup, Integer> groupThreshold;
59 * Show a dialogue which allows the user to select two text colours and adjust
60 * a slider for the cross-over point
63 * the AlignmentPanel context
64 * @param sequenceGroup
65 * the SequenceGroup context (only for group pop-menu option)
67 public void chooseColour(AlignmentPanel alignPanel, SequenceGroup sequenceGroup)
70 this.sg = sequenceGroup;
72 saveInitialSettings();
74 final JSlider slider = new JSlider(0, 750, originalThreshold);
75 final JPanel col1 = new JPanel();
76 col1.setPreferredSize(new Dimension(40, 20));
77 col1.setBorder(BorderFactory.createEtchedBorder());
78 col1.setToolTipText(MessageManager.getString("label.dark_colour"));
79 col1.setBackground(original1);
80 final JPanel col2 = new JPanel();
81 col2.setPreferredSize(new Dimension(40, 20));
82 col2.setBorder(BorderFactory.createEtchedBorder());
83 col2.setToolTipText(MessageManager.getString("label.light_colour"));
84 col2.setBackground(original2);
85 final JPanel bigpanel = new JPanel(new BorderLayout());
86 JPanel panel = new JPanel();
87 bigpanel.add(panel, BorderLayout.CENTER);
92 .getString("label.select_dark_light_set_threshold")
93 + "</html>"), BorderLayout.NORTH);
98 col1.addMouseListener(new MouseAdapter()
101 public void mousePressed(MouseEvent e)
103 Color col = JColorChooser.showDialog(bigpanel,
104 MessageManager.getString("label.select_colour_for_text"),
105 col1.getBackground());
109 col1.setBackground(col);
114 col2.addMouseListener(new MouseAdapter()
117 public void mousePressed(MouseEvent e)
119 Color col = JColorChooser.showDialog(bigpanel,
120 MessageManager.getString("label.select_colour_for_text"),
121 col2.getBackground());
125 col2.setBackground(col);
130 slider.addChangeListener(new ChangeListener()
133 public void stateChanged(ChangeEvent evt)
135 thresholdChanged(slider.getValue());
139 int reply = JvOptionPane
140 .showInternalOptionDialog(
144 .getString("label.adjunst_foreground_text_colour_threshold"),
145 JvOptionPane.OK_CANCEL_OPTION,
146 JvOptionPane.QUESTION_MESSAGE, null, null, null);
148 if (reply == JvOptionPane.CANCEL_OPTION)
150 restoreInitialSettings();
155 * Restore initial settings on Cancel
157 protected void restoreInitialSettings()
161 ap.av.setTextColour(original1);
162 ap.av.setTextColour2(original2);
163 ap.av.setThresholdTextColour(originalThreshold);
167 sg.textColour = original1;
168 sg.textColour2 = original2;
169 sg.thresholdTextColour = originalThreshold;
173 * if 'Apply To All Groups' was in force, there will be
174 * group-specific settings to restore as well
176 for (SequenceGroup group : this.groupColour1.keySet())
178 group.textColour = groupColour1.get(group);
179 group.textColour2 = groupColour2.get(group);
180 group.thresholdTextColour = groupThreshold.get(group);
185 * Save settings on entry, for restore on Cancel
187 protected void saveInitialSettings()
189 groupColour1 = new HashMap<SequenceGroup, Color>();
190 groupColour2 = new HashMap<SequenceGroup, Color>();
191 groupThreshold = new HashMap<SequenceGroup, Integer>();
198 original1 = ap.av.getTextColour();
199 original2 = ap.av.getTextColour2();
200 originalThreshold = ap.av.getThresholdTextColour();
201 if (ap.av.getColourAppliesToAllGroups()
202 && ap.av.getAlignment().getGroups() != null)
205 * if applying changes to all groups, need to be able to
206 * restore group settings as well
208 for (SequenceGroup group : ap.av.getAlignment().getGroups())
210 groupColour1.put(group, group.textColour);
211 groupColour2.put(group, group.textColour2);
212 groupThreshold.put(group, group.thresholdTextColour);
219 * Sequence group scope
221 original1 = sg.textColour;
222 original2 = sg.textColour2;
223 originalThreshold = sg.thresholdTextColour;
227 void colour1Changed(Color col)
231 ap.av.setTextColour(col);
232 if (ap.av.getColourAppliesToAllGroups())
234 setGroupTextColour();
242 ap.paintAlignment(true);
245 void colour2Changed(Color col)
249 ap.av.setTextColour2(col);
250 if (ap.av.getColourAppliesToAllGroups())
252 setGroupTextColour();
257 sg.textColour2 = col;
260 ap.paintAlignment(true);
263 void thresholdChanged(int value)
267 ap.av.setThresholdTextColour(value);
268 if (ap.av.getColourAppliesToAllGroups())
270 setGroupTextColour();
275 sg.thresholdTextColour = value;
278 ap.paintAlignment(true);
281 void setGroupTextColour()
283 if (ap.av.getAlignment().getGroups() == null)
288 for (SequenceGroup group : ap.av.getAlignment().getGroups())
290 group.textColour = ap.av.getTextColour();
291 group.textColour2 = ap.av.getTextColour2();
292 group.thresholdTextColour = ap.av.getThresholdTextColour();