package com.WorldOfBeverage.examples.VoyagerChat;

import java.awt.Frame;
import java.awt.Window;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import com.objectspace.voyager.Voyager;
import com.objectspace.voyager.VoyagerException;
import com.objectspace.voyager.VObject;

/**
 * Starts up the whole show.
 * @author Paul Reavis
 */
public class ChatApp {

	//******** enter here
	public static void main(String[] argv) {
		try {
			if (argv.length < 1) {
				System.out.println("Usage: ChatApp <portnumber>");
				System.exit(1);
				}
			
			String port = argv[0];
			Voyager.startup((new Integer(port)).intValue());
			ChatApp app = new ChatApp();
			}
		catch (Exception oopsie) {
			oopsie.printStackTrace(System.err);
			System.exit(0);
			}

		}

	//******** state
	private VChatApp connectedTo;
	private VChatApp myVSelf;
	private Connector connector;
	private ChatLog log;
	private ChatListener vChatListener;
	private MessageConsole console;

	//******** constructors
	public ChatApp() {
		try {
			myVSelf = (VChatApp)VObject.forObject(this);
			myVSelf.setAlias("chatApp");

			Frame framed = new Frame("Chatterbox");
			framed.addWindowListener(new Closer());
		
			connector = new Connector();
			log = new ChatLog();
			vChatListener = (ChatListener)VObject.forObject(log);
			console = new MessageConsole();
		
			// set up a listener for the connector
			ConnectionListener connectEar = new ConnectionListener() {
				public void handleConnection(ConnectionEvent event) {
					if (event.isConnected() && (event.getConnectedTo() instanceof VChatApp)) 
						connect((VChatApp)event.getConnectedTo());
					else
						connect(null);
					}
				};
			connector.addConnectionListener(connectEar);

			// and need to log my own messages
			console.addChatListener(log);

			framed.add(connector, "North");
			framed.add(log.getGUI(), "Center");
			framed.add(console, "South");
			framed.setSize(640,480);
			framed.show();
			}
		catch(VoyagerException oopsie) {
			// cop out, I know
		        oopsie.printStackTrace(System.err);
			System.exit(1);
			}
		}

	//******** primary methods
	public void connect(VChatApp connectTo) {
		// don't connect if already connected
		if (connectTo != null && connectTo.equals(connectedTo)) return;

		// close old connection
		if (connectedTo != null) {
			try {
				console.removeChatListener(connectedTo.getVChatListener());
				connectedTo.connect(null);
				}
			catch (VoyagerException oopsie) {
				// oh well...
				}
			}

		// make new connection
		connectedTo = connectTo;
		if (connectedTo != null) {
			try {
				console.addChatListener(connectedTo.getVChatListener());
				connectedTo.connect(myVSelf);
				}
			catch (VoyagerException oopsie) {
				// oh well...
				connect(null);
				}
			}

		}

	//******** accessors
	public ChatListener getVChatListener() {
		return vChatListener;
		}
	}

class Closer extends WindowAdapter {
	public void windowClosing(WindowEvent e) {
		((Window)e.getSource()).dispose();
		}
	}


