JAL-2383 make popup colour menu order and wording consistent
[jalview.git] / src / jalview / gui / SliderPanel.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.jbgui.GSliderPanel;
25 import jalview.schemes.ColourSchemeI;
26 import jalview.util.MessageManager;
27
28 import java.awt.event.MouseAdapter;
29 import java.awt.event.MouseEvent;
30 import java.beans.PropertyVetoException;
31 import java.util.Iterator;
32
33 import javax.swing.JInternalFrame;
34 import javax.swing.JLayeredPane;
35 import javax.swing.event.ChangeEvent;
36 import javax.swing.event.ChangeListener;
37
38 /**
39  * DOCUMENT ME!
40  * 
41  * @author $author$
42  * @version $Revision$
43  */
44 public class SliderPanel extends GSliderPanel
45 {
46   static JInternalFrame conservationSlider;
47
48   static JInternalFrame PIDSlider;
49
50   AlignmentPanel ap;
51
52   boolean forConservation = true;
53
54   ColourSchemeI cs;
55
56   /**
57    * Creates a new SliderPanel object.
58    * 
59    * @param ap
60    *          DOCUMENT ME!
61    * @param value
62    *          DOCUMENT ME!
63    * @param forConserve
64    *          DOCUMENT ME!
65    * @param cs
66    *          DOCUMENT ME!
67    */
68   public SliderPanel(final AlignmentPanel ap, int value,
69           boolean forConserve, ColourSchemeI cs)
70   {
71     this.ap = ap;
72     this.cs = cs;
73     forConservation = forConserve;
74     undoButton.setVisible(false);
75     applyButton.setVisible(false);
76
77     if (forConservation)
78     {
79       label.setText(MessageManager
80               .getString("label.enter_value_increase_conservation_visibility"));
81       slider.setMinimum(0);
82       slider.setMaximum(100);
83     }
84     else
85     {
86       label.setText(MessageManager
87               .getString("label.enter_percentage_identity_above_which_colour_residues"));
88       slider.setMinimum(0);
89       slider.setMaximum(100);
90     }
91
92     slider.addChangeListener(new ChangeListener()
93     {
94       @Override
95       public void stateChanged(ChangeEvent evt)
96       {
97         valueField.setText(slider.getValue() + "");
98         valueChanged(slider.getValue());
99       }
100     });
101
102     slider.addMouseListener(new MouseAdapter()
103     {
104       @Override
105       public void mouseReleased(MouseEvent evt)
106       {
107         ap.paintAlignment(true);
108       }
109     });
110
111     slider.setValue(value);
112     valueField.setText(value + "");
113   }
114
115   /**
116    * DOCUMENT ME!
117    * 
118    * @param ap
119    *          DOCUMENT ME!
120    * @param cs
121    *          DOCUMENT ME!
122    * @param source
123    *          DOCUMENT ME!
124    * 
125    * @return DOCUMENT ME!
126    */
127   public static int setConservationSlider(AlignmentPanel ap,
128           ColourSchemeI cs, String source)
129   {
130     SliderPanel sp = null;
131
132     if (conservationSlider == null)
133     {
134       sp = new SliderPanel(ap, cs.getConservationInc(), true, cs);
135       conservationSlider = new JInternalFrame();
136       conservationSlider.setContentPane(sp);
137       conservationSlider.setLayer(JLayeredPane.PALETTE_LAYER);
138     }
139     else
140     {
141       sp = (SliderPanel) conservationSlider.getContentPane();
142       sp.cs = cs;
143     }
144
145     conservationSlider
146             .setTitle(MessageManager.formatMessage(
147                     "label.conservation_colour_increment",
148                     new String[] { source }));
149
150     if (ap.av.getAlignment().getGroups() != null)
151     {
152       sp.setAllGroupsCheckEnabled(true);
153     }
154     else
155     {
156       sp.setAllGroupsCheckEnabled(false);
157     }
158
159     return sp.getValue();
160   }
161
162   public static void hidePIDSlider()
163   {
164     try
165     {
166       PIDSlider.setClosed(true);
167       PIDSlider = null;
168     } catch (PropertyVetoException ex)
169     {
170     }
171   }
172
173   public static void hideConservationSlider()
174   {
175     try
176     {
177       conservationSlider.setClosed(true);
178       conservationSlider = null;
179     } catch (PropertyVetoException ex)
180     {
181     }
182   }
183
184   /**
185    * DOCUMENT ME!
186    */
187   public static void showConservationSlider()
188   {
189     try
190     {
191       PIDSlider.setClosed(true);
192       PIDSlider = null;
193     } catch (Exception ex)
194     {
195     }
196
197     if (!conservationSlider.isVisible())
198     {
199       Desktop.addInternalFrame(conservationSlider,
200               conservationSlider.getTitle(), 420, 90, false);
201       conservationSlider
202               .addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
203               {
204                 @Override
205                 public void internalFrameClosed(
206                         javax.swing.event.InternalFrameEvent e)
207                 {
208                   conservationSlider = null;
209                 }
210               });
211       conservationSlider.setLayer(JLayeredPane.PALETTE_LAYER);
212     }
213   }
214
215   /**
216    * DOCUMENT ME!
217    * 
218    * @param ap
219    *          DOCUMENT ME!
220    * @param cs
221    *          DOCUMENT ME!
222    * @param source
223    *          DOCUMENT ME!
224    * 
225    * @return DOCUMENT ME!
226    */
227   public static int setPIDSliderSource(AlignmentPanel ap, ColourSchemeI cs,
228           String source)
229   {
230     SliderPanel pid = null;
231
232     int threshold = cs.getThreshold();
233
234     if (PIDSlider == null)
235     {
236       pid = new SliderPanel(ap, threshold, false, cs);
237       PIDSlider = new JInternalFrame();
238       PIDSlider.setContentPane(pid);
239       PIDSlider.setLayer(JLayeredPane.PALETTE_LAYER);
240     }
241     else
242     {
243       pid = (SliderPanel) PIDSlider.getContentPane();
244       pid.cs = cs;
245     }
246
247     PIDSlider
248             .setTitle(MessageManager.formatMessage(
249                     "label.percentage_identity_threshold",
250                     new String[] { source }));
251
252     if (ap.av.getAlignment().getGroups() != null)
253     {
254       pid.setAllGroupsCheckEnabled(true);
255     }
256     else
257     {
258       pid.setAllGroupsCheckEnabled(false);
259     }
260
261     return pid.getValue();
262   }
263
264   /**
265    * DOCUMENT ME!
266    */
267   public static void showPIDSlider()
268   {
269     try
270     {
271       conservationSlider.setClosed(true);
272       conservationSlider = null;
273     } catch (Exception ex)
274     {
275     }
276
277     if (!PIDSlider.isVisible())
278     {
279       Desktop.addInternalFrame(PIDSlider, PIDSlider.getTitle(), 420, 90,
280               false);
281       PIDSlider.setLayer(JLayeredPane.PALETTE_LAYER);
282       PIDSlider
283               .addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
284               {
285                 @Override
286                 public void internalFrameClosed(
287                         javax.swing.event.InternalFrameEvent e)
288                 {
289                   PIDSlider = null;
290                 }
291               });
292       PIDSlider.setLayer(JLayeredPane.PALETTE_LAYER);
293     }
294   }
295
296   /**
297    * DOCUMENT ME!
298    * 
299    * @param i
300    *          DOCUMENT ME!
301    */
302   public void valueChanged(int i)
303   {
304     if (cs == null)
305     {
306       return;
307     }
308
309     ColourSchemeI toChange = cs;
310     Iterator<SequenceGroup> allGroups = null;
311
312     if (allGroupsCheck.isSelected())
313     {
314       allGroups = ap.av.getAlignment().getGroups().listIterator();
315     }
316
317     while (toChange != null)
318     {
319       if (forConservation)
320       {
321         toChange.setConservationInc(i);
322       }
323       else
324       {
325         toChange.setThreshold(i, ap.av.isIgnoreGapsConsensus());
326       }
327       if (allGroups != null && allGroups.hasNext())
328       {
329         while ((toChange = allGroups.next().cs) == null
330                 && allGroups.hasNext())
331         {
332           ;
333         }
334       }
335       else
336       {
337         toChange = null;
338       }
339     }
340
341     ap.getSeqPanel().seqCanvas.repaint();
342   }
343
344   /**
345    * DOCUMENT ME!
346    * 
347    * @param b
348    *          DOCUMENT ME!
349    */
350   public void setAllGroupsCheckEnabled(boolean b)
351   {
352     allGroupsCheck.setEnabled(b);
353   }
354
355   /**
356    * DOCUMENT ME!
357    * 
358    * @param value
359    *          DOCUMENT ME!
360    */
361   public void setValue(int value)
362   {
363     slider.setValue(value);
364   }
365
366   /**
367    * DOCUMENT ME!
368    * 
369    * @return DOCUMENT ME!
370    */
371   public int getValue()
372   {
373     return Integer.parseInt(valueField.getText());
374   }
375
376   @Override
377   public void slider_mouseReleased(MouseEvent e)
378   {
379     if (ap.overviewPanel != null)
380     {
381       ap.overviewPanel.updateOverviewImage();
382     }
383   }
384
385 }