package programming101.calculBeanz;

import java.awt.Dimension;
import java.awt.TextField;
import java.awt.event.TextEvent;
import java.awt.event.TextListener;
import FR.essi.sander.graphix.mvc.Control;
import FR.essi.sander.graphix.mvc.ControlEvent;
import FR.essi.sander.graphix.mvc.ControlEventImpl;
import FR.essi.sander.graphix.mvc.ControlImpl;
import FR.essi.sander.graphix.mvc.ControlListener;
import FR.essi.sander.graphix.mvc.ModelEvent;
import FR.essi.sander.graphix.mvc.ModelListener;


/**
	* Entry of new values and display of cumulative values.
	* This is the V-component of the Model-View-Control (MVC) design
	* pattern.
	* <P>
	* This class
	* <UL>
	* <LI><CODE>extends java.awt.TextField</CODE><BR>
	* in order to be a visible bean
	* <LI><CODE>implements FR.essi.sander.graphix.mvc.Control</CODE><BR>
	* guarantees code implementing management for <CODE>ControlListener</CODE>s
	* (the actual management is delegated to a <CODE>ControlImpl</CODE> instance)
	* <LI><CODE>implements FR.essi.sander.graphix.mvc.ModelListener</CODE><BR>
	* guarantees code for the <CODE>update</CODE> method which is invoked by model events
	* <LI><CODE>implements java.awt.event.TextListener</CODE><BR>
	* guarantees code for the <CODE>textValueChanged</CODE> method which is invoked by text events
	* </UL>
	*
	* @author ©1998 Peter T. Sander
	* @version 1.2  (6/04/98)
	* @since 15/03/98
	*/
	
public class DisplayField extends TextField 
		implements Control, ModelListener, TextListener {
	// visible attributes
	private int width = 64;
	private int height = 32;
	// other variables
	private ControlImpl controlImpl = new ControlImpl();  // manages listeners

	/**
		* No-args constructor (needed for JavaBeans).  
		* Registers itself as a listener for text events.
		*/
	public DisplayField() {
		super();
		addTextListener(this);  // listens for changes to the text field
	}

  /**
		* Registers another listener to be informed when text is entered.
		* The actual management is delegated to the <CODE>ControlImpl</CODE> object.
		*
		* @param listener listener to add
		*/
	public void addControlListener(ControlListener listener) {
		controlImpl.addControlListener(listener);
	}
	
  /**
		* Removes a listener.
		* The actual management is delegated to the <CODE>ControlImpl</CODE> object.
		*
		* @param listener listener to remove
		*/
	public void removeControlListener(ControlListener listener) {
		controlImpl.removeControlListener(listener);
	}
	
  /**
		* Fires a text event to registered listeners.
		* The actual management is delegated to the <CODE>ControlImpl</CODE> object.
		*
		* @param te text event encapsulating relevant text information
		*/
	public void fireControlEvent(ControlEvent te) {
  	controlImpl.fireControlEvent(te);
	}
	
	/**
		* Method guaranteed by implementing the <CODE>TextListener</CODE>
		* interface.  Invoked by the underlying windowing system.
		*
		* @param te a text field event
		*/
	public void textValueChanged(TextEvent te) {
		fireControlEvent(new ControlEventImpl(this));
	}
	
	/**
		* Determines size of display area.
		*
		* @return dimension of display area
		*/
	public Dimension getPreferredSize() {
		return new Dimension(width, height);
	}
	
	/**
		* Method guaranteed by implementing the <CODE>ModelListener</CODE>
		* interface.  Invoked by any models which have registered this
		* text field control as interested by their events in response to a new
		* calculation.  Updates the display.
		*
		* @param me encapsulates information about the calculation event
		*/
	public void update(ModelEvent me) {
		setText(new Double(((Calculator)me.getModel()).getCumulator()).toString());
	}
}
