Jalview 2.6 source licence
[jalview.git] / src / jalview / gui / TextColourChooser.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6)
3  * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle
4  * 
5  * This file is part of Jalview.
6  * 
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 of the License, or (at your option) any later version.
10  * 
11  * Jalview is distributed in the hope that it will be useful, but 
12  * WITHOUT ANY WARRANTY; without even the implied warranty 
13  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
14  * PURPOSE.  See the GNU General Public License for more details.
15  * 
16  * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
17  */
18 package jalview.gui;
19
20 import java.util.*;
21
22 import java.awt.*;
23 import java.awt.event.*;
24 import javax.swing.*;
25 import javax.swing.event.*;
26
27 import jalview.datamodel.*;
28
29 public class TextColourChooser
30 {
31   AlignmentPanel ap;
32
33   SequenceGroup sg;
34
35   public void chooseColour(AlignmentPanel ap, SequenceGroup sg)
36   {
37     this.ap = ap;
38     this.sg = sg;
39
40     int original1, original2, originalThreshold;
41     if (sg == null)
42     {
43       original1 = ap.av.textColour.getRGB();
44       original2 = ap.av.textColour2.getRGB();
45       originalThreshold = ap.av.thresholdTextColour;
46     }
47     else
48     {
49       original1 = sg.textColour.getRGB();
50       original2 = sg.textColour2.getRGB();
51       originalThreshold = sg.thresholdTextColour;
52     }
53
54     final JSlider slider = new JSlider(0, 750, originalThreshold);
55     final JPanel col1 = new JPanel();
56     col1.setPreferredSize(new Dimension(40, 20));
57     col1.setBorder(BorderFactory.createEtchedBorder());
58     col1.setToolTipText("Dark Colour");
59     col1.setBackground(new Color(original1));
60     final JPanel col2 = new JPanel();
61     col2.setPreferredSize(new Dimension(40, 20));
62     col2.setBorder(BorderFactory.createEtchedBorder());
63     col2.setToolTipText("Light Colour");
64     col2.setBackground(new Color(original2));
65     final JPanel bigpanel = new JPanel(new BorderLayout());
66     JPanel panel = new JPanel();
67     bigpanel.add(panel, BorderLayout.CENTER);
68     bigpanel
69             .add(
70                     new JLabel(
71                             "<html><i>Select a dark and light text colour, then set the threshold to"
72                                     + "<br>switch between colours, based on background colour</i></html>"),
73                     BorderLayout.NORTH);
74     panel.add(col1);
75     panel.add(slider);
76     panel.add(col2);
77
78     col1.addMouseListener(new MouseAdapter()
79     {
80       public void mousePressed(MouseEvent e)
81       {
82         Color col = JColorChooser.showDialog(bigpanel,
83                 "Select Colour for Text", col1.getBackground());
84         if (col != null)
85         {
86           colour1Changed(col);
87           col1.setBackground(col);
88         }
89       }
90     });
91
92     col2.addMouseListener(new MouseAdapter()
93     {
94       public void mousePressed(MouseEvent e)
95       {
96         Color col = JColorChooser.showDialog(bigpanel,
97                 "Select Colour for Text", col2.getBackground());
98         if (col != null)
99         {
100           colour2Changed(col);
101           col2.setBackground(col);
102         }
103       }
104     });
105
106     slider.addChangeListener(new ChangeListener()
107     {
108       public void stateChanged(ChangeEvent evt)
109       {
110         thresholdChanged(slider.getValue());
111       }
112     });
113
114     int reply = JOptionPane.showInternalOptionDialog(ap, bigpanel,
115             "Adjust Foreground Text Colour Threshold",
116             JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE,
117             null, null, null);
118
119     if (reply == JOptionPane.CANCEL_OPTION)
120     {
121       if (sg == null)
122       {
123         ap.av.textColour = new Color(original1);
124         ap.av.textColour2 = new Color(original2);
125         ap.av.thresholdTextColour = originalThreshold;
126       }
127       else
128       {
129         sg.textColour = new Color(original1);
130         sg.textColour2 = new Color(original2);
131         sg.thresholdTextColour = originalThreshold;
132       }
133     }
134   }
135
136   void colour1Changed(Color col)
137   {
138     if (sg == null)
139     {
140       ap.av.textColour = col;
141       if (ap.av.colourAppliesToAllGroups)
142       {
143         setGroupTextColour();
144       }
145     }
146     else
147     {
148       sg.textColour = col;
149     }
150
151     ap.paintAlignment(true);
152   }
153
154   void colour2Changed(Color col)
155   {
156     if (sg == null)
157     {
158       ap.av.textColour2 = col;
159       if (ap.av.colourAppliesToAllGroups)
160       {
161         setGroupTextColour();
162       }
163     }
164     else
165     {
166       sg.textColour2 = col;
167     }
168
169     ap.paintAlignment(true);
170   }
171
172   void thresholdChanged(int value)
173   {
174     if (sg == null)
175     {
176       ap.av.thresholdTextColour = value;
177       if (ap.av.colourAppliesToAllGroups)
178       {
179         setGroupTextColour();
180       }
181     }
182     else
183     {
184       sg.thresholdTextColour = value;
185     }
186
187     ap.paintAlignment(true);
188   }
189
190   void setGroupTextColour()
191   {
192     if (ap.av.alignment.getGroups() == null)
193     {
194       return;
195     }
196
197     Vector groups = ap.av.alignment.getGroups();
198
199     for (int i = 0; i < groups.size(); i++)
200     {
201       SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
202       sg.textColour = ap.av.textColour;
203       sg.textColour2 = ap.av.textColour2;
204       sg.thresholdTextColour = ap.av.thresholdTextColour;
205     }
206   }
207
208 }