Clover icon

jalviewX

  1. Project Clover database Wed Oct 31 2018 15:13:58 GMT
  2. Package jalview.gui

File SliderPanel.java

 

Coverage histogram

../../img/srcFileCovDistChart9.png
12% of files have more coverage

Code metrics

46
120
24
1
501
319
54
0.45
5
24
2.25

Classes

Class Line # Actions
SliderPanel 47 120 54 36
0.810526381.1%
 

Contributing tests

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