
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.*;

/**
 * Printer01 is a component which shows an array of doubles converted 
 * by a display component into a certain format plus a binary operator
 * representation. The length of the array is 100.
 *
 * <br><br><a href=../source/polarDust/calculator/Printer01.java>
 * The source code.</a>
 *
 * @version 0.9, 1996.06.04
 * @author Sorin Lazareanu
 */

public class Printer01
	extends Canvas
	implements CalcConstants {
	static final int PRN_MAX_LINES = 100;
	String lines[] = new String[ PRN_MAX_LINES ];
	String text = "", op = "";

	/**
	* Constructs a printer.
	*/
	public Printer01() {
		super();
		int i;

		for (i = PRN_MAX_LINES - 1; i >= 0; i--) {
			lines[ i ] = "";
		}
		lines[ 0 ] = "                   ";
	}

	/**
	* Paints the component. Uses update.
	* @see Printer01.update
	*/
	public void paint(Graphics aGraphics) {
		update(aGraphics);
	}

	/**
	* Paints the component uses double buffering.
	* <br><br><a href=../source/polarDust/calculator/Printer01.java>
	* The source code.</a>
	*/
	public synchronized void update(Graphics aGraphics) {
		int iStringWidth, iFontNewSize, i;
		int iMaxWidth = size().width - 2;
		int iFontHeight;
		String aLine = new String("                 ");
		Dimension aDimension = size();
		FontMetrics currentFontMetrics;
		Dimension bufferDimension = new Dimension(0, 0);
		Image bufferImage;
		Graphics bufferGraphics;

		bufferDimension = size();
	 	bufferImage = createImage(bufferDimension.width, bufferDimension.height);
		bufferGraphics = bufferImage.getGraphics();
		bufferGraphics.setColor(new Color(255, 255, 210));
		bufferGraphics.fillRect(0, 0, aDimension.width, aDimension.height);
		bufferGraphics.setColor(Color.red);
		bufferGraphics.drawRect(0, 0, aDimension.width - 1, aDimension.height - 1);
		bufferGraphics.setFont(new Font(COURIER, Font.BOLD, 12));
		iStringWidth = bufferGraphics.getFontMetrics().stringWidth(aLine);
		if (iStringWidth != 0) {
			iFontNewSize = bufferGraphics.getFont().getSize() *
				iMaxWidth / iStringWidth + 5;
			do { // we must loop here since the font size is not a precise defined measure.
				iFontNewSize--;
				bufferGraphics.setFont(new Font(COURIER, Font.BOLD, iFontNewSize));
				currentFontMetrics = bufferGraphics.getFontMetrics();
			   	iStringWidth = currentFontMetrics.stringWidth(aLine);
				iFontHeight = currentFontMetrics.getHeight();
			} while (iStringWidth > iMaxWidth);
			for (i = PRN_MAX_LINES - 1; i >= 0; i--) {
				if (aDimension.height - iFontHeight * (i + 1) > 0) {
					bufferGraphics.setColor(Color.blue);
					bufferGraphics.drawLine(
						0,
						bufferDimension.height - iFontHeight * (i + 1) + 2,
						bufferDimension.width,
						bufferDimension.height - iFontHeight * (i + 1) + 2
					);
					bufferGraphics.setColor(Color.black);
					bufferGraphics.drawString(lines[ i ], 3, aDimension.height - iFontHeight * i - 2 );
				}
			}
			aGraphics.drawImage(bufferImage, 0, 0, this);
		}
	}

	public Dimension preferredSize() {
		return new Dimension(155, 264);
	}

	public Dimension minimumSize() {
		return preferredSize();
	}

	/**
	* Advances the "paper tape" one row and prints a number.
	*/
	public void showResult(String aResult) {
		int i;

		for (i = PRN_MAX_LINES - 1; i > 0; i--) {
			lines[ i ] = lines [ i - 1 ];
		}
		lines[ 0 ] = aResult + " ";
		repaint();
	}

	/**
	* Prints an operator.
	*/
	void showOp(String anOperator) {
		lines[ 0 ] = lines[ 0 ] + anOperator;
		repaint();
	}
}


