package org.limewire.ui.swing.components; import java.awt.BorderLayout; import java.awt.Color; import javax.swing.BorderFactory; import javax.swing.InputMap; import javax.swing.JPopupMenu; import javax.swing.JSlider; import javax.swing.KeyStroke; import org.jdesktop.application.Resource; import org.limewire.ui.swing.util.GuiUtils; /** * A volume control based on JSlider. VolumeSlider installs a custom UI * delegate to render a slider with a stylized appearance. The default * orientation is vertical. */ public class VolumeSlider extends JSlider { @Resource private Color background; @Resource private Color borderForeground; /** * Constructs a VolumeSlider with default minimum and maximum values of 0 * and 100. */ public VolumeSlider() { this(0, 100); } /** * Constructs a VolumeSlider with the specified minimum and maximum values. */ public VolumeSlider(int min, int max) { super(min, max); GuiUtils.assignResources(this); initSlider(); } /** * Initializes the slider by setting default properties. */ private void initSlider() { setBackground(background); setOrientation(VERTICAL); InputMap inputMap = getInputMap(); inputMap.put(KeyStroke.getKeyStroke("HOME"), "maxScroll"); inputMap.put(KeyStroke.getKeyStroke("END"), "minScroll"); } /** * Overrides superclass method to install a custom UI delegate. */ @Override public void updateUI() { setUI(new VolumeSliderUI(this)); // Update UI for slider labels. This must be called after updating the // UI of the slider. Refer to JSlider.updateUI(). updateLabelUIs(); } /** * Creates a new popup window containing this slider. */ public JPopupMenu createPopup() { // Create popup. JPopupMenu popup = new JPopupMenu() { @Override public void requestFocus() { VolumeSlider.this.requestFocus(); } }; // Set attributes and add slider. popup.setBorder(BorderFactory.createLineBorder(borderForeground)); popup.setLayout(new BorderLayout()); popup.add(this, BorderLayout.CENTER); return popup; } }