/* * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) * Copyright (C) $$Year-Rel$$ The Jalview Authors * * This file is part of Jalview. * * Jalview is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation, either version 3 * of the License, or (at your option) any later version. * * Jalview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Jalview. If not, see . * The Jalview Authors are detailed in the 'AUTHORS' file. */ package jalview.appletgui; import jalview.analysis.Conservation; import jalview.datamodel.SequenceGroup; import jalview.renderer.ResidueShaderI; import jalview.util.MessageManager; import java.awt.BorderLayout; import java.awt.Button; import java.awt.Checkbox; import java.awt.Color; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.Label; import java.awt.Panel; import java.awt.Scrollbar; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.AdjustmentEvent; import java.awt.event.AdjustmentListener; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.List; public class SliderPanel extends Panel implements ActionListener, AdjustmentListener, MouseListener { private static final String BACKGROUND = "Background"; AlignmentPanel ap; boolean forConservation = true; ResidueShaderI cs; static Frame conservationSlider; static Frame PIDSlider; public static int setConservationSlider(AlignmentPanel ap, ResidueShaderI ccs, String source) { SliderPanel sp = null; if (conservationSlider == null) { sp = new SliderPanel(ap, ccs.getConservationInc(), true, ccs); conservationSlider = new Frame(); conservationSlider.add(sp); } else { sp = (SliderPanel) conservationSlider.getComponent(0); sp.cs = ccs; sp.valueField.setText(String.valueOf(ccs.getConservationInc())); } conservationSlider.setTitle(MessageManager.formatMessage( "label.conservation_colour_increment", new String[] { source == null ? BACKGROUND : source })); List groups = ap.av.getAlignment().getGroups(); if (groups != null && !groups.isEmpty()) { sp.setAllGroupsCheckEnabled(true); } else { sp.setAllGroupsCheckEnabled(false); } return sp.getValue(); } public static void showConservationSlider() { try { PIDSlider.setVisible(false); PIDSlider = null; } catch (Exception ex) { } if (!conservationSlider.isVisible()) { jalview.bin.JalviewLite.addFrame(conservationSlider, conservationSlider.getTitle(), 420, 100); conservationSlider.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { conservationSlider = null; } }); } } public static int setPIDSliderSource(AlignmentPanel ap, ResidueShaderI ccs, String source) { SliderPanel pid = null; if (PIDSlider == null) { pid = new SliderPanel(ap, ccs.getThreshold(), false, ccs); PIDSlider = new Frame(); PIDSlider.add(pid); } else { pid = (SliderPanel) PIDSlider.getComponent(0); pid.cs = ccs; pid.valueField.setText(String.valueOf(ccs.getThreshold())); } PIDSlider.setTitle(MessageManager.formatMessage( "label.percentage_identity_threshold", new String[] { source == null ? BACKGROUND : source })); if (ap.av.getAlignment().getGroups() != null) { pid.setAllGroupsCheckEnabled(true); } else { pid.setAllGroupsCheckEnabled(false); } return pid.getValue(); } public static void showPIDSlider() { try { conservationSlider.setVisible(false); conservationSlider = null; } catch (Exception ex) { } if (!PIDSlider.isVisible()) { jalview.bin.JalviewLite.addFrame(PIDSlider, PIDSlider.getTitle(), 420, 100); PIDSlider.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { PIDSlider = null; } }); } } /** * Hides the PID slider panel if it is shown */ public static void hidePIDSlider() { if (PIDSlider != null) { PIDSlider.setVisible(false); PIDSlider = null; } } /** * Hides the Conservation slider panel if it is shown */ public static void hideConservationSlider() { if (conservationSlider != null) { conservationSlider.setVisible(false); conservationSlider = null; } } public SliderPanel(AlignmentPanel ap, int value, boolean forConserve, ResidueShaderI shader) { try { jbInit(); } catch (Exception e) { e.printStackTrace(); } this.ap = ap; this.cs = shader; forConservation = forConserve; undoButton.setVisible(false); applyButton.setVisible(false); if (forConservation) { label.setText(MessageManager .getString("label.modify_conservation_visibility")); slider.setMinimum(0); slider.setMaximum(50 + slider.getVisibleAmount()); slider.setUnitIncrement(1); } else { label.setText(MessageManager .getString("label.colour_residues_above_occurrence")); slider.setMinimum(0); slider.setMaximum(100 + slider.getVisibleAmount()); slider.setBlockIncrement(1); } slider.addAdjustmentListener(this); slider.addMouseListener(this); slider.setValue(value); valueField.setText(value + ""); } public void valueChanged(int i) { if (cs == null) { return; } if (forConservation) { cs.setConservationApplied(true); cs.setConservationInc(i); } else { cs.setThreshold(i, ap.av.isIgnoreGapsConsensus()); } if (allGroupsCheck.getState()) { for (SequenceGroup group : ap.av.getAlignment().getGroups()) { ResidueShaderI groupColourScheme = group.getGroupColourScheme(); if (forConservation) { if (!groupColourScheme.conservationApplied()) { /* * first time the colour scheme has had Conservation shading applied * - compute conservation */ Conservation c = new Conservation("Group", group.getSequences(null), group.getStartRes(), group.getEndRes()); c.calculate(); c.verdict(false, ap.av.getConsPercGaps()); group.cs.setConservation(c); } groupColourScheme.setConservationApplied(true); groupColourScheme.setConservationInc(i); } else { groupColourScheme.setThreshold(i, ap.av.isIgnoreGapsConsensus()); } } } ap.seqPanel.seqCanvas.repaint(); } public void setAllGroupsCheckEnabled(boolean b) { allGroupsCheck.setState(ap.av.getColourAppliesToAllGroups()); allGroupsCheck.setEnabled(b); } @Override public void actionPerformed(ActionEvent evt) { if (evt.getSource() == applyButton) { applyButton_actionPerformed(); } else if (evt.getSource() == undoButton) { undoButton_actionPerformed(); } else if (evt.getSource() == valueField) { valueField_actionPerformed(); } } @Override public void adjustmentValueChanged(AdjustmentEvent evt) { valueField.setText(slider.getValue() + ""); valueChanged(slider.getValue()); } public void valueField_actionPerformed() { try { int i = Integer.valueOf(valueField.getText()); slider.setValue(i); } catch (NumberFormatException ex) { valueField.setText(String.valueOf(slider.getValue())); } } public void setValue(int value) { slider.setValue(value); } public int getValue() { return Integer.parseInt(valueField.getText()); } // this is used for conservation colours, PID colours and redundancy threshold protected Scrollbar slider = new Scrollbar(); protected TextField valueField = new TextField(); protected Label label = new Label(); Panel jPanel1 = new Panel(); Panel jPanel2 = new Panel(); protected Button applyButton = new Button(); protected Button undoButton = new Button(); FlowLayout flowLayout1 = new FlowLayout(); protected Checkbox allGroupsCheck = new Checkbox(); BorderLayout borderLayout1 = new BorderLayout(); BorderLayout borderLayout2 = new BorderLayout(); FlowLayout flowLayout2 = new FlowLayout(); private void jbInit() throws Exception { this.setLayout(borderLayout2); // slider.setMajorTickSpacing(10); // slider.setMinorTickSpacing(1); // slider.setPaintTicks(true); slider.setBackground(Color.white); slider.setFont(new java.awt.Font("Verdana", 0, 11)); slider.setOrientation(0); valueField.setFont(new java.awt.Font("Verdana", 0, 11)); valueField.setText(" "); valueField.addActionListener(this); valueField.setColumns(3); valueField.addFocusListener(new FocusAdapter() { @Override public void focusLost(FocusEvent e) { valueField_actionPerformed(); valueChanged(slider.getValue()); } }); label.setFont(new java.awt.Font("Verdana", 0, 11)); label.setText(MessageManager.getString("label.set_this_label_text")); jPanel1.setLayout(borderLayout1); jPanel2.setLayout(flowLayout1); applyButton.setFont(new java.awt.Font("Verdana", 0, 11)); applyButton.setLabel(MessageManager.getString("action.apply")); applyButton.addActionListener(this); undoButton.setEnabled(false); undoButton.setFont(new java.awt.Font("Verdana", 0, 11)); undoButton.setLabel(MessageManager.getString("action.undo")); undoButton.addActionListener(this); allGroupsCheck.setEnabled(false); allGroupsCheck.setFont(new java.awt.Font("Verdana", 0, 11)); allGroupsCheck.setLabel( MessageManager.getString("action.apply_threshold_all_groups")); allGroupsCheck .setName(MessageManager.getString("action.apply_all_groups")); this.setBackground(Color.white); this.setForeground(Color.black); jPanel2.add(label, null); jPanel2.add(applyButton, null); jPanel2.add(undoButton, null); jPanel2.add(allGroupsCheck); jPanel1.add(valueField, java.awt.BorderLayout.EAST); jPanel1.add(slider, java.awt.BorderLayout.CENTER); this.add(jPanel1, java.awt.BorderLayout.SOUTH); this.add(jPanel2, java.awt.BorderLayout.CENTER); } protected void applyButton_actionPerformed() { } protected void undoButton_actionPerformed() { } @Override public void mousePressed(MouseEvent evt) { } @Override public void mouseReleased(MouseEvent evt) { ap.paintAlignment(true, true); } @Override public void mouseClicked(MouseEvent evt) { } @Override public void mouseEntered(MouseEvent evt) { } @Override public void mouseExited(MouseEvent evt) { } }