
package polarDust.calculator;

/*
 * Copyright (c) 1996 Sorin Lazareanu, All Rights Reserved.
 *
 * Permission to use, copy, modify, and distribute this software
 * and its documentation for NON-COMMERCIAL purposes and without
 * fee is hereby granted provided that this copyright notice
 * appears in all copies.
 *
 */

import java.awt.*;
import java.applet.*;
import java.net.*;

/**
 * NumKeypadPanel is a container for a NumKeypad component.
 *
 * <br><br><a href=../source/polarDust/calculator/NumKeypadPanel.java>
 * The source code.</a>
 *
 * @version 0.9, 1996.06.04
 * @author Sorin Lazareanu
 */

public class NumKeypadPanel extends Panel implements CalcConstants {
	Button btn7, btn8, btn9;
	Button btn4, btn5, btn6;
	Button btn1, btn2, btn3;
	Button btn0, btnDot;
	CalcCPU cpu;
	Dimension lastDimension = new Dimension(0,0);
	CalculatorApplet parentApplet = null;

	/**
	* Constructs a panel with the following buttons: 0, ..., 9, dot(.).
	* @param aCPU the processor where the messages are sent.
	* @param parentApplet used for sound related messages.
	* @see Processor01
	* @see CalculatorApplet
	*/
	public NumKeypadPanel(CalcCPU aCPU, CalculatorApplet parentApplet) {
		cpu = aCPU;
		this.parentApplet = parentApplet;
		commonInit();
	}

	/**
	* Constructs a panel with the following buttons: 0, ..., 9, dot(.).
	* @param aCPU the processor where the messages are sent.
	* @see Processor01
	*/
	public NumKeypadPanel(CalcCPU aCPU) {
		cpu = aCPU;
		commonInit();
	}

	private void commonInit() {

		btn7= new Button(STR_7);
		btn8= new Button(STR_8);
		btn9= new Button(STR_9);

		btn4= new Button(STR_4);
		btn5= new Button(STR_5);
		btn6= new Button(STR_6);

		btn1 = new Button(STR_1);
		btn2 = new Button(STR_2);
		btn3 = new Button(STR_3);

		btn0 = new Button(STR_0);
		btnDot = new Button(STR_DOT);
	}

	/**
	* Configures panel's layout.
	*/
	public void configure() {

		GridBagLayout gridBag = new GridBagLayout();
		GridBagConstraints c = new GridBagConstraints();
		GridBagLayoutHelper aHelper;

		setLayout(gridBag);
		c.fill = GridBagConstraints.BOTH;
		c.anchor = GridBagConstraints.CENTER;
		c.insets = new Insets(2, 2, 2, 2);
		aHelper = new GridBagLayoutHelper(this, gridBag, c, 3, 4);
		setFont(new Font(HELVETICA, Font.PLAIN, 14));

		aHelper.addComponent(0, 0, 1, 1, btn7);
		aHelper.addComponent(1, 0, 1, 1, btn8);
		aHelper.addComponent(2, 0, 1, 1, btn9);

		aHelper.addComponent(0, 1, 1, 1, btn4);
		aHelper.addComponent(1, 1, 1, 1, btn5);
		aHelper.addComponent(2, 1, 1, 1, btn6);

		aHelper.addComponent(0, 2, 1, 1, btn1);
		aHelper.addComponent(1, 2, 1, 1, btn2);
		aHelper.addComponent(2, 2, 1, 1, btn3);

		aHelper.addComponent(0, 3, 2, 1, btn0);
		aHelper.addComponent(2, 3, 1, 1, btnDot);
	}

	/**
	* Responds to button actions.
	* @see Event
	* @see Object
	*/
	public boolean action(Event evt, Object arg) {

		if (evt.target == btn0) { digit(0); return true; }
		if (evt.target == btn1) { digit(1);	return true; }
		if (evt.target == btn2) { digit(2); return true; }
		if (evt.target == btn3) { digit(3); return true; }
		if (evt.target == btn4) { digit(4); return true; }
		if (evt.target == btn5) { digit(5); return true; }
		if (evt.target == btn6) { digit(6); return true; }
		if (evt.target == btn7) { digit(7); return true; }
		if (evt.target == btn8) { digit(8); return true; }
		if (evt.target == btn9) { digit(9); return true; }
		if (evt.target == btnDot) { dot(); return true; }
		return false;
	}

	/**
	* Dispatch unintercepted key down events.
	*/
	public boolean dispatchKeyDown(Event evt, int iKey) {
		return keyDown(evt, iKey);
	}

	/**
	* Dispatch unintercepted key down events.
	*/
	public boolean dispatchKeyUp(Event evt, int iKey) {
		return keyUp(evt, iKey);
	}

	/**
	* Responds to key actions.
	* @see Event
	*/
	public boolean keyDown(Event evt, int iKey) {
		if (evt.key == CALC_KEY_0) { digit(0); return true; };
		if (evt.key == CALC_KEY_1) { digit(1); return true; };
		if (evt.key == CALC_KEY_2) { digit(2); return true; };
		if (evt.key == CALC_KEY_3) { digit(3); return true; };
		if (evt.key == CALC_KEY_4) { digit(4); return true; };
		if (evt.key == CALC_KEY_5) { digit(5); return true; };
		if (evt.key == CALC_KEY_6) { digit(6); return true; };
		if (evt.key == CALC_KEY_7) { digit(7); return true; };
		if (evt.key == CALC_KEY_8) { digit(8); return true; };
		if (evt.key == CALC_KEY_9) { digit(9); return true; };
		return false;
	}

	/**
	* Responds to key actions.
	* @see Event
	*/
	public boolean keyUp(Event evt, int iKey) {
		if (evt.key == CALC_KEY_DOT) { dot(); return true; };
		return false;
	}

	private void digit(int iDigit) {
		if (parentApplet != null) parentApplet.digit(iDigit);
		cpu.digit(iDigit);
	}

	private void dot() {
		if (parentApplet != null) parentApplet.dot();
		cpu.dot();
	}

	/**
	* Paints the panel.
	* @see Graphics
	*/
	public void paint(Graphics aGraphics) {
		if (lastDimension.width != size().width || lastDimension.height != size().height) {
			int iFontHeight = Math.min( size().height / 8, size().width / 6 );
			Font stdFont = new Font(HELVETICA, Font.PLAIN, iFontHeight);
			btn1.setFont(stdFont);
			btn2.setFont(stdFont);
			btn3.setFont(stdFont);
			btn4.setFont(stdFont);
			btn5.setFont(stdFont);
			btn6.setFont(stdFont);
			btn7.setFont(stdFont);
			btn8.setFont(stdFont);
			btn9.setFont(stdFont);
			btn0.setFont(stdFont);
			btnDot.setFont(stdFont);
			lastDimension = size();
		}
		super.paint(aGraphics);
	}

}

