Clover icon

jalviewX

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

File AnnotationRowFilter.java

 

Coverage histogram

../../img/srcFileCovDistChart5.png
40% of files have more coverage

Code metrics

42
134
37
1
531
412
66
0.49
3.62
37
1.78

Classes

Class Line # Actions
AnnotationRowFilter 53 134 66 122
0.4272300642.7%
 

Contributing tests

This file is covered by 2 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.datamodel.AlignmentAnnotation;
24    import jalview.datamodel.GraphLine;
25    import jalview.schemes.AnnotationColourGradient;
26    import jalview.util.MessageManager;
27   
28    import java.awt.Color;
29    import java.awt.Dimension;
30    import java.awt.event.ActionEvent;
31    import java.awt.event.ActionListener;
32    import java.awt.event.FocusAdapter;
33    import java.awt.event.FocusEvent;
34    import java.awt.event.ItemEvent;
35    import java.awt.event.ItemListener;
36    import java.awt.event.MouseAdapter;
37    import java.awt.event.MouseEvent;
38    import java.util.HashMap;
39    import java.util.Map;
40    import java.util.Vector;
41   
42    import javax.swing.JButton;
43    import javax.swing.JCheckBox;
44    import javax.swing.JComboBox;
45    import javax.swing.JInternalFrame;
46    import javax.swing.JPanel;
47    import javax.swing.JSlider;
48    import javax.swing.JTextField;
49    import javax.swing.event.ChangeEvent;
50    import javax.swing.event.ChangeListener;
51   
52    @SuppressWarnings("serial")
 
