package apes.views; import java.awt.GridLayout; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSlider; import apes.controllers.PlayerController; import apes.lib.PlayerHandler; import apes.models.Config; /** * <p> * This is a panel that volume components are placed on. * </p> * <p> * The label can be configured with the option volume_label_format. The value * can be anything, but these replacements will be done: * </p> * <ul> * <li>%v - The current volume</li> * <li>%m - The minimum volume</li> * <li>%M - The maximum volume</li> * </ul> * * @author Johan Andersson (johandy@student.chalmers.se) */ public class VolumePanel extends JPanel { /** * The player controller. */ private PlayerController playerController; /** * The label that the volume percentage is shown on. */ private JLabel label; /** * The slider that changes the volume. */ private JSlider slider; /** * The label format. */ private String volumeLabelFormat; /** * Creates a new <code>VolumePanel</code>. * * @param playerController the player controller. */ public VolumePanel(PlayerController playerController) { // Set the label format. Config config = Config.getInstance(); volumeLabelFormat = config.getOption("volume_label_format"); // This can be set here since these values never change when the // program is running. volumeLabelFormat = substituteLabel("m", PlayerHandler.MIN_VALUE); volumeLabelFormat = substituteLabel("M", PlayerHandler.MAX_VALUE); this.playerController = playerController; // Add components. setLayout(new GridLayout(1, 2)); setSlider(); setLabel(); add(slider); add(label); } /** * Create and set volume slider. */ private void setSlider() { slider = new VolumeSlider(); slider.addChangeListener(playerController); slider.setName("volume"); } /** * Create and set volume label. */ private void setLabel() { label = new JLabel(); updateLabelVolume(); } /** * Update label to the slider value. */ public void updateLabelVolume() { label.setText(substituteLabel("v", getVolume())); } /** * Returns the slider volume. * * @return the slider volume. */ public int getVolume() { return slider.getValue(); } /** * Returns <code>volumeLabelFormat</code> but with <code>target</code> * substituted with <code>replacement</code>. * * @param target the target value (%x). * @param replacement the replacement. * @return <code>volumeLabelFormat</code> substituted. */ private String substituteLabel(String target, int replacement) { return substituteLabel(target, new Integer(replacement).toString()); } /** * Returns <code>volumeLabelFormat</code> but with <code>target</code> * substituted with <code>replacement</code>. * * @param target the target value (%x). * @param replacement the replacement. * @return <code>volumeLabelFormat</code> substituted. */ private String substituteLabel(String target, String replacement) { return volumeLabelFormat.replaceAll("%" + target, replacement); } }