import java.awt.*;

import java.applet.Applet;
import java.applet.AppletContext;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFileChooser;

import org.web3d.x3d.sai.*;
import org.xj3d.sai.*;

/**
 * An example class showing how to deploy the Xj3D Browser as an applet.
 *
 * @author Justin
 * @version $Revision: 1.1 $
 */
public class Xj3DAppletTutorial6 extends Applet
    implements ActionListener, Xj3DScreenCaptureListener {

    private Xj3DBrowser browser;

    public Xj3DAppletTutorial6() {
    }

    // Methods from Applet

    public void init() {
        setLayout(new BorderLayout());
        browser = (Xj3DBrowser) getBrowser();
        browser.setScreenCaptureListener(this);

        JButton b = new JButton("Capture Now");
        b.addActionListener(this);
        add(b, BorderLayout.SOUTH);

        loadScene();
    }

    // Local methods

    // Generate the browser
    private ExternalBrowser getBrowser() {
        HashMap<String, Boolean> requestedParameters = new HashMap<String, Boolean>();
        requestedParameters.put("Xj3D_ConsoleShown", Boolean.TRUE);
        requestedParameters.put("Xj3D_LocationShown", Boolean.FALSE);

        X3DComponent comp =
            BrowserFactory.createX3DComponent(requestedParameters);

        Xj3DBrowser browser = (Xj3DBrowser) comp.getBrowser();

        setBackground(Color.blue);
        add((Component) comp, BorderLayout.CENTER);
        setVisible(Boolean.TRUE);

        return browser;
    }

    // Create the scene implementation and add it to the world
    private void loadScene() {
        browser.loadURL(new String[] { getParameter("modelURL") }, null);
    }

    // Methods defined by ActionListener

    /**
     * Notification of an action event on a specific UI item
     */
    public void actionPerformed(ActionEvent evt) {
        browser.captureFrames(1);
    }

    // Methods defined by Xj3DScreenCaptureListener

    /**
     * Notification of a new screen capture.
     */
    public void screenCaptured(BufferedImage img) {
        // Show the file dialog to save the file
        JFileChooser chooser = new JFileChooser();
    
        if(chooser.showSaveDialog(this) != JFileChooser.APPROVE_OPTION) 
            return;

        File out_file = chooser.getSelectedFile();
        try {
            ImageIO.write(img, "PNG", out_file);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
