import java.awt.*;
import java.io.*;
import java.awt.event.*;
import java.applet.*;
import java.net.URL;

public class program extends Applet implements ActionListener, AdjustmentListener, ItemListener, Runnable
{
public static String filename = null;
public canvas CANVAS;
public Thread painter;
    
public Panel      panel;
public Button     left;
public Button     right;
public Button     up;
public Button     down;
     
public static void main(String[] args)
    {
	// ------- init static members --------
	Parser.init_static();      // initialize Parsers static variables
	bodypart.init_static(100); // 100 polygons max
	bodypartDB.init_static(20);// max 20 bodypart definitions
	modelDB.init_static(10);   // max 10 model definitions
	poly.init_static(1000);    // max 1000 of vertices
	polyDEF.init_static();     // initialize polyDEFs static variables
	polygonDB.init_static(80); // max 80 polygon definitions
	vector.init_static();      // initialize vectors static variables
	matrix.init_static();      // initialize matrix static variables
	canvas.init_static();      // initialize canvas static variables
	animatorDB.init_static(20);// max 20 animation definitions
	// ------------------------------------
	
        if(args.length == 0)
	    {
		printUsage();
		return;
	    }
        for(int i=0; i<args.length; i++)
	    {
		if(args[i].equalsIgnoreCase("-f"))
		    {
			if(i+1 < args.length)
			    { 
				filename = args[i+1];
				i++;
			    }
			else
			    {
				printUsage();
				return;
			    }
		    }
		else
		    {
			printUsage();
			return;
		    }
	    }
	
        application app = new application(filename);
        app.setSize(700, 600);
	app.setup_application();
        app.show();
	app.run();
    }
    
private static void printUsage()
    {
        System.out.println("Usage: java program [-f file]");
    }
    
public void init()
    {
	// ------- init static members --------
	Parser.init_static();      // initialize Parsers static variables
	bodypart.init_static(200); // 200 polygons max
	bodypartDB.init_static(20);// max 20 bodypart definitions
	modelDB.init_static(10);   // max 10 model definitions
	poly.init_static(1000);    // max 1000 of vertices
	polyDEF.init_static();     // initialize polyDEFs static variables
	polygonDB.init_static(80); // max 80 polygon definitions
	vector.init_static();      // initialize vectors static variables
	matrix.init_static();      // initialize matrix static variables
	canvas.init_static();      // initialize canvas static variables
	animatorDB.init_static(20);// max 20 animation definitions
	// ------------------------------------

        filename = getParameter("FILENAME");
        System.out.print("loading model definition file "+filename);
        read(filename);
        System.out.println(" ...done");

        setLayout(new BorderLayout());
	panel = new Panel(new GridLayout(3, 3));
	
        panel.add(new Label(""));

        up = new Button(" up ");
//	up.setBackground(Color.black);
//	up.setForeground(Color.green);	
        up.addActionListener(this);
        panel.add(up);

        panel.add(new Label(""));

        left = new Button(" << ");
//	left.setBackground(Color.black);
//	left.setForeground(Color.green);	
        left.addActionListener(this);
        panel.add(left);

        panel.add(new Label(""));

        right = new Button(" >> ");
//	right.setBackground(Color.black);
//	right.setForeground(Color.green);	
        right.addActionListener(this);
        panel.add(right);

        panel.add(new Label(""));

        down = new Button("down");
//	down.setBackground(Color.black);
//	down.setForeground(Color.green);	
        down.addActionListener(this);
        panel.add(down);

        panel.add(new Label(""));
	
	Dimension DIM = this.getSize();
	CANVAS = new canvas(DIM.width, DIM.height-120);
//	CANVAS = new canvas(640, 480);
	add("Center", CANVAS);
	add("South", panel);
	double radius = 5;
	vector la = new vector();
	vector lf = new vector(la.xyz[0], la.xyz[1], la.xyz[2] + 4*radius);
	CANVAS.set(lf, la, radius, 5, 10, lf.xyz[2] - (la.xyz[2] + radius));
	modelDB.makemodels();

        painter = new Thread(this);
        painter.start();
	CANVAS.precompute();
    }

public void read(String file)
    {        
        BufferedReader is = null;
        try
	    {
		is = new BufferedReader(new InputStreamReader(new URL(getDocumentBase(),file).openStream()));
	    }
	catch(Exception e)
	    {
		System.err.println("could not read file " + file);
	    }
        if(is != null)
	    {
		filename = file;
		Parser.parse(is);
	    }
        System.gc();
    }
    
public double ttod(TextField textField)
    {
        double f;
        try
	    {
		f = Double.valueOf(textField.getText()).doubleValue();
	    }
	catch(java.lang.NumberFormatException e)
	    {
		f = 1.0;
	    }
        return f;
    } 
    
public void actionPerformed(ActionEvent event)
    {
	if(event.getSource() == left)
	    CANVAS.move_lf(-1, 0);
	else if(event.getSource() == right)
	    CANVAS.move_lf( 1, 0);
	else if(event.getSource() == up)
	    CANVAS.move_lf( 0, 1);
	else if(event.getSource() == down)
	    CANVAS.move_lf( 0,-1);
    }

public void adjustmentValueChanged(AdjustmentEvent event)
    {}
    
public void itemStateChanged(ItemEvent event)
    {}

public void run()
    {
        while(true)
	    {
		CANVAS.repaint();
		try
		    {
			Thread.sleep(100);
		    }
		catch (InterruptedException e)
		    {}
	    }
    }
}


