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.bin.Instance;
25 import jalview.datamodel.SequenceGroup;
26 import jalview.jbgui.GSliderPanel;
27 import jalview.renderer.ResidueShaderI;
28 import jalview.util.MessageManager;
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 @SuppressWarnings("serial")
49 public class SliderPanel extends GSliderPanel
51 private static final String BACKGROUND = "Background";
55 boolean forConservation = true;
60 * Returns the currently displayed slider panel (or null if none).
64 public static SliderPanel getSliderPanel()
67 JInternalFrame conservationSlider = Instance
68 .getDesktop().conservationSlider;
70 JInternalFrame PIDSlider = Instance.getDesktop().PIDSlider;
72 if (conservationSlider != null && conservationSlider.isVisible())
74 return (SliderPanel) conservationSlider.getContentPane();
76 if (PIDSlider != null && PIDSlider.isVisible())
78 return (SliderPanel) PIDSlider.getContentPane();
84 * Creates a new SliderPanel object.
95 public SliderPanel(final AlignmentPanel ap, int value,
96 boolean forConserve, ResidueShaderI scheme)
100 forConservation = forConserve;
101 undoButton.setVisible(false);
102 applyButton.setVisible(false);
106 label.setText(MessageManager.getString(
107 "label.enter_value_increase_conservation_visibility"));
108 slider.setMinimum(0);
109 slider.setMaximum(100);
113 label.setText(MessageManager.getString(
114 "label.enter_percentage_identity_above_which_colour_residues"));
115 slider.setMinimum(0);
116 slider.setMaximum(100);
119 slider.addChangeListener(new ChangeListener()
122 public void stateChanged(ChangeEvent evt)
124 valueField.setText(String.valueOf(slider.getValue()));
125 valueChanged(slider.getValue());
129 slider.addMouseListener(new MouseAdapter()
132 public void mouseReleased(MouseEvent evt)
134 ap.paintAlignment(true, true);
138 slider.setValue(value);
139 valueField.setText(String.valueOf(value));
143 * Method to 'set focus' of the Conservation slider panel
146 * the panel to repaint on change of slider
148 * the colour scheme to update on change of slider
150 * a text description for the panel's title
154 public static int setConservationSlider(AlignmentPanel ap,
155 ResidueShaderI rs, String source)
157 SliderPanel sliderPanel = null;
159 JInternalFrame conservationSlider = Instance
160 .getDesktop().conservationSlider;
162 if (conservationSlider == null)
164 sliderPanel = new SliderPanel(ap, rs.getConservationInc(), true, rs);
165 conservationSlider = Instance
166 .getDesktop().conservationSlider = new JInternalFrame();
167 conservationSlider.setContentPane(sliderPanel);
168 conservationSlider.setLayer(JLayeredPane.PALETTE_LAYER);
172 sliderPanel = (SliderPanel) conservationSlider.getContentPane();
173 sliderPanel.valueField
174 .setText(String.valueOf(rs.getConservationInc()));
177 sliderPanel.slider.setValue(rs.getConservationInc());
180 conservationSlider.setTitle(MessageManager.formatMessage(
181 "label.conservation_colour_increment", new String[]
182 { source == null ? BACKGROUND : source }));
184 List<SequenceGroup> groups = ap.av.getAlignment().getGroups();
185 if (groups != null && !groups.isEmpty())
187 sliderPanel.setAllGroupsCheckEnabled(true);
191 sliderPanel.setAllGroupsCheckEnabled(false);
194 return sliderPanel.getValue();
198 * Hides the PID slider panel if it is shown
200 public static void hidePIDSlider()
202 JInternalFrame PIDSlider = Instance.getDesktop().PIDSlider;
204 if (PIDSlider != null)
208 PIDSlider.setClosed(true);
209 Instance.getDesktop().PIDSlider = null;
210 } catch (PropertyVetoException ex)
217 * Hides the conservation slider panel if it is shown
219 public static void hideConservationSlider()
221 JInternalFrame conservationSlider = Instance
222 .getDesktop().conservationSlider;
224 if (conservationSlider != null)
228 conservationSlider.setClosed(true);
229 Instance.getDesktop().conservationSlider = null;
230 } catch (PropertyVetoException ex)
239 public static void showConservationSlider()
243 JInternalFrame conservationSlider = Instance
244 .getDesktop().conservationSlider;
246 if (!conservationSlider.isVisible())
248 Desktop.addInternalFrame(conservationSlider,
249 conservationSlider.getTitle(), true, FRAME_WIDTH,
250 FRAME_HEIGHT, false, true);
251 conservationSlider.addInternalFrameListener(new InternalFrameAdapter()
254 public void internalFrameClosed(InternalFrameEvent e)
256 Instance.getDesktop().conservationSlider = null;
259 conservationSlider.setLayer(JLayeredPane.PALETTE_LAYER);
264 * Method to 'set focus' of the PID slider panel
267 * the panel to repaint on change of slider
269 * the colour scheme to update on change of slider
271 * a text description for the panel's title
275 public static int setPIDSliderSource(AlignmentPanel ap, ResidueShaderI rs,
278 int threshold = rs.getThreshold();
280 SliderPanel sliderPanel = null;
282 JInternalFrame PIDSlider = Instance.getDesktop().PIDSlider;
284 if (PIDSlider == null)
286 sliderPanel = new SliderPanel(ap, threshold, false, rs);
287 PIDSlider = Instance.getDesktop().PIDSlider = new JInternalFrame();
288 PIDSlider.setContentPane(sliderPanel);
289 PIDSlider.setLayer(JLayeredPane.PALETTE_LAYER);
293 sliderPanel = (SliderPanel) PIDSlider.getContentPane();
296 sliderPanel.valueField.setText(String.valueOf(rs.getThreshold()));
297 sliderPanel.slider.setValue(rs.getThreshold());
300 PIDSlider.setTitle(MessageManager.formatMessage(
301 "label.percentage_identity_threshold", new String[]
302 { source == null ? BACKGROUND : source }));
304 if (ap.av.getAlignment().getGroups() != null)
306 sliderPanel.setAllGroupsCheckEnabled(true);
310 sliderPanel.setAllGroupsCheckEnabled(false);
313 return sliderPanel.getValue();
321 public static JInternalFrame showPIDSlider()
323 hideConservationSlider();
325 JInternalFrame PIDSlider = Instance.getDesktop().PIDSlider;
327 if (!PIDSlider.isVisible())
329 Desktop.addInternalFrame(PIDSlider, PIDSlider.getTitle(), true,
330 FRAME_WIDTH, FRAME_HEIGHT, false, true);
331 PIDSlider.setLayer(JLayeredPane.PALETTE_LAYER);
332 PIDSlider.addInternalFrameListener(new InternalFrameAdapter()
335 public void internalFrameClosed(InternalFrameEvent e)
337 Instance.getDesktop().PIDSlider = null;
340 PIDSlider.setLayer(JLayeredPane.PALETTE_LAYER);
346 * Updates the colour scheme with the current (identity threshold or
347 * conservation) percentage value. Also updates all groups if 'apply to all
348 * groups' is selected.
352 public void valueChanged(int percent)
354 if (!forConservation)
356 ap.av.setThreshold(percent);
358 updateColourScheme(percent, cs, null);
360 if (allGroupsCheck.isSelected())
362 List<SequenceGroup> groups = ap.av.getAlignment().getGroups();
363 for (SequenceGroup sg : groups)
365 updateColourScheme(percent, sg.getGroupColourScheme(), sg);
369 ap.getSeqPanel().seqCanvas.repaint();
373 * Updates the colour scheme (if not null) with the current (identity
374 * threshold or conservation) percentage value
380 protected void updateColourScheme(int percent, ResidueShaderI scheme,
389 if (!scheme.conservationApplied() && sg != null)
392 * first time the colour scheme has had Conservation shading applied
393 * - compute conservation
395 Conservation c = new Conservation("Group", sg.getSequences(null),
396 sg.getStartRes(), sg.getEndRes());
398 c.verdict(false, ap.av.getConsPercGaps());
399 sg.cs.setConservation(c);
402 scheme.setConservationApplied(true);
403 scheme.setConservationInc(percent);
407 scheme.setThreshold(percent, ap.av.isIgnoreGapsConsensus());
417 public void setAllGroupsCheckEnabled(boolean b)
419 allGroupsCheck.setEnabled(b);
429 public void valueField_actionPerformed()
433 int i = Integer.parseInt(valueField.getText());
435 } catch (NumberFormatException ex)
437 valueField.setText(slider.getValue() + "");
447 public void setValue(int value)
449 slider.setValue(value);
455 * @return DOCUMENT ME!
457 public int getValue()
459 return Integer.parseInt(valueField.getText());
463 public void slider_mouseReleased(MouseEvent e)
465 if (ap.overviewPanel != null)
467 ap.overviewPanel.updateOverviewImage();
471 public static int getConservationValue()
473 return getValue(Instance.getDesktop().conservationSlider);
476 static int getValue(JInternalFrame slider)
478 return slider == null ? 0
479 : ((SliderPanel) slider.getContentPane()).getValue();
482 public static int getPIDValue()
484 return getValue(Instance.getDesktop().PIDSlider);
488 * Answers true if the SliderPanel is for Conservation, false if it is for PID
493 public boolean isForConservation()
495 return forConservation;
499 * Answers the title for the slider panel; this may include 'Background' if
500 * for the alignment, or the group id if for a group
504 public String getTitle()
507 JInternalFrame conservationSlider = Instance
508 .getDesktop().conservationSlider;
509 JInternalFrame PIDSlider = Instance.getDesktop().PIDSlider;
511 if (isForConservation())
513 if (conservationSlider != null)
515 title = conservationSlider.getTitle();
518 else if (PIDSlider != null)
520 title = PIDSlider.getTitle();