3 import jalview.api.analysis.AnnotationFilterParameter;
4 import jalview.api.analysis.AnnotationFilterParameter.SearchableAnnotationField;
5 import jalview.datamodel.AlignmentAnnotation;
6 import jalview.datamodel.Annotation;
7 import jalview.datamodel.ColumnSelection;
8 import jalview.datamodel.GraphLine;
9 import jalview.datamodel.SequenceGroup;
10 import jalview.schemes.AnnotationColourGradient;
11 import jalview.util.MessageManager;
13 import java.awt.event.ActionEvent;
14 import java.awt.event.MouseAdapter;
15 import java.awt.event.MouseEvent;
16 import java.util.List;
17 import java.util.Vector;
19 import javax.swing.JCheckBox;
20 import javax.swing.JComboBox;
21 import javax.swing.JInternalFrame;
22 import javax.swing.JPanel;
23 import javax.swing.JSlider;
24 import javax.swing.JTextField;
25 import javax.swing.event.ChangeEvent;
26 import javax.swing.event.ChangeListener;
28 @SuppressWarnings("serial")
29 public abstract class AnnotationRowFilter extends JPanel
31 protected AlignViewport av;
33 protected AlignmentPanel ap;
35 protected int[] annmap;
37 protected boolean enableSeqAss = false;
39 private jalview.datamodel.AlignmentAnnotation currentAnnotation;
41 protected boolean adjusting = false;
43 protected JCheckBox currentColours = new JCheckBox();
45 protected JPanel minColour = new JPanel();
47 protected JPanel maxColour = new JPanel();
49 protected JCheckBox seqAssociated = new JCheckBox();
51 protected JCheckBox thresholdIsMin = new JCheckBox();
53 protected JSlider slider = new JSlider();
55 protected JTextField thresholdValue = new JTextField(20);
57 protected JInternalFrame frame;
59 * enabled if the user is dragging the slider - try to keep updates to a
62 protected boolean sliderDragging = false;
64 protected void addSliderChangeListener()
67 slider.addChangeListener(new ChangeListener()
70 public void stateChanged(ChangeEvent evt)
74 thresholdValue.setText((slider.getValue() / 1000f) + "");
75 valueChanged(!sliderDragging);
81 protected void addSliderMouseListeners()
84 slider.addMouseListener(new MouseAdapter()
87 public void mousePressed(MouseEvent e)
89 sliderDragging = true;
90 super.mousePressed(e);
94 public void mouseDragged(MouseEvent e)
96 sliderDragging = true;
97 super.mouseDragged(e);
101 public void mouseReleased(MouseEvent evt)
105 sliderDragging = false;
108 ap.paintAlignment(true);
114 public AnnotationRowFilter(AlignViewport av, final AlignmentPanel ap)
120 public AnnotationRowFilter()
125 public Vector<String> getAnnotationItems(boolean isSeqAssociated)
127 Vector<String> list = new Vector<String>();
129 int[] anmap = new int[av.getAlignment().getAlignmentAnnotation().length];
130 for (int i = 0; i < av.getAlignment().getAlignmentAnnotation().length; i++)
132 if (av.getAlignment().getAlignmentAnnotation()[i].sequenceRef == null)
143 String label = av.getAlignment().getAlignmentAnnotation()[i].label;
144 if (!list.contains(label))
146 anmap[list.size()] = i;
152 if (!isSeqAssociated)
154 anmap[list.size()] = i;
155 list.add(label + "_" + (index++));
159 this.annmap = new int[list.size()];
160 System.arraycopy(anmap, 0, this.annmap, 0, this.annmap.length);
164 protected int getSelectedThresholdItem(int indexValue)
166 int selectedThresholdItem = -1;
169 selectedThresholdItem = AnnotationColourGradient.ABOVE_THRESHOLD;
171 else if (indexValue == 2)
173 selectedThresholdItem = AnnotationColourGradient.BELOW_THRESHOLD;
175 return selectedThresholdItem;
178 public void modelChanged()
180 seqAssociated.setEnabled(enableSeqAss);
183 public void ok_actionPerformed(ActionEvent e)
188 frame.setClosed(true);
189 } catch (Exception ex)
194 public void cancel_actionPerformed(ActionEvent e)
197 ap.paintAlignment(true);
200 frame.setClosed(true);
201 } catch (Exception ex)
206 public void thresholdCheck_actionPerformed(ActionEvent e)
211 public void annotations_actionPerformed(ActionEvent e)
216 public void threshold_actionPerformed(ActionEvent e)
221 public void thresholdValue_actionPerformed(ActionEvent e)
225 float f = Float.parseFloat(thresholdValue.getText());
226 slider.setValue((int) (f * 1000));
228 } catch (NumberFormatException ex)
233 public void thresholdIsMin_actionPerformed(ActionEvent actionEvent)
238 protected void populateThresholdComboBox(JComboBox<String> threshold)
240 threshold.addItem(MessageManager
241 .getString("label.threshold_feature_no_thereshold"));
242 threshold.addItem(MessageManager
243 .getString("label.threshold_feature_above_thereshold"));
244 threshold.addItem(MessageManager
245 .getString("label.threshold_feature_below_thereshold"));
248 protected void seqAssociated_actionPerformed(ActionEvent arg0,
249 JComboBox<String> annotations, JCheckBox seqAssociated)
252 String cursel = (String) annotations.getSelectedItem();
253 boolean isvalid = false, isseqs = seqAssociated.isSelected();
254 annotations.removeAllItems();
255 for (String anitem : getAnnotationItems(seqAssociated.isSelected()))
257 if (anitem.equals(cursel) || (isseqs && cursel.startsWith(anitem)))
262 annotations.addItem(anitem);
267 annotations.setSelectedItem(cursel);
271 if (annotations.getItemCount() > 0)
273 annotations.setSelectedIndex(0);
278 protected void propagateSeqAssociatedThreshold(boolean allAnnotation,
279 AlignmentAnnotation annotation)
281 if (annotation.sequenceRef == null || annotation.threshold == null)
286 float thr = annotation.threshold.value;
287 for (int i = 0; i < av.getAlignment().getAlignmentAnnotation().length; i++)
289 AlignmentAnnotation aa = av.getAlignment().getAlignmentAnnotation()[i];
290 if (aa.label.equals(annotation.label)
291 && (annotation.getCalcId() == null ? aa.getCalcId() == null
292 : annotation.getCalcId().equals(aa.getCalcId())))
294 if (aa.threshold == null)
296 aa.threshold = new GraphLine(annotation.threshold);
300 aa.threshold.value = thr;
306 protected boolean colorAlignmContaining(
307 AlignmentAnnotation currentAnnotation, int selectedThresholdItem)
310 AnnotationColourGradient acg = null;
311 if (currentColours.isSelected())
313 acg = new AnnotationColourGradient(currentAnnotation,
314 av.getGlobalColourScheme(), selectedThresholdItem);
318 acg = new AnnotationColourGradient(currentAnnotation,
319 minColour.getBackground(), maxColour.getBackground(),
320 selectedThresholdItem);
322 acg.setSeqAssociated(seqAssociated.isSelected());
324 if (currentAnnotation.graphMin == 0f
325 && currentAnnotation.graphMax == 0f)
327 acg.setPredefinedColours(true);
330 acg.thresholdIsMinMax = thresholdIsMin.isSelected();
332 av.setGlobalColourScheme(acg);
334 if (av.getAlignment().getGroups() != null)
337 for (SequenceGroup sg : ap.av.getAlignment().getGroups())
344 if (currentColours.isSelected())
346 sg.cs = new AnnotationColourGradient(currentAnnotation, sg.cs,
347 selectedThresholdItem);
348 ((AnnotationColourGradient) sg.cs).setSeqAssociated(seqAssociated
354 sg.cs = new AnnotationColourGradient(currentAnnotation,
355 minColour.getBackground(), maxColour.getBackground(),
356 selectedThresholdItem);
357 ((AnnotationColourGradient) sg.cs).setSeqAssociated(seqAssociated
366 protected boolean filterAnnotations(Annotation[] annotations,
367 AnnotationFilterParameter filterParams, ColumnSelection cs)
369 av.showAllHiddenColumns();
374 if (annotations[count] != null)
377 boolean itemMatched = false;
379 if (filterParams.getThresholdType() == AnnotationFilterParameter.ThresholdType.ABOVE_THRESHOLD
380 && annotations[count].value > currentAnnotation.threshold.value)
384 if (filterParams.getThresholdType() == AnnotationFilterParameter.ThresholdType.BELOW_THRESHOLD
385 && annotations[count].value < currentAnnotation.threshold.value)
390 if (filterParams.isFilterAlphaHelix()
391 && annotations[count].secondaryStructure == 'H')
396 if (filterParams.isFilterBetaSheet()
397 && annotations[count].secondaryStructure == 'E')
402 if (filterParams.isFilterTurn()
403 && annotations[count].secondaryStructure == 'S')
408 String regexSearchString = filterParams.getRegexString();
409 if (regexSearchString != null
410 && !filterParams.getRegexSearchFields().isEmpty())
412 List<SearchableAnnotationField> fields = filterParams
413 .getRegexSearchFields();
416 if (fields.contains(SearchableAnnotationField.DISPLAY_STRING)
417 && annotations[count].displayCharacter
418 .matches(regexSearchString))
422 } catch (java.util.regex.PatternSyntaxException pse)
424 if (annotations[count].displayCharacter
425 .equals(regexSearchString))
430 if (fields.contains(SearchableAnnotationField.DESCRIPTION)
431 && annotations[count].description != null
432 && annotations[count].description
433 .matches(regexSearchString))
441 cs.addElement(count);
445 } while (count < annotations.length);
449 public jalview.datamodel.AlignmentAnnotation getCurrentAnnotation()
451 return currentAnnotation;
454 public void setCurrentAnnotation(
455 jalview.datamodel.AlignmentAnnotation currentAnnotation)
457 this.currentAnnotation = currentAnnotation;
460 public abstract void valueChanged(boolean updateAllAnnotation);
462 public abstract void updateView();
464 public abstract void reset();