53    public abstract class AnnotationRowFilter extends JPanel
54    {
55    protected AlignViewport av;
56   
57    protected AlignmentPanel ap;
58   
59    protected int[] annmap;
60   
61    protected boolean adjusting = false;
62   
63    protected JCheckBox seqAssociated = new JCheckBox();
64   
65    protected JCheckBox percentThreshold = new JCheckBox();
66   
67    protected JSlider slider = new JSlider();
68   
69    protected JTextField thresholdValue = new JTextField(20);
70   
71    protected JInternalFrame frame;
72   
73    protected JButton ok = new JButton();
74   
75    protected JButton cancel = new JButton();
76   
77    /**
78    * enabled if the user is dragging the slider - try to keep updates to a
79    * minimun
80    */
81    protected boolean sliderDragging = false;
82   
83    protected JComboBox<String> threshold = new JComboBox<>();
84   
85    protected JComboBox<String> annotations;
86   
87    /*
88    * map from annotation to its menu item display label
89    * - so we know which item to pre-select on restore
90    */
91    private Map<AlignmentAnnotation, String> annotationLabels;
92   
93    private AlignmentAnnotation currentAnnotation;
94   
95    /**
96    * Constructor
97    *
98    * @param viewport
99    * @param alignPanel
100    */
 
101  2 toggle public AnnotationRowFilter(AlignViewport viewport,
102    final AlignmentPanel alignPanel)
103    {
104  2 this.av = viewport;
105  2 this.ap = alignPanel;
106  2 thresholdValue.addFocusListener(new FocusAdapter()
107    {
 
108  0 toggle @Override
109    public void focusLost(FocusEvent e)
110    {
111  0 thresholdValue_actionPerformed();
112    }
113    });
114    }
115   
 
116  1 toggle protected void addSliderChangeListener()
117    {
118   
119  1 slider.addChangeListener(new ChangeListener()
120    {
 
121  0 toggle @Override
122    public void stateChanged(ChangeEvent evt)
123    {
124  0 if (!adjusting)
125    {
126  0 setThresholdValueText();
127  0 valueChanged(!sliderDragging);
128    }
129    }
130    });
131    }
132   
133    /**
134    * update the text field from the threshold slider. preserves state of
135    * 'adjusting' so safe to call in init.
136    */
 
137  0 toggle protected void setThresholdValueText()
138    {
139  0 boolean oldadj = adjusting;
140  0 adjusting = true;
141  0 if (percentThreshold.isSelected())
142    {
143  0 thresholdValue.setText("" + (slider.getValue() - slider.getMinimum())
144    * 100f / (slider.getMaximum() - slider.getMinimum()));
145    }
146    else
147    {
148  0 thresholdValue.setText((slider.getValue() / 1000f) + "");
149    }
150  0 adjusting = oldadj;
151    }
152   
 
153  1 toggle protected void addSliderMouseListeners()
154    {
155   
156  1 slider.addMouseListener(new MouseAdapter()
157    {
 
158  0 toggle @Override
159    public void mousePressed(MouseEvent e)
160    {
161  0 sliderDragging = true;
162  0 super.mousePressed(e);
163    }
164   
 
165  0 toggle @Override
166    public void mouseDragged(MouseEvent e)
167    {
168  0 sliderDragging = true;
169  0 super.mouseDragged(e);
170    }
171   
 
172  0 toggle @Override
173    public void mouseReleased(MouseEvent evt)
174    {
175  0 sliderDragReleased();
176    }
177    });
178    }
179   
180    /**
181    * Builds and returns a list of menu items (display text) for choice of
182    * annotation. Also builds maps between annotations, their positions in the
183    * list, and their display labels in the list.
184    *
185    * @param isSeqAssociated
186    * @return
187    */
 
188  3 toggle public Vector<String> getAnnotationItems(boolean isSeqAssociated)
189    {
190  3 annotationLabels = new HashMap<>();
191   
192  3 Vector<String> list = new Vector<>();
193  3 int index = 1;
194  3 int[] anmap = new int[av.getAlignment()
195    .getAlignmentAnnotation().length];
196  3 seqAssociated.setEnabled(false);
197  34 for (int i = 0; i < av.getAlignment()
198    .getAlignmentAnnotation().length; i++)
199    {
200  31 AlignmentAnnotation annotation = av.getAlignment()
201    .getAlignmentAnnotation()[i];
202  31 if (annotation.sequenceRef == null)
203    {
204  19 if (isSeqAssociated)
205    {
206  7 continue;
207    }
208    }
209    else
210    {
211  12 seqAssociated.setEnabled(true);
212    }
213  24 String label = annotation.label;
214    // add associated sequence ID if available
215  24 if (!isSeqAssociated && annotation.sequenceRef != null)
216    {
217  8 label = label + "_" + annotation.sequenceRef.getName();
218    }
219    // make label unique
220  24 if (!list.contains(label))
221    {
222  20 anmap[list.size()] = i;
223  20 list.add(label);
224  20 annotationLabels.put(annotation, label);
225    }
226    else
227    {
228  4 if (!isSeqAssociated)
229    {
230  2 anmap[list.size()] = i;
231  2 label = label + "_" + (index++);
232  2 list.add(label);
233  2 annotationLabels.put(annotation, label);
234    }
235    }
236    }
237  3 this.annmap = new int[list.size()];
238  3 System.arraycopy(anmap, 0, this.annmap, 0, this.annmap.length);
239  3 return list;
240    }
241   
 
242  1 toggle protected int getSelectedThresholdItem(int indexValue)
243    {
244  1 int selectedThresholdItem = -1;
245  1 if (indexValue == 1)
246    {
247  0 selectedThresholdItem = AnnotationColourGradient.ABOVE_THRESHOLD;
248    }
249  1 else if (indexValue == 2)
250    {
251  0 selectedThresholdItem = AnnotationColourGradient.BELOW_THRESHOLD;
252    }
253  1 return selectedThresholdItem;
254    }
255   
 
256  0 toggle public void ok_actionPerformed()
257    {
258  0 try
259    {
260  0 frame.setClosed(true);
261    } catch (Exception ex)
262    {
263    }
264    }
265   
 
266  0 toggle public void cancel_actionPerformed()
267    {
268  0 reset();
269  0 ap.paintAlignment(true, true);
270  0 try
271    {
272  0 frame.setClosed(true);
273    } catch (Exception ex)
274    {
275    }
276    }
277   
 
278  0 toggle protected void thresholdCheck_actionPerformed()
279    {
280  0 updateView();
281    }
282   
 
283  0 toggle protected void selectedAnnotationChanged()
284    {
285  0 updateView();
286    }
287   
 
288  0 toggle protected void threshold_actionPerformed()
289    {
290  0 updateView();
291    }
292   
 
293  0 toggle protected void thresholdValue_actionPerformed()
294    {
295  0 try
296    {
297  0 float f = Float.parseFloat(thresholdValue.getText());
298  0 if (percentThreshold.isSelected())
299    {
300  0 slider.setValue(slider.getMinimum() + ((int) ((f / 100f)
301    * (slider.getMaximum() - slider.getMinimum()))));
302    }
303    else
304    {
305  0 slider.setValue((int) (f * 1000));
306    }
307  0 updateView();
308    } catch (NumberFormatException ex)
309    {
310    }
311    }
312   
 
313  0 toggle protected void percentageValue_actionPerformed()
314    {
315  0 setThresholdValueText();
316    }
317   
 
318  0 toggle protected void thresholdIsMin_actionPerformed()
319    {
320  0 updateView();
321    }
322   
 
323  1 toggle protected void populateThresholdComboBox(JComboBox<String> thresh)
324    {
325  1 thresh.addItem(MessageManager
326    .getString("label.threshold_feature_no_threshold"));
327  1 thresh.addItem(MessageManager
328    .getString("label.threshold_feature_above_threshold"));
329  1 thresh.addItem(MessageManager
330    .getString("label.threshold_feature_below_threshold"));
331    }
332   
333    /**
334    * Rebuilds the drop-down list of annotations to choose from when the 'per
335    * sequence only' checkbox is checked or unchecked.
336    *
337    * @param anns
338    */
 
339  0 toggle protected void seqAssociated_actionPerformed(JComboBox<String> anns)
340    {
341  0 adjusting = true;
342  0 String cursel = (String) anns.getSelectedItem();
343  0 boolean isvalid = false;
344  0 boolean isseqs = seqAssociated.isSelected();
345  0 anns.removeAllItems();
346  0 for (String anitem : getAnnotationItems(seqAssociated.isSelected()))
347    {
348  0 if (anitem.equals(cursel) || (isseqs && cursel.startsWith(anitem)))
349    {
350  0 isvalid = true;
351  0 cursel = anitem;
352    }
353  0 anns.addItem(anitem);
354    }
355  0 if (isvalid)
356    {
357  0 anns.setSelectedItem(cursel);
358    }
359    else
360    {
361  0 if (anns.getItemCount() > 0)
362    {
363  0 anns.setSelectedIndex(0);
364    }
365    }
366  0 adjusting = false;
367   
368  0 updateView();
369    }
370   
 
371  0 toggle protected void propagateSeqAssociatedThreshold(boolean allAnnotation,
372    AlignmentAnnotation annotation)
373    {
374  0 if (annotation.sequenceRef == null || annotation.threshold == null)
375    {
376  0 return;
377    }
378   
379  0 float thr = annotation.threshold.value;
380  0 for (int i = 0; i < av.getAlignment()
381    .getAlignmentAnnotation().length; i++)
382    {
383  0 AlignmentAnnotation aa = av.getAlignment()
384    .getAlignmentAnnotation()[i];
385  0 if (aa.label.equals(annotation.label)
386  0 && (annotation.getCalcId() == null ? aa.getCalcId() == null
387    : annotation.getCalcId().equals(aa.getCalcId())))
388    {
389  0 if (aa.threshold == null)
390    {
391  0 aa.threshold = new GraphLine(annotation.threshold);
392    }
393    else
394    {
395  0 aa.threshold.value = thr;
396    }
397    }
398    }
399    }
400   
 
401  1 toggle public AlignmentAnnotation getCurrentAnnotation()
402    {
403  1 return currentAnnotation;
404    }
405   
 
406  1 toggle protected void setCurrentAnnotation(AlignmentAnnotation annotation)
407    {
408  1 this.currentAnnotation = annotation;
409    }
410   
411    /**
412    * update associated view model and trigger any necessary repaints.
413    *
414    * @param updateAllAnnotation
415    */
416    protected abstract void valueChanged(boolean updateAllAnnotation);
417   
418    protected abstract void updateView();
419   
420    protected abstract void reset();
421   
 
422  9 toggle protected String getAnnotationMenuLabel(AlignmentAnnotation ann)
423    {
424  9 return annotationLabels.get(ann);
425    }
426   
 
427  1 toggle protected void jbInit()
428    {
429  1 ok.setOpaque(false);
430  1 ok.setText(MessageManager.getString("action.ok"));
431  1 ok.addActionListener(new ActionListener()
432    {
 
433  0 toggle @Override
434    public void actionPerformed(ActionEvent e)
435    {
436  0 ok_actionPerformed();
437    }
438    });
439   
440  1 cancel.setOpaque(false);
441  1 cancel.setText(MessageManager.getString("action.cancel"));
442  1 cancel.addActionListener(new ActionListener()
443    {
 
444  0 toggle @Override
445    public void actionPerformed(ActionEvent e)
446    {
447  0 cancel_actionPerformed();
448    }
449    });
450   
451  1 annotations.addItemListener(new ItemListener()
452    {
 
453  0 toggle @Override
454    public void itemStateChanged(ItemEvent e)
455    {
456  0 selectedAnnotationChanged();
457    }
458    });
459  1 annotations.setToolTipText(
460    MessageManager.getString("info.select_annotation_row"));
461   
462  1 threshold.addActionListener(new ActionListener()
463    {
 
464  0 toggle @Override
465    public void actionPerformed(ActionEvent e)
466    {
467  0 threshold_actionPerformed();
468    }
469    });
470   
471  1 thresholdValue.setEnabled(false);
472  1 thresholdValue.setColumns(7);
473  1 thresholdValue.addActionListener(new ActionListener()
474    {
 
475  0 toggle @Override
476    public void actionPerformed(ActionEvent e)
477    {
478  0 thresholdValue_actionPerformed();
479    }
480    });
481   
482  1 percentThreshold
483    .setText(MessageManager.getString("label.as_percentage"));
484  1 percentThreshold.addActionListener(new ActionListener()
485    {
 
486  0 toggle @Override
487    public void actionPerformed(ActionEvent e)
488    {
489  0 if (!adjusting)
490    {
491  0 percentageValue_actionPerformed();
492    }
493    }
494    });
495  1 slider.setPaintLabels(false);
496  1 slider.setPaintTicks(true);
497  1 slider.setBackground(Color.white);
498  1 slider.setEnabled(false);
499  1 slider.setOpaque(false);
500  1 slider.setPreferredSize(new Dimension(100, 32));
501    }
502   
 
503  4 toggle public JComboBox<String> getThreshold()
504    {
505  4 return threshold;
506    }
507   
 
508  0 toggle public void setThreshold(JComboBox<String> thresh)
509    {
510  0 this.threshold = thresh;
511    }
512   
 
513  3 toggle public JComboBox<String> getAnnotations()
514    {
515  3 return annotations;
516    }
517   
 
518  1 toggle public void setAnnotations(JComboBox<String> anns)
519    {
520  1 this.annotations = anns;
521    }
522   
 
523  0 toggle protected void sliderDragReleased()
524    {
525  0 if (sliderDragging)
526    {
527  0 sliderDragging = false;
528  0 valueChanged(true);
529    }
530    }
531    }