JAL-2371 CollectionColourScheme wraps ColourSchemeI
[jalview.git] / src / jalview / appletgui / SliderPanel.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.datamodel.SequenceGroup;
24 import jalview.schemes.CollectionColourSchemeI;
25 import jalview.util.MessageManager;
26
27 import java.awt.BorderLayout;
28 import java.awt.Button;
29 import java.awt.Checkbox;
30 import java.awt.Color;
31 import java.awt.FlowLayout;
32 import java.awt.Frame;
33 import java.awt.Label;
34 import java.awt.Panel;
35 import java.awt.Scrollbar;
36 import java.awt.TextField;
37 import java.awt.event.ActionEvent;
38 import java.awt.event.ActionListener;
39 import java.awt.event.AdjustmentEvent;
40 import java.awt.event.AdjustmentListener;
41 import java.awt.event.MouseEvent;
42 import java.awt.event.MouseListener;
43 import java.awt.event.WindowAdapter;
44 import java.awt.event.WindowEvent;
45 import java.util.Iterator;
46
47 public class SliderPanel extends Panel implements ActionListener,
48         AdjustmentListener, MouseListener
49 {
50   AlignmentPanel ap;
51
52   boolean forConservation = true;
53
54   CollectionColourSchemeI cs;
55
56   static Frame conservationSlider;
57
58   static Frame PIDSlider;
59
60   public static int setConservationSlider(AlignmentPanel ap,
61           CollectionColourSchemeI collectionColourSchemeI, String source)
62   {
63     SliderPanel sp = null;
64
65     if (conservationSlider == null)
66     {
67       sp = new SliderPanel(ap,
68               collectionColourSchemeI.getConservationInc(), true,
69               collectionColourSchemeI);
70       conservationSlider = new Frame();
71       conservationSlider.add(sp);
72     }
73     else
74     {
75       sp = (SliderPanel) conservationSlider.getComponent(0);
76       sp.cs = collectionColourSchemeI;
77     }
78
79     conservationSlider
80             .setTitle(MessageManager.formatMessage(
81                     "label.conservation_colour_increment",
82                     new String[] { source }));
83     if (ap.av.getAlignment().getGroups() != null)
84     {
85       sp.setAllGroupsCheckEnabled(true);
86     }
87     else
88     {
89       sp.setAllGroupsCheckEnabled(false);
90     }
91
92     return sp.getValue();
93   }
94
95   public static void showConservationSlider()
96   {
97     try
98     {
99       PIDSlider.setVisible(false);
100       PIDSlider = null;
101     } catch (Exception ex)
102     {
103     }
104
105     if (!conservationSlider.isVisible())
106     {
107       jalview.bin.JalviewLite.addFrame(conservationSlider,
108               conservationSlider.getTitle(), 420, 100);
109       conservationSlider.addWindowListener(new WindowAdapter()
110       {
111         @Override
112         public void windowClosing(WindowEvent e)
113         {
114           conservationSlider = null;
115         }
116       });
117
118     }
119
120   }
121
122   public static int setPIDSliderSource(AlignmentPanel ap,
123           CollectionColourSchemeI collectionColourSchemeI, String source)
124   {
125     SliderPanel pid = null;
126     if (PIDSlider == null)
127     {
128       pid = new SliderPanel(ap, 50, false, collectionColourSchemeI);
129       PIDSlider = new Frame();
130       PIDSlider.add(pid);
131     }
132     else
133     {
134       pid = (SliderPanel) PIDSlider.getComponent(0);
135       pid.cs = collectionColourSchemeI;
136     }
137     PIDSlider
138             .setTitle(MessageManager.formatMessage(
139                     "label.percentage_identity_threshold",
140                     new String[] { source }));
141
142     if (ap.av.getAlignment().getGroups() != null)
143     {
144       pid.setAllGroupsCheckEnabled(true);
145     }
146     else
147     {
148       pid.setAllGroupsCheckEnabled(false);
149     }
150
151     return pid.getValue();
152
153   }
154
155   public static void showPIDSlider()
156   {
157     try
158     {
159       conservationSlider.setVisible(false);
160       conservationSlider = null;
161     } catch (Exception ex)
162     {
163     }
164
165     if (!PIDSlider.isVisible())
166     {
167       jalview.bin.JalviewLite.addFrame(PIDSlider, PIDSlider.getTitle(),
168               420, 100);
169       PIDSlider.addWindowListener(new WindowAdapter()
170       {
171         @Override
172         public void windowClosing(WindowEvent e)
173         {
174           PIDSlider = null;
175         }
176       });
177     }
178
179   }
180
181   public SliderPanel(AlignmentPanel ap, int value, boolean forConserve,
182           CollectionColourSchemeI collectionColourSchemeI)
183   {
184     try
185     {
186       jbInit();
187     } catch (Exception e)
188     {
189       e.printStackTrace();
190     }
191     this.ap = ap;
192     this.cs = collectionColourSchemeI;
193     forConservation = forConserve;
194     undoButton.setVisible(false);
195     applyButton.setVisible(false);
196     if (forConservation)
197     {
198       label.setText(MessageManager
199               .getString("label.modify_conservation_visibility"));
200       slider.setMinimum(0);
201       slider.setMaximum(50 + slider.getVisibleAmount());
202       slider.setUnitIncrement(1);
203     }
204     else
205     {
206       label.setText(MessageManager
207               .getString("label.colour_residues_above_occurence"));
208       slider.setMinimum(0);
209       slider.setMaximum(100 + slider.getVisibleAmount());
210       slider.setBlockIncrement(1);
211     }
212
213     slider.addAdjustmentListener(this);
214     slider.addMouseListener(this);
215
216     slider.setValue(value);
217     valueField.setText(value + "");
218   }
219
220   public void valueChanged(int i)
221   {
222     if (cs == null)
223     {
224       return;
225     }
226
227     CollectionColourSchemeI toChange = cs;
228     Iterator<SequenceGroup> allGroups = null;
229
230     if (allGroupsCheck.getState())
231     {
232       allGroups = ap.av.getAlignment().getGroups().listIterator();
233     }
234
235     while (toChange != null)
236     {
237       if (forConservation)
238       {
239         toChange.setConservationInc(i);
240       }
241       else
242       {
243         toChange.setThreshold(i, ap.av.isIgnoreGapsConsensus());
244       }
245       if (allGroups != null && allGroups.hasNext())
246       {
247         while ((toChange = allGroups.next().cs) == null
248                 && allGroups.hasNext())
249         {
250           ;
251         }
252       }
253       else
254       {
255         toChange = null;
256       }
257     }
258
259     ap.seqPanel.seqCanvas.repaint();
260
261   }
262
263   public void setAllGroupsCheckEnabled(boolean b)
264   {
265     allGroupsCheck.setEnabled(b);
266   }
267
268   @Override
269   public void actionPerformed(ActionEvent evt)
270   {
271     if (evt.getSource() == applyButton)
272     {
273       applyButton_actionPerformed();
274     }
275     else if (evt.getSource() == undoButton)
276     {
277       undoButton_actionPerformed();
278     }
279     else if (evt.getSource() == valueField)
280     {
281       valueField_actionPerformed();
282     }
283   }
284
285   @Override
286   public void adjustmentValueChanged(AdjustmentEvent evt)
287   {
288     valueField.setText(slider.getValue() + "");
289     valueChanged(slider.getValue());
290   }
291
292   public void valueField_actionPerformed()
293   {
294     try
295     {
296       int i = Integer.parseInt(valueField.getText());
297       slider.setValue(i);
298     } catch (Exception ex)
299     {
300       valueField.setText(slider.getValue() + "");
301     }
302   }
303
304   public void setValue(int value)
305   {
306     slider.setValue(value);
307   }
308
309   public int getValue()
310   {
311     return Integer.parseInt(valueField.getText());
312   }
313
314   // this is used for conservation colours, PID colours and redundancy threshold
315   protected Scrollbar slider = new Scrollbar();
316
317   protected TextField valueField = new TextField();
318
319   protected Label label = new Label();
320
321   Panel jPanel1 = new Panel();
322
323   Panel jPanel2 = new Panel();
324
325   protected Button applyButton = new Button();
326
327   protected Button undoButton = new Button();
328
329   FlowLayout flowLayout1 = new FlowLayout();
330
331   protected Checkbox allGroupsCheck = new Checkbox();
332
333   BorderLayout borderLayout1 = new BorderLayout();
334
335   BorderLayout borderLayout2 = new BorderLayout();
336
337   FlowLayout flowLayout2 = new FlowLayout();
338
339   private void jbInit() throws Exception
340   {
341     this.setLayout(borderLayout2);
342
343     // slider.setMajorTickSpacing(10);
344     // slider.setMinorTickSpacing(1);
345     // slider.setPaintTicks(true);
346     slider.setBackground(Color.white);
347     slider.setFont(new java.awt.Font("Verdana", 0, 11));
348     slider.setOrientation(0);
349     valueField.setFont(new java.awt.Font("Verdana", 0, 11));
350     valueField.setText("   ");
351     valueField.addActionListener(this);
352     valueField.setColumns(3);
353     label.setFont(new java.awt.Font("Verdana", 0, 11));
354     label.setText(MessageManager.getString("label.set_this_label_text"));
355     jPanel1.setLayout(borderLayout1);
356     jPanel2.setLayout(flowLayout1);
357     applyButton.setFont(new java.awt.Font("Verdana", 0, 11));
358     applyButton.setLabel(MessageManager.getString("action.apply"));
359     applyButton.addActionListener(this);
360     undoButton.setEnabled(false);
361     undoButton.setFont(new java.awt.Font("Verdana", 0, 11));
362     undoButton.setLabel(MessageManager.getString("action.undo"));
363     undoButton.addActionListener(this);
364     allGroupsCheck.setEnabled(false);
365     allGroupsCheck.setFont(new java.awt.Font("Verdana", 0, 11));
366     allGroupsCheck.setLabel(MessageManager
367             .getString("action.apply_threshold_all_groups"));
368     allGroupsCheck.setName(MessageManager
369             .getString("action.apply_all_groups"));
370     this.setBackground(Color.white);
371     this.setForeground(Color.black);
372     jPanel2.add(label, null);
373     jPanel2.add(applyButton, null);
374     jPanel2.add(undoButton, null);
375     jPanel2.add(allGroupsCheck);
376     jPanel1.add(valueField, java.awt.BorderLayout.EAST);
377     jPanel1.add(slider, java.awt.BorderLayout.CENTER);
378     this.add(jPanel1, java.awt.BorderLayout.SOUTH);
379     this.add(jPanel2, java.awt.BorderLayout.CENTER);
380   }
381
382   protected void applyButton_actionPerformed()
383   {
384   }
385
386   protected void undoButton_actionPerformed()
387   {
388   }
389
390   @Override
391   public void mousePressed(MouseEvent evt)
392   {
393   }
394
395   @Override
396   public void mouseReleased(MouseEvent evt)
397   {
398     ap.paintAlignment(true);
399   }
400
401   @Override
402   public void mouseClicked(MouseEvent evt)
403   {
404   }
405
406   @Override
407   public void mouseEntered(MouseEvent evt)
408   {
409   }
410
411   @Override
412   public void mouseExited(MouseEvent evt)
413   {
414   }
415 }