import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.applet.AudioClip;
import java.net.URL;

/**
 * A demo program that can play a few sounds from resource files and
 * can show several different cursors, including a custom cursor that
 * is created from an image resource.  A main() routine allows this class
 * to be run as a stand-alone application. 
 * (The sound files used by this demo were taken from the KDE desktop.)
 * @author David J. Eck
 */
public class SoundAndCursorDemo extends JPanel {
    
    /**
     * The main routine simply opens a window that shows a SoundAndCursorDemo panel.
     */
    public static void main(String[] args) {
        JFrame window = new JFrame("SoundAndCursorDemo");
        SoundAndCursorDemo content = new SoundAndCursorDemo();
        window.setContentPane(content);
        window.pack();  
        window.setResizable(false); 
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        window.setLocation( (screenSize.width - window.getWidth())/2,
                (screenSize.height - window.getHeight())/2 );
        window.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        window.setVisible(true);
    }
    
    
    public SoundAndCursorDemo() {
        setLayout(new GridLayout(4,2,3,3));
        setBackground(Color.GRAY);
        setBorder(BorderFactory.createLineBorder(Color.GRAY,3));
        JButton button;
        ButtonHandler listener = new ButtonHandler();
        button = new JButton("Play Sound #1");
        button.addActionListener(listener);
        add(button);
        button = new JButton("Use Crosshair Cursor");
        button.addActionListener(listener);
        add(button);
        button = new JButton("Play Sound #2");
        button.addActionListener(listener);
        add(button);
        button = new JButton("Use Wait Cursor");
        button.addActionListener(listener);
        add(button);
        button = new JButton("Play Sound #3");
        button.addActionListener(listener);
        add(button);
        button = new JButton("Use Move Cursor");
        button.addActionListener(listener);
        add(button);
        button = new JButton("Play Sound #4");
        button.addActionListener(listener);
        add(button);
        button = new JButton("Use Custom Cursor");
        button.addActionListener(listener);
        add(button);
    }
    
    
    private class ButtonHandler implements ActionListener {
        public void actionPerformed(ActionEvent evt) {
            String command = evt.getActionCommand();
            if (command.equals("Play Sound #1"))
                playAudioResource("snc_resources/KDE_Beep.wav");
            else if (command.equals("Play Sound #2"))
                playAudioResource("snc_resources/KDE_Beep_Lightning.wav");
            else if (command.equals("Play Sound #3"))
                playAudioResource("snc_resources/KDE_Window_Iconify.wav");
            else if (command.equals("Play Sound #4"))
                playAudioResource("snc_resources/KDE_Window_Sticky.wav");
            else if (command.equals("Use Wait Cursor"))
                setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
            else if (command.equals("Use Move Cursor"))
                setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
            else if (command.equals("Use Crosshair Cursor"))
                setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
            else if (command.equals("Use Custom Cursor"))
                useCustomCursor("snc_resources/TinySmiley.png");
            if (command.startsWith("Play"))
                setCursor(Cursor.getDefaultCursor());
        }
    }
    
    
    /**
     * Plays the sound from an audio resource file.  If the resource can't
     * be found, nothing is done.  (If the sound is to replayed several
     * times, it would be more efficient to save the AudioClip in an
     * instance variable instead of loading it each time it is played.)
     */
    private void playAudioResource(String audioResourceName) {
        ClassLoader cl = getClass().getClassLoader();
        URL resourceURL = cl.getResource(audioResourceName);
        if (resourceURL != null) {
            AudioClip sound = JApplet.newAudioClip(resourceURL);
            sound.play();
        }
    }


    /**
     * Sets the current cursor for this component to be a custom
     * cursor defined by an image resource.  If the image resource
     * can't be found, then the component's cursor is not changed.
     * (For this demo, the hotspot of the cursor is always set to
     * be the point (7,7).)
     */
    private void useCustomCursor(String imageResourceName) {
        ClassLoader cl = getClass().getClassLoader();
        URL resourceURL = cl.getResource(imageResourceName);
        if (resourceURL != null) {
            Toolkit toolkit = Toolkit.getDefaultToolkit();
            Image image = toolkit.createImage(resourceURL);
            Point hotSpot = new Point(7,7);
            Cursor cursor = toolkit.createCustomCursor(image, hotSpot, "smiley");
            setCursor(cursor);
        }
    }

}
