recovery of identical dataset sequence object on undo (rather than creation of a...
[jalview.git] / src / jalview / appletgui / SliderPanel.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2007 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 \r
20 package jalview.appletgui;\r
21 \r
22 import java.util.*;\r
23 \r
24 import java.awt.*;\r
25 import java.awt.event.*;\r
26 \r
27 import jalview.datamodel.*;\r
28 import jalview.schemes.*;\r
29 \r
30 public class SliderPanel\r
31     extends Panel implements ActionListener,\r
32     AdjustmentListener,\r
33     MouseListener\r
34 {\r
35   AlignmentPanel ap;\r
36   boolean forConservation = true;\r
37   ColourSchemeI cs;\r
38 \r
39   static Frame conservationSlider;\r
40   static Frame PIDSlider;\r
41 \r
42   public static int setConservationSlider(AlignmentPanel ap, ColourSchemeI cs,\r
43                                           String source)\r
44   {\r
45     SliderPanel sp = null;\r
46 \r
47     if (conservationSlider == null)\r
48     {\r
49       sp = new SliderPanel(ap, cs.getConservationInc(), true, cs);\r
50       conservationSlider = new Frame();\r
51       conservationSlider.add(sp);\r
52     }\r
53     else\r
54     {\r
55       sp = (SliderPanel) conservationSlider.getComponent(0);\r
56       sp.cs = cs;\r
57     }\r
58 \r
59     conservationSlider.setTitle("Conservation Colour Increment  (" + source +\r
60                                 ")");\r
61     if (ap.av.alignment.getGroups() != null)\r
62     {\r
63       sp.setAllGroupsCheckEnabled(true);\r
64     }\r
65     else\r
66     {\r
67       sp.setAllGroupsCheckEnabled(false);\r
68     }\r
69 \r
70     return sp.getValue();\r
71   }\r
72 \r
73   public static void showConservationSlider()\r
74   {\r
75     try\r
76     {\r
77       PIDSlider.setVisible(false);\r
78       PIDSlider = null;\r
79     }\r
80     catch (Exception ex)\r
81     {}\r
82 \r
83     if (!conservationSlider.isVisible())\r
84     {\r
85       jalview.bin.JalviewLite.addFrame(conservationSlider,\r
86                                        conservationSlider.getTitle(), 420, 100);\r
87       conservationSlider.addWindowListener(new WindowAdapter()\r
88       {\r
89         public void windowClosing(WindowEvent e)\r
90         {\r
91           conservationSlider = null;\r
92         }\r
93       });\r
94 \r
95     }\r
96 \r
97   }\r
98 \r
99   public static int setPIDSliderSource(AlignmentPanel ap, ColourSchemeI cs,\r
100                                        String source)\r
101   {\r
102     SliderPanel pid = null;\r
103     if (PIDSlider == null)\r
104     {\r
105       pid = new SliderPanel(ap, 50, false, cs);\r
106       PIDSlider = new Frame();\r
107       PIDSlider.add(pid);\r
108     }\r
109     else\r
110     {\r
111       pid = (SliderPanel) PIDSlider.getComponent(0);\r
112       pid.cs = cs;\r
113     }\r
114     PIDSlider.setTitle("Percentage Identity Threshold (" + source + ")");\r
115 \r
116     if (ap.av.alignment.getGroups() != null)\r
117     {\r
118       pid.setAllGroupsCheckEnabled(true);\r
119     }\r
120     else\r
121     {\r
122       pid.setAllGroupsCheckEnabled(false);\r
123     }\r
124 \r
125     return pid.getValue();\r
126 \r
127   }\r
128 \r
129   public static void showPIDSlider()\r
130   {\r
131     try\r
132     {\r
133       conservationSlider.setVisible(false);\r
134       conservationSlider = null;\r
135     }\r
136     catch (Exception ex)\r
137     {}\r
138 \r
139     if (!PIDSlider.isVisible())\r
140     {\r
141       jalview.bin.JalviewLite.addFrame(PIDSlider, PIDSlider.getTitle(), 420,\r
142                                        100);\r
143       PIDSlider.addWindowListener(new WindowAdapter()\r
144       {\r
145         public void windowClosing(WindowEvent e)\r
146         {\r
147           PIDSlider = null;\r
148         }\r
149       });\r
150     }\r
151 \r
152   }\r
153 \r
154   public SliderPanel(AlignmentPanel ap, int value, boolean forConserve,\r
155                      ColourSchemeI cs)\r
156   {\r
157     try\r
158     {\r
159       jbInit();\r
160     }\r
161     catch (Exception e)\r
162     {\r
163       e.printStackTrace();\r
164     }\r
165     this.ap = ap;\r
166     this.cs = cs;\r
167     forConservation = forConserve;\r
168     undoButton.setVisible(false);\r
169     applyButton.setVisible(false);\r
170     if (forConservation)\r
171     {\r
172       label.setText("Modify conservation visibility");\r
173       slider.setMinimum(0);\r
174       slider.setMaximum(50 + slider.getVisibleAmount());\r
175       slider.setUnitIncrement(1);\r
176     }\r
177     else\r
178     {\r
179       label.setText("Colour residues above % occurence");\r
180       slider.setMinimum(0);\r
181       slider.setMaximum(100 + slider.getVisibleAmount());\r
182       slider.setBlockIncrement(1);\r
183     }\r
184 \r
185     slider.addAdjustmentListener(this);\r
186     slider.addMouseListener(this);\r
187 \r
188     slider.setValue(value);\r
189     valueField.setText(value + "");\r
190   }\r
191 \r
192   public void valueChanged(int i)\r
193   {\r
194     if (cs == null)\r
195     {\r
196       return;\r
197     }\r
198 \r
199     ColourSchemeI toChange = null;\r
200     Vector allGroups = null;\r
201     int groupIndex = 0;\r
202 \r
203     if (allGroupsCheck.getState())\r
204     {\r
205       allGroups = ap.av.alignment.getGroups();\r
206       groupIndex = allGroups.size() - 1;\r
207     }\r
208     else\r
209     {\r
210       toChange = cs;\r
211     }\r
212 \r
213     while (groupIndex > -1)\r
214     {\r
215       if (allGroups != null)\r
216       {\r
217         toChange = ( (SequenceGroup) allGroups.elementAt(groupIndex)).cs;\r
218       }\r
219 \r
220       if (forConservation)\r
221       {\r
222         toChange.setConservationInc(i);\r
223       }\r
224       else\r
225       {\r
226         toChange.setThreshold(i, ap.av.getIgnoreGapsConsensus());\r
227       }\r
228 \r
229       groupIndex--;\r
230     }\r
231 \r
232     ap.seqPanel.seqCanvas.repaint();\r
233 \r
234   }\r
235 \r
236   public void setAllGroupsCheckEnabled(boolean b)\r
237   {\r
238     allGroupsCheck.setEnabled(b);\r
239   }\r
240 \r
241   public void actionPerformed(ActionEvent evt)\r
242   {\r
243     if (evt.getSource() == applyButton)\r
244     {\r
245       applyButton_actionPerformed();\r
246     }\r
247     else if (evt.getSource() == undoButton)\r
248     {\r
249       undoButton_actionPerformed();\r
250     }\r
251     else if (evt.getSource() == valueField)\r
252     {\r
253       valueField_actionPerformed();\r
254     }\r
255   }\r
256 \r
257   public void adjustmentValueChanged(AdjustmentEvent evt)\r
258   {\r
259     valueField.setText(slider.getValue() + "");\r
260     valueChanged(slider.getValue());\r
261   }\r
262 \r
263   public void valueField_actionPerformed()\r
264   {\r
265     try\r
266     {\r
267       int i = Integer.parseInt(valueField.getText());\r
268       slider.setValue(i);\r
269     }\r
270     catch (Exception ex)\r
271     {\r
272       valueField.setText(slider.getValue() + "");\r
273     }\r
274   }\r
275 \r
276   public void setValue(int value)\r
277   {\r
278     slider.setValue(value);\r
279   }\r
280 \r
281   public int getValue()\r
282   {\r
283     return Integer.parseInt(valueField.getText());\r
284   }\r
285 \r
286   // this is used for conservation colours, PID colours and redundancy threshold\r
287   protected Scrollbar slider = new Scrollbar();\r
288   protected TextField valueField = new TextField();\r
289   protected Label label = new Label();\r
290   Panel jPanel1 = new Panel();\r
291   Panel jPanel2 = new Panel();\r
292   protected Button applyButton = new Button();\r
293   protected Button undoButton = new Button();\r
294   FlowLayout flowLayout1 = new FlowLayout();\r
295   protected Checkbox allGroupsCheck = new Checkbox();\r
296   BorderLayout borderLayout1 = new BorderLayout();\r
297   BorderLayout borderLayout2 = new BorderLayout();\r
298   FlowLayout flowLayout2 = new FlowLayout();\r
299 \r
300   private void jbInit()\r
301       throws Exception\r
302   {\r
303     this.setLayout(borderLayout2);\r
304 \r
305     // slider.setMajorTickSpacing(10);\r
306     //  slider.setMinorTickSpacing(1);\r
307     //  slider.setPaintTicks(true);\r
308     slider.setBackground(Color.white);\r
309     slider.setFont(new java.awt.Font("Verdana", 0, 11));\r
310     slider.setOrientation(0);\r
311     valueField.setFont(new java.awt.Font("Verdana", 0, 11));\r
312     valueField.setText("      ");\r
313     valueField.addActionListener(this);\r
314     label.setFont(new java.awt.Font("Verdana", 0, 11));\r
315     label.setText("set this label text");\r
316     jPanel1.setLayout(borderLayout1);\r
317     jPanel2.setLayout(flowLayout1);\r
318     applyButton.setFont(new java.awt.Font("Verdana", 0, 11));\r
319     applyButton.setLabel("Apply");\r
320     applyButton.addActionListener(this);\r
321     undoButton.setEnabled(false);\r
322     undoButton.setFont(new java.awt.Font("Verdana", 0, 11));\r
323     undoButton.setLabel("Undo");\r
324     undoButton.addActionListener(this);\r
325     allGroupsCheck.setEnabled(false);\r
326     allGroupsCheck.setFont(new java.awt.Font("Verdana", 0, 11));\r
327     allGroupsCheck.setLabel("Apply threshold to all groups");\r
328     allGroupsCheck.setName("Apply to all Groups");\r
329     this.setBackground(Color.white);\r
330     this.setForeground(Color.black);\r
331     jPanel2.add(label, null);\r
332     jPanel2.add(applyButton, null);\r
333     jPanel2.add(undoButton, null);\r
334     jPanel2.add(allGroupsCheck);\r
335     jPanel1.add(valueField, java.awt.BorderLayout.EAST);\r
336     jPanel1.add(slider, java.awt.BorderLayout.CENTER);\r
337     this.add(jPanel1, java.awt.BorderLayout.SOUTH);\r
338     this.add(jPanel2, java.awt.BorderLayout.CENTER);\r
339   }\r
340 \r
341   protected void applyButton_actionPerformed()\r
342   {}\r
343 \r
344   protected void undoButton_actionPerformed()\r
345   {}\r
346 \r
347   public void mousePressed(MouseEvent evt)\r
348   {}\r
349 \r
350   public void mouseReleased(MouseEvent evt)\r
351   {\r
352       ap.paintAlignment(true);\r
353   }\r
354 \r
355   public void mouseClicked(MouseEvent evt)\r
356   {}\r
357 \r
358   public void mouseEntered(MouseEvent evt)\r
359   {}\r
360 \r
361   public void mouseExited(MouseEvent evt)\r
362   {}\r
363 }\r