package com.WorldOfBeverage.examples.VoyagerChat;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.TextField;
import java.awt.Button;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
import java.util.Enumeration;

import com.objectspace.voyager.VoyagerRuntimeException;

/**
  * Where ya type in your chat message.
  * @author Paul Reavis
  */
public class MessageConsole extends Container {

	//******** private state
	private TextField nameField;
	private TextField messageField;
	private Button sendButt;
	private Vector listeners;

	//******** constructors
	public MessageConsole() {
		nameField = new TextField();
		messageField = new TextField();
		sendButt = new Button("send");

		sendButt.addActionListener(new ButtonEar());

		setLayout(new BorderLayout());
		add(new Label("name: "), "West");
		add(nameField, "Center");
		add(sendButt, "East");
		add(messageField, "South");
		}

	//******** event registrars
	public synchronized void addChatListener(ChatListener listener) {
		if (listeners == null) listeners = new Vector();
		listeners.addElement(listener);
		}

	public synchronized void removeChatListener(ChatListener listener) {
		if (listeners == null) return;
		listeners.removeElement(listener);
		}

	//******** private methods
	private void dispatchEvent(ChatEvent event) {
		if (listeners == null) return;
		Vector temp;
		synchronized(this) {temp = (Vector)listeners.clone();}
		Enumeration e = temp.elements();
		while (e.hasMoreElements()) {
			ChatListener ear = (ChatListener)e.nextElement();

			// Hey, watch out for this! Got me good on my first release! You might be dealing with VChatListeners,
			// and they may not be there at all...
			try {
				ear.newMessage(event);
				}
			catch (VoyagerRuntimeException oopsie) {
				System.err.println("Exception during ChatEvent dispatch: " + oopsie + ". Removing listener.");
				removeChatListener(ear);
				}
			}
		}

	//******** private classes
	private class ButtonEar implements ActionListener {
    
		public void actionPerformed(ActionEvent event) {
			dispatchEvent(new ChatEvent(MessageConsole.this, nameField.getText(), messageField.getText()));
			}
		}

	}

