3 import jalview.datamodel.AlignmentAnnotation;
4 import jalview.datamodel.GraphLine;
5 import jalview.datamodel.SequenceGroup;
6 import jalview.schemes.AnnotationColourGradient;
7 import jalview.util.MessageManager;
9 import java.awt.event.ActionEvent;
10 import java.awt.event.MouseAdapter;
11 import java.awt.event.MouseEvent;
12 import java.util.Vector;
14 import javax.swing.JButton;
15 import javax.swing.JCheckBox;
16 import javax.swing.JComboBox;
17 import javax.swing.JInternalFrame;
18 import javax.swing.JPanel;
19 import javax.swing.JSlider;
20 import javax.swing.JTextField;
21 import javax.swing.event.ChangeEvent;
22 import javax.swing.event.ChangeListener;
24 @SuppressWarnings("serial")
25 public abstract class AnnotationRowFilter extends JPanel
27 protected AlignViewport av;
29 protected AlignmentPanel ap;
31 protected int[] annmap;
33 protected boolean enableSeqAss = false;
35 private jalview.datamodel.AlignmentAnnotation currentAnnotation;
37 protected boolean adjusting = false;
39 protected JCheckBox currentColours = new JCheckBox();
41 protected JPanel minColour = new JPanel();
43 protected JPanel maxColour = new JPanel();
45 protected JCheckBox seqAssociated = new JCheckBox();
47 protected JCheckBox thresholdIsMin = new JCheckBox();
49 protected JSlider slider = new JSlider();
51 protected JTextField thresholdValue = new JTextField(20);
53 protected JInternalFrame frame;
55 protected JButton ok = new JButton();
57 protected JButton cancel = new JButton();
60 * enabled if the user is dragging the slider - try to keep updates to a
63 protected boolean sliderDragging = false;
65 protected void addSliderChangeListener()
68 slider.addChangeListener(new ChangeListener()
71 public void stateChanged(ChangeEvent evt)
75 thresholdValue.setText((slider.getValue() / 1000f) + "");
76 valueChanged(!sliderDragging);
82 protected void addSliderMouseListeners()
85 slider.addMouseListener(new MouseAdapter()
88 public void mousePressed(MouseEvent e)
90 sliderDragging = true;
91 super.mousePressed(e);
95 public void mouseDragged(MouseEvent e)
97 sliderDragging = true;
98 super.mouseDragged(e);
102 public void mouseReleased(MouseEvent evt)
106 sliderDragging = false;
109 ap.paintAlignment(true);
115 public AnnotationRowFilter(AlignViewport av, final AlignmentPanel ap)
121 public AnnotationRowFilter()
126 public Vector<String> getAnnotationItems(boolean isSeqAssociated)
128 Vector<String> list = new Vector<String>();
130 int[] anmap = new int[av.getAlignment().getAlignmentAnnotation().length];
131 for (int i = 0; i < av.getAlignment().getAlignmentAnnotation().length; i++)
133 if (av.getAlignment().getAlignmentAnnotation()[i].sequenceRef == null)
144 String label = av.getAlignment().getAlignmentAnnotation()[i].label;
145 if (!list.contains(label))
147 anmap[list.size()] = i;
153 if (!isSeqAssociated)
155 anmap[list.size()] = i;
156 list.add(label + "_" + (index++));
160 this.annmap = new int[list.size()];
161 System.arraycopy(anmap, 0, this.annmap, 0, this.annmap.length);
165 protected int getSelectedThresholdItem(int indexValue)
167 int selectedThresholdItem = -1;
170 selectedThresholdItem = AnnotationColourGradient.ABOVE_THRESHOLD;
172 else if (indexValue == 2)
174 selectedThresholdItem = AnnotationColourGradient.BELOW_THRESHOLD;
176 return selectedThresholdItem;
179 public void modelChanged()
181 seqAssociated.setEnabled(enableSeqAss);
184 public void ok_actionPerformed(ActionEvent e)
189 frame.setClosed(true);
190 } catch (Exception ex)
195 public void cancel_actionPerformed(ActionEvent e)
198 ap.paintAlignment(true);
201 frame.setClosed(true);
202 } catch (Exception ex)
207 public void thresholdCheck_actionPerformed(ActionEvent e)
212 public void annotations_actionPerformed(ActionEvent e)
217 public void threshold_actionPerformed(ActionEvent e)
222 public void thresholdValue_actionPerformed(ActionEvent e)
226 float f = Float.parseFloat(thresholdValue.getText());
227 slider.setValue((int) (f * 1000));
229 } catch (NumberFormatException ex)
234 public void thresholdIsMin_actionPerformed(ActionEvent actionEvent)
239 protected void populateThresholdComboBox(JComboBox<String> threshold)
241 threshold.addItem(MessageManager
242 .getString("label.threshold_feature_no_thereshold"));
243 threshold.addItem(MessageManager
244 .getString("label.threshold_feature_above_thereshold"));
245 threshold.addItem(MessageManager
246 .getString("label.threshold_feature_below_thereshold"));
249 protected void seqAssociated_actionPerformed(ActionEvent arg0,
250 JComboBox<String> annotations, JCheckBox seqAssociated)
253 String cursel = (String) annotations.getSelectedItem();
254 boolean isvalid = false, isseqs = seqAssociated.isSelected();
255 annotations.removeAllItems();
256 for (String anitem : getAnnotationItems(seqAssociated.isSelected()))
258 if (anitem.equals(cursel) || (isseqs && cursel.startsWith(anitem)))
263 annotations.addItem(anitem);
268 annotations.setSelectedItem(cursel);
272 if (annotations.getItemCount() > 0)
274 annotations.setSelectedIndex(0);
279 protected void propagateSeqAssociatedThreshold(boolean allAnnotation,
280 AlignmentAnnotation annotation)
282 if (annotation.sequenceRef == null || annotation.threshold == null)
287 float thr = annotation.threshold.value;
288 for (int i = 0; i < av.getAlignment().getAlignmentAnnotation().length; i++)
290 AlignmentAnnotation aa = av.getAlignment().getAlignmentAnnotation()[i];
291 if (aa.label.equals(annotation.label)
292 && (annotation.getCalcId() == null ? aa.getCalcId() == null
293 : annotation.getCalcId().equals(aa.getCalcId())))
295 if (aa.threshold == null)
297 aa.threshold = new GraphLine(annotation.threshold);
301 aa.threshold.value = thr;
307 protected boolean colorAlignmContaining(
308 AlignmentAnnotation currentAnnotation, int selectedThresholdItem)
311 AnnotationColourGradient acg = null;
312 if (currentColours.isSelected())
314 acg = new AnnotationColourGradient(currentAnnotation,
315 av.getGlobalColourScheme(), selectedThresholdItem);
319 acg = new AnnotationColourGradient(currentAnnotation,
320 minColour.getBackground(), maxColour.getBackground(),
321 selectedThresholdItem);
323 acg.setSeqAssociated(seqAssociated.isSelected());
325 if (currentAnnotation.graphMin == 0f
326 && currentAnnotation.graphMax == 0f)
328 acg.setPredefinedColours(true);
331 acg.thresholdIsMinMax = thresholdIsMin.isSelected();
333 av.setGlobalColourScheme(acg);
335 if (av.getAlignment().getGroups() != null)
338 for (SequenceGroup sg : ap.av.getAlignment().getGroups())
345 if (currentColours.isSelected())
347 sg.cs = new AnnotationColourGradient(currentAnnotation, sg.cs,
348 selectedThresholdItem);
349 ((AnnotationColourGradient) sg.cs).setSeqAssociated(seqAssociated
355 sg.cs = new AnnotationColourGradient(currentAnnotation,
356 minColour.getBackground(), maxColour.getBackground(),
357 selectedThresholdItem);
358 ((AnnotationColourGradient) sg.cs).setSeqAssociated(seqAssociated
368 public jalview.datamodel.AlignmentAnnotation getCurrentAnnotation()
370 return currentAnnotation;
373 public void setCurrentAnnotation(
374 jalview.datamodel.AlignmentAnnotation currentAnnotation)
376 this.currentAnnotation = currentAnnotation;
379 public abstract void valueChanged(boolean updateAllAnnotation);
381 public abstract void updateView();
383 public abstract void reset();