package gui;

import java.awt.*;
import javax.swing.*;
import javax.swing.border.Border;

import calc.Registers;

/** The JFrame window that holds the calculator.
 * @author Gary T. Leavens
 *
 */
public class CalculatorFrame extends JFrame {
    
    /** Initialize this frame. */
    public CalculatorFrame() {
        setTitle("Formula-Register Calculator");
        setSize(WIDTH, HEIGHT);
        
        Container contentPane = getContentPane();
        GridBagLayout layout = new GridBagLayout();
        contentPane.setLayout(layout);
        
        // create objects
        JTextField outputText = new JTextField(25);
        Border lined = BorderFactory.createLineBorder(Color.BLUE);
        Border outputTitle = BorderFactory.createTitledBorder(lined, "Output");
        outputText.setBorder(outputTitle);
        
        // add labels
        JLabel nfLabel = new JLabel("Named Formulas");
        JLabel regsLabel = new JLabel("Registers");
        JLabel fcLabel = new JLabel("Formula Composition");
        
        for (int i = 0; i < 10; i++) {
            regLabels[i] = new JLabel("r" + i);
            regTexts[i] = new JTextField(25);
            regTexts[i].setEditable(true);
            regTexts[i].setHorizontalAlignment(JTextField.RIGHT);
            
            // add listener for events on this textfield
            RegisterInputListener ril
            	= new RegisterInputListener(regTexts[i], i);
            regTexts[i].addActionListener(ril);
            regTexts[i].addFocusListener(ril);
            
        }
        
        // add objects to layout
        
        GridBagConstraints constraints = new GridBagConstraints();
        constraints.fill = GridBagConstraints.NONE;
        constraints.anchor = GridBagConstraints.CENTER;
        
        add(outputText, constraints, 0, 0, 7, 1);
        add(nfLabel, constraints, 0, 1, 7, 1);
        add(regsLabel, constraints, 0, 3, 7, 1);
        add(fcLabel, constraints, 0, 9, 7, 1);
        
        for (int i = 0; i < 10; i=i+2) {
            constraints.anchor = GridBagConstraints.EAST;
            int row = 4+i/2;
            add(regLabels[i], constraints, 0, row, 1, 1);
            add(regLabels[i+1], constraints, 4, row, 1, 1);
            constraints.anchor = GridBagConstraints.WEST;
            constraints.fill = GridBagConstraints.NONE;
            add(regTexts[i], constraints, 1, row, 2, 1);
            add(regTexts[i+1], constraints, 5, row, 2, 1);
        }
        
    }
    public static final int WIDTH = 800;
    public static final int HEIGHT = 600;
    
    /** the register labels */
    private JLabel[] regLabels = new JLabel[Registers.NUM_REGS];
    /** the register text fields */
    private JTextField[] regTexts = new JTextField[Registers.NUM_REGS];

   
    /**
     * Add the given component to the given grid bag layout.
     * This simplifies otherwise tedious code.  See Core Java 2,
     * Volume 1, pp. 521-522.
     * @param c the component to add
     * @param constraints the grid bag constraints object to use
     * @param x the gird x position
     * @param y the grid y position
     * @param w the grid width (columns spanned)
     * @param h the grid height (rows spanned)
     */
    private void add(Component c, GridBagConstraints constraints,
                     int x, int y, int w, int h)
    {
        constraints.gridx = x;
        constraints.gridy = y;
        constraints.gridwidth = w;
        constraints.gridheight = h;
        getContentPane().add(c, constraints);  
    }
    
    // The output text field.
    private JTextField outputText;
}
