/*
 * Copyright (c) 1995-1997 Sun Microsystems, Inc. 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. Please refer to the file "copyright.html"
 * for further important copyright and licensing information.
 *
 * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
 * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
 * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
 * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
 * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
 */
package bingo.game;

import java.net.*;
import java.rmi.*;
import java.awt.*;
import java.awt.event.*;
import com.sun.java.swing.*;
import bingo.shared.*;

public class BINGO {
    protected static String windowName = "BINGO Server";
    protected static String controlPaneTitle = "Game Parameters";
    protected static String statusPaneTitle = "Game Status";
    protected static boolean DEBUG = false;

    public static void main(String[] args) {
        String hostname = null;
	RingMaster ringMaster = null;

	if (DEBUG) {
	    System.out.println("In BINGO main method.");
	}
	System.setSecurityManager(new RMISecurityManager());

	if (DEBUG) {
	    System.out.println("Just set security manager.");
	    System.out.println("About to try connecting.");
	}
	try {
	    ringMaster = new RingMaster();

            RegistrarImpl registrar = new RegistrarImpl(ringMaster);
	    hostname = InetAddress.getLocalHost().getHostName();
	    Naming.rebind("//" + hostname + "/Registrar", registrar);
	} catch (java.rmi.ConnectException e) {
	    ErrorMessages.fatalError("You must run rmiregistry before "
				     + "starting the BINGO server.",
				     e);
	} catch (java.net.UnknownHostException e) {
	    ErrorMessages.fatalError("Can't get current host.", e);
	} catch (java.rmi.RemoteException e) {
	    ErrorMessages.fatalError("Can't create the registrar.", e);
	} catch (java.net.MalformedURLException e) {
	    ErrorMessages.fatalError("Can't bind the registrar.", e);
	} catch (java.io.IOException e) {
	    ErrorMessages.fatalError("Can't open multicast socket.", e);
	} catch (Exception e) {
	    ErrorMessages.fatalError("Unknown exception on server startup", e);
	}

	if (DEBUG) {
	    System.out.println("Successfully connected.");
	}
        JFrame frame = new JFrame(windowName);
	if (DEBUG) {
	    System.out.println("Created JFrame.");
	}
	Container container = frame.getContentPane();
	if (DEBUG) {
	    System.out.println("Got content pane.");
	}
	//b.setHgap(5); //use rigid area instead.
	//b.setVgap(5); //use rigid area instead.
	ControlPane controlPane = new ControlPane(hostname, ringMaster);
	if (DEBUG) {
	    System.out.println("Created control pane.");
	}

	OverallStatusPane statusPane = new OverallStatusPane();
	if (DEBUG) {
	    System.out.println("Created status pane.");
	}
	statusPane.setBorder(BorderFactory.createTitledBorder(
				statusPaneTitle));

        frame.addWindowListener(new WindowAdapter() {
	        public void windowClosing(WindowEvent e) {
		    System.exit(0);
		} 
	    });
	if (DEBUG) {
	    System.out.println("About to call pack.");
	}

	container.setLayout(new BoxLayout(container, BoxLayout.Y_AXIS));
	controlPane.setAlignmentX(0.5f);
	container.add(controlPane);
	statusPane.setAlignmentX(0.5f);

	//Does the following work?  We want the table to be able
	//to take up as much space as it can.
	statusPane.setMaximumSize(new Dimension(Short.MAX_VALUE,
						Short.MAX_VALUE));
	container.add(statusPane);
        frame.pack();
	if (DEBUG) {
	    System.out.println("About to call show.");
	}
        frame.setVisible(true);
	if (DEBUG) {
	    System.out.println("At end of BINGO.main.");
	}
    }
}
