package jalview.gui; import jalview.api.AnnotationRowFilterI; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.Annotation; import jalview.datamodel.ColumnSelection; import jalview.datamodel.GraphLine; import jalview.datamodel.SequenceGroup; import jalview.schemes.AnnotationColourGradient; import jalview.util.MessageManager; import java.awt.event.ActionEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Vector; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JInternalFrame; import javax.swing.JPanel; import javax.swing.JSlider; import javax.swing.JTextField; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; @SuppressWarnings("serial") public abstract class AnnotationRowFilter extends JPanel implements AnnotationRowFilterI { protected AlignViewport av; protected AlignmentPanel ap; protected int[] annmap; protected boolean enableSeqAss = false; private jalview.datamodel.AlignmentAnnotation currentAnnotation; protected boolean adjusting = false; protected JCheckBox currentColours = new JCheckBox(); protected JPanel minColour = new JPanel(); protected JPanel maxColour = new JPanel(); protected JCheckBox seqAssociated = new JCheckBox(); protected JCheckBox thresholdIsMin = new JCheckBox(); protected JSlider slider = new JSlider(); protected JTextField thresholdValue = new JTextField(20); protected JInternalFrame frame; /** * enabled if the user is dragging the slider - try to keep updates to a * minimun */ protected boolean sliderDragging = false; protected void addSliderChangeListener() { slider.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent evt) { if (!adjusting) { thresholdValue.setText((slider.getValue() / 1000f) + ""); valueChanged(!sliderDragging); } } }); } protected void addSliderMouseListeners() { slider.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { sliderDragging = true; super.mousePressed(e); } @Override public void mouseDragged(MouseEvent e) { sliderDragging = true; super.mouseDragged(e); } @Override public void mouseReleased(MouseEvent evt) { if (sliderDragging) { sliderDragging = false; valueChanged(true); } ap.paintAlignment(true); } }); } public AnnotationRowFilter(AlignViewport av, final AlignmentPanel ap) { this.av = av; this.ap = ap; } public AnnotationRowFilter() { } @Override public Vector getAnnotationItems(boolean isSeqAssociated) { Vector list = new Vector(); int index = 1; int[] anmap = new int[av.getAlignment().getAlignmentAnnotation().length]; for (int i = 0; i < av.getAlignment().getAlignmentAnnotation().length; i++) { if (av.getAlignment().getAlignmentAnnotation()[i].sequenceRef == null) { if (isSeqAssociated) { continue; } } else { enableSeqAss = true; } String label = av.getAlignment().getAlignmentAnnotation()[i].label; if (!list.contains(label)) { anmap[list.size()] = i; list.add(label); } else { if (!isSeqAssociated) { anmap[list.size()] = i; list.add(label + "_" + (index++)); } } } // seqAssociated.setEnabled(enableSeqAss); this.annmap = new int[list.size()]; System.arraycopy(anmap, 0, this.annmap, 0, this.annmap.length); return list; } protected int getSelectedThresholdItem(int indexValue) { int selectedThresholdItem = -1; if (indexValue == 1) { selectedThresholdItem = AnnotationColourGradient.ABOVE_THRESHOLD; } else if (indexValue == 2) { selectedThresholdItem = AnnotationColourGradient.BELOW_THRESHOLD; } return selectedThresholdItem; } public void modelChanged() { seqAssociated.setEnabled(enableSeqAss); } public void ok_actionPerformed(ActionEvent e) { updateView(); try { frame.setClosed(true); } catch (Exception ex) { } } public void cancel_actionPerformed(ActionEvent e) { reset(); ap.paintAlignment(true); try { frame.setClosed(true); } catch (Exception ex) { } } public void thresholdCheck_actionPerformed(ActionEvent e) { updateView(); } public void annotations_actionPerformed(ActionEvent e) { updateView(); } public void threshold_actionPerformed(ActionEvent e) { updateView(); } public void thresholdValue_actionPerformed(ActionEvent e) { try { float f = Float.parseFloat(thresholdValue.getText()); slider.setValue((int) (f * 1000)); updateView(); } catch (NumberFormatException ex) { } } public void thresholdIsMin_actionPerformed(ActionEvent actionEvent) { updateView(); } protected void populateThresholdComboBox(JComboBox threshold) { threshold.addItem(MessageManager .getString("label.threshold_feature_no_thereshold")); threshold.addItem(MessageManager .getString("label.threshold_feature_above_thereshold")); threshold.addItem(MessageManager .getString("label.threshold_feature_below_thereshold")); } protected void seqAssociated_actionPerformed(ActionEvent arg0, JComboBox annotations, JCheckBox seqAssociated) { adjusting = true; String cursel = (String) annotations.getSelectedItem(); boolean isvalid = false, isseqs = seqAssociated.isSelected(); annotations.removeAllItems(); for (String anitem : getAnnotationItems(seqAssociated.isSelected())) { if (anitem.equals(cursel) || (isseqs && cursel.startsWith(anitem))) { isvalid = true; cursel = anitem; } annotations.addItem(anitem); } adjusting = false; if (isvalid) { annotations.setSelectedItem(cursel); } else { if (annotations.getItemCount() > 0) { annotations.setSelectedIndex(0); } } } protected void propagateSeqAssociatedThreshold(boolean allAnnotation, AlignmentAnnotation annotation) { if (annotation.sequenceRef == null || annotation.threshold == null) { return; } float thr = annotation.threshold.value; for (int i = 0; i < av.getAlignment().getAlignmentAnnotation().length; i++) { AlignmentAnnotation aa = av.getAlignment().getAlignmentAnnotation()[i]; if (aa.label.equals(annotation.label) && (annotation.getCalcId() == null ? aa.getCalcId() == null : annotation.getCalcId().equals(aa.getCalcId()))) { if (aa.threshold == null) { aa.threshold = new GraphLine(annotation.threshold); } else { aa.threshold.value = thr; } } } } protected boolean colorAlignmContaining( AlignmentAnnotation currentAnnotation, int selectedThresholdItem) { AnnotationColourGradient acg = null; if (currentColours.isSelected()) { acg = new AnnotationColourGradient(currentAnnotation, av.getGlobalColourScheme(), selectedThresholdItem); } else { acg = new AnnotationColourGradient(currentAnnotation, minColour.getBackground(), maxColour.getBackground(), selectedThresholdItem); } acg.setSeqAssociated(seqAssociated.isSelected()); if (currentAnnotation.graphMin == 0f && currentAnnotation.graphMax == 0f) { acg.setPredefinedColours(true); } acg.thresholdIsMinMax = thresholdIsMin.isSelected(); av.setGlobalColourScheme(acg); if (av.getAlignment().getGroups() != null) { for (SequenceGroup sg : ap.av.getAlignment().getGroups()) { if (sg.cs == null) { continue; } if (currentColours.isSelected()) { sg.cs = new AnnotationColourGradient(currentAnnotation, sg.cs, selectedThresholdItem); ((AnnotationColourGradient) sg.cs).setSeqAssociated(seqAssociated .isSelected()); } else { sg.cs = new AnnotationColourGradient(currentAnnotation, minColour.getBackground(), maxColour.getBackground(), selectedThresholdItem); ((AnnotationColourGradient) sg.cs).setSeqAssociated(seqAssociated .isSelected()); } } } return false; } protected boolean markColumnsContaining( AlignmentAnnotation currentAnnotation, int thresholdComparisonType) { try { if (currentAnnotation != null) { Annotation[] annotations = currentAnnotation.annotations; ColumnSelection cs = av.getColumnSelection(); cs.clear(); if (thresholdComparisonType == AnnotationColourGradient.NO_THRESHOLD) { int count = 0; do { if (annotations[count] != null) { if (currentAnnotation.label.equals("Secondary Structure") && annotations[count].secondaryStructure != ' ') { cs.addElement(count); } else if (currentAnnotation.label .equals("Iron Sulphur Contacts")) { cs.addElement(count); } else if (annotations[count].value != 0.0) { cs.addElement(count); } } count++; } while (count < annotations.length); } else { int count = 0; do { if (annotations[count] != null) { if (thresholdComparisonType == AnnotationColourGradient.ABOVE_THRESHOLD) { if (annotations[count].value > currentAnnotation.threshold.value) { cs.addElement(count); } } else if (thresholdComparisonType == AnnotationColourGradient.BELOW_THRESHOLD) { if (annotations[count].value < currentAnnotation.threshold.value) { cs.addElement(count); } } } count++; } while (count < annotations.length); } } return true; } catch (Exception e) { e.printStackTrace(); return false; } } public jalview.datamodel.AlignmentAnnotation getCurrentAnnotation() { return currentAnnotation; } public void setCurrentAnnotation( jalview.datamodel.AlignmentAnnotation currentAnnotation) { this.currentAnnotation = currentAnnotation; } }