Clover icon

Coverage Report

  1. Project Clover database Thu Aug 13 2020 12:04:21 BST
  2. Package jalview.gui

File SliderPanel.java

 

Coverage histogram

../../img/srcFileCovDistChart8.png
20% of files have more coverage

Code metrics

46
119
24
1
501
319
54
0.45
4.96
24
2.25

Classes

Class Line # Actions
SliderPanel 48 119 54
0.7883597678.8%
 

Contributing tests

This file is covered by 16 tests. .

Source view

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