4cb5ede3399312b3683896d2bc1792750a5b1a0a
[jalview.git] / src / jalview / appletgui / AnnotationRowFilter.java
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.appletgui;
22
23 import jalview.schemes.AnnotationColourGradient;
24 import jalview.util.MessageManager;
25
26 import java.awt.Button;
27 import java.awt.Checkbox;
28 import java.awt.Choice;
29 import java.awt.Frame;
30 import java.awt.Panel;
31 import java.awt.Scrollbar;
32 import java.awt.TextField;
33 import java.awt.event.ActionEvent;
34 import java.util.Vector;
35
36 @SuppressWarnings("serial")
37 public abstract class AnnotationRowFilter extends Panel
38 {
39   protected AlignViewport av;
40
41   protected AlignmentPanel ap;
42
43   protected int[] annmap;
44
45   protected boolean enableSeqAss = false;
46
47   private jalview.datamodel.AlignmentAnnotation currentAnnotation;
48
49   protected boolean adjusting = false;
50
51   protected Checkbox currentColours = new Checkbox();
52
53   protected Panel minColour = new Panel();
54
55   protected Panel maxColour = new Panel();
56
57   protected Checkbox seqAssociated = new Checkbox();
58
59   protected Checkbox thresholdIsMin = new Checkbox();
60
61   protected Scrollbar slider = new Scrollbar(Scrollbar.HORIZONTAL);
62
63   protected TextField thresholdValue = new TextField(20);
64
65   protected Frame frame;
66
67   protected Button ok = new Button();
68
69   protected Button cancel = new Button();
70
71   /**
72    * enabled if the user is dragging the slider - try to keep updates to a
73    * minimun
74    */
75   protected boolean sliderDragging = false;
76
77   public AnnotationRowFilter(AlignViewport av, final AlignmentPanel ap)
78   {
79     this.av = av;
80     this.ap = ap;
81   }
82
83   public AnnotationRowFilter()
84   {
85
86   }
87
88   public Vector getAnnotationItems(boolean isSeqAssociated)
89   {
90     Vector list = new Vector();
91     int index = 1;
92     int[] anmap = new int[av.getAlignment().getAlignmentAnnotation().length];
93     for (int i = 0; i < av.getAlignment().getAlignmentAnnotation().length; i++)
94     {
95       if (av.getAlignment().getAlignmentAnnotation()[i].sequenceRef == null)
96       {
97         if (isSeqAssociated)
98         {
99           continue;
100         }
101       }
102       else
103       {
104         enableSeqAss = true;
105       }
106       String label = av.getAlignment().getAlignmentAnnotation()[i].label;
107       if (!list.contains(label))
108       {
109         anmap[list.size()] = i;
110         list.add(label);
111
112       }
113       else
114       {
115         if (!isSeqAssociated)
116         {
117           anmap[list.size()] = i;
118           list.add(label + "_" + (index++));
119         }
120       }
121     }
122     this.annmap = new int[list.size()];
123     System.arraycopy(anmap, 0, this.annmap, 0, this.annmap.length);
124     return list;
125   }
126
127   protected int getSelectedThresholdItem(int indexValue)
128   {
129     int selectedThresholdItem = -1;
130     if (indexValue == 1)
131     {
132       selectedThresholdItem = AnnotationColourGradient.ABOVE_THRESHOLD;
133     }
134     else if (indexValue == 2)
135     {
136       selectedThresholdItem = AnnotationColourGradient.BELOW_THRESHOLD;
137     }
138     return selectedThresholdItem;
139   }
140
141   public void modelChanged()
142   {
143     seqAssociated.setEnabled(enableSeqAss);
144   }
145
146   public void ok_actionPerformed(ActionEvent e)
147   {
148     updateView();
149     frame.setVisible(false);
150   }
151
152   public void cancel_actionPerformed(ActionEvent e)
153   {
154     reset();
155     ap.paintAlignment(true);
156     frame.setVisible(false);
157   }
158
159   public void thresholdCheck_actionPerformed(ActionEvent e)
160   {
161     updateView();
162   }
163
164   public void annotations_actionPerformed(ActionEvent e)
165   {
166     updateView();
167   }
168
169   public void threshold_actionPerformed(ActionEvent e)
170   {
171     updateView();
172   }
173
174   public void thresholdValue_actionPerformed(ActionEvent e)
175   {
176     try
177     {
178       float f = Float.parseFloat(thresholdValue.getText());
179       slider.setValue((int) (f * 1000));
180       updateView();
181     } catch (NumberFormatException ex)
182     {
183     }
184   }
185
186   protected void populateThresholdComboBox(Choice threshold)
187   {
188     threshold.addItem(MessageManager
189             .getString("label.threshold_feature_no_thereshold"));
190     threshold.addItem(MessageManager
191             .getString("label.threshold_feature_above_thereshold"));
192     threshold.addItem(MessageManager
193             .getString("label.threshold_feature_below_thereshold"));
194   }
195
196   public jalview.datamodel.AlignmentAnnotation getCurrentAnnotation()
197   {
198     return currentAnnotation;
199   }
200
201   public void setCurrentAnnotation(
202           jalview.datamodel.AlignmentAnnotation currentAnnotation)
203   {
204     this.currentAnnotation = currentAnnotation;
205   }
206
207   public abstract void valueChanged(boolean updateAllAnnotation);
208
209   public abstract void updateView();
210
211   public abstract void reset();
212 }