Merge develop to Release_2_8_3_Branch
[jalview.git] / src / jalview / gui / TextColourChooser.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ 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
10  * of the License, or (at your option) any later version.
11  *  
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.
16  * 
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.
20  */
21 package jalview.gui;
22
23 import jalview.datamodel.SequenceGroup;
24 import jalview.util.MessageManager;
25
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
32 import javax.swing.BorderFactory;
33 import javax.swing.JColorChooser;
34 import javax.swing.JLabel;
35 import javax.swing.JOptionPane;
36 import javax.swing.JPanel;
37 import javax.swing.JSlider;
38 import javax.swing.event.ChangeEvent;
39 import javax.swing.event.ChangeListener;
40
41 public class TextColourChooser
42 {
43   AlignmentPanel ap;
44
45   SequenceGroup sg;
46
47   public void chooseColour(AlignmentPanel ap, SequenceGroup sg)
48   {
49     this.ap = ap;
50     this.sg = sg;
51
52     int original1, original2, originalThreshold;
53     if (sg == null)
54     {
55       original1 = ap.av.getTextColour().getRGB();
56       original2 = ap.av.getTextColour2().getRGB();
57       originalThreshold = ap.av.getThresholdTextColour();
58     }
59     else
60     {
61       original1 = sg.textColour.getRGB();
62       original2 = sg.textColour2.getRGB();
63       originalThreshold = sg.thresholdTextColour;
64     }
65
66     final JSlider slider = new JSlider(0, 750, originalThreshold);
67     final JPanel col1 = new JPanel();
68     col1.setPreferredSize(new Dimension(40, 20));
69     col1.setBorder(BorderFactory.createEtchedBorder());
70     col1.setToolTipText(MessageManager.getString("label.dark_colour"));
71     col1.setBackground(new Color(original1));
72     final JPanel col2 = new JPanel();
73     col2.setPreferredSize(new Dimension(40, 20));
74     col2.setBorder(BorderFactory.createEtchedBorder());
75     col2.setToolTipText(MessageManager.getString("label.ligth_colour"));
76     col2.setBackground(new Color(original2));
77     final JPanel bigpanel = new JPanel(new BorderLayout());
78     JPanel panel = new JPanel();
79     bigpanel.add(panel, BorderLayout.CENTER);
80     bigpanel.add(
81             new JLabel("<html>"+MessageManager.getString("label.select_dark_light_set_thereshold")+"</html>"),
82             BorderLayout.NORTH);
83     panel.add(col1);
84     panel.add(slider);
85     panel.add(col2);
86
87     col1.addMouseListener(new MouseAdapter()
88     {
89       public void mousePressed(MouseEvent e)
90       {
91         Color col = JColorChooser.showDialog(bigpanel,
92                 MessageManager.getString("label.select_colour_for_text"), col1.getBackground());
93         if (col != null)
94         {
95           colour1Changed(col);
96           col1.setBackground(col);
97         }
98       }
99     });
100
101     col2.addMouseListener(new MouseAdapter()
102     {
103       public void mousePressed(MouseEvent e)
104       {
105         Color col = JColorChooser.showDialog(bigpanel,
106                         MessageManager.getString("label.select_colour_for_text"), col2.getBackground());
107         if (col != null)
108         {
109           colour2Changed(col);
110           col2.setBackground(col);
111         }
112       }
113     });
114
115     slider.addChangeListener(new ChangeListener()
116     {
117       public void stateChanged(ChangeEvent evt)
118       {
119         thresholdChanged(slider.getValue());
120       }
121     });
122
123     int reply = JOptionPane.showInternalOptionDialog(ap, bigpanel,
124             MessageManager.getString("label.adjunst_foreground_text_colour_thereshold"),
125             JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE,
126             null, null, null);
127
128     if (reply == JOptionPane.CANCEL_OPTION)
129     {
130       if (sg == null)
131       {
132         ap.av.setTextColour(new Color(original1));
133         ap.av.setTextColour2(new Color(original2));
134         ap.av.setThresholdTextColour(originalThreshold);
135       }
136       else
137       {
138         sg.textColour = new Color(original1);
139         sg.textColour2 = new Color(original2);
140         sg.thresholdTextColour = originalThreshold;
141       }
142     }
143   }
144
145   void colour1Changed(Color col)
146   {
147     if (sg == null)
148     {
149       ap.av.setTextColour(col);
150       if (ap.av.getColourAppliesToAllGroups())
151       {
152         setGroupTextColour();
153       }
154     }
155     else
156     {
157       sg.textColour = col;
158     }
159
160     ap.paintAlignment(true);
161   }
162
163   void colour2Changed(Color col)
164   {
165     if (sg == null)
166     {
167       ap.av.setTextColour2(col);
168       if (ap.av.getColourAppliesToAllGroups())
169       {
170         setGroupTextColour();
171       }
172     }
173     else
174     {
175       sg.textColour2 = col;
176     }
177
178     ap.paintAlignment(true);
179   }
180
181   void thresholdChanged(int value)
182   {
183     if (sg == null)
184     {
185       ap.av.setThresholdTextColour(value);
186       if (ap.av.getColourAppliesToAllGroups())
187       {
188         setGroupTextColour();
189       }
190     }
191     else
192     {
193       sg.thresholdTextColour = value;
194     }
195
196     ap.paintAlignment(true);
197   }
198
199   void setGroupTextColour()
200   {
201     if (ap.av.getAlignment().getGroups() == null)
202     {
203       return;
204     }
205
206     for (SequenceGroup sg : ap.av.getAlignment().getGroups())
207     {
208       sg.textColour = ap.av.getTextColour();
209       sg.textColour2 = ap.av.getTextColour2();
210       sg.thresholdTextColour = ap.av.getThresholdTextColour();
211     }
212   }
213
214 }