/*
 * [HybridJ.java]
 *
 * Summary: Converts a JApplet into an Application.
 *
 * Copyright: (c) 2005-2017 Roedy Green, Canadian Mind Products, http://mindprod.com
 *
 * Licence: This software may be copied and used freely for any purpose but military.
 *          http://mindprod.com/contact/nonmil.html
 *
 * Requires: JDK 1.7+
 *
 * Created with: JetBrains IntelliJ IDEA IDE http://www.jetbrains.com/idea/
 *
 * Version History:
 *  1.0 2006-03-07 initial version.
 */
package com.mindprod.common17;

import javax.swing.JApplet;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/**
 * Converts a JApplet into an Application.
 *
 * @author Roedy Green, Canadian Mind Products
 * @version 1.0 2006-03-07
 * @since 2006-03-07
 */
public final class HybridJ
    {
    /**
     * return code to use when Applet run as an Application
     */
    private static int retCode = 0;

    /**
     * Fire up the JApplet as an application
     *
     * @param title             title for frame usually TITLE_STRING+ " " + VERSION_STRING
     * @param applicationWidth  width of frame, usually APPLET_WIDTH
     * @param applicationHeight height of frame body,  usually APPLET_HEIGHT
     */
    public static void fireup( final JApplet applet,
                               final String title,
                               final int applicationWidth,
                               final int applicationHeight )
        {
        // fire up JApplet on the Swing Thread
        SwingUtilities.invokeLater( new Runnable()
            {
            /**
             * do all swing work on the swing thread.
             */
            public void run()
                {
                JFrame.setDefaultLookAndFeelDecorated( true );
                final JFrame frame = new JFrame( title );
                frame.setResizable( true );
                frame.setUndecorated( false );
                frame.setDefaultCloseOperation( JFrame.DO_NOTHING_ON_CLOSE );
                // allow some extra room for the frame title bar.
                frame.setSize( applicationWidth + 22, applicationHeight + 32 );
                frame.addWindowListener( new WindowAdapter()
                    {
                    /**
                     * Handle request to shutdown.
                     * @param e event giving details of closing.
                     */
                    public void windowClosing( WindowEvent e )
                        {
                        applet.stop();
                        applet.destroy();
                        System.exit( retCode );
                        } // end WindowClosing
                    } // end anonymous class
                );// end addWindowListener line
                frame.getContentPane().add( applet );
                applet.init();
                // yes frame, not contentpane.
                frame.validate();
                frame.setVisible( true );
                applet.start();
                } // end run
            } // end runnable
        );
        }

    /**
     * set return code to use when Applet run as an Application
     *
     * @param retCode code for System.exit
     */
    public static void setRetCode( final int retCode )
        {
        HybridJ.retCode = retCode;
        }
    }