Merge branch 'develop' into features/JAL-2360colourSchemeApplicability
[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   /**
163    * Hides the PID slider panel if it is shown
164    */
165   public static void hidePIDSlider()
166   {
167     if (PIDSlider != null)
168     {
169       try
170       {
171         PIDSlider.setClosed(true);
172         PIDSlider = null;
173       } catch (PropertyVetoException ex)
174       {
175       }
176     }
177   }
178
179   /**
180    * Hides the conservation slider panel if it is shown
181    */
182   public static void hideConservationSlider()
183   {
184     if (conservationSlider != null)
185     {
186       try
187       {
188         conservationSlider.setClosed(true);
189         conservationSlider = null;
190       } catch (PropertyVetoException ex)
191       {
192       }
193     }
194   }
195
196   /**
197    * DOCUMENT ME!
198    */
199   public static void showConservationSlider()
200   {
201     try
202     {
203       PIDSlider.setClosed(true);
204       PIDSlider = null;
205     } catch (Exception ex)
206     {
207     }
208
209     if (!conservationSlider.isVisible())
210     {
211       Desktop.addInternalFrame(conservationSlider,
212               conservationSlider.getTitle(), 420, 90, false);
213       conservationSlider
214               .addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
215               {
216                 @Override
217                 public void internalFrameClosed(
218                         javax.swing.event.InternalFrameEvent e)
219                 {
220                   conservationSlider = null;
221                 }
222               });
223       conservationSlider.setLayer(JLayeredPane.PALETTE_LAYER);
224     }
225   }
226
227   /**
228    * DOCUMENT ME!
229    * 
230    * @param ap
231    *          DOCUMENT ME!
232    * @param cs
233    *          DOCUMENT ME!
234    * @param source
235    *          DOCUMENT ME!
236    * 
237    * @return DOCUMENT ME!
238    */
239   public static int setPIDSliderSource(AlignmentPanel ap, ColourSchemeI cs,
240           String source)
241   {
242     SliderPanel pid = null;
243
244     int threshold = cs.getThreshold();
245
246     if (PIDSlider == null)
247     {
248       pid = new SliderPanel(ap, threshold, false, cs);
249       PIDSlider = new JInternalFrame();
250       PIDSlider.setContentPane(pid);
251       PIDSlider.setLayer(JLayeredPane.PALETTE_LAYER);
252     }
253     else
254     {
255       pid = (SliderPanel) PIDSlider.getContentPane();
256       pid.cs = cs;
257     }
258
259     PIDSlider
260             .setTitle(MessageManager.formatMessage(
261                     "label.percentage_identity_threshold",
262                     new String[] { source }));
263
264     if (ap.av.getAlignment().getGroups() != null)
265     {
266       pid.setAllGroupsCheckEnabled(true);
267     }
268     else
269     {
270       pid.setAllGroupsCheckEnabled(false);
271     }
272
273     return pid.getValue();
274   }
275
276   /**
277    * DOCUMENT ME!
278    */
279   public static void showPIDSlider()
280   {
281     try
282     {
283       conservationSlider.setClosed(true);
284       conservationSlider = null;
285     } catch (Exception ex)
286     {
287     }
288
289     if (!PIDSlider.isVisible())
290     {
291       Desktop.addInternalFrame(PIDSlider, PIDSlider.getTitle(), 420, 90,
292               false);
293       PIDSlider.setLayer(JLayeredPane.PALETTE_LAYER);
294       PIDSlider
295               .addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
296               {
297                 @Override
298                 public void internalFrameClosed(
299                         javax.swing.event.InternalFrameEvent e)
300                 {
301                   PIDSlider = null;
302                 }
303               });
304       PIDSlider.setLayer(JLayeredPane.PALETTE_LAYER);
305     }
306   }
307
308   /**
309    * DOCUMENT ME!
310    * 
311    * @param i
312    *          DOCUMENT ME!
313    */
314   public void valueChanged(int i)
315   {
316     if (cs == null)
317     {
318       return;
319     }
320
321     ColourSchemeI toChange = cs;
322     Iterator<SequenceGroup> allGroups = null;
323
324     if (allGroupsCheck.isSelected())
325     {
326       allGroups = ap.av.getAlignment().getGroups().listIterator();
327     }
328
329     while (toChange != null)
330     {
331       if (forConservation)
332       {
333         toChange.setConservationInc(i);
334       }
335       else
336       {
337         toChange.setThreshold(i, ap.av.isIgnoreGapsConsensus());
338       }
339       if (allGroups != null && allGroups.hasNext())
340       {
341         while ((toChange = allGroups.next().cs) == null
342                 && allGroups.hasNext())
343         {
344           ;
345         }
346       }
347       else
348       {
349         toChange = null;
350       }
351     }
352
353     ap.getSeqPanel().seqCanvas.repaint();
354   }
355
356   /**
357    * DOCUMENT ME!
358    * 
359    * @param b
360    *          DOCUMENT ME!
361    */
362   public void setAllGroupsCheckEnabled(boolean b)
363   {
364     allGroupsCheck.setEnabled(b);
365   }
366
367   /**
368    * DOCUMENT ME!
369    * 
370    * @param value
371    *          DOCUMENT ME!
372    */
373   public void setValue(int value)
374   {
375     slider.setValue(value);
376   }
377
378   /**
379    * DOCUMENT ME!
380    * 
381    * @return DOCUMENT ME!
382    */
383   public int getValue()
384   {
385     return Integer.parseInt(valueField.getText());
386   }
387
388   @Override
389   public void slider_mouseReleased(MouseEvent e)
390   {
391     if (ap.overviewPanel != null)
392     {
393       ap.overviewPanel.updateOverviewImage();
394     }
395   }
396
397 }