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.MouseAdapter;
30 import java.awt.event.MouseEvent;
31 import java.beans.PropertyVetoException;
32 import java.util.List;
34 import javax.swing.JInternalFrame;
35 import javax.swing.JLayeredPane;
36 import javax.swing.event.ChangeEvent;
37 import javax.swing.event.ChangeListener;
38 import javax.swing.event.InternalFrameAdapter;
39 import javax.swing.event.InternalFrameEvent;
47 @SuppressWarnings("serial")
48 public class SliderPanel extends GSliderPanel
50 private static final String BACKGROUND = "Background";
54 boolean forConservation = true;
59 * Returns the currently displayed slider panel (or null if none).
63 public static SliderPanel getSliderPanel()
66 JInternalFrame conservationSlider = Desktop
67 .getInstance().conservationSlider;
69 JInternalFrame PIDSlider = Desktop.getInstance().PIDSlider;
71 if (conservationSlider != null && conservationSlider.isVisible())
73 return (SliderPanel) conservationSlider.getContentPane();
75 if (PIDSlider != null && PIDSlider.isVisible())
77 return (SliderPanel) PIDSlider.getContentPane();
83 * Creates a new SliderPanel object.
94 public SliderPanel(final AlignmentPanel ap, int value,
95 boolean forConserve, ResidueShaderI scheme)
99 forConservation = forConserve;
100 undoButton.setVisible(false);
101 applyButton.setVisible(false);
105 label.setText(MessageManager.getString(
106 "label.enter_value_increase_conservation_visibility"));
107 slider.setMinimum(0);
108 slider.setMaximum(100);
112 label.setText(MessageManager.getString(
113 "label.enter_percentage_identity_above_which_colour_residues"));
114 slider.setMinimum(0);
115 slider.setMaximum(100);
118 slider.addChangeListener(new ChangeListener()
121 public void stateChanged(ChangeEvent evt)
123 valueField.setText(String.valueOf(slider.getValue()));
124 valueChanged(slider.getValue());
128 slider.addMouseListener(new MouseAdapter()
131 public void mouseReleased(MouseEvent evt)
133 ap.paintAlignment(true, true);
137 slider.setValue(value);
138 valueField.setText(String.valueOf(value));
142 * Method to 'set focus' of the Conservation slider panel
145 * the panel to repaint on change of slider
147 * the colour scheme to update on change of slider
149 * a text description for the panel's title
153 public static int setConservationSlider(AlignmentPanel ap,
154 ResidueShaderI rs, String source)
156 SliderPanel sliderPanel = null;
158 JInternalFrame conservationSlider = Desktop
159 .getInstance().conservationSlider;
161 if (conservationSlider == null)
163 sliderPanel = new SliderPanel(ap, rs.getConservationInc(), true, rs);
164 conservationSlider = Desktop
165 .getInstance().conservationSlider = new JInternalFrame();
166 conservationSlider.setContentPane(sliderPanel);
167 conservationSlider.setLayer(JLayeredPane.PALETTE_LAYER);
171 sliderPanel = (SliderPanel) conservationSlider.getContentPane();
172 sliderPanel.valueField
173 .setText(String.valueOf(rs.getConservationInc()));
176 sliderPanel.slider.setValue(rs.getConservationInc());
179 conservationSlider.setTitle(MessageManager.formatMessage(
180 "label.conservation_colour_increment", new String[]
181 { source == null ? BACKGROUND : source }));
183 List<SequenceGroup> groups = ap.av.getAlignment().getGroups();
184 if (groups != null && !groups.isEmpty())
186 sliderPanel.setAllGroupsCheckEnabled(true);
190 sliderPanel.setAllGroupsCheckEnabled(false);
193 return sliderPanel.getValue();
197 * Hides the PID slider panel if it is shown
199 public static void hidePIDSlider()
201 JInternalFrame PIDSlider = Desktop.getInstance().PIDSlider;
203 if (PIDSlider != null)
207 PIDSlider.setClosed(true);
208 Desktop.getInstance().PIDSlider = null;
209 } catch (PropertyVetoException ex)
216 * Hides the conservation slider panel if it is shown
218 public static void hideConservationSlider()
220 JInternalFrame conservationSlider = Desktop
221 .getInstance().conservationSlider;
223 if (conservationSlider != null)
227 conservationSlider.setClosed(true);
228 Desktop.getInstance().conservationSlider = null;
229 } catch (PropertyVetoException ex)
238 public static void showConservationSlider()
242 JInternalFrame conservationSlider = Desktop
243 .getInstance().conservationSlider;
245 if (!conservationSlider.isVisible())
247 Desktop.addInternalFrame(conservationSlider,
248 conservationSlider.getTitle(), true, FRAME_WIDTH,
249 FRAME_HEIGHT, false, true);
250 conservationSlider.addInternalFrameListener(new InternalFrameAdapter()
253 public void internalFrameClosed(InternalFrameEvent e)
255 Desktop.getInstance().conservationSlider = null;
258 conservationSlider.setLayer(JLayeredPane.PALETTE_LAYER);
263 * Method to 'set focus' of the PID slider panel
266 * the panel to repaint on change of slider
268 * the colour scheme to update on change of slider
270 * a text description for the panel's title
274 public static int setPIDSliderSource(AlignmentPanel ap, ResidueShaderI rs,
277 int threshold = rs.getThreshold();
279 SliderPanel sliderPanel = null;
281 JInternalFrame PIDSlider = Desktop.getInstance().PIDSlider;
283 if (PIDSlider == null)
285 sliderPanel = new SliderPanel(ap, threshold, false, rs);
286 PIDSlider = Desktop.getInstance().PIDSlider = new JInternalFrame();
287 PIDSlider.setContentPane(sliderPanel);
288 PIDSlider.setLayer(JLayeredPane.PALETTE_LAYER);
292 sliderPanel = (SliderPanel) PIDSlider.getContentPane();
295 sliderPanel.valueField.setText(String.valueOf(rs.getThreshold()));
296 sliderPanel.slider.setValue(rs.getThreshold());
299 PIDSlider.setTitle(MessageManager.formatMessage(
300 "label.percentage_identity_threshold", new String[]
301 { source == null ? BACKGROUND : source }));
303 if (ap.av.getAlignment().getGroups() != null)
305 sliderPanel.setAllGroupsCheckEnabled(true);
309 sliderPanel.setAllGroupsCheckEnabled(false);
312 return sliderPanel.getValue();
320 public static JInternalFrame showPIDSlider()
322 hideConservationSlider();
324 JInternalFrame PIDSlider = Desktop.getInstance().PIDSlider;
326 if (!PIDSlider.isVisible())
328 Desktop.addInternalFrame(PIDSlider, PIDSlider.getTitle(), true,
329 FRAME_WIDTH, FRAME_HEIGHT, false, true);
330 PIDSlider.setLayer(JLayeredPane.PALETTE_LAYER);
331 PIDSlider.addInternalFrameListener(new InternalFrameAdapter()
334 public void internalFrameClosed(InternalFrameEvent e)
336 Desktop.getInstance().PIDSlider = null;
339 PIDSlider.setLayer(JLayeredPane.PALETTE_LAYER);
345 * Updates the colour scheme with the current (identity threshold or
346 * conservation) percentage value. Also updates all groups if 'apply to all
347 * groups' is selected.
351 public void valueChanged(int percent)
353 if (!forConservation)
355 ap.av.setThreshold(percent);
357 updateColourScheme(percent, cs, null);
359 if (allGroupsCheck.isSelected())
361 List<SequenceGroup> groups = ap.av.getAlignment().getGroups();
362 for (SequenceGroup sg : groups)
364 updateColourScheme(percent, sg.getGroupColourScheme(), sg);
368 ap.getSeqPanel().seqCanvas.repaint();
372 * Updates the colour scheme (if not null) with the current (identity
373 * threshold or conservation) percentage value
379 protected void updateColourScheme(int percent, ResidueShaderI scheme,
388 if (!scheme.conservationApplied() && sg != null)
391 * first time the colour scheme has had Conservation shading applied
392 * - compute conservation
394 Conservation c = new Conservation("Group", sg.getSequences(null),
395 sg.getStartRes(), sg.getEndRes());
397 c.verdict(false, ap.av.getConsPercGaps());
398 sg.cs.setConservation(c);
401 scheme.setConservationApplied(true);
402 scheme.setConservationInc(percent);
406 scheme.setThreshold(percent, ap.av.isIgnoreGapsConsensus());
416 public void setAllGroupsCheckEnabled(boolean b)
418 allGroupsCheck.setEnabled(b);
428 public void valueField_actionPerformed()
432 int i = Integer.parseInt(valueField.getText());
434 } catch (NumberFormatException ex)
436 valueField.setText(slider.getValue() + "");
446 public void setValue(int value)
448 slider.setValue(value);
454 * @return DOCUMENT ME!
456 public int getValue()
458 return Integer.parseInt(valueField.getText());
462 public void slider_mouseReleased(MouseEvent e)
464 if (ap.overviewPanel != null)
466 ap.overviewPanel.updateOverviewImage();
470 public static int getConservationValue()
472 return getValue(Desktop.getInstance().conservationSlider);
475 static int getValue(JInternalFrame slider)
477 return slider == null ? 0
478 : ((SliderPanel) slider.getContentPane()).getValue();
481 public static int getPIDValue()
483 return getValue(Desktop.getInstance().PIDSlider);
487 * Answers true if the SliderPanel is for Conservation, false if it is for PID
492 public boolean isForConservation()
494 return forConservation;
498 * Answers the title for the slider panel; this may include 'Background' if
499 * for the alignment, or the group id if for a group
503 public String getTitle()
506 JInternalFrame conservationSlider = Desktop
507 .getInstance().conservationSlider;
508 JInternalFrame PIDSlider = Desktop.getInstance().PIDSlider;
510 if (isForConservation())
512 if (conservationSlider != null)
514 title = conservationSlider.getTitle();
517 else if (PIDSlider != null)
519 title = PIDSlider.getTitle();