import java.io.Serializable;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.awt.Component;
import java.awt.Rectangle;
import java.awt.Dimension;
import java.applet.Applet;
import sunw.beanbox.AppletSupport;

public class LoginApplet extends Applet implements Serializable {

    // Public 0-argument constructor

    public LoginApplet() {
        InputStream is = this.getClass().getResourceAsStream("LoginAppletData");
        if (is == null) {
            System.err.println("Could not locate the Applet data at LoginAppletData");
            throw new Error("Could not locate the Applet data at LoginAppletData");
        }
        this.setLayout(null);
        try {
            ObjectInputStream ois = new ObjectInputStream(is);
            Object[] data = (Object[]) ois.readObject();
            Rectangle[] boundsData = (Rectangle[]) ois.readObject();

            String id = (String) data[0];
            if (! id.equals("LoginApplet")) {
                throw new Error("Wrong data!");
            }
            Rectangle b = boundsData[0];
            mySize = new Dimension(b.width, b.height);
            this.setSize(mySize);

            login1 = (com.wiley.compbooks.vogel.chapter12.loginBean.Login) data[1];
            acquire(login1, boundsData[1]);
            juggler1 = (sunw.demo.juggler.Juggler) data[2];
            acquire(juggler1, boundsData[2]);
            explicitButton1 = (sunw.demo.buttons.ExplicitButton) data[3];
            acquire(explicitButton1, boundsData[3]);
        } catch (Exception ex) {
            System.err.println("trouble reading from serialized data: "+ex);
                throw new Error("trouble reading from serialized data: "+ex);
            }
        }

        public Dimension getPreferredSize() {
            return mySize;
        }

        // support code
        // acquire a bean
        private void acquire(Object bean, Rectangle boundsData) {
            if (!(bean instanceof Component)) {
                return;
            }
            if (bean instanceof Applet) {
                AppletSupport.assignStub((Applet) bean,
                    myLoader,
                bean.getClass());
            }

            add((Component) bean);
            if (boundsData != null) {
                ((Component) bean).setBounds(boundsData);
            }
            ((Component)bean).invalidate();	// not needed?

            if (bean instanceof Applet) {
                // Start the Applet
                ((Applet)bean).start();
            }
        }

        // Serialization code
        private void readObject(java.io.ObjectInputStream ois)
            throws java.lang.ClassNotFoundException,
            java.io.IOException
        {
            Object[] data = (Object[]) ois.readObject();
            mySize = (Dimension) ois.readObject();

            String id = (String) data[0];
            if (! id.equals("LoginApplet")) {
                throw new Error("Wrong data!");
            }
            login1 = (com.wiley.compbooks.vogel.chapter12.loginBean.Login) data[1];
            acquire(login1, null);
            juggler1 = (sunw.demo.juggler.Juggler) data[2];
            acquire(juggler1, null);
            explicitButton1 = (sunw.demo.buttons.ExplicitButton) data[3];
            acquire(explicitButton1, null);
        }

        private void writeObject(java.io.ObjectOutputStream oos)
            throws java.io.IOException
        {
            Object data[] = new Object[4];
            data[0] = "LoginApplet";
            data[1] = login1;
            data[2] = juggler1;
            data[3] = explicitButton1;
            oos.writeObject(data);
            oos.writeObject(mySize);
        }


        // The fields used to hold the beans
        private com.wiley.compbooks.vogel.chapter12.loginBean.Login login1;
        private sunw.demo.juggler.Juggler juggler1;
        private sunw.demo.buttons.ExplicitButton explicitButton1;

        // the loader so we can locate the resource file
        private ClassLoader myLoader = this.getClass().getClassLoader();

        private Dimension mySize;
    }
