
//Title:        Computer Graphics
//Version:      
//Copyright:    Copyright (c) 1998
//Author:       Ashish
//Company:      IITD
//Description:  

package Graphics;

import java.awt.*;
import java.awt.event.*;
import borland.jbcl.layout.*;

public class toolbox extends Dialog
{
  Panel panel1 = new Panel();
  XYLayout xYLayout1 = new XYLayout();
  Button btnLeft = new Button();
  Button btnRight = new Button();
  Button btnUp = new Button();
  Button btnDown = new Button();
  TextField cdx = new TextField();
  TextField cdy = new TextField();
  TextField cdz = new TextField();
  TextField clx = new TextField();
  TextField cly = new TextField();
  TextField clz = new TextField();
  Button btnDraw = new Button();

  public canvas screen;
  Button btnL = new Button();
  Button btnU = new Button();
  Button btnD = new Button();
  Button btnR = new Button();
  Button btnAnimate = new Button();
  TextField aspeed = new TextField();
  Thread anim,action;


  boolean aflag=false; // for camera rotation
  boolean action_flag=false;


  Button btnAxis = new Button();
  Button btnFile = new Button();
  Button btnLights = new Button();
  Label label1 = new Label();

    Lights dlg_lights=new Lights(new Frame(),"Light Configuration");
  Label label2 = new Label();
  Label label3 = new Label();
  Button btnWireFrame = new Button();
  Scrollbar scrScale = new Scrollbar();
  Label label4 = new Label();
  Button btnAction = new Button();


  public toolbox(Frame frame, String title, boolean modal)
  {
    super(frame, title, modal);
    enableEvents(AWTEvent.WINDOW_EVENT_MASK);
    try
    {
      jbInit();
      add(panel1);
      pack();
    }
    catch (Exception ex)
    {
      ex.printStackTrace();
    }
  }

  
  public toolbox(Frame frame)
  {
    this(frame, "", false);
  }

  
  public toolbox(Frame frame, boolean modal)
  {
    this(frame, "", modal);
  }

  
  public toolbox(Frame frame, String title)
  {
    this(frame, title, false);
  }

