import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import javax.media.j3d.*;
import com.sun.j3d.utils.universe.*;
import javax.vecmath.*;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.applet.MainFrame;
import javax.swing.*;
import java.util.*;

/**
 * <p>Title: TestGraphics</p>
 * <p>Description: A tool to test what template best fits for VCards with depthbuffer not equal 32 or 16</p>
 * <p>Copyright: Copyright (c) 2002</p>
 * @author Alessandro
 * @version 1.0
 */

public class TestGraphics extends Applet
{
  private boolean isStandalone = false;
  Vector vector = new Vector();

  private Canvas3D canvas3D = null;
  //Get a parameter value
  public String getParameter(String key, String def)
  {
    return isStandalone ? System.getProperty(key, def) :
      (getParameter(key) != null ? getParameter(key) : def);
  }

  //Construct the applet
  public TestGraphics()
  { }

  //Initialize the applet
  public void init()
  {
   setLayout(new GridLayout(3,3,2,2));

   int[] bufferSizes = {32,24,16,12,10,8,0};
   Rectangle virtualBounds = new Rectangle();
   GraphicsConfigTemplate3D template = new GraphicsConfigTemplate3D();
   for (int m = 0; m < bufferSizes.length; m++)
   {
    int bufferDepth = bufferSizes[m];
    template.setDepthSize(bufferDepth);
    System.out.println("Depth Buffer size " + bufferDepth);
    GraphicsConfiguration gc = null;
    try
    {
     GraphicsDevice gdArr[] = GraphicsEnvironment.getLocalGraphicsEnvironment( ).getScreenDevices( );
     gc = gdArr[0].getBestConfiguration( template);
     System.out.println("GC " + gc);
     canvas3D = new Canvas3D(gc);
     JPanel panel = new JPanel();
       panel.setLayout(new BorderLayout());
       JLabel label;
       // create a small canvas window
       if (canvas3D != null)
       {
       SimpleUniverse u = createUniverse(canvas3D);
       vector.add(u); // just to cleanup it later
       panel.add("Center",canvas3D);
       label  = new JLabel("Buffer:" + bufferDepth);
       }
       else
       label  = new JLabel("depthBuffer " + bufferDepth + " Failed !");
       panel.add("South",label);
       add(panel);
      //GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();

     GraphicsDevice gd = gc.getDevice();

     System.out.println("GraphicsDevice IDstring: " +  gd.getIDstring());
     System.out.println("GraphicsDevice getAvailableAcceleratedMemory: " +  gd.getAvailableAcceleratedMemory()/(1024*1024) + "Mb");
     System.out.println("GraphicsDevice isDisplayChangeSupported: " +  gd.isDisplayChangeSupported());
     System.out.println("GraphicsDevice isFullScreenSupported: " +  gd.isFullScreenSupported());
     DisplayMode[] displayMode = gd.getDisplayModes();

/*
     System.out.println("DisplayMode#\tBitDepth\theight\tWidth\tRefresh Rate");
     for (int i = 0; i < displayMode.length; i++)
     {
       System.out.print("Display Mode #" + i);
      // System.out.println("" + displayMode[i]. );
       System.out.print("\t" + displayMode[i].getBitDepth());
       System.out.print("\t" + displayMode[i].getWidth());
       System.out.print("\t" + displayMode[i].getHeight());
       System.out.println("\t" + displayMode[i].getRefreshRate());
       }
    */
        //System.out.println("");
         virtualBounds =  virtualBounds.union(gc.getBounds());
         System.out.println("GraphicsConfiguration ");
         System.out.println("virtualBounds" + virtualBounds);
         BufferCapabilities buffCap =  gc.getBufferCapabilities();
         ImageCapabilities imgCaps = buffCap.getFrontBufferCapabilities();
         System.out.println("BufferCapabilities.isMultiBufferAvailable: " + buffCap.isMultiBufferAvailable());
         System.out.println("BufferCapabilities.isPageFlipping: " + buffCap.isPageFlipping());
         System.out.println("BufferCapabilities.isFullScreenRequired: " + buffCap.isFullScreenRequired());
         System.out.println("ImageCapabilities.isAccelerated: " + imgCaps.isAccelerated());
         System.out.println("ImageCapabilities.isTrueVolatile: " + imgCaps.isTrueVolatile());
         System.out.println("ColorModel " +  gc.getColorModel());
         System.out.println("");
    }
      catch (Exception ex)
      {
        System.out.println("Failed at " +bufferDepth );
        ex.printStackTrace();
        JPanel panel = new JPanel();
        JLabel label  = new JLabel("depthBuffer " + bufferDepth + " Failed !");
        panel.add("South",label);
        add(panel);
      }
     }
  }

  public BranchGroup createSceneGraph()
  {
       BranchGroup objRoot = new BranchGroup();
       TransformGroup objTrans = new TransformGroup();
       objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
       objRoot.addChild(objTrans);
       objTrans.addChild(new ColorCube(0.4));

       Transform3D yAxis = new Transform3D();
       Alpha rotationAlpha = new Alpha(-1, 4000);

       RotationInterpolator rotator =
         new RotationInterpolator(rotationAlpha, objTrans, yAxis,
                           0.0f, (float) Math.PI*2.0f);
       BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
       rotator.setSchedulingBounds(bounds);
       objRoot.addChild(rotator);
       objRoot.compile();
       return objRoot;
   }

   public SimpleUniverse createUniverse(Canvas3D canvas)
   {
       add("Center", canvas);
       BranchGroup scene = createSceneGraph();
       SimpleUniverse u = new SimpleUniverse(canvas);
       u.getViewingPlatform().setNominalViewingTransform();
       u.addBranchGraph(scene);
       return u;
    }

public void destroy()
{
  Enumeration enum = vector.elements();
  while (enum.hasMoreElements())
  {
    Object item = enum.nextElement();
    ((SimpleUniverse)(item)).removeAllLocales();
  }
}

  //Main method
  public static void main(String[] args)
  {
    TestGraphics applet = new TestGraphics();
    new MainFrame(applet,480,480);
  }
}
