JAL-1432 updated copyright notices
[jalview.git] / src / jalview / gui / TextColourChooser.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
3  * Copyright (C) 2014 The Jalview Authors
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  * The Jalview Authors are detailed in the 'AUTHORS' file.
18  */
19 package jalview.gui;
20
21 import java.awt.*;
22 import java.awt.event.*;
23 import javax.swing.*;
24 import javax.swing.event.*;
25
26 import jalview.datamodel.*;
27
28 public class TextColourChooser
29 {
30   AlignmentPanel ap;
31
32   SequenceGroup sg;
33
34   public void chooseColour(AlignmentPanel ap, SequenceGroup sg)
35   {
36     this.ap = ap;
37     this.sg = sg;
38
39     int original1, original2, originalThreshold;
40     if (sg == null)
41     {
42       original1 = ap.av.textColour.getRGB();
43       original2 = ap.av.textColour2.getRGB();
44       originalThreshold = ap.av.thresholdTextColour;
45     }
46     else
47     {
48       original1 = sg.textColour.getRGB();
49       original2 = sg.textColour2.getRGB();
50       originalThreshold = sg.thresholdTextColour;
51     }
52
53     final JSlider slider = new JSlider(0, 750, originalThreshold);
54     final JPanel col1 = new JPanel();
55     col1.setPreferredSize(new Dimension(40, 20));
56     col1.setBorder(BorderFactory.createEtchedBorder());
57     col1.setToolTipText("Dark Colour");
58     col1.setBackground(new Color(original1));
59     final JPanel col2 = new JPanel();
60     col2.setPreferredSize(new Dimension(40, 20));
61     col2.setBorder(BorderFactory.createEtchedBorder());
62     col2.setToolTipText("Light Colour");
63     col2.setBackground(new Color(original2));
64     final JPanel bigpanel = new JPanel(new BorderLayout());
65     JPanel panel = new JPanel();
66     bigpanel.add(panel, BorderLayout.CENTER);
67     bigpanel.add(
68             new JLabel(
69                     "<html><i>Select a dark and light text colour, then set the threshold to"
70                             + "<br>switch between colours, based on background colour</i></html>"),
71             BorderLayout.NORTH);
72     panel.add(col1);
73     panel.add(slider);
74     panel.add(col2);
75
76     col1.addMouseListener(new MouseAdapter()
77     {
78       public void mousePressed(MouseEvent e)
79       {
80         Color col = JColorChooser.showDialog(bigpanel,
81                 "Select Colour for Text", col1.getBackground());
82         if (col != null)
83         {
84           colour1Changed(col);
85           col1.setBackground(col);
86         }
87       }
88     });
89
90     col2.addMouseListener(new MouseAdapter()
91     {
92       public void mousePressed(MouseEvent e)
93       {
94         Color col = JColorChooser.showDialog(bigpanel,
95                 "Select Colour for Text", col2.getBackground());
96         if (col != null)
97         {
98           colour2Changed(col);
99           col2.setBackground(col);
100         }
101       }
102     });
103
104     slider.addChangeListener(new ChangeListener()
105     {
106       public void stateChanged(ChangeEvent evt)
107       {
108         thresholdChanged(slider.getValue());
109       }
110     });
111
112     int reply = JOptionPane.showInternalOptionDialog(ap, bigpanel,
113             "Adjust Foreground Text Colour Threshold",
114             JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE,
115             null, null, null);
116
117     if (reply == JOptionPane.CANCEL_OPTION)
118     {
119       if (sg == null)
120       {
121         ap.av.textColour = new Color(original1);
122         ap.av.textColour2 = new Color(original2);
123         ap.av.thresholdTextColour = originalThreshold;
124       }
125       else
126       {
127         sg.textColour = new Color(original1);
128         sg.textColour2 = new Color(original2);
129         sg.thresholdTextColour = originalThreshold;
130       }
131     }
132   }
133
134   void colour1Changed(Color col)
135   {
136     if (sg == null)
137     {
138       ap.av.textColour = col;
139       if (ap.av.getColourAppliesToAllGroups())
140       {
141         setGroupTextColour();
142       }
143     }
144     else
145     {
146       sg.textColour = col;
147     }
148
149     ap.paintAlignment(true);
150   }
151
152   void colour2Changed(Color col)
153   {
154     if (sg == null)
155     {
156       ap.av.textColour2 = col;
157       if (ap.av.getColourAppliesToAllGroups())
158       {
159         setGroupTextColour();
160       }
161     }
162     else
163     {
164       sg.textColour2 = col;
165     }
166
167     ap.paintAlignment(true);
168   }
169
170   void thresholdChanged(int value)
171   {
172     if (sg == null)
173     {
174       ap.av.thresholdTextColour = value;
175       if (ap.av.getColourAppliesToAllGroups())
176       {
177         setGroupTextColour();
178       }
179     }
180     else
181     {
182       sg.thresholdTextColour = value;
183     }
184
185     ap.paintAlignment(true);
186   }
187
188   void setGroupTextColour()
189   {
190     if (ap.av.getAlignment().getGroups() == null)
191     {
192       return;
193     }
194
195     for (SequenceGroup sg : ap.av.getAlignment().getGroups())
196     {
197       sg.textColour = ap.av.textColour;
198       sg.textColour2 = ap.av.textColour2;
199       sg.thresholdTextColour = ap.av.thresholdTextColour;
200     }
201   }
202
203 }