import java.awt.*;
import java.io.*;

import java.applet.Applet;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;

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
 */
public class Xj3DAppletTutorial7 extends Applet
    implements ActionListener {

    private ExternalBrowser browser;

    public Xj3DAppletTutorial7() {
    }

    // Methods from Applet

    public void init() {
        setLayout(new BorderLayout());
        browser = getBrowser();

        JButton b = new JButton("Get View Position");
        b.addActionListener(this);
        add(b, BorderLayout.SOUTH);

        loadScene();
    }

    public void actionPerformed(ActionEvent evt) {
        // Get the values and write them to a file
        X3DScene scene = (X3DScene)browser.getExecutionContext();
        X3DNode sensor = scene.getNamedNode("PROXIMITY_SENSOR");
        SFVec3f position = (SFVec3f)sensor.getField("position_changed");
        SFRotation orientation = (SFRotation)sensor.getField("orientation_changed");

        float[] pos_value = new float[3];
        float[] orient_value = new float[4];

        position.getValue(pos_value);
        orientation.getValue(orient_value);

        JFileChooser chooser = new JFileChooser();

        if(chooser.showSaveDialog(this) != JFileChooser.APPROVE_OPTION)
            return;

        File out_file = chooser.getSelectedFile();
        try {
            FileWriter fos = new FileWriter(out_file);
            PrintWriter pw = new PrintWriter(fos);
            pw.print("pos: ");
            pw.print(pos_value[0]);
            pw.print(" ");
            pw.print(pos_value[1]);
            pw.print(" ");
            pw.print(pos_value[2]);
            pw.println();

            pw.print("orient: ");
            pw.print(orient_value[0]);
            pw.print(" ");
            pw.print(orient_value[1]);
            pw.print(" ");
            pw.print(orient_value[2]);
            pw.print(" ");
            pw.print(orient_value[3]);
            pw.println();

            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 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() {
        X3DScene mainScene = browser.createX3DFromURL(new String[] {getParameter("modelURL")});
        browser.replaceWorld(mainScene);
    }
}

