package lectures.mvc.toolkit;
import util.annotations.WebDocuments;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JTextField;

import lectures.interfaces.BMISpreadsheet;
/**
 * As we see below, ABMISpreadSheetController is not only a controller for 
 * the model, but an observer of the editable widgets, which are not models!
 * 
 * Here, a listener == observer
 * 
 * Study the code below.
 * 
 * (T/F) ABMISpreadsheetController is an observer of a JSlider widget.
 * 
 * (T/F) ABMISpreadsheetController is an observer of a JTextField widget.
 * 
 * 
 * Put a break point at the start of actionPerformed so you can observe the stack
 * when it is hit.
 * 
 * Debug-run MVCToolkitMain.
 * 
 * Change the slider in the custom UI.
 * 
 * Edit the height field in the custom UI.
 * 
 * (T/F) The actionPerformed method is called in ABMISpreadsheetController
 *  each time a new character is input in the height field.
 * 
 * (T/F) The actionPerformed method is called in ABMISpreadsheetController
 *  when the user presses ENTER to finish editing the height field.
 *  
 * (T/F) The actionPerformed method is called in ABMISpreadsheetController
 *  when the slider is dragged.
 *  
 * (T/F) The actionPerformed method is called in ABMISpreadsheetController:
 *  when the the use releases the slider after dragging it.
 *  
 * (T/F) When the height field is changed, actionPeformed calls setHeight() in
 * the model.
 * 
 * (T/F) When the height field is changed, actionPeformed calls getHeight() in
 * the model.
 * 
 * (T/F) When the height field is changed, actionPeformed calls getBMI() in
 * the model.
 * 
 * (T/F) When the height field is changed, the view calls getBMI() in the model.
 * 
 * (T/F) When the height field is changed, propertyChange() is called in the view.
 *
 *  
 */
@WebDocuments({"Lectures/MvcToolkit.pptx", "Lectures/MvcToolkit.pdf", "Videos/MvcToolkit.avi"})
public class ABMISpreadsheetController 
    implements ActionListener { // The observer interface defined by the editable widgets
    JTextField height, weight;
    BMISpreadsheet bmiSpreadsheet;
    public ABMISpreadsheetController (BMISpreadsheet theBMISpreadsheet, JTextField theHeight, JTextField theWeight) {
        height = theHeight;
        weight = theWeight;
        bmiSpreadsheet = theBMISpreadsheet;
        
        /*
         *  Making this object an observer of two different observable widgets
         */
        height.addActionListener(this);
        weight.addActionListener(this);
    }
    /*
     *  Method called on an observer of a textfield when a user enters new 
     *  text and presses ENTER.
     */
    public void actionPerformed(ActionEvent event) {
    
        JTextField source = (JTextField) event.getSource();
        String text = source.getText();
        double val = Double.parseDouble(text);
        // Depending on which observable notified, do different things
        if (source == height) {
            
            /*
             * Step into this call to trace the actions that lead to a 
             * new BMI value being displayed by the progress bar and slider
             */
            bmiSpreadsheet.setHeight(val);
            
        } else {
            bmiSpreadsheet.setWeight(val);
        }       
    }   
    
}