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

public class UEGUI extends JFrame 
{
  public static int WIDTH = 700; //default interface width
  public static int HEIGHT = 600; //default interface height
  public static String TITLE = "Survey Editor";
  public boolean open = false;
  public boolean saved = true;
  public SurveyObject stims;
  
  //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;
  //User Edit Menu
  UserEditMenu menu;
  //Current User Editing
  CUE survEdit;
 
  //buttons
  AddFile addbutton;
  RemoveFile removebutton;
	UpButton moveUp;
	DownButton moveDown;
 
  /**
   * Method UEGUI
   */
  public UEGUI() 
  {
    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);
      menu = new UserEditMenu(this);
      survEdit = new CUE(layers,bevelL,WIDTH, 140);
	
      addbutton = new AddFile(layers, bevelL);
      removebutton = new RemoveFile(layers, bevelL);
			moveUp = new UpButton(layers, bevelL);
			moveDown = new DownButton(layers, bevelL);

      //SetupLayout();
      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.fileNewSurvey.addActionListener(new MenuItemHandler());
    menu.fileOpenSurvey.addActionListener(new MenuItemHandler());
    menu.fileSaveSurvey.addActionListener(new MenuItemHandler());
    menu.fileSaveSurveyAs.addActionListener(new MenuItemHandler());
    menu.fileClose.addActionListener(new MenuItemHandler());
    menu.toolsQuestionEditor.addActionListener(new MenuItemHandler());
    menu.toolsLaunchSurvey.addActionListener(new MenuItemHandler());
    //buttons
    addbutton.addfile.addActionListener(new ButtonItemHandler());
    removebutton.removefile.addActionListener(new ButtonItemHandler());
    moveUp.up.addActionListener(new ButtonItemHandler());
    moveDown.down.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(cmd.equals("Add >>"))
        {
         
		if(open == true && survEdit.getFileList().getSelectedFile().getName().endsWith(".xml"))
		{
			
			File temp[] = survEdit.getFileList().getSelectedFiles();
			
			try{
			
				for(int i = 0; i < temp.length; i++)
				{
					
					stims.getStimList().add(temp[i].getName());
				}
			}
			catch(Exception g)
			{
				g.printStackTrace();
			}
			
			//stims.getStimList().add(survEdit.getFileList().getSelectedFile().getName());
			survEdit.getAdded().setListData(stims.getStimList());
			
		}
		else if(open == false)
		{
			JOptionPane.showMessageDialog(layers, "Please open a Wafers survey.",
          		"Error", JOptionPane.ERROR_MESSAGE);	
		}
		else if(!survEdit.getFileList().getSelectedFile().getName().endsWith(".xml"))
		{
			JOptionPane.showMessageDialog(layers, "Incorrect file type.",
          		"Error", JOptionPane.ERROR_MESSAGE);
		}	
					
      	}//end if
	else if(cmd.equals("<< Remove"))
	{
		
		if(open == true)
		{
			Object temp[] = survEdit.getAdded().getSelectedValues();
			
			try{
			
				for(int i = 0; i < temp.length; i++)
				{
					
					stims.getStimList().remove(temp[i]);
				}
			}
			catch(Exception f)
			{
				f.printStackTrace();
			}
			
			
			survEdit.getAdded().setListData(stims.getStimList());
		}
	
	}//end else if
  else if(cmd.equals(moveUp.up.getActionCommand()))
	{
		if(survEdit.getAdded().getSelectedIndex() >= 0)
		{
			Object tempb = stims.getStimList().elementAt(survEdit.getAdded().getSelectedIndex());
			Object tempa = stims.getStimList().elementAt(survEdit.getAdded().getSelectedIndex()-1);
			
			stims.getStimList().setElementAt(tempa,survEdit.getAdded().getSelectedIndex());
			stims.getStimList().setElementAt(tempb,survEdit.getAdded().getSelectedIndex()-1);
			
			survEdit.getAdded().setListData(stims.getStimList());		
		}
		
		
		
		//System.out.println("UP!!");
	}
	else if(cmd.equals(moveDown.down.getActionCommand()))
	{
		if(survEdit.getAdded().getSelectedIndex() >= 0)
		{
			Object tempb = stims.getStimList().elementAt(survEdit.getAdded().getSelectedIndex());
			Object tempa = stims.getStimList().elementAt(survEdit.getAdded().getSelectedIndex()+1);
			
			stims.getStimList().setElementAt(tempa,survEdit.getAdded().getSelectedIndex());
			stims.getStimList().setElementAt(tempb,survEdit.getAdded().getSelectedIndex()+1);
			
			survEdit.getAdded().setListData(stims.getStimList());		
		}
		
		//System.out.println("DOWN!!");
	
	
	}
	   		
   }
 }		
   
 
 
 private void SaveSurvey()
 {
 
 	if(survEdit.getSurv().equals("untitled.wsl") || survEdit.getSurv().equals(""))
				{
						
					SaveAsSurvey();	
				}
				else
				{
					
					stims.setFileName(survEdit.getDir() + "/" + survEdit.getSurv());
					stims.writeSurvey();
				}
	  
	 			saved = true;
				return;
 
 }
 
 private void SaveAsSurvey()
 {
 
 					File dir = new File("Surveys/");
					JFileChooser chooser = new JFileChooser();
        	chooser.setCurrentDirectory(dir);
					chooser.addChoosableFileFilter(new MyFileFilter(".wsl"));
        	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(".wsl"))
          		{
           			stims.setFileName(saveThis);
								stims.writeSurvey();		
								survEdit.setDir(chooser.getCurrentDirectory().getPath());
								survEdit.setSurv(chooser.getSelectedFile().getName());

        	 		}
        	  	else
        	  	{
        	    	JOptionPane.showMessageDialog(layers, "Please give file a .wsl 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(".wsl"))
								{	
									stims.setFileName(saveThis);
									stims.writeSurvey();
									survEdit.setDir(chooser.getCurrentDirectory().getPath());
									survEdit.setSurv(chooser.getSelectedFile().getName());

								}	
								else
								{
  								JOptionPane.showMessageDialog(layers, "Please give file a .wsl extension",
  								"Error", JOptionPane.ERROR_MESSAGE);

								}
							}
						}
					}	
			
			
				saved = true;
				return;
 
 
 }
 

  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 opt2 = JOptionPane.showConfirmDialog(layers, "Would you like to save changes made to " + survEdit.getSurv() + "?",
    	    	"Save Changes?", JOptionPane.YES_NO_OPTION);
		if(opt2 == JOptionPane.YES_OPTION)
		{
			if(!stims.getStimList().isEmpty() )
				{
	  			SaveSurvey();
				}
				else
				{
					JOptionPane.showMessageDialog(layers, "Cannot save a blank survey. Save Not Complete.",
  																			"Save Not Complete", JOptionPane.ERROR_MESSAGE);
				}
		}
		
	}
       
	dispose();
       }
      else if(cmd.equals("File"))
      {
        
      }
      else if(cmd.equals("New"))
      {
      	
				if(open == true && saved == false)
				{
					int opt1 = JOptionPane.showConfirmDialog(layers, "Would you like to save changes made to " + survEdit.getSurv() + "?",
        				"Save Changes?", JOptionPane.YES_NO_OPTION);
					if(opt1 == JOptionPane.YES_OPTION)
					{
						if(!stims.getStimList().isEmpty() )
						{
	  					SaveSurvey();
						}
						else
						{
							JOptionPane.showMessageDialog(layers, "Cannot save a blank survey. Save Not Complete.",
  																			"Save Not Complete", JOptionPane.ERROR_MESSAGE);
						}
					}
			
				}
				
		try{
					
			File dir = new File("Surveys/");
			
			
			stims = new SurveyObject(dir.getCanonicalPath() + "/untitled.wsl");
			survEdit.getAdded().setListData(stims.getStimList());
			
			survEdit.setDir(dir.getCanonicalPath());
			survEdit.setSurv("untitled.wsl");
		
        	}
		catch(Exception io)
		{
 
      			io.printStackTrace();

		}
	
	
		open = true;
		saved = false;
      
     }
     else if(cmd.equals("Open"))
     {
      	
			if(open == true && saved == false)
			{
				int opt1 = JOptionPane.showConfirmDialog(layers, "Would you like to save changes made to " + survEdit.getSurv() + "?",
    	    	    		"Save Changes?", JOptionPane.YES_NO_OPTION);
				if(opt1 == JOptionPane.YES_OPTION)
				{
					if(!stims.getStimList().isEmpty() )
					{
	  				SaveSurvey();
					}
					else
					{	
						JOptionPane.showMessageDialog(layers, "Cannot save a blank survey. Save Not Complete.",
  																			"Save Not Complete", JOptionPane.ERROR_MESSAGE);
					}
				}
				
			}	
			
					JFileChooser chooser = new JFileChooser();
					chooser.addChoosableFileFilter(new MyFileFilter(".wsl"));
        	chooser.setCurrentDirectory(new File("Surveys/"));
        	int returnVal = chooser.showOpenDialog(layers);
        	if(returnVal == JFileChooser.APPROVE_OPTION)
        	{
        	  String openThis = new String (chooser.getSelectedFile().getPath());
        	  stims = new SurveyObject(openThis);
        	  stims.readInSurvey();
			  survEdit.getAdded().setListData(stims.getStimList());
        	
						
        		survEdit.setDir(chooser.getCurrentDirectory().getPath());
        		survEdit.setSurv(chooser.getSelectedFile().getName());
			open = true;
        		saved = false; 
	
        	}
        	
		
      	
      }
      else if(cmd.equals("Save"))
      {
	  		
				if(!stims.getStimList().isEmpty() )
				{
	  			SaveSurvey();
				}
				else
				{
					JOptionPane.showMessageDialog(layers, "Cannot save a blank survey. Save Not Complete.",
  																			"Save Not Complete", JOptionPane.ERROR_MESSAGE);
				}
		}
	else if(cmd.equals("Save As"))
	{
		if(!stims.getStimList().isEmpty() )
				{
	  			SaveAsSurvey();
				}
				else
				{
					JOptionPane.showMessageDialog(layers, "Cannot save a blank survey. Save Not Complete.",
  																			"Save Not Complete", JOptionPane.ERROR_MESSAGE);
				}
	}
    	else if(cmd.equals("Question Editor"))
			{
				WafersEdit application = new WafersEdit();
			}
			else if(cmd.equals("Launch Survey"))
			{
				WafersSurvey application4 = new WafersSurvey();
			}
		}
  }
}
