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 = getConservationSlider();
68 JInternalFrame PIDSlider = getPIDSlider();
70 if (conservationSlider != null && conservationSlider.isVisible())
72 return (SliderPanel) conservationSlider.getContentPane();
74 if (PIDSlider != null && PIDSlider.isVisible())
76 return (SliderPanel) PIDSlider.getContentPane();
82 * Creates a new SliderPanel object.
93 public SliderPanel(final AlignmentPanel ap, int value,
94 boolean forConserve, ResidueShaderI scheme)
98 forConservation = forConserve;
99 undoButton.setVisible(false);
100 applyButton.setVisible(false);
104 label.setText(MessageManager.getString(
105 "label.enter_value_increase_conservation_visibility"));
106 slider.setMinimum(0);
107 slider.setMaximum(100);
111 label.setText(MessageManager.getString(
112 "label.enter_percentage_identity_above_which_colour_residues"));
113 slider.setMinimum(0);
114 slider.setMaximum(100);
117 slider.addChangeListener(new ChangeListener()
120 public void stateChanged(ChangeEvent evt)
122 valueField.setText(String.valueOf(slider.getValue()));
123 valueChanged(slider.getValue());
127 slider.addMouseListener(new MouseAdapter()
130 public void mouseReleased(MouseEvent evt)
132 ap.paintAlignment(true, true);
136 slider.setValue(value);
137 valueField.setText(String.valueOf(value));
141 * Method to 'set focus' of the Conservation slider panel
144 * the panel to repaint on change of slider
146 * the colour scheme to update on change of slider
148 * a text description for the panel's title
152 public static int setConservationSlider(AlignmentPanel ap,
153 ResidueShaderI rs, String source)
155 SliderPanel sliderPanel = null;
157 JInternalFrame conservationSlider = getConservationSlider();
159 if (conservationSlider == null)
161 sliderPanel = new SliderPanel(ap, rs.getConservationInc(), true, rs);
162 conservationSlider = Desktop
163 .getInstance().conservationSlider = new JInternalFrame();
164 conservationSlider.setContentPane(sliderPanel);
165 conservationSlider.setLayer(JLayeredPane.PALETTE_LAYER);
169 sliderPanel = (SliderPanel) conservationSlider.getContentPane();
170 sliderPanel.valueField
171 .setText(String.valueOf(rs.getConservationInc()));
174 sliderPanel.slider.setValue(rs.getConservationInc());
177 conservationSlider.setTitle(MessageManager.formatMessage(
178 "label.conservation_colour_increment", new String[]
179 { source == null ? BACKGROUND : source }));
181 List<SequenceGroup> groups = ap.av.getAlignment().getGroups();
182 if (groups != null && !groups.isEmpty())
184 sliderPanel.setAllGroupsCheckEnabled(true);
188 sliderPanel.setAllGroupsCheckEnabled(false);
191 return sliderPanel.getValue();
195 * Hides the PID slider panel if it is shown
197 public static void hidePIDSlider()
199 JInternalFrame PIDSlider = getPIDSlider();
201 if (PIDSlider != null)
205 PIDSlider.setClosed(true);
206 Desktop.getInstance().PIDSlider = null;
207 } catch (PropertyVetoException ex)
214 * Hides the conservation slider panel if it is shown
216 public static void hideConservationSlider()
218 JInternalFrame conservationSlider = getConservationSlider();
220 if (conservationSlider != null)
224 conservationSlider.setClosed(true);
225 Desktop.getInstance().conservationSlider = null;
226 } catch (PropertyVetoException ex)
235 public static void showConservationSlider()
239 JInternalFrame conservationSlider = getConservationSlider();
241 if (!conservationSlider.isVisible())
243 Desktop.addInternalFrame(conservationSlider,
244 conservationSlider.getTitle(), true, FRAME_WIDTH,
245 FRAME_HEIGHT, false, true);
246 conservationSlider.addInternalFrameListener(new InternalFrameAdapter()
249 public void internalFrameClosed(InternalFrameEvent e)
251 Desktop.getInstance().conservationSlider = null;
254 conservationSlider.setLayer(JLayeredPane.PALETTE_LAYER);
259 * Method to 'set focus' of the PID slider panel
262 * the panel to repaint on change of slider
264 * the colour scheme to update on change of slider
266 * a text description for the panel's title
270 public static int setPIDSliderSource(AlignmentPanel ap, ResidueShaderI rs,
273 int threshold = rs.getThreshold();
275 SliderPanel sliderPanel = null;
277 JInternalFrame PIDSlider = getPIDSlider();
279 if (PIDSlider == null)
281 sliderPanel = new SliderPanel(ap, threshold, false, rs);
282 PIDSlider = Desktop.getInstance().PIDSlider = new JInternalFrame();
283 PIDSlider.setContentPane(sliderPanel);
284 PIDSlider.setLayer(JLayeredPane.PALETTE_LAYER);
288 sliderPanel = (SliderPanel) PIDSlider.getContentPane();
291 sliderPanel.valueField.setText(String.valueOf(rs.getThreshold()));
292 sliderPanel.slider.setValue(rs.getThreshold());
295 PIDSlider.setTitle(MessageManager.formatMessage(
296 "label.percentage_identity_threshold", new String[]
297 { source == null ? BACKGROUND : source }));
299 if (ap.av.getAlignment().getGroups() != null)
301 sliderPanel.setAllGroupsCheckEnabled(true);
305 sliderPanel.setAllGroupsCheckEnabled(false);
308 return sliderPanel.getValue();
316 public static JInternalFrame showPIDSlider()
318 hideConservationSlider();
320 JInternalFrame PIDSlider = getPIDSlider();
322 if (!PIDSlider.isVisible())
324 Desktop.addInternalFrame(PIDSlider, PIDSlider.getTitle(), true,
325 FRAME_WIDTH, FRAME_HEIGHT, false, true);
326 PIDSlider.setLayer(JLayeredPane.PALETTE_LAYER);
327 PIDSlider.addInternalFrameListener(new InternalFrameAdapter()
330 public void internalFrameClosed(InternalFrameEvent e)
332 Desktop.getInstance().PIDSlider = null;
335 PIDSlider.setLayer(JLayeredPane.PALETTE_LAYER);
341 * Updates the colour scheme with the current (identity threshold or
342 * conservation) percentage value. Also updates all groups if 'apply to all
343 * groups' is selected.
347 public void valueChanged(int percent)
349 if (!forConservation)
351 ap.av.setThreshold(percent);
353 updateColourScheme(percent, cs, null);
355 if (allGroupsCheck.isSelected())
357 List<SequenceGroup> groups = ap.av.getAlignment().getGroups();
358 for (SequenceGroup sg : groups)
360 updateColourScheme(percent, sg.getGroupColourScheme(), sg);
364 ap.getSeqPanel().seqCanvas.repaint();
368 * Updates the colour scheme (if not null) with the current (identity
369 * threshold or conservation) percentage value
375 protected void updateColourScheme(int percent, ResidueShaderI scheme,
384 if (!scheme.conservationApplied() && sg != null)
387 * first time the colour scheme has had Conservation shading applied
388 * - compute conservation
390 Conservation c = new Conservation("Group", sg.getSequences(null),
391 sg.getStartRes(), sg.getEndRes());
393 c.verdict(false, ap.av.getConsPercGaps());
394 sg.cs.setConservation(c);
397 scheme.setConservationApplied(true);
398 scheme.setConservationInc(percent);
402 scheme.setThreshold(percent, ap.av.isIgnoreGapsConsensus());
412 public void setAllGroupsCheckEnabled(boolean b)
414 allGroupsCheck.setEnabled(b);
424 public void valueField_actionPerformed()
428 int i = Integer.parseInt(valueField.getText());
430 } catch (NumberFormatException ex)
432 valueField.setText(slider.getValue() + "");
442 public void setValue(int value)
444 slider.setValue(value);
450 * @return DOCUMENT ME!
452 public int getValue()
454 return Integer.parseInt(valueField.getText());
458 public void slider_mouseReleased(MouseEvent e)
460 if (ap.overviewPanel != null)
462 ap.overviewPanel.updateOverviewImage();
467 * Answers true if the SliderPanel is for Conservation, false if it is for PID
472 public boolean isForConservation()
474 return forConservation;
478 * Answers the title for the slider panel; this may include 'Background' if
479 * for the alignment, or the group id if for a group
483 public String getTitle()
486 JInternalFrame conservationSlider = getConservationSlider();
487 JInternalFrame PIDSlider = getPIDSlider();
489 if (isForConservation())
491 if (conservationSlider != null)
493 title = conservationSlider.getTitle();
496 else if (PIDSlider != null)
498 title = PIDSlider.getTitle();
504 * Returns the singleton instance of the Conservation slider within current
505 * application scope, or null if there is none
509 private static JInternalFrame getConservationSlider()
511 return Desktop.getInstance().conservationSlider;
515 * Returns the singleton instance of the PID slider within current application
516 * scope, or null if there is none
520 private static JInternalFrame getPIDSlider()
522 return Desktop.getInstance().PIDSlider;
526 * Returns the current value of the Conservation slider, or zero if there is
532 public static int getConservationValue()
534 return getValue(getConservationSlider());
538 * Returns the current value of the PID slider, or zero if there is no such
544 public static int getPIDValue()
546 return getValue(getPIDSlider());
550 * Returns the current value of the given slider, or zero if {@code slider} is
556 static int getValue(JInternalFrame slider)
558 return slider == null ? 0
559 : ((SliderPanel) slider.getContentPane()).getValue();