JAL-2371 CollectionColourScheme renamed ResidueShader and moved to
[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.renderer.ResidueShaderI;
26 import jalview.util.MessageManager;
27
28 import java.awt.event.MouseAdapter;
29 import java.awt.event.MouseEvent;
30 import java.beans.PropertyVetoException;
31
32 import javax.swing.JInternalFrame;
33 import javax.swing.JLayeredPane;
34 import javax.swing.event.ChangeEvent;
35 import javax.swing.event.ChangeListener;
36 import javax.swing.event.InternalFrameAdapter;
37 import javax.swing.event.InternalFrameEvent;
38
39 /**
40  * DOCUMENT ME!
41  * 
42  * @author $author$
43  * @version $Revision$
44  */
45 public class SliderPanel extends GSliderPanel
46 {
47   static JInternalFrame conservationSlider;
48
49   static JInternalFrame PIDSlider;
50
51   AlignmentPanel ap;
52
53   boolean forConservation = true;
54
55   ResidueShaderI cs;
56
57   private static SliderPanel sliderPanel;
58
59   /**
60    * Returns the currently active slider panel (or null if none).
61    * 
62    * @return
63    */
64   public static SliderPanel getSliderPanel()
65   {
66     return sliderPanel;
67   }
68
69   /**
70    * Creates a new SliderPanel object.
71    * 
72    * @param ap
73    *          DOCUMENT ME!
74    * @param value
75    *          DOCUMENT ME!
76    * @param forConserve
77    *          DOCUMENT ME!
78    * @param scheme
79    *          DOCUMENT ME!
80    */
81   public SliderPanel(final AlignmentPanel ap, int value,
82           boolean forConserve, ResidueShaderI scheme)
83   {
84     this.ap = ap;
85     this.cs = scheme;
86     forConservation = forConserve;
87     undoButton.setVisible(false);
88     applyButton.setVisible(false);
89
90     if (forConservation)
91     {
92       label.setText(MessageManager
93               .getString("label.enter_value_increase_conservation_visibility"));
94       slider.setMinimum(0);
95       slider.setMaximum(100);
96     }
97     else
98     {
99       label.setText(MessageManager
100               .getString("label.enter_percentage_identity_above_which_colour_residues"));
101       slider.setMinimum(0);
102       slider.setMaximum(100);
103     }
104
105     slider.addChangeListener(new ChangeListener()
106     {
107       @Override
108       public void stateChanged(ChangeEvent evt)
109       {
110         valueField.setText(slider.getValue() + "");
111         valueChanged(slider.getValue());
112       }
113     });
114
115     slider.addMouseListener(new MouseAdapter()
116     {
117       @Override
118       public void mouseReleased(MouseEvent evt)
119       {
120         ap.paintAlignment(true);
121       }
122     });
123
124     slider.setValue(value);
125     valueField.setText(value + "");
126   }
127
128   /**
129    * DOCUMENT ME!
130    * 
131    * @param ap
132    *          DOCUMENT ME!
133    * @param ccs
134    *          DOCUMENT ME!
135    * @param source
136    *          DOCUMENT ME!
137    * 
138    * @return DOCUMENT ME!
139    */
140   public static int setConservationSlider(AlignmentPanel ap,
141           ResidueShaderI ccs, String source)
142   {
143     sliderPanel = null;
144
145     if (conservationSlider == null)
146     {
147       sliderPanel = new SliderPanel(ap, ccs.getConservationInc(), true, ccs);
148       conservationSlider = new JInternalFrame();
149       conservationSlider.setContentPane(sliderPanel);
150       conservationSlider.setLayer(JLayeredPane.PALETTE_LAYER);
151     }
152     else
153     {
154       sliderPanel = (SliderPanel) conservationSlider.getContentPane();
155       sliderPanel.valueField.setText(String.valueOf(ccs.getConservationInc()));
156       sliderPanel.cs = ccs;
157     }
158
159     conservationSlider
160             .setTitle(MessageManager.formatMessage(
161                     "label.conservation_colour_increment",
162                     new String[] { source }));
163
164     if (ap.av.getAlignment().getGroups() != null)
165     {
166       sliderPanel.setAllGroupsCheckEnabled(true);
167     }
168     else
169     {
170       sliderPanel.setAllGroupsCheckEnabled(false);
171     }
172
173     return sliderPanel.getValue();
174   }
175
176   /**
177    * Hides the PID slider panel if it is shown
178    */
179   public static void hidePIDSlider()
180   {
181     if (PIDSlider != null)
182     {
183       try
184       {
185         PIDSlider.setClosed(true);
186         PIDSlider = null;
187       } catch (PropertyVetoException ex)
188       {
189       }
190     }
191   }
192
193   /**
194    * Hides the conservation slider panel if it is shown
195    */
196   public static void hideConservationSlider()
197   {
198     if (conservationSlider != null)
199     {
200       try
201       {
202         conservationSlider.setClosed(true);
203         conservationSlider = null;
204       } catch (PropertyVetoException ex)
205       {
206       }
207     }
208   }
209
210   /**
211    * DOCUMENT ME!
212    */
213   public static void showConservationSlider()
214   {
215     hidePIDSlider();
216
217     if (!conservationSlider.isVisible())
218     {
219       Desktop.addInternalFrame(conservationSlider,
220               conservationSlider.getTitle(), 420, 90, false);
221       conservationSlider
222               .addInternalFrameListener(new InternalFrameAdapter()
223               {
224                 @Override
225                 public void internalFrameClosed(InternalFrameEvent e)
226                 {
227                   conservationSlider = null;
228                 }
229               });
230       conservationSlider.setLayer(JLayeredPane.PALETTE_LAYER);
231     }
232   }
233
234   /**
235    * DOCUMENT ME!
236    * 
237    * @param ap
238    *          DOCUMENT ME!
239    * @param ccs
240    *          DOCUMENT ME!
241    * @param source
242    *          DOCUMENT ME!
243    * 
244    * @return DOCUMENT ME!
245    */
246   public static int setPIDSliderSource(AlignmentPanel ap,
247           ResidueShaderI ccs, String source)
248   {
249     int threshold = ccs.getThreshold();
250
251     if (PIDSlider == null)
252     {
253       sliderPanel = new SliderPanel(ap, threshold, false, ccs);
254       PIDSlider = new JInternalFrame();
255       PIDSlider.setContentPane(sliderPanel);
256       PIDSlider.setLayer(JLayeredPane.PALETTE_LAYER);
257     }
258     else
259     {
260       sliderPanel = (SliderPanel) PIDSlider.getContentPane();
261       sliderPanel.cs = ccs;
262       sliderPanel.valueField.setText(String.valueOf(ccs.getThreshold()));
263     }
264
265     PIDSlider
266             .setTitle(MessageManager.formatMessage(
267                     "label.percentage_identity_threshold",
268                     new String[] { source }));
269
270     if (ap.av.getAlignment().getGroups() != null)
271     {
272       sliderPanel.setAllGroupsCheckEnabled(true);
273     }
274     else
275     {
276       sliderPanel.setAllGroupsCheckEnabled(false);
277     }
278
279     return sliderPanel.getValue();
280   }
281
282   /**
283    * DOCUMENT ME!
284    * 
285    * @return
286    */
287   public static JInternalFrame showPIDSlider()
288   {
289     hideConservationSlider();
290
291     if (!PIDSlider.isVisible())
292     {
293       Desktop.addInternalFrame(PIDSlider, PIDSlider.getTitle(), 420, 90,
294               false);
295       PIDSlider.setLayer(JLayeredPane.PALETTE_LAYER);
296       PIDSlider.addInternalFrameListener(new InternalFrameAdapter()
297       {
298         @Override
299         public void internalFrameClosed(InternalFrameEvent e)
300         {
301           PIDSlider = null;
302         }
303       });
304       PIDSlider.setLayer(JLayeredPane.PALETTE_LAYER);
305     }
306     return PIDSlider;
307   }
308
309   /**
310    * Updates the colour scheme with the current (identity threshold or
311    * conservation) percentage value. Also updates all groups if 'apply to all
312    * groups' is selected.
313    * 
314    * @param percent
315    */
316   public void valueChanged(int percent)
317   {
318     if (!forConservation)
319     {
320       ap.av.setThreshold(percent);
321     }
322     updateColourScheme(percent, cs);
323
324     if (allGroupsCheck.isSelected())
325     {
326       for (SequenceGroup sg : ap.av.getAlignment().getGroups())
327       {
328         updateColourScheme(percent, sg.getGroupColourScheme());
329       }
330     }
331
332     ap.getSeqPanel().seqCanvas.repaint();
333   }
334
335   /**
336    * Updates the colour scheme (if not null) with the current (identity
337    * threshold or conservation) percentage value
338    * 
339    * @param percent
340    * @param scheme
341    */
342   protected void updateColourScheme(int percent, ResidueShaderI scheme)
343   {
344     if (scheme == null)
345     {
346       return;
347     }
348     if (forConservation)
349     {
350       scheme.setConservationInc(percent);
351     }
352     else
353     {
354       scheme.setThreshold(percent, ap.av.isIgnoreGapsConsensus());
355     }
356   }
357
358   /**
359    * DOCUMENT ME!
360    * 
361    * @param b
362    *          DOCUMENT ME!
363    */
364   public void setAllGroupsCheckEnabled(boolean b)
365   {
366     allGroupsCheck.setEnabled(b);
367   }
368
369   /**
370    * DOCUMENT ME!
371    * 
372    * @param e
373    *          DOCUMENT ME!
374    */
375   @Override
376   public void valueField_actionPerformed()
377   {
378     try
379     {
380       int i = Integer.parseInt(valueField.getText());
381       slider.setValue(i);
382     } catch (NumberFormatException ex)
383     {
384       valueField.setText(slider.getValue() + "");
385     }
386   }
387
388   /**
389    * DOCUMENT ME!
390    * 
391    * @param value
392    *          DOCUMENT ME!
393    */
394   public void setValue(int value)
395   {
396     slider.setValue(value);
397   }
398
399   /**
400    * DOCUMENT ME!
401    * 
402    * @return DOCUMENT ME!
403    */
404   public int getValue()
405   {
406     return Integer.parseInt(valueField.getText());
407   }
408
409   @Override
410   public void slider_mouseReleased(MouseEvent e)
411   {
412     if (ap.overviewPanel != null)
413     {
414       ap.overviewPanel.updateOverviewImage();
415     }
416   }
417
418   public static int getConservationValue()
419   {
420     return getValue(conservationSlider);
421   }
422
423   static int getValue(JInternalFrame slider)
424   {
425     return slider == null ? 0 : ((SliderPanel) slider.getContentPane())
426             .getValue();
427   }
428
429   public static int getPIDValue()
430   {
431     return getValue(PIDSlider);
432   }
433
434   /**
435    * Answers true if the SliderPanel is for Conservation, false if it is for PID
436    * threshold
437    * 
438    * @return
439    */
440   public boolean isForConservation()
441   {
442     return forConservation;
443   }
444
445   /**
446    * Answers the title for the slider panel; this may include 'Background' if
447    * for the alignment, or the group id if for a group
448    * 
449    * @return
450    */
451   public String getTitle()
452   {
453     String title = null;
454     if (isForConservation())
455     {
456       if (conservationSlider != null)
457       {
458         title = conservationSlider.getTitle();
459       }
460     }
461     else if (PIDSlider != null)
462     {
463       title = PIDSlider.getTitle();
464     }
465     return title;
466   }
467 }