Can be used for annotation colouring
[jalview.git] / src / jalview / gui / SliderPanel.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  *\r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  *\r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 package jalview.gui;\r
20 \r
21 import jalview.datamodel.*;\r
22 \r
23 import jalview.jbgui.*;\r
24 \r
25 import jalview.schemes.*;\r
26 \r
27 import java.awt.event.*;\r
28 \r
29 import java.util.*;\r
30 \r
31 import javax.swing.*;\r
32 import javax.swing.event.*;\r
33 \r
34 \r
35 /**\r
36  * DOCUMENT ME!\r
37  *\r
38  * @author $author$\r
39  * @version $Revision$\r
40  */\r
41 public class SliderPanel extends GSliderPanel\r
42 {\r
43     static JInternalFrame conservationSlider;\r
44     static JInternalFrame PIDSlider;\r
45     AlignmentPanel ap;\r
46     boolean forConservation = true;\r
47     boolean forAnnotation = false;\r
48     ColourSchemeI cs;\r
49 \r
50     /**\r
51      * Creates a new SliderPanel object.\r
52      *\r
53      * @param ap DOCUMENT ME!\r
54      * @param value DOCUMENT ME!\r
55      * @param forConserve DOCUMENT ME!\r
56      * @param cs DOCUMENT ME!\r
57      */\r
58     public SliderPanel(AlignmentPanel ap, int value, boolean forConserve,\r
59         ColourSchemeI cs)\r
60     {\r
61         this.ap = ap;\r
62         this.cs = cs;\r
63         forConservation = forConserve;\r
64         undoButton.setVisible(false);\r
65         applyButton.setVisible(false);\r
66 \r
67         if (forConservation)\r
68         {\r
69             label.setText("Enter value to increase conservation visibility");\r
70             slider.setMinimum(0);\r
71             slider.setMaximum(50);\r
72         }\r
73         else\r
74         {\r
75             label.setText("Enter % identity above which to colour residues");\r
76             slider.setMinimum(0);\r
77             slider.setMaximum(100);\r
78         }\r
79 \r
80         slider.addChangeListener(new ChangeListener()\r
81             {\r
82                 public void stateChanged(ChangeEvent evt)\r
83                 {\r
84                     valueField.setText(slider.getValue() + "");\r
85                     valueChanged(slider.getValue());\r
86                 }\r
87             });\r
88 \r
89         slider.setValue(value);\r
90         valueField.setText(value + "");\r
91     }\r
92 \r
93     public SliderPanel(final AlignmentAnnotation annotation, final AlignmentPanel ap)\r
94     {\r
95       forAnnotation = true;\r
96       undoButton.setVisible(false);\r
97       applyButton.setVisible(false);\r
98       allGroupsCheck.setVisible(false);\r
99       label.setText("Adjust value - "+annotation.getGraphLine(0).label);\r
100 \r
101       float range = annotation.graphMax * 1000 - annotation.graphMin * 1000;\r
102 \r
103       slider.setMinimum( (int) (annotation.graphMin * 1000));\r
104       slider.setMaximum( (int) (annotation.graphMax * 1000));\r
105       slider.setValue( (int) (annotation.getGraphLine(0).value * 1000));\r
106       valueField.setText( annotation.getGraphLine(0).value + "");\r
107       slider.setMajorTickSpacing( (int) (range / 10f));\r
108       slider.setMinorTickSpacing( (int) (range / 100f));\r
109       slider.setPaintTicks(true);\r
110 \r
111       JInternalFrame slideFrame = new JInternalFrame();\r
112       slideFrame.setLayer(JLayeredPane.PALETTE_LAYER);\r
113       Desktop.addInternalFrame(slideFrame,\r
114                                "Adjust " + annotation.label +" value",\r
115                                250, 90);\r
116 \r
117       slideFrame.setContentPane(this);\r
118       slider.addChangeListener(new ChangeListener()\r
119       {\r
120         public void stateChanged(ChangeEvent evt)\r
121         {\r
122           valueField.setText( ((float)slider.getValue()/1000f) + "");\r
123           annotation.getGraphLine(0).value = (float)slider.getValue()/1000f;\r
124           ap.repaint();\r
125         }\r
126       });\r
127 \r
128     }\r
129 \r
130 \r
131     /**\r
132      * DOCUMENT ME!\r
133      *\r
134      * @param ap DOCUMENT ME!\r
135      * @param cs DOCUMENT ME!\r
136      * @param source DOCUMENT ME!\r
137      *\r
138      * @return DOCUMENT ME!\r
139      */\r
140     public static int setConservationSlider(AlignmentPanel ap,\r
141         ColourSchemeI cs, String source)\r
142     {\r
143         SliderPanel sp = null;\r
144 \r
145         if (conservationSlider == null)\r
146         {\r
147             sp = new SliderPanel(ap, cs.getConservationInc(), true, cs);\r
148             conservationSlider = new JInternalFrame();\r
149             conservationSlider.setContentPane(sp);\r
150             conservationSlider.setLayer(JLayeredPane.PALETTE_LAYER);\r
151         }\r
152         else\r
153         {\r
154             sp = (SliderPanel) conservationSlider.getContentPane();\r
155             sp.cs = cs;\r
156         }\r
157 \r
158         conservationSlider.setTitle("Conservation Colour Increment  (" +\r
159             source + ")");\r
160 \r
161         if (ap.av.alignment.getGroups() != null)\r
162         {\r
163             sp.setAllGroupsCheckEnabled(true);\r
164         }\r
165         else\r
166         {\r
167             sp.setAllGroupsCheckEnabled(false);\r
168         }\r
169 \r
170         return sp.getValue();\r
171     }\r
172 \r
173     /**\r
174      * DOCUMENT ME!\r
175      */\r
176     public static void showConservationSlider()\r
177     {\r
178         try\r
179         {\r
180             PIDSlider.setClosed(true);\r
181             PIDSlider = null;\r
182         }\r
183         catch (Exception ex)\r
184         {\r
185         }\r
186 \r
187         if (!conservationSlider.isVisible())\r
188         {\r
189             Desktop.addInternalFrame(conservationSlider,\r
190                 conservationSlider.getTitle(), 420, 90, false);\r
191             conservationSlider.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()\r
192                 {\r
193                     public void internalFrameClosed(\r
194                         javax.swing.event.InternalFrameEvent e)\r
195                     {\r
196                         conservationSlider = null;\r
197                     }\r
198                 });\r
199             conservationSlider.setLayer(JLayeredPane.PALETTE_LAYER);\r
200         }\r
201     }\r
202 \r
203     /**\r
204      * DOCUMENT ME!\r
205      *\r
206      * @param ap DOCUMENT ME!\r
207      * @param cs DOCUMENT ME!\r
208      * @param source DOCUMENT ME!\r
209      *\r
210      * @return DOCUMENT ME!\r
211      */\r
212     public static int setPIDSliderSource(AlignmentPanel ap, ColourSchemeI cs,\r
213         String source)\r
214     {\r
215         SliderPanel pid = null;\r
216 \r
217         int threshold = cs.getThreshold();\r
218 \r
219         if (PIDSlider == null)\r
220         {\r
221             pid = new SliderPanel(ap, threshold, false, cs);\r
222             PIDSlider = new JInternalFrame();\r
223             PIDSlider.setContentPane(pid);\r
224             PIDSlider.setLayer(JLayeredPane.PALETTE_LAYER);\r
225         }\r
226         else\r
227         {\r
228             pid = (SliderPanel) PIDSlider.getContentPane();\r
229             pid.cs = cs;\r
230         }\r
231 \r
232         PIDSlider.setTitle("Percentage Identity Threshold (" + source + ")");\r
233 \r
234         if (ap.av.alignment.getGroups() != null)\r
235         {\r
236             pid.setAllGroupsCheckEnabled(true);\r
237         }\r
238         else\r
239         {\r
240             pid.setAllGroupsCheckEnabled(false);\r
241         }\r
242 \r
243         return pid.getValue();\r
244     }\r
245 \r
246     /**\r
247      * DOCUMENT ME!\r
248      */\r
249     public static void showPIDSlider()\r
250     {\r
251         try\r
252         {\r
253             conservationSlider.setClosed(true);\r
254             conservationSlider = null;\r
255         }\r
256         catch (Exception ex)\r
257         {\r
258         }\r
259 \r
260         if (!PIDSlider.isVisible())\r
261         {\r
262             Desktop.addInternalFrame(PIDSlider, PIDSlider.getTitle(), 420, 90,\r
263                 false);\r
264             PIDSlider.setLayer(JLayeredPane.PALETTE_LAYER);\r
265             PIDSlider.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()\r
266                 {\r
267                     public void internalFrameClosed(\r
268                         javax.swing.event.InternalFrameEvent e)\r
269                     {\r
270                         PIDSlider = null;\r
271                     }\r
272                 });\r
273             PIDSlider.setLayer(JLayeredPane.PALETTE_LAYER);\r
274         }\r
275     }\r
276 \r
277     /**\r
278      * DOCUMENT ME!\r
279      *\r
280      * @param i DOCUMENT ME!\r
281      */\r
282     public void valueChanged(int i)\r
283     {\r
284         if (cs == null)\r
285         {System.out.println("cs is null");\r
286             return;\r
287         }\r
288 \r
289 \r
290 \r
291         ColourSchemeI toChange = null;\r
292         Vector allGroups = null;\r
293         int groupIndex = 0;\r
294 \r
295         if (allGroupsCheck.isSelected())\r
296         {\r
297             allGroups = ap.av.alignment.getGroups();\r
298             groupIndex = allGroups.size() - 1;\r
299         }\r
300         else\r
301         {\r
302             toChange = cs;\r
303         }\r
304 \r
305 \r
306         while (groupIndex > -1)\r
307         {\r
308             if (allGroups != null)\r
309             {\r
310                 toChange = ((SequenceGroup) allGroups.get(groupIndex)).cs;\r
311 \r
312                 if (toChange == null)\r
313                 {\r
314                     groupIndex--;\r
315 \r
316                     continue;\r
317                 }\r
318             }\r
319 \r
320             if (forConservation)\r
321             {\r
322                 if (toChange.conservationApplied())\r
323                 {\r
324                     toChange.setConservationInc(i);\r
325                 }\r
326             }\r
327             else\r
328             {\r
329                 toChange.setThreshold(i, ap.av.getIgnoreGapsConsensus());\r
330             }\r
331 \r
332             groupIndex--;\r
333         }\r
334 \r
335         ap.seqPanel.seqCanvas.repaint();\r
336     }\r
337 \r
338     /**\r
339      * DOCUMENT ME!\r
340      *\r
341      * @param b DOCUMENT ME!\r
342      */\r
343     public void setAllGroupsCheckEnabled(boolean b)\r
344     {\r
345         allGroupsCheck.setEnabled(b);\r
346     }\r
347 \r
348     /**\r
349      * DOCUMENT ME!\r
350      *\r
351      * @param e DOCUMENT ME!\r
352      */\r
353     public void valueField_actionPerformed(ActionEvent e)\r
354     {\r
355         try\r
356         {\r
357           if (forAnnotation)\r
358           {\r
359             float f = Float.parseFloat(valueField.getText());\r
360             slider.setValue( (int)( f * 1000 ));\r
361           }\r
362           else\r
363           {\r
364             int i = Integer.parseInt(valueField.getText());\r
365             slider.setValue(i);\r
366           }\r
367         }\r
368         catch (Exception ex)\r
369         {\r
370             valueField.setText(slider.getValue() + "");\r
371         }\r
372     }\r
373 \r
374     /**\r
375      * DOCUMENT ME!\r
376      *\r
377      * @param value DOCUMENT ME!\r
378      */\r
379     public void setValue(int value)\r
380     {\r
381         slider.setValue(value);\r
382     }\r
383 \r
384     /**\r
385      * DOCUMENT ME!\r
386      *\r
387      * @return DOCUMENT ME!\r
388      */\r
389     public int getValue()\r
390     {\r
391         return Integer.parseInt(valueField.getText());\r
392     }\r
393 }\r