2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
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.
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.
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.
23 import jalview.analysis.Conservation;
24 import jalview.datamodel.SequenceGroup;
25 import jalview.jbgui.GSliderPanel;
26 import jalview.renderer.ResidueShaderI;
27 import jalview.util.MessageManager;
29 import java.awt.event.ActionEvent;
30 import java.awt.event.MouseAdapter;
31 import java.awt.event.MouseEvent;
32 import java.beans.PropertyVetoException;
33 import java.util.List;
35 import javax.swing.JInternalFrame;
36 import javax.swing.JLayeredPane;
37 import javax.swing.event.ChangeEvent;
38 import javax.swing.event.ChangeListener;
39 import javax.swing.event.InternalFrameAdapter;
40 import javax.swing.event.InternalFrameEvent;
48 public class SliderPanel extends GSliderPanel
50 private static final String BACKGROUND = "Background";
52 static JInternalFrame conservationSlider;
54 static JInternalFrame PIDSlider;
58 boolean forConservation = true;
63 * Returns the currently displayed slider panel (or null if none).
67 public static SliderPanel getSliderPanel()
69 if (conservationSlider != null && conservationSlider.isVisible())
71 return (SliderPanel) conservationSlider.getContentPane();
73 if (PIDSlider != null && PIDSlider.isVisible())
75 return (SliderPanel) PIDSlider.getContentPane();
81 * Creates a new SliderPanel object.
92 public SliderPanel(final AlignmentPanel ap, int value,
93 boolean forConserve, ResidueShaderI scheme)
97 forConservation = forConserve;
98 undoButton.setVisible(false);
99 applyButton.setVisible(false);
103 label.setText(MessageManager.getString(
104 "label.enter_value_increase_conservation_visibility"));
105 slider.setMinimum(0);
106 slider.setMaximum(100);
110 label.setText(MessageManager.getString(
111 "label.enter_percentage_identity_above_which_colour_residues"));
112 slider.setMinimum(0);
113 slider.setMaximum(100);
116 slider.addChangeListener(new ChangeListener()
119 public void stateChanged(ChangeEvent evt)
121 valueField.setText(String.valueOf(slider.getValue()));
122 valueChanged(slider.getValue());
126 slider.addMouseListener(new MouseAdapter()
129 public void mouseReleased(MouseEvent evt)
131 ap.paintAlignment(true, true);
135 slider.setValue(value);
136 valueField.setText(String.valueOf(value));
140 * Method to 'set focus' of the Conservation slider panel
143 * the panel to repaint on change of slider
145 * the colour scheme to update on change of slider
147 * a text description for the panel's title
151 public static int setConservationSlider(AlignmentPanel ap,
152 ResidueShaderI rs, String source)
154 SliderPanel sliderPanel = null;
156 if (conservationSlider == null)
158 sliderPanel = new SliderPanel(ap, rs.getConservationInc(), true, rs);
159 conservationSlider = new JInternalFrame();
160 conservationSlider.setContentPane(sliderPanel);
161 conservationSlider.setLayer(JLayeredPane.PALETTE_LAYER);
165 sliderPanel = (SliderPanel) conservationSlider.getContentPane();
166 sliderPanel.valueField
167 .setText(String.valueOf(rs.getConservationInc()));
170 sliderPanel.slider.setValue(rs.getConservationInc());
173 conservationSlider.setTitle(MessageManager.formatMessage(
174 "label.conservation_colour_increment", new String[]
175 { source == null ? BACKGROUND : source }));
177 List<SequenceGroup> groups = ap.av.getAlignment().getGroups();
178 if (groups != null && !groups.isEmpty())
180 sliderPanel.setAllGroupsCheckEnabled(true);
181 sliderPanel.allGroupsCheck
182 .setSelected(ap.av.getColourAppliesToAllGroups());
186 sliderPanel.setAllGroupsCheckEnabled(false);
189 return sliderPanel.getValue();
193 * Hides the PID slider panel if it is shown
195 public static void hidePIDSlider()
197 if (PIDSlider != null)
201 PIDSlider.setClosed(true);
203 } catch (PropertyVetoException ex)
210 * Hides the conservation slider panel if it is shown
212 public static void hideConservationSlider()
214 if (conservationSlider != null)
218 conservationSlider.setClosed(true);
219 conservationSlider = null;
220 } catch (PropertyVetoException ex)
229 public static void showConservationSlider()
233 if (!conservationSlider.isVisible())
235 Desktop.addInternalFrame(conservationSlider,
236 conservationSlider.getTitle(), true, FRAME_WIDTH,
237 FRAME_HEIGHT, false, true);
238 conservationSlider.addInternalFrameListener(new InternalFrameAdapter()
241 public void internalFrameClosed(InternalFrameEvent e)
243 conservationSlider = null;
246 conservationSlider.setLayer(JLayeredPane.PALETTE_LAYER);
251 * Method to 'set focus' of the PID slider panel
254 * the panel to repaint on change of slider
256 * the colour scheme to update on change of slider
258 * a text description for the panel's title
262 public static int setPIDSliderSource(AlignmentPanel ap, ResidueShaderI rs,
265 int threshold = rs.getThreshold();
267 SliderPanel sliderPanel = null;
269 if (PIDSlider == null)
271 sliderPanel = new SliderPanel(ap, threshold, false, rs);
272 PIDSlider = new JInternalFrame();
273 PIDSlider.setContentPane(sliderPanel);
274 PIDSlider.setLayer(JLayeredPane.PALETTE_LAYER);
278 sliderPanel = (SliderPanel) PIDSlider.getContentPane();
281 sliderPanel.valueField.setText(String.valueOf(rs.getThreshold()));
282 sliderPanel.slider.setValue(rs.getThreshold());
285 PIDSlider.setTitle(MessageManager.formatMessage(
286 "label.percentage_identity_threshold", new String[]
287 { source == null ? BACKGROUND : source }));
289 if (ap.av.getAlignment().getGroups() != null)
291 sliderPanel.setAllGroupsCheckEnabled(true);
295 sliderPanel.setAllGroupsCheckEnabled(false);
298 return sliderPanel.getValue();
306 public static JInternalFrame showPIDSlider()
308 hideConservationSlider();
310 if (!PIDSlider.isVisible())
312 Desktop.addInternalFrame(PIDSlider, PIDSlider.getTitle(), true,
313 FRAME_WIDTH, FRAME_HEIGHT, false, true);
314 PIDSlider.setLayer(JLayeredPane.PALETTE_LAYER);
315 PIDSlider.addInternalFrameListener(new InternalFrameAdapter()
318 public void internalFrameClosed(InternalFrameEvent e)
323 PIDSlider.setLayer(JLayeredPane.PALETTE_LAYER);
329 * Updates the colour scheme with the current (identity threshold or
330 * conservation) percentage value. Also updates all groups if 'apply to all
331 * groups' is selected.
335 public void valueChanged(int percent)
337 if (!forConservation)
339 ap.av.setThreshold(percent);
341 updateColourScheme(percent, cs, null);
343 if (allGroupsCheck.isSelected())
345 List<SequenceGroup> groups = ap.av.getAlignment().getGroups();
346 for (SequenceGroup sg : groups)
348 updateColourScheme(percent, sg.getGroupColourScheme(), sg);
352 ap.getSeqPanel().seqCanvas.repaint();
356 * Updates the colour scheme (if not null) with the current (identity
357 * threshold or conservation) percentage value
363 protected void updateColourScheme(int percent, ResidueShaderI scheme,
372 if (!scheme.conservationApplied() && sg != null)
375 * first time the colour scheme has had Conservation shading applied
376 * - compute conservation
378 Conservation c = new Conservation("Group", sg.getSequences(null),
379 sg.getStartRes(), sg.getEndRes());
381 c.verdict(false, ap.av.getConsPercGaps());
382 sg.cs.setConservation(c);
385 scheme.setConservationApplied(true);
386 scheme.setConservationInc(percent);
390 scheme.setThreshold(percent, ap.av.isIgnoreGapsConsensus());
400 public void setAllGroupsCheckEnabled(boolean b)
402 allGroupsCheck.setEnabled(b);
412 public void valueField_actionPerformed()
416 int i = Integer.parseInt(valueField.getText());
418 } catch (NumberFormatException ex)
420 valueField.setText(slider.getValue() + "");
430 public void setValue(int value)
432 slider.setValue(value);
438 * @return DOCUMENT ME!
440 public int getValue()
442 return Integer.parseInt(valueField.getText());
446 public void slider_mouseReleased(MouseEvent e)
448 if (ap.overviewPanel != null)
450 ap.overviewPanel.updateOverviewImage();
454 public static int getConservationValue()
456 return getValue(conservationSlider);
459 static int getValue(JInternalFrame slider)
461 return slider == null ? 0
462 : ((SliderPanel) slider.getContentPane()).getValue();
465 public static int getPIDValue()
467 return getValue(PIDSlider);
471 * Answers true if the SliderPanel is for Conservation, false if it is for PID
476 public boolean isForConservation()
478 return forConservation;
482 * Answers the title for the slider panel; this may include 'Background' if
483 * for the alignment, or the group id if for a group
487 public String getTitle()
490 if (isForConservation())
492 if (conservationSlider != null)
494 title = conservationSlider.getTitle();
497 else if (PIDSlider != null)
499 title = PIDSlider.getTitle();