import java.awt.*;
import java.awt.event.*;
import java.io.*;

public class application extends Frame implements ActionListener, AdjustmentListener, ItemListener, Runnable
{
public String     filename;
public MenuItem   openfile;
public MenuItem   save;
public MenuItem   saveas;
public MenuItem   quit;
public FileWindow filewindow;
public canvas     CANVAS;
public Thread     painter;
    
public Panel      panel;
public Button     left;
public Button     right;
public Button     up;
public Button     down;

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

public application(String file)
    {
	super("Perestroika 3D");
        filename = file;
    }
    
public void setup_application()
    {
        filewindow = new FileWindow("Open File", 300, 90, this); 
        
        MenuBar bar = new MenuBar();
        Menu menu   = new Menu("FILE");
        openfile    = new MenuItem("Open File");
        openfile.addActionListener(this);
        menu.add(openfile);
        save = new MenuItem("Save");
        save.setEnabled(false);
        save.addActionListener(this);
        menu.add(save);
        saveas = new MenuItem("Save As");
        saveas.addActionListener(this);
        menu.add(saveas);
        quit = new MenuItem("Quit");
        quit.addActionListener(this);
        menu.add(quit);
        bar.add(menu);
        setMenuBar(bar);
	
        if(filename != null)
	    {
		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 FileInputStream(file)));
	    }
	catch(FileNotFoundException e)
	    {
		System.err.println("could not read file " + file);
	    }
        if(is != null)
	    {
		filename = file;
		setTitle("Perestroika 3D "+filename);
		Parser.parse(is);
	    }
        System.gc();
    }
    
public void write(String fname)
    {}
    
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() == openfile)
	    {
		filewindow.setTitle("Open File");
		filewindow.setVisible(true);
	    }
	else 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);
        else if(event.getSource() == quit)
	    System.exit(0);
    }
    
public void adjustmentValueChanged(AdjustmentEvent event)
    {}
    
public void itemStateChanged(ItemEvent event)
    {}
}


