import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import javax.swing.tree.*;
import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
import java.net.*;


public class WSGUI extends JApplet
{
  public static int WIDTH = 790; //default interface width
  public static int HEIGHT = 470; //default interface height
  public static String TITLE = "Wafers Survey";
  
  //two bevel border objects one with a raised edge, one with a lowered edge
  BevelBorder bevelL = new BevelBorder(BevelBorder.LOWERED);
  BevelBorder bevelR = new BevelBorder(BevelBorder.RAISED);
  
  //content manager
  JLayeredPane layers = new JLayeredPane();
  

  //Empty component backdrop. Prevents nasty refresh issues with JFrame background.
  WComponent background;
  //Stimulus Display Area - questions
  StimDisplay stimDisplay;
  //Stimulus Response Area - triangle
  SRPole stimPole;
  //Current Survey Display
  CSD surveyDisplay;
  //Menu Bar
  WafersSurveyMenu menu;
  //Submit Button
  SubmitButton sbutton;
  //Back Button
  BackButton bbutton;
  //Restart Button
  RestartButton rbutton;
  //Controller object
  Control control;
  
  private Vector questions = new Vector();
  private SurveyObject survey;
  private int question = 0;
  private boolean surveyOpen = false;
  private String input;
  private XMLobject stim;
  private String openThis;
  
  /**
   * Default Constructor
   */
  public WSGUI() 
  {
  
	
    try
    {
      
	  
	  
	  //Setup Internal Class Properties
      //setTitle(TITLE); //title of the main window
     // addWindowListener(new WindowHandler()); 
     //adds the window listener to allow you to close the window
      
      setContentPane(layers);
     
      //Instantiate external class objects
      background = new WComponent(layers,WIDTH,HEIGHT);
      stimPole = new SRPole(layers, bevelL);
      //surveyDisplay = new CSD(layers,bevelL,0);
      //'0' is to select secondary constructor with different layout.
      sbutton = new SubmitButton(layers,bevelL);
      bbutton = new BackButton(layers,bevelL);
      rbutton = new RestartButton(layers,bevelL);
      control = new Control();
      //menu = new WafersSurveyMenu(this);
      starter(); //setup a default "survey"
      //SetupLayout();
      SetupEventHandlers();

      setSize(WIDTH,HEIGHT); //sets the size of the main window
      setVisible(true);
         
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
  }
	
  private void starter()
  {
	
	String user = JOptionPane.showMessageDialog("Enter your WebCT user ID:");
	userControl = new Control();
	userControl.processUser(user);
	
	
	try{
			
		
        		//selecting a list of stims
        		String openThis = new String ("Survey1.wsl");
			File dir = new File("Surveys");

            		surveyOpen = true;
			
			//setup list of questions
			control = new Control(openThis, dir); //questions setup in constructor
			control.gotoFirst(); //goto first question
			
           		//open the first stored element and dispaly it.
            		stimPole.stimDisplay(control.getObject());



	}
	catch(Exception e)
    {
      e.printStackTrace();
    }
  }//end starter


  public void SetupEventHandlers()
  {
   
    
    stimPole.canvas.addMouseMotionListener(new MouseMotionHandler());
    stimPole.canvas.addMouseListener(new MouseHandler());
    
    sbutton.submit.addActionListener(new ButtonItemHandler());
    bbutton.back.addActionListener(new ButtonItemHandler());
    rbutton.restart.addActionListener(new ButtonItemHandler());
  }
  
    
  
  /**
  Sets up the Window Closing event handlers for the Wafers interface.
  */
  public class WindowHandler extends WindowAdapter
  {
    /**
    Handles closing of the main program window.
    */
    public void windowClosing(WindowEvent e)
    {
    }
    
    public void windowActivated(WindowEvent e)
    {
      validate();
    }
  
    public void windowDeiconified(WindowEvent e)
    {
      validate();
    }
  
    public void windowGainedFocus(WindowEvent e)
    {
      validate();
    }
  
    public void windowOpened(WindowEvent e)
    {
      validate();
    }
  }

  public class ButtonItemHandler implements ActionListener
  {
    public void actionPerformed(ActionEvent e)
    {
      String cmd = e.getActionCommand();
      if(surveyOpen)
      {
        if(cmd.equals("SUBMIT"))
        {
          //record results to a results file
          //then load next stim
          
			control.gotoNext(stimPole);
			stimPole.reset();
		
			if(!control.finished())
			{
				stimPole.stimDisplay(control.getObject());
			}
			else
			{
				JOptionPane.showMessageDialog(layers, "You have finished your Survey, Thank you!",
            	"Message", JOptionPane.INFORMATION_MESSAGE);
			
				
				try{
					control.writeData();
				}
				catch(Exception j)
				{
					j.printStackTrace();
				}
				control.gotoFirst(); //goto first question			
           	 	stimPole.reset();
				stimPole.stimDisplay(control.getObject());
			}
					
      		
		}//end submit if
		else if(cmd.equals("BACK"))
		{
				
			//goback
					   
			control.goBack();
          	stimPole.reset();
			stimPole.stimDisplay(control.getObject());			
		}
      	else if(cmd.equals("RESTART"))
		{
				
			control.gotoFirst();  //goto first stim
			stimPole.reset();
			stimPole.stimDisplay(control.getObject());
			
		}			
		
	}//end if surveyOpen
	else
    {
   		JOptionPane.showMessageDialog(layers, "Please open a survey first.",
      	"Error", JOptionPane.ERROR_MESSAGE);
   	}//end
				
   }
 }		
 	
  public class MouseHandler extends MouseAdapter
  {
    public void mouseClicked(MouseEvent e)
    {
      
	  	if(surveyOpen)
	  	{
	  		stimPole.update(e.getX(),e.getY());
	  	}
    }
  }

  public class MouseMotionHandler extends MouseMotionAdapter
  {
    public void mouseDragged(MouseEvent e)
    {
      if(surveyOpen)
			{
				stimPole.update(e.getX(),e.getY());
			}
    }
		
	public void mouseMoved(MouseEvent e)
	{
		if(surveyOpen)
		{
			stimPole.decompress(e.getX(),e.getY());
		}
	}
		
  }
  
	
  
	
}