  void jbInit() throws Exception
  {
    xYLayout1.setHeight(325);
    xYLayout1.setWidth(342);
    btnLeft.setLabel("Left");
    btnLeft.addActionListener(new java.awt.event.ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        btnLeft_actionPerformed(e);
      }
    });
    btnRight.setLabel("Right");
    btnRight.addActionListener(new java.awt.event.ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        btnRight_actionPerformed(e);
      }
    });
    btnUp.setLabel("Up");
    btnUp.addActionListener(new java.awt.event.ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        btnUp_actionPerformed(e);
      }
    });
    btnDown.setLabel("Down");
    btnDown.addActionListener(new java.awt.event.ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        btnDown_actionPerformed(e);
      }
    });
    cdx.setText("0");
    cdx.setColumns(4);
    cdy.setText("0");
    cdy.setColumns(4);
    cdz.setText("0");
    cdz.setColumns(4);
    clx.setText("0");
    clx.setColumns(4);
    cly.setText("0");
    cly.setColumns(4);
    clz.setText("300");
    clz.setColumns(4);
    btnDraw.setLabel("Camera...");
    btnDraw.addActionListener(new java.awt.event.ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        btnDraw_actionPerformed(e);
      }
    });
    btnL.setLabel("L");
    btnL.addActionListener(new java.awt.event.ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        btnL_actionPerformed(e);
      }
    });
    btnU.setLabel("U");
    btnU.addActionListener(new java.awt.event.ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        btnU_actionPerformed(e);
      }
    });
    btnD.setLabel("D");
    btnD.addActionListener(new java.awt.event.ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        btnD_actionPerformed(e);
      }
    });
    btnR.setLabel("R");
    btnAnimate.setLabel("Rotate Camera");
    aspeed.setText("0.1");
    btnAxis.setLabel("Toggle Axis");
    btnFile.setLabel("Load a Scene...");
    btnLights.setLabel("Lights...");
    btnLights.addActionListener(new java.awt.event.ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        btnLights_actionPerformed(e);
      }
    });
    label1.setText("Anim. angle");
    label2.setText("Viewer Pos");
    label3.setText("Lookat");
    btnWireFrame.setLabel("Toggle WireF");
    scrScale.setValue(10);
    scrScale.setOrientation(0);
    scrScale.setMinimum(1);
    label4.setText("Scale");
    btnAction.setLabel("Action...");
    btnAction.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        btnAction_actionPerformed(e);
      }
    });
    scrScale.addAdjustmentListener(new java.awt.event.AdjustmentListener() {
      public void adjustmentValueChanged(AdjustmentEvent e) {
        scrScale_adjustmentValueChanged(e);
      }
    });
    btnWireFrame.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        btnWireFrame_actionPerformed(e);
      }
    });
    btnFile.addActionListener(new java.awt.event.ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        btnFile_actionPerformed(e);
      }
    });
    btnAxis.addActionListener(new java.awt.event.ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        btnAxis_actionPerformed(e);
      }
    });
    btnAnimate.addActionListener(new java.awt.event.ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        btnAnimate_actionPerformed(e);
      }
    });
    btnR.addActionListener(new java.awt.event.ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        btnR_actionPerformed(e);
      }
    });
    panel1.setLayout(xYLayout1);
    panel1.add(btnLeft, new XYConstraints(14, 125, 49, -1));
    panel1.add(btnRight, new XYConstraints(82, 127, 55, -1));
    panel1.add(btnUp, new XYConstraints(13, 152, 50, -1));
    panel1.add(btnDown, new XYConstraints(81, 152, 56, -1));
    panel1.add(cdx, new XYConstraints(123, 39, -1, -1));
    panel1.add(cdy, new XYConstraints(122, 68, -1, -1));
    panel1.add(cdz, new XYConstraints(122, 96, -1, -1));
    panel1.add(clx, new XYConstraints(19, 38, -1, -1));
    panel1.add(cly, new XYConstraints(19, 66, -1, -1));
    panel1.add(clz, new XYConstraints(18, 94, -1, -1));
    panel1.add(btnDraw, new XYConstraints(227, 231, 102, -1));
    panel1.add(btnL, new XYConstraints(25, 251, 33, 24));
    panel1.add(btnU, new XYConstraints(58, 229, 28, -1));
    panel1.add(btnD, new XYConstraints(57, 273, 29, -1));
    panel1.add(btnR, new XYConstraints(85, 252, 35, -1));
    panel1.add(btnAnimate, new XYConstraints(222, 131, 106, -1));
    panel1.add(aspeed, new XYConstraints(98, 296, 67, 22));
    panel1.add(btnAxis, new XYConstraints(229, 10, 91, -1));
    panel1.add(btnFile, new XYConstraints(229, 174, 101, -1));
    panel1.add(btnLights, new XYConstraints(228, 201, 101, -1));
    panel1.add(label1, new XYConstraints(16, 297, 77, -1));
    panel1.add(label2, new XYConstraints(13, 16, 70, -1));
    panel1.add(label3, new XYConstraints(121, 18, 61, -1));
    panel1.add(btnWireFrame, new XYConstraints(229, 37, 92, -1));
    panel1.add(scrScale, new XYConstraints(14, 203, 123, 18));
    panel1.add(label4, new XYConstraints(15, 182, 54, -1));
    panel1.add(btnAction, new XYConstraints(226, 261, 102, -1));
  }

  protected void processWindowEvent(WindowEvent e)
  {
    if (e.getID() == WindowEvent.WINDOW_CLOSING)
    {
      cancel();
    }
    super.processWindowEvent(e);
  }

  void cancel()
  {
    dispose();
  }

  void btnDraw_actionPerformed(ActionEvent e)
  {
    Vector cl=new Vector((Double.valueOf(clx.getText())).doubleValue(),(Double.valueOf(cly.getText())).doubleValue(),
                         (Double.valueOf(clz.getText())).doubleValue());
    Vector cd=new Vector((Double.valueOf(cdx.getText())).doubleValue(),(Double.valueOf(cdy.getText())).doubleValue(),
                          (Double.valueOf(cdz.getText())).doubleValue());

    screen.scene.cameraLocation=cl;
    screen.scene.cameraLookat=cd;
    screen.origin.set(200,200);
//    screen.scalefactor=1;

      draw();

  }


  void draw()
  {


    screen.compute();
    screen.paintImmediately(screen.getVisibleRect());
  }


  void btnLeft_actionPerformed(ActionEvent e)
  {

     Matrix m =new Matrix();
     m.rotate_y(-0.1);
     screen.scene.cameraLocation=m.vec_postmultiply(screen.scene.cameraLocation);

     draw();
  }

  void btnRight_actionPerformed(ActionEvent e)
  {
     Matrix m =new Matrix();
     m.rotate_y(0.10);
     screen.scene.cameraLocation=m.vec_postmultiply(screen.scene.cameraLocation);
     //System.out.println("Position : " + screen.cameraLocation.toString());


     draw();
  }

  void btnUp_actionPerformed(ActionEvent e)
  {
     Matrix m =new Matrix();
     m.rotate_x(-0.10);
     screen.scene.cameraLocation=m.vec_postmultiply(screen.scene.cameraLocation);

     draw();
  }

  void btnDown_actionPerformed(ActionEvent e)
  {
     Matrix m =new Matrix();
     m.rotate_x(0.10);
     screen.scene.cameraLocation=m.vec_postmultiply(screen.scene.cameraLocation);
   
     draw();
  }

  void btnCloser_actionPerformed(ActionEvent e)
  {
    screen.scalefactor*=1.1;
    draw();

  }

  void btnAway_actionPerformed(ActionEvent e)
  {
    screen.scalefactor*=0.95;
    draw();
  }

  void btnU_actionPerformed(ActionEvent e)
  {
    screen.origin=screen.origin.add(new Vector(0,-30));
    draw();
  }

  void btnD_actionPerformed(ActionEvent e)
  {
       screen.origin=screen.origin.add(new Vector(0,30));
       draw();
  }

  void btnL_actionPerformed(ActionEvent e)
  {
       screen.origin=screen.origin.add(new Vector(30,0));
       draw();

  }

  void btnR_actionPerformed(ActionEvent e)
  {
       screen.origin=screen.origin.add(new Vector(-30,0));
       draw();

  }

  void btnAnimate_actionPerformed(ActionEvent e)
  {



  aflag=!aflag;
  if(aflag)
  {

  
      if(anim!=null)
        anim.stop();
        
    double r=(Double.valueOf(aspeed.getText()).doubleValue());
       anim an=new anim(screen,r);
     anim=new Thread(an);
    anim.start();

  }
  else
    anim.stop();


  }

  void btnAxis_actionPerformed(ActionEvent e)
  {
    screen.showaxis=!screen.showaxis;
    screen.paintImmediately(screen.getVisibleRect());
  }

  void btnFile_actionPerformed(ActionEvent e)
  {
    FileDialog fd=new FileDialog(new Frame(),"Load Scene",FileDialog.LOAD);
    fd.show();
    String s=fd.getDirectory()+fd.getFile();

   

     screen.scene.clear_scene();


        screen.add_axis();
          
    Scenefile sf=new Scenefile(s);
    sf.parse(screen.scene);




    screen.scene.sort(screen.scene.cameraLocation);
     draw();


  }

  void btnLights_actionPerformed(ActionEvent e)
  {
    dlg_lights.screen=screen;
    
    dlg_lights.show();
    dlg_lights.fill_list();
    
    
  }

  void btnWireFrame_actionPerformed(ActionEvent e) {
    screen.showwireframe=!screen.showwireframe;
     screen.paintImmediately(screen.getVisibleRect());
  }

  void scrScale_adjustmentValueChanged(AdjustmentEvent e) {
          screen.scalefactor=scrScale.getValue();
           screen.paintImmediately(screen.getVisibleRect());
  }

  void btnAction_actionPerformed(ActionEvent e) {

     action_flag=!action_flag;
     screen.action_flag=action_flag;
  if(action_flag)
  {

      if(action!=null)
        action.stop();

    ActionThread at=new ActionThread(screen);
     action=new Thread(at);
    action.start();

  }
  else
    action.stop();
  }
}


