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

/**
* Question Editor
* Part of the Wafers application that deals with creating and saving survey questions.
*/
public class WEGUI extends JFrame 
{
  public static int WIDTH = 800; //default interface width
  public static int HEIGHT = 480; //default interface height
  public static String TITLE = "Question Editor";
  public boolean open = false;
  public boolean saved = true;
  public boolean parsable;
  
	JFrame intFrame = this;
	
  //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
  StimEdit stimEditor;
  //Current Survey Editor
  CSE surveyEdit;
  //Menu Bar
  WafersEditMenu menu;
  //Writer object
  SchemaWriter writer;
  
  private Vector questions = new Vector();
  private SurveyObject survey;
  
  /**
   * The constructor.
   */  
   public WEGUI() 
   {
    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);
      stimEditor = new StimEdit(layers,bevelL);
      surveyEdit = new CSE(layers,bevelL);
      menu = new WafersEditMenu(this);
     
      SetupEventHandlers();
      
      setResizable(false);
      pack();
      setSize(WIDTH,HEIGHT); //sets the size of the main window
      setVisible(true);
      show();
   
    
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
   }
  
  private void SetupEventHandlers()
  {
    menu.fileNew.addActionListener(new MenuItemHandler());
    menu.fileOpen.addActionListener(new MenuItemHandler());
    menu.fileCloseEdit.addActionListener(new MenuItemHandler());
    
    menu.fileSave.addActionListener(new MenuItemHandler());
    menu.fileSaveAs.addActionListener(new MenuItemHandler());
    menu.toolsSurveyEditor.addActionListener(new MenuItemHandler());
    menu.toolsLaunchSurvey.addActionListener(new MenuItemHandler());
    
  }
  
  /**
  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();
    }
  }
	
  /**
  * Save current question without prompting for name and location
  */
  private void SaveQuestion()
  {
  	if(surveyEdit.getQuestion().equals("untitled.xml") || surveyEdit.getQuestion().equals(""))
	{
			
		SaveAsQuestion();
	}
	else
	{
		writer = new SchemaWriter(surveyEdit, stimEditor);
		writer.write();
	}
  
  }
  /**
  * Ask for filename and save current question.
  */
  private void SaveAsQuestion()
  {
  		File dir = new File("Surveys/");
		JFileChooser chooser = new JFileChooser();
        	chooser.setCurrentDirectory(dir);
			chooser.addChoosableFileFilter(new MyFileFilter(".xml"));
        	int returnVal = chooser.showSaveDialog(layers);
        	if(returnVal == JFileChooser.APPROVE_OPTION)
        	{
			//check if file exists and if to over write
					
			if(!chooser.getSelectedFile().exists())
			{
				//selecting a list of stims
          			String saveThis = new String (chooser.getSelectedFile().getPath());
          			if(saveThis.endsWith(".xml"))
          			{
           				writer = new SchemaWriter(chooser.getSelectedFile(), stimEditor);
					writer.write();		
					surveyEdit.setDir(chooser.getCurrentDirectory().getPath());
					surveyEdit.setQuestion(chooser.getSelectedFile().getName());

        	 		}
        	  		else
        	  		{
        	    		JOptionPane.showMessageDialog(layers, "Please give file a .xml extension",
        	    		"Error", JOptionPane.ERROR_MESSAGE);
       	
			 	 }
			}
			else
			{
				int opt = JOptionPane.showConfirmDialog(layers,"Would you like to overwrite " +
				chooser.getSelectedFile().getPath() + "?", "Overwrite?",
				JOptionPane.YES_NO_OPTION);
				
				if(opt == JOptionPane.YES_OPTION)
				{
				
					//selecting a list of stims
          				String saveThis = new String (chooser.getSelectedFile().getPath());
          				if(saveThis.endsWith(".xml"))
          				{
           					writer = new SchemaWriter(chooser.getSelectedFile(), stimEditor);
						writer.write();
						surveyEdit.setDir(chooser.getCurrentDirectory().getPath());
						surveyEdit.setQuestion(chooser.getSelectedFile().getName());		

        	 			}	
        	  		else
        	  		{
        	    		JOptionPane.showMessageDialog(layers, "Please give file a .xml extension",
        	    		"Error", JOptionPane.ERROR_MESSAGE);
       
			  				}
							
							}
							
						}
					}
		saved = true;
  }
  
  private void openFile()
  {
  
 	JFileChooser chooser = new JFileChooser();
        chooser.setCurrentDirectory(new File("Surveys/"));
	chooser.addChoosableFileFilter(new MyFileFilter(".xml"));
        int returnVal = chooser.showOpenDialog(layers);
        if(returnVal == JFileChooser.APPROVE_OPTION)
        {
         
	String openThis = new String (chooser.getSelectedFile().getPath());
	SchemaParser input = new SchemaParser(openThis);
	XMLobject stim = new XMLobject(openThis);
	parsable = input.checkParsable();
	
	if(parsable)
	{
		stim = input.Parse();
    		surveyEdit.setDir(chooser.getCurrentDirectory().getPath());
		surveyEdit.setQuestion(chooser.getSelectedFile().getName());
       	 	stimEditor.setStim(stim.getDisplayData());
		
		for(int i = 0; i <= 2; i++)
        stimEditor.setPole(i+1,stim.getPoleIDs(i),stim.getPoleCues(i), stim.getPoleDescrip(i));
	open = true;
	saved = false;
	}
	else
	{
		openFile();
	}
				
	
       }
  
  
  
  }
  /**
  * Handles actions executed by the menu.
  */
  public class MenuItemHandler implements ActionListener
  {
    public void actionPerformed(ActionEvent e)
    {
      String cmd = e.getActionCommand();
      if(cmd.equals("Close Editor"))
      {
      	 	if(open == true && saved == false)
		{
		int opt1 = JOptionPane.showConfirmDialog(layers, "Would you like to save changes made to " + surveyEdit.getQuestion() + "?",
    	    	"Save Changes?", JOptionPane.YES_NO_OPTION);
		if(opt1 == JOptionPane.YES_OPTION)
		{
			SaveQuestion();
		}
		
		}
		dispose();
	}	
      else if(cmd.equals("New"))
	{
		if(open == true && saved == false)
		{
		int opt2 = JOptionPane.showConfirmDialog(layers, "Would you like to save changes made to " + surveyEdit.getQuestion() + "?",
    	    	"Save Changes?", JOptionPane.YES_NO_OPTION);
		if(opt2 == JOptionPane.YES_OPTION)
		{
			SaveQuestion();
		}
		
		}
		try{
					
			File dir = new File("Surveys/");
			surveyEdit.setDir(dir.getCanonicalPath());
			surveyEdit.setQuestion("untitled.xml");
          		stimEditor.setStim("");
            		stimEditor.reset();

		}
		catch(Exception io)
		{
 
      			io.printStackTrace();

		}	
		open = true;
		saved = false;
	}
	else if(cmd.equals("Open"))
	{
		
		if(open == true && saved == false)
		{
		int opt3 = JOptionPane.showConfirmDialog(layers, "Would you like to save changes made to " + surveyEdit.getQuestion() + "?",
    	    	"Save Changes?", JOptionPane.YES_NO_OPTION);
		if(opt3 == JOptionPane.YES_OPTION)
		{
			SaveQuestion();
		}
		
		}
						

        	openFile();
     
			
	}
      	else if(cmd.equals("Save"))
      	{
					
		SaveQuestion();
		
	}
      	else if(cmd.equals("Save As"))
      	{
		SaveAsQuestion();		
	}
      	else if(cmd.equals("Survey Editor"))
      	{
        	UserEdit application3 = new UserEdit();
      	}
      	else if(cmd.equals("Launch Survey"))
      	{
      	  WafersSurvey application4 = new WafersSurvey();
      	}
    }
  }
  

	
}

