view ExperimentController.java @ 2:1fe7ac28a3ca

Save results after each presentation. Ignore-this: 5f7d744b55a2f8919f7807bf69fa3d1a
author Marcus Pearce <m.pearce@gold.ac.uk>
date Mon, 14 Jun 2010 13:28:18 +0100
parents 4031cbb02f08
children 5080b65e6963
line wrap: on
line source
/*=============================================================================
 * File:       ExperimentController.java
 * Author:     Marcus Pearce <m.pearce@gold.ac.uk>
 * Created:    <2007-12-14 12:06:10 marcusp>
 * Time-stamp: <2010-06-14 13:20:03 marcusp>
 *=============================================================================
 */

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ExperimentController implements ActionListener, KeyListener { 
    
    /* variables */ 
    ExperimentGui gui;

    Experiment exp; 
    SubjectResults results; 

    InstructionsPanel ip; 
    StimulusPanel sp; 
    SubjectDataPanel sdp; 
    InterBlockPanel ibp;
    
    /* constructor */ 
    public ExperimentController(ExperimentGui eg) { 
        gui = eg; 
        exp = gui.getExperiment(); 
        results = exp.getSubjectResults(); 

        ip = gui.getInstructionsPanel(); 
        ibp = gui.getInterBlockPanel(); 
        sp = gui.getStimulusPanel();         
        sdp = gui.getSubjectDataPanel(); 

        ip.addNextButtonListener(this); 
        sp.addAllListeners(this);
        sdp.addFinishButtonListener(this); 
        ibp.addContinueButtonListener(this); 

        sp.setFocusable(true);
        sp.addKeyListener(this);
        sp.addAllKeyListeners(this);
        gui.setFocusable(true);
        gui.addKeyListener(this);
    }

    /* report erroneous input */ 
    protected void reportError (String msg) {
        JOptionPane.showMessageDialog (gui, msg);
    }

    /* actionPerformed */ 
    public void actionPerformed(ActionEvent e) {
        long time = System.nanoTime(); 
        Object source = e.getSource();

        ip = gui.getInstructionsPanel(); 
        ibp = gui.getInterBlockPanel(); 
        sp = gui.getStimulusPanel();         
        sdp = gui.getSubjectDataPanel(); 
 
        Block block = exp.getCurrentBlock(); 

        // InstructionsPanel 
        if (source == ip.getNextButton()) { 
            int subjID = ip.getSubjectID(); 
            if (subjID == ip.INVALID_SUBJECT_ID || subjID < 1)
                reportError("The Participant ID should be a positive integer.");
            // TODO: check that subjID doesn't already exist
            else { 
                exp.setSubjectID(subjID); 
                gui.showCard("stimulus");
                exp.runExperiment();  
            }
        }

        // InterBlockPanel
        else if (source == ibp.getContinueButton()) { 
            block.initialiseBlock();
            sp.setSongNumberText(); 
            sp.defaultAnswers(); 
            gui.setAcceptingResponses(false); 
            gui.showCard("stimulus"); 
            exp.runExperiment();  
        }
         
       // SubjectDataPanel
        else if (e.getSource() == sdp.getFinishButton()) { 
            if (sdp.allDataEntered()) { 
                sdp.storeData(); 
                results.writeSubjectData(); 
                System.exit(0); 
            } else 
                reportError("You have not filled in all the information."); 
        }

        // StimulusPanel
        else if (source == sp.getPlayButton()) {
//             if (!exp.isRunning() && !exp.hasRun())
//                 exp.runExperiment(); 
//             else 
//                 reportError("You have already played the melody.");
        } else if (source == sp.getNextButton()) { 
            if (!exp.hasRun() || exp.isRunning()) 
                reportError("You haven't finished playing the melody yet."); 
            else if (sp.unansweredQuestions())
                reportError("There are unanswered questions."); 
            else {  
                // store results (and write to file)
                String answer1 = (String)(sp.getQ1Box().getSelectedItem()); 
                String answer2 = (String)(sp.getQ2Box().getSelectedItem()); 
                block.addMelodyQA("known", answer1); 
                block.addMelodyQA("liked", answer2); 
                block.storeMelodyResult();
                results.writeResults();
                // proceed to ... 
                String nextFile = block.nextFile();
                if (nextFile == null) { 
                    boolean nb = exp.nextBlock(); 
                    if (nb) { 
                        // ... next block of trials 
                        gui.getInterBlockPanel().setText(); 
                        gui.getInterBlockPanel().updateMessageDisplay(); 
                        gui.showCard("interblock"); 
                    } else {
                        // ... write results and subject questionnaire 
                        results.writeResults(); 
                        gui.showCard("subject"); 
                    }
                } else { 
                    // ... next melody within block
                    sp.setSongNumberText(); 
                    sp.defaultAnswers(); 
                    gui.setAcceptingResponses(false); 
                    block.initialiseBlock(); 
                    exp.runExperiment(); 
                }
            }
        } else { 
            JButton[] rButtons = sp.getResponseButtons(); 
            for (int i = 0; i < rButtons.length; i++) { 
                if (source == rButtons[i] && (exp.isRunning() || exp.hasRun()) && gui.getAcceptingResponses()) { 
                    block.addResponse(i+1, time); 
                    gui.setAcceptingResponses(false); 
                }
            }
        }
    }
    
    public void keyPressed(KeyEvent e)  {
        //System.out.println("Key pressed: " + e.getKeyChar());
        long time = System.nanoTime();

        Block block = exp.getCurrentBlock();
        sp = gui.getStimulusPanel();
        JButton[] rButtons = sp.getResponseButtons();

        for (int i = 0; i < rButtons.length; i++) {
            if ((exp.isRunning() || exp.hasRun()) && gui.getAcceptingResponses()) {
                //System.out.println("Char = " + Character.forDigit(i+1, 10));
                if (e.getKeyChar() == Character.forDigit(i+1, 10)) {
                    //System.out.println("Got rating: " + (i + 1));
                    block.addResponse(i+1, time);
                    gui.setAcceptingResponses(false); 
                }
                //else 
                //    block.addResponse(0, time);
            }
        }
    }

    public void keyReleased(KeyEvent e)  {
        // System.out.println("Key released: " + e.getKeyChar());
    }
    public void keyTyped(KeyEvent e)  {
        //System.out.println("Key typed: " + e.getKeyChar());
    }
}