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);
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)
187 frame.setClosed(true);
188 } catch (Exception ex)
193 public void cancel_actionPerformed(ActionEvent e)
196 ap.paintAlignment(true);
199 frame.setClosed(true);
200 } catch (Exception ex)
205 public void thresholdCheck_actionPerformed(ActionEvent e)
210 public void annotations_actionPerformed(ActionEvent e)
215 public void threshold_actionPerformed(ActionEvent e)
220 public void thresholdValue_actionPerformed(ActionEvent e)
224 float f = Float.parseFloat(thresholdValue.getText());
225 slider.setValue((int) (f * 1000));
227 } catch (NumberFormatException ex)
232 public void thresholdIsMin_actionPerformed(ActionEvent actionEvent)
237 protected void populateThresholdComboBox(JComboBox<String> threshold)
239 threshold.addItem(MessageManager
240 .getString("label.threshold_feature_no_thereshold"));
241 threshold.addItem(MessageManager
242 .getString("label.threshold_feature_above_thereshold"));
243 threshold.addItem(MessageManager
244 .getString("label.threshold_feature_below_thereshold"));
247 protected void seqAssociated_actionPerformed(ActionEvent arg0,
248 JComboBox<String> annotations, JCheckBox seqAssociated)
251 String cursel = (String) annotations.getSelectedItem();
252 boolean isvalid = false, isseqs = seqAssociated.isSelected();
253 annotations.removeAllItems();
254 for (String anitem : getAnnotationItems(seqAssociated.isSelected()))
256 if (anitem.equals(cursel) || (isseqs && cursel.startsWith(anitem)))
261 annotations.addItem(anitem);
266 annotations.setSelectedItem(cursel);
270 if (annotations.getItemCount() > 0)
272 annotations.setSelectedIndex(0);
277 protected void propagateSeqAssociatedThreshold(boolean allAnnotation,
278 AlignmentAnnotation annotation)
280 if (annotation.sequenceRef == null || annotation.threshold == null)
285 float thr = annotation.threshold.value;
286 for (int i = 0; i < av.getAlignment().getAlignmentAnnotation().length; i++)
288 AlignmentAnnotation aa = av.getAlignment().getAlignmentAnnotation()[i];
289 if (aa.label.equals(annotation.label)
290 && (annotation.getCalcId() == null ? aa.getCalcId() == null
291 : annotation.getCalcId().equals(aa.getCalcId())))
293 if (aa.threshold == null)
295 aa.threshold = new GraphLine(annotation.threshold);
299 aa.threshold.value = thr;
305 protected boolean colorAlignmContaining(
306 AlignmentAnnotation currentAnnotation, int selectedThresholdItem)
309 AnnotationColourGradient acg = null;
310 if (currentColours.isSelected())
312 acg = new AnnotationColourGradient(currentAnnotation,
313 av.getGlobalColourScheme(), selectedThresholdItem);
317 acg = new AnnotationColourGradient(currentAnnotation,
318 minColour.getBackground(), maxColour.getBackground(),
319 selectedThresholdItem);
321 acg.setSeqAssociated(seqAssociated.isSelected());
323 if (currentAnnotation.graphMin == 0f
324 && currentAnnotation.graphMax == 0f)
326 acg.setPredefinedColours(true);
329 acg.thresholdIsMinMax = thresholdIsMin.isSelected();
331 av.setGlobalColourScheme(acg);
333 if (av.getAlignment().getGroups() != null)
336 for (SequenceGroup sg : ap.av.getAlignment().getGroups())
343 if (currentColours.isSelected())
345 sg.cs = new AnnotationColourGradient(currentAnnotation, sg.cs,
346 selectedThresholdItem);
347 ((AnnotationColourGradient) sg.cs).setSeqAssociated(seqAssociated
353 sg.cs = new AnnotationColourGradient(currentAnnotation,
354 minColour.getBackground(), maxColour.getBackground(),
355 selectedThresholdItem);
356 ((AnnotationColourGradient) sg.cs).setSeqAssociated(seqAssociated
365 public jalview.datamodel.AlignmentAnnotation getCurrentAnnotation()
367 return currentAnnotation;
370 public void setCurrentAnnotation(
371 jalview.datamodel.AlignmentAnnotation currentAnnotation)
373 this.currentAnnotation = currentAnnotation;
376 public abstract void valueChanged(boolean updateAllAnnotation);
378 public abstract void updateView();
380 public abstract void reset();