// Lenko Stefanov
// Sam Vanderhyden
// Choedpong Khannabha

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.*;
import InstructorNotifier1;

public class GUI1 implements ActionListener, SchemeTesterInterface1 {  
    
    JFrame staticStateFrame;
    JFrame enterInfoDialogue;
    Container schemeTester;
    JScrollPane testResultsWindow, commentsWindow;
  
    JLabel enterInfoLabel, submitLabel, nameLabel, labNumLabel, fileNameAndLocationLabel;
    JLabel instructionLabel4;
    JLabel specialCaseLocationLabel, instructionLabel1, instructionLabel2, instructionLabel3;
    JLabel emailAddressLabel, testLabel, thanksLabel, titleLable, instructionLabel5;  
    JTextField nameField, labNumField, fileNameAndLocationField, specialCaseLocationField;
    JTextField testResultsWindowField, emailAddressField, commentsWindowField, commentsField;
    JButton enterInfoButton, submitButton, testButton;
    ImageIcon titleIcon;
   
    private String name;
    private String labNum;   
    private String fileNameAndLocation;
    private String specialCaseLocation;
    private String emailAddress;
    private String results1;
    private String comments;

    boolean testButtonPressed = false;
    boolean submitButtonPressed = false;
    
   

    public String sendInfo() {
        
        staticStateFrame = new JFrame("Scheme Program Tester");
        schemeTester = staticStateFrame.getContentPane();
        schemeTester.setSize(800, 400);
        
        addWidgets(); 

        enterInfoButton.addActionListener(this);    
        submitButton.addActionListener(new submitAction(this));

        staticStateFrame.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    System.exit(0);  
                }
            });
        
        staticStateFrame.pack();
        staticStateFrame.setVisible(true);
       
        return buildString();
        
    }

        public synchronized void waitForClick()
    {
        try {
            wait(500);
        }
        catch (InterruptedException e){}
    }


    public String buildString()
    {
        String info;
        String separator = "####";

        while(!testButtonPressed)
            {
                waitForClick();
            }

           name = nameField.getText();
           labNum = labNumField.getText();   
           emailAddress = emailAddressField.getText();         

        info = labNumField.getText() + separator +  fileNameAndLocationField.getText() + separator +  specialCaseLocationField.getText();

        return info;
        

    }

    public void actionPerformed (ActionEvent event) {
        
        this.testButtonPressed = true;
    }

    public void sendEmail() throws IOException{

        while(!submitButtonPressed)
            {
                waitForClick();
            }

        comments = commentsWindowField.getText();

        InstructorNotifier1 mailObj = new InstructorNotifier1 ();

        mailObj.sendEmail(emailAddress, name+" , Lab Number: "
                          +labNum, results1 + "\n\n" + comments);

    }

    public void printResults(String results){
        
        JScrollPane myPane = testResultsWindow;
        JTextField myOut = testResultsWindowField;
        results1 = results;
        
        myOut.setText(results);
        myPane.revalidate();
       
        try{
        
            sendEmail();
        
        }
        
        catch (IOException exc){}
    
    }
        
    private void addWidgets() {

        GridBagLayout gridbag = new GridBagLayout();
        GridBagConstraints gridcons = new GridBagConstraints();
        schemeTester.setLayout(gridbag);

        // Row 0
        //title image

        gridcons.gridx = 0;
        gridcons.gridy = 0;
        gridcons.weightx = 0.5;
        gridcons.gridwidth = 2; 
        titleIcon=new ImageIcon("Title.jpg","");
        titleLable = new JLabel("",titleIcon,JLabel.CENTER);
        gridbag.setConstraints(titleLable, gridcons);
        schemeTester.add(titleLable, SwingConstants.CENTER);
             

        // Row 1, 1

        gridcons.gridx = 0;
        gridcons.gridy = 1;
        gridcons.gridwidth = 1;
        gridcons.weightx = 1.0;
        nameLabel  = new JLabel("Type in your name (last, first):");
        nameLabel.setBorder(BorderFactory.createEmptyBorder(5, // top
                                                            10, // left
                                                            5, // bottom
                                                            10  // right
                                                            ));
        gridbag.setConstraints(nameLabel, gridcons);
        schemeTester.add(nameLabel);

        // Row 1, 2

        gridcons.gridx = GridBagConstraints.RELATIVE;
        gridcons.gridy = 1;
        gridcons.weightx = 1.0;  
        nameField  = new JTextField(20); 
        gridbag.setConstraints(nameField, gridcons);
        schemeTester.add(nameField);

        // Row 2, 1

        gridcons.gridx = 0;
        gridcons.gridy = 2;
        gridcons.gridwidth = 1;
        gridcons.weightx = 1.0;
        labNumLabel  = new JLabel("Type in lab number (L5, SP4):");
        labNumLabel.setBorder(BorderFactory.createEmptyBorder(5, // top
                                                              10, // left
                                                              5, // bottom
                                                              10  // right
                                                              ));
        gridbag.setConstraints(labNumLabel, gridcons);
        schemeTester.add(labNumLabel);

        // Row 2, 2

        gridcons.gridx = GridBagConstraints.RELATIVE;
        gridcons.gridy = 2;
        gridcons.weightx = 1.0;  
        labNumField  = new JTextField(20); 
        gridbag.setConstraints(labNumField, gridcons);
        schemeTester.add(labNumField);

        // Row 3, 1

        gridcons.gridx = 0;
        gridcons.gridy = 3;
        gridcons.gridwidth = 1;
        gridcons.weightx = 1.0;
        fileNameAndLocationLabel  = new JLabel("Type in location of Scheme file:");
        fileNameAndLocationLabel.setBorder(BorderFactory.createEmptyBorder(5, // top
                                                                           10, // left 
                                                                           5, // bottom
                                                                           10  // right
                                                                           ));
        gridbag.setConstraints(fileNameAndLocationLabel, gridcons);
        schemeTester.add(fileNameAndLocationLabel);
        
        // Row 3, 2
        
        gridcons.gridx = GridBagConstraints.RELATIVE;
        gridcons.gridy = 3;
        gridcons.weightx = 1.0;  
        fileNameAndLocationField  = new JTextField(20); 
        gridbag.setConstraints(fileNameAndLocationField, gridcons);
        schemeTester.add(fileNameAndLocationField);

        // Row 4, 1

        gridcons.gridx = 0;
        gridcons.gridy = 4;
        gridcons.gridwidth = 1;
        gridcons.weightx = 1.0;
        specialCaseLocationLabel  = new JLabel("Type in location of special cases file:");
        specialCaseLocationLabel.setBorder(BorderFactory.createEmptyBorder(5, // top
                                                                           10, // left 
                                                                           5, // bottom
                                                                           10  // right
                                                                           ));
        gridbag.setConstraints(specialCaseLocationLabel, gridcons);
        schemeTester.add(specialCaseLocationLabel);
        
        // Row 4, 2
        
        gridcons.gridx = GridBagConstraints.RELATIVE;
        gridcons.gridy = 4;
        gridcons.weightx = 1.0;  
        specialCaseLocationField  = new JTextField(20); 
        gridbag.setConstraints(specialCaseLocationField, gridcons);
        schemeTester.add(specialCaseLocationField);
        
         // Row 5, 1

        gridcons.gridx = 0;
        gridcons.gridy = 5;
        gridcons.gridwidth = 1;
        gridcons.weightx = 1.0;
        emailAddressLabel  = new JLabel("Type in your Email address:");
        emailAddressLabel.setBorder(BorderFactory.createEmptyBorder(5, // top
                                                                    10, // left 
                                                                    5, // bottom
                                                                    10  // right
                                                                    ));
        gridbag.setConstraints(emailAddressLabel, gridcons);
        schemeTester.add(emailAddressLabel);
        
        // Row 5, 2
        
        gridcons.gridx = GridBagConstraints.RELATIVE;
        gridcons.gridy = 5;
        gridcons.weightx = 1.0;  
        emailAddressField  = new JTextField(20); 
        gridbag.setConstraints(emailAddressField, gridcons);
        schemeTester.add(emailAddressField);

        // Row 6

        gridcons.gridx = 0;
        gridcons.gridy = 6;
        gridcons.weightx = 0.5;
        gridcons.gridwidth = 2;
        instructionLabel4 = new JLabel 
            ("Press this button to test your program:");
        instructionLabel4.setBorder(BorderFactory.createEmptyBorder(5, // top
                                                                    10, // left
                                                                    5, // bottom
                                                                    15  // right
                                                                    ));
        gridbag.setConstraints(instructionLabel4, gridcons);
        schemeTester.add(instructionLabel4, SwingConstants.CENTER); 

        // Row 7
        // place ENTER INFO button

        gridcons.gridx=0;
        gridcons.gridy=7;
        gridcons.weightx=0.5;
        gridcons.gridwidth=2;
        gridcons.ipadx = 10;
        gridcons.ipady = 10;
        enterInfoButton = new JButton("   TEST   ");
        enterInfoButton.setBorder(BorderFactory.createRaisedBevelBorder());
        gridbag.setConstraints(enterInfoButton, gridcons);
        schemeTester.add(enterInfoButton, SwingConstants.CENTER);
 
	

        // Row 8
        // Instructions

        gridcons.gridx = 0;
        gridcons.gridy = 8;
        gridcons.weightx = 0.5;
        gridcons.gridwidth = 2;
        instructionLabel2 = new JLabel 
            ("Results from the testing are displayed in this window:");
        instructionLabel2.setBorder(BorderFactory.createEmptyBorder(5, // top
                                                                    10, // left
                                                                    5, // bottom
                                                                    10  // right
                                                                    ));
        gridbag.setConstraints(instructionLabel2, gridcons);
        schemeTester.add(instructionLabel2, SwingConstants.CENTER);

        // Row 9
        // Add display result window

        gridcons.gridx = 0;
        gridcons.gridy = 9;    
        gridcons.ipadx = 0;
        gridcons.ipady = 0;
        testResultsWindowField = new JTextField(100);
        Font monoFont = new Font ("Monospaced", Font.PLAIN, 10);
        testResultsWindowField.setFont(monoFont);
        testResultsWindowField.setEditable(false);
        testResultsWindowField.setBorder(BorderFactory.createEmptyBorder(30,5,5,10));
        testResultsWindow = new JScrollPane(testResultsWindowField);
        testResultsWindow.setHorizontalScrollBarPolicy
            (JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        testResultsWindow.setVerticalScrollBarPolicy
            (JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        Dimension preferredSize = new Dimension (400, 175);
        testResultsWindow.setPreferredSize(preferredSize);
        gridbag.setConstraints(testResultsWindow, gridcons);
        schemeTester.add(testResultsWindow);

        // Row 10
        // Instructions

        gridcons.gridx = 0;
        gridcons.gridy = 10;
        gridcons.weightx = 0.5;
        gridcons.gridwidth = 2;
        instructionLabel5 = new JLabel 
            ("Enter comments which will be sent to the instructor:");
        instructionLabel5.setBorder(BorderFactory.createEmptyBorder(5, // top
                                                                    10, // left
                                                                    5, // bottom
                                                                    10  // right
                                                                    ));
        gridbag.setConstraints(instructionLabel5, gridcons);
        schemeTester.add(instructionLabel5, SwingConstants.CENTER);

        // Row 11
        // Comments

        gridcons.gridx = 0;
        gridcons.gridy = 11;    
        gridcons.ipadx = 0;
        gridcons.ipady = 0;
        commentsWindowField = new JTextField(100);
        Font monoFont1 = new Font ("Monospaced", Font.PLAIN, 10);
        commentsWindowField.setFont(monoFont1);
        commentsWindowField.setEditable(true);
        commentsWindowField.setBorder(BorderFactory.createEmptyBorder(30,5,30,5));
        commentsWindow = new JScrollPane(commentsWindowField);
        commentsWindow.setHorizontalScrollBarPolicy
            (JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        commentsWindow.setVerticalScrollBarPolicy
            (JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        Dimension preferredSize1 = new Dimension (400, 125);
        commentsWindow.setPreferredSize(preferredSize1);
        gridbag.setConstraints(commentsWindow, gridcons);
        schemeTester.add(commentsWindow);

        // Row 12
        // Instructions

        gridcons.gridx = 0;
        gridcons.gridy = 12;
        gridcons.weightx = 0.5;
        gridcons.gridwidth = 2;
        instructionLabel3 = new JLabel 
            ("Press this button if you wish to submit your results to the instructor:");
        instructionLabel3.setBorder(BorderFactory.createEmptyBorder(5, // top
                                                                    10, // left
                                                                    5, // bottom
                                                                    10  // right
                                                                    ));
        gridbag.setConstraints(instructionLabel3, gridcons);
        schemeTester.add(instructionLabel3, SwingConstants.CENTER);

        // Row 13
        // place SUBMIT button

        gridcons.gridx=0;
        gridcons.gridy=13;
        gridcons.weightx=3;
        gridcons.gridwidth=2;
        gridcons.ipadx = 10;
        gridcons.ipady = 10;
        submitButton = new JButton("   SUBMIT   ");
        submitButton.setBorder(BorderFactory.createRaisedBevelBorder());
        gridbag.setConstraints(submitButton, gridcons);
        schemeTester.add(submitButton, SwingConstants.CENTER);

        // Row 14
        // Thanks

        gridcons.gridx = 0;
        gridcons.gridy = 14;
        gridcons.weightx = 0.5;
        gridcons.gridwidth = 2;
        thanksLabel = new JLabel 
            ("");
        thanksLabel.setBorder(BorderFactory.createEmptyBorder(1, // top
                                                              10, // left
                                                              1, // bottom
                                                              10  // right
                                                             ));
        gridbag.setConstraints(thanksLabel, gridcons);
        schemeTester.add(thanksLabel, SwingConstants.CENTER);  
    }       
    
} //end GUI1


class submitAction implements ActionListener {
    
    GUI1 myGUI;
    
    submitAction(GUI1 myGUI1) 
    {        
        
        myGUI = myGUI1;
    }
    
    public void actionPerformed (ActionEvent event) {
        
        myGUI.submitButtonPressed = true;
    }
}


    



