package com.mindprod.example;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.ImageProducer;
import java.io.IOException;
import java.net.URL;

/**
 * Demonstrate use of java.swing.JButton
 * <p/>
 * composed with IntelliJ IDEA
 *
 * @author Roedy Green, Canadian Mind Products
 * @version 1.0
 */
public final class TestJButton
    {
// ------------------------------ FIELDS ------------------------------

    private static final Border buttonBevelBorder;

// -------------------------- STATIC METHODS --------------------------

    static
        {
        final Border innerBorder =
                BorderFactory.createEmptyBorder( 2, 5, 2, 5 );
        final Border outerBorder = BorderFactory.createRaisedBevelBorder();
        buttonBevelBorder =
                BorderFactory.createCompoundBorder( outerBorder, innerBorder );
        }

    /**
     * Read a png, gif or jpg from the archive resource jar file.
     *
     * @param imageResourceName fully resource name of the image in the jar. if leave off off lead / will be relative to
     *                          com.mindprod.example.
     * @param target            Component where this image will end up.
     * @return ImageIcon corresponding to the png/gif/jpg.
     */
    @SuppressWarnings( { "EmptyCatchBlock" } )
    private static ImageIcon createImageIcon( String imageResourceName,
                                              Component target )
        {
        try
            {
            URL url = TestButton.class.getResource( imageResourceName );

            if ( url == null )
                {
                System.err
                        .println( "createImageIcon cannot find resource "
                                  + imageResourceName );
                return null;
                }
            Image image = target.getToolkit()
                    .createImage( ( ImageProducer ) url.getContent() );
            // wait till item is loaded
            MediaTracker tracker;
            try
                {
                // wait until image is fully loaded.
                // MediaTracker arranges repaint via ImageObsever interface
                tracker = new MediaTracker( target );
                tracker.addImage( image, 0 );
                tracker.waitForID( 0 );
                }
            catch ( InterruptedException e )
                {
                }
            return new ImageIcon( image );
            }
        catch ( IOException e )
            {
            System.err.println( e );
            e.printStackTrace( System.err );
            return null;
            }
        }// end createImageIcon

// --------------------------- main() method ---------------------------

    // ---- PUBLIC METHODS ----

    /**
     * Debugging harness for a Frame
     *
     * @param args command line arguments are ignored.
     */
    public static void main( String args[] )
        {
        final JFrame frame = new JFrame();
        Container contentPane = frame.getContentPane();
        contentPane.setLayout( new BorderLayout() );

        // create JButton with text label.
        JButton jButton1 = new JButton( "Alert" );
        jButton1.setBorder( BorderFactory.createRaisedBevelBorder() );
        jButton1.setFocusPainted( false );
        jButton1.setToolTipText( "Alert homeland security" );

        // Leaving off colours gets you a pretty
        // gradient metal button.
        jButton1.setBackground( Color.BLACK );
        jButton1.setForeground( Color.YELLOW );
        jButton1.setFont( new Font( "Dialog", Font.BOLD, 15 ) );
        jButton1.setEnabled( true );
        jButton1.addActionListener( new ActionListener()
        {
        /**
         * Invoked when a button pressed
         */
        public void actionPerformed( ActionEvent e )
            {
            System.out.println( "Alert button pressed" );
            }
        } );

        // ---------------------------------

        JButton jButton2 = new JButton( "CMP Standard Button" );
        jButton2.setFocusPainted( false );
        jButton2.setBorder( buttonBevelBorder );
        jButton2.setFont( new Font( "Dialog", Font.BOLD, 16 ) );
        jButton2.setToolTipText(
                "This is the way I have standardised all my buttons." );
        // set up keystroke shortcut Alt-F2
        jButton2.setMnemonic( KeyEvent.VK_F2 );
        jButton2.requestFocus();
        // setMargin does not work, when you have a Border, because
        // the margin is a implemented as a species of Border.
        // Leave foreground and background alone to get gradient.

        jButton2.addActionListener( new ActionListener()
        {
        /**
         * Invoked when jButton1 pressed
         */
        public void actionPerformed( ActionEvent e )
            {
            System.out.println( "standard button pressed" );
            }
        } );
        // --------------------------------

        // Create JButton with custom icon
        JButton jButton3 = new JButton();

        // suppress borders
        jButton3.setBorderPainted( false );

        // suppress jButton1 press decoration
        jButton3.setContentAreaFilled( false );

        // suppress the ability of the jButton1 to be triggered by enter
        jButton3.setDefaultCapable( false );

        // hide focus rectangle
        jButton3.setFocusPainted( false );

        // set how wide the space must be around the text to the buttonBevelBorder. Also use ipadx/ejbd
        jButton3.setMargin( new Insets( 3, 3, 3, 3 ) );

        // ignore clicks that come too fast
        jButton3.setMultiClickThreshhold( 100/* mill's */ );

        // the gifts have transparent background
        jButton3.setOpaque( false );

        // hover help
        jButton3.setToolTipText( "Launch frog bioterror missiles" );

        // Various icon images live in the jar as resources in directory
        // com/mindprod/example/buttonimages/frog

        // What jButton1 looks like normally.
        jButton3.setIcon( createImageIcon( "buttonimages/frog/normal.png",
                jButton3 ) );

        // What jButton1 looks like normally after setSelected( true ).
        jButton3.setSelectedIcon( createImageIcon(
                "buttonimages/frog/selected.png",
                jButton3 ) );

        // what jButton1 looks like pressed.
        jButton3.setPressedIcon( createImageIcon(
                "buttonimages/frog/pressed.png",
                jButton3 ) );

        // what jButton1 looks like when mouse hovers over item.
        jButton3.setRolloverIcon( createImageIcon(
                "buttonimages/frog/rollover.png",
                jButton3 ) );

        // what jButton1 looks like when mouse hovers over item after setSelected( true ).
        jButton3.setRolloverSelectedIcon( createImageIcon(
                "buttonimages/frog/rolloverselected.png",
                jButton3 ) );

        // what jButton1 looks like when item has been grayed out.
        jButton3.setDisabledIcon( createImageIcon(
                "buttonimages/frog/disabled.png",
                jButton3 ) );

        // what jButton1 looks like when item has been grayed out after setSelected( true ).
        jButton3.setDisabledSelectedIcon( createImageIcon(
                "buttonimages/frog/disabledselected.png",
                jButton3 ) );

        jButton3.addActionListener( new ActionListener()
        {
        /**
         * Invoked when jButton1 pressed
         */
        public void actionPerformed( ActionEvent e )
            {
            System.out.println( "Frog launch button pressed" );
            }
        } );

        frame.add( jButton1, BorderLayout.NORTH );
        frame.add( jButton2, BorderLayout.CENTER );
        frame.add( jButton3, BorderLayout.SOUTH );
        frame.setSize( 300, 200 );
        frame.addWindowListener( new WindowAdapter()
        {
        /**
         * Handle request to shutdown.
         *
         * @param e event giving details of closing.
         */
        public void windowClosing( WindowEvent e )
            {
            System.exit( 0 );
            }// end WindowClosing
        }// end anonymous class
        );// end addWindowListener line
        frame.validate();
        frame.setVisible( true );
        }// end main
    }