--- jsampler/trunk/src/org/jsampler/view/fantasia/ChannelsBar.java 2007/09/22 07:40:13 1356 +++ jsampler/trunk/src/org/jsampler/view/fantasia/ChannelsBar.java 2007/09/22 17:27:06 1357 @@ -24,11 +24,33 @@ import java.awt.Dimension; import java.awt.Insets; +import java.awt.Point; + +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JLabel; import javax.swing.JSlider; +import javax.swing.JToolTip; +import javax.swing.Popup; +import javax.swing.PopupFactory; + +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + +import org.jsampler.CC; + +import org.jsampler.event.SamplerAdapter; +import org.jsampler.event.SamplerEvent; + +import static org.jsampler.view.fantasia.FantasiaI18n.i18n; +import static org.jsampler.view.fantasia.FantasiaPrefs.preferences; +import static org.jsampler.view.std.StdPrefs.*; /** * @@ -36,6 +58,8 @@ */ public class ChannelsBar extends PixmapPane { private final JSlider slVolume = new JSlider(); + private Popup popup = null; + private final JToolTip tip = new JToolTip(); /** Creates a new instance of ChannelsBar */ public @@ -56,6 +80,7 @@ slVolume.setMaximumSize(d); add(slVolume); + add(Box.createGlue()); d = new Dimension(420, 29); @@ -63,6 +88,87 @@ setPreferredSize(d); setMaximumSize(d); + // Setting the tooltip size + tip.setTipText(i18n.getLabel("ChannelsBar.volume", 1000)); + tip.setMinimumSize(tip.getPreferredSize()); + tip.setPreferredSize(tip.getPreferredSize()); // workaround for preserving that size + tip.setComponent(slVolume); + /////// + + int i = preferences().getIntProperty(MAXIMUM_MASTER_VOLUME); + slVolume.setMaximum(i); + String s = MAXIMUM_MASTER_VOLUME; + preferences().addPropertyChangeListener(s, new PropertyChangeListener() { + public void + propertyChange(PropertyChangeEvent e) { + int j = preferences().getIntProperty(MAXIMUM_MASTER_VOLUME); + slVolume.setMaximum(j); + } + }); + + slVolume.addChangeListener(new ChangeListener() { + public void + stateChanged(ChangeEvent e) { setVolume(); } + }); + + CC.getSamplerModel().addSamplerListener(new SamplerAdapter() { + public void + volumeChanged(SamplerEvent e) { updateVolume(); } + }); + + updateVolume(); + + slVolume.addMouseListener(new MouseAdapter() { + public void + mousePressed(MouseEvent e) { + if(popup != null) { + popup.hide(); + popup = null; + } + + Point p = slVolume.getLocationOnScreen(); + PopupFactory pf = PopupFactory.getSharedInstance(); + popup = pf.getPopup(slVolume, tip, p.x, p.y - 22); + popup.show(); + } + + public void + mouseReleased(MouseEvent e) { + if(popup != null) { + popup.hide(); + popup = null; + } + } + }); + } + + private void + setVolume() { + int volume = slVolume.getValue(); + String s = i18n.getLabel("ChannelsBar.volume", volume); + slVolume.setToolTipText(s); + tip.setTipText(s); + tip.repaint(); + + if(slVolume.getValueIsAdjusting()) return; + + int vol = (int)(CC.getSamplerModel().getVolume() * 100); + + if(vol == slVolume.getValue()) return; + + /* + * If the model's volume is not equal to the slider + * value we assume that the change is due to user input. + * So we must update the volume at the backend too. + */ + float v = slVolume.getValue(); + v /= 100; + CC.getSamplerModel().setBackendVolume(v); + } + + private void + updateVolume() { + slVolume.setValue((int)(CC.getSamplerModel().getVolume() * 100)); } }