update author list in license for (JAL-826)
[jalview.git] / src / jalview / gui / TextColourChooser.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)
3  * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, 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.add(
69             new JLabel(
70                     "<html><i>Select a dark and light text colour, then set the threshold to"
71                             + "<br>switch between colours, based on background colour</i></html>"),
72             BorderLayout.NORTH);
73     panel.add(col1);
74     panel.add(slider);
75     panel.add(col2);
76
77     col1.addMouseListener(new MouseAdapter()
78     {
79       public void mousePressed(MouseEvent e)
80       {
81         Color col = JColorChooser.showDialog(bigpanel,
82                 "Select Colour for Text", col1.getBackground());
83         if (col != null)
84         {
85           colour1Changed(col);
86           col1.setBackground(col);
87         }
88       }
89     });
90
91     col2.addMouseListener(new MouseAdapter()
92     {
93       public void mousePressed(MouseEvent e)
94       {
95         Color col = JColorChooser.showDialog(bigpanel,
96                 "Select Colour for Text", col2.getBackground());
97         if (col != null)
98         {
99           colour2Changed(col);
100           col2.setBackground(col);
101         }
102       }
103     });
104
105     slider.addChangeListener(new ChangeListener()
106     {
107       public void stateChanged(ChangeEvent evt)
108       {
109         thresholdChanged(slider.getValue());
110       }
111     });
112
113     int reply = JOptionPane.showInternalOptionDialog(ap, bigpanel,
114             "Adjust Foreground Text Colour Threshold",
115             JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE,
116             null, null, null);
117
118     if (reply == JOptionPane.CANCEL_OPTION)
119     {
120       if (sg == null)
121       {
122         ap.av.textColour = new Color(original1);
123         ap.av.textColour2 = new Color(original2);
124         ap.av.thresholdTextColour = originalThreshold;
125       }
126       else
127       {
128         sg.textColour = new Color(original1);
129         sg.textColour2 = new Color(original2);
130         sg.thresholdTextColour = originalThreshold;
131       }
132     }
133   }
134
135   void colour1Changed(Color col)
136   {
137     if (sg == null)
138     {
139       ap.av.textColour = col;
140       if (ap.av.colourAppliesToAllGroups)
141       {
142         setGroupTextColour();
143       }
144     }
145     else
146     {
147       sg.textColour = col;
148     }
149
150     ap.paintAlignment(true);
151   }
152
153   void colour2Changed(Color col)
154   {
155     if (sg == null)
156     {
157       ap.av.textColour2 = col;
158       if (ap.av.colourAppliesToAllGroups)
159       {
160         setGroupTextColour();
161       }
162     }
163     else
164     {
165       sg.textColour2 = col;
166     }
167
168     ap.paintAlignment(true);
169   }
170
171   void thresholdChanged(int value)
172   {
173     if (sg == null)
174     {
175       ap.av.thresholdTextColour = value;
176       if (ap.av.colourAppliesToAllGroups)
177       {
178         setGroupTextColour();
179       }
180     }
181     else
182     {
183       sg.thresholdTextColour = value;
184     }
185
186     ap.paintAlignment(true);
187   }
188
189   void setGroupTextColour()
190   {
191     if (ap.av.alignment.getGroups() == null)
192     {
193       return;
194     }
195
196     Vector groups = ap.av.alignment.getGroups();
197
198     for (int i = 0; i < groups.size(); i++)
199     {
200       SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
201       sg.textColour = ap.av.textColour;
202       sg.textColour2 = ap.av.textColour2;
203       sg.thresholdTextColour = ap.av.thresholdTextColour;
204     }
205   }
206
207 }