import java.applet.Applet;
import java.awt.BorderLayout;
import java.util.*;
import java.awt.*;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.Sphere;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import java.lang.String;

public class Text3DTest extends Applet
{
    java.awt.Button button = new java.awt.Button();
    Text3D txt;

    public BranchGroup createSceneGraph(SimpleUniverse u) {
        Shape3D sph;
        Font3D myFont3D;
        Font buttonFont;
	Color3f bgColor   = new Color3f(0.05f, 0.05f, 0.2f);

	Transform3D t;

	BranchGroup objRoot = new BranchGroup();

        TransformGroup objScale = new TransformGroup();
        Transform3D t3d = new Transform3D();
        t3d.setScale(0.2);
        objScale.setTransform(t3d);
        objRoot.addChild(objScale);

	BoundingSphere bounds =
	    new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);

	Background bg = new Background(bgColor);
	bg.setApplicationBounds(bounds);
	objScale.addChild(bg);

        buttonFont = new Font("Dialog", Font.PLAIN, 1);
        myFont3D = new Font3D(buttonFont,new FontExtrusion());
        txt = new Text3D(myFont3D, "set");
        txt.setCapability(Text3D.ALLOW_STRING_WRITE);
        txt.setCapability(Text3D.ALLOW_STRING_READ);
	txt.setCapability(Text3D.ALLOW_STRING_READ);
	txt.setCapability(Text3D.ALLOW_STRING_WRITE);
        txt.setCapability(Text3D.ALLOW_CHARACTER_SPACING_WRITE);
        txt.setCapability(Text3D.ALLOW_CHARACTER_SPACING_WRITE);
        txt.setCapability(Text3D.PATH_RIGHT);
        txt.setCapability(Text3D.ALLOW_BOUNDING_BOX_READ);

        sph = new Shape3D(txt, new Appearance());
	objScale.addChild(sph);


        objRoot.compile();

	return objRoot;
    }

    public Text3DTest()
    {
        button.setLabel("setString");
        add(button);
        button.setBackground(java.awt.Color.lightGray);
        button.setBounds(10,12,60,40);

	setLayout(new BorderLayout());
        setSize(320,200);
	Canvas3D c = new Canvas3D(null);
	add(c);

	SimpleUniverse u = new SimpleUniverse(c);
	BranchGroup scene = createSceneGraph(u);

        u.getViewingPlatform().setNominalViewingTransform();


        SymKey aSymKey = new SymKey();
        button.addKeyListener(aSymKey);
        SymMouse aSymMouse = new SymMouse();
        button.addMouseListener(aSymMouse);
        u.addBranchGraph(scene);
    }

    public static void main(String[] args)
    {
        new MainFrame(new Text3DTest(), 320, 200);
    }

        class SymMouse extends java.awt.event.MouseAdapter
	{
                public void mouseClicked(java.awt.event.MouseEvent event)
		{
                        Object object = event.getSource();
			if (object == button)
				button_MouseClicked(event);
		}
	}

        class SymKey extends java.awt.event.KeyAdapter
	{
		public void keyPressed(java.awt.event.KeyEvent event)
		{
			Object object = event.getSource();
			if (object == button)
				button_KeyPressed(event);

		}
	}

	void button_KeyPressed(java.awt.event.KeyEvent event)
	{
                txt.setString(new String("setString"));      
	}
 
	void button_MouseClicked(java.awt.event.MouseEvent event)
	{
                txt.setString(new String("setString"));
        }
}
