package pddemo;

import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
import com.ibm.aglet.util.*;
import com.ibm.agletx.util.SimpleItinerary;

import java.awt.*;
import java.io.Externalizable;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.io.IOException;
import java.lang.InterruptedException;
import java.net.*;
import java.util.Enumeration;

public class Comm extends Aglet {

    transient Frame f = new WinFrame(this);

    String message;
    String home = null;
    SimpleItinerary itinerary = null;

    public void onCreation(Object init) {
        itinerary = new SimpleItinerary(this);
        f.pack();
        f.resize(f.preferredSize());
        f.show();
        home = getAgletContext().getHostingURL().toString();
    }

    public boolean handleMessage(Message msg) {         
        if (msg.sameKind("Back")) {
            Back(msg);
        } else if (msg.sameKind("Launch")) {
            Launch(msg);
        } else if (msg.sameKind("Talk")) {
            Talk(msg);
        } else if (msg.sameKind("frame")) {
            frame(msg);
        } else {
            return false;
        }
        return true;
    }

    public void Back(Message msg) {
        setText("Back to Home");
        waitMessage(3 * 1000); 
        dispose();
    }

    public synchronized void Launch(Message msg) {
        String destination = (String)msg.getArg();        
        try {
            itinerary.go(destination, "Talk");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public void Talk(Message msg) {
        setText(message + "last for 5 seconds");
        waitMessage(5 * 1000);
        try {
            setText(home);
            itinerary.go(home, "Back");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public void frame(Message msg) {
        if (f == null) {
            f = new WinFrame(this);
            f.pack();
            f.resize(f.preferredSize());
        }
        f.show();
    }
}

class WinFrame extends Frame {

    private Comm aglet  = null;
    private Label Ldest         = new Label("Atp Address : ");
    private TextField dest      = new TextField(20);
    private Label Lmsg          = new Label("Message : ");
    private TextField msg       = new TextField(50);
    private Button go           = new Button("dispatch");
    private Button close        = new Button("close");    
    
    WinFrame(Comm aglet) {
        this.aglet = aglet;
        Decorate();
    }

    private void Decorate() {
    
    msg.setText(aglet.message);

    Panel Addr = new Panel();
	Panel Mess = new Panel();
	Panel Ctrl = new Panel();
	setLayout(new BorderLayout());
	
	setTitle("Message Handling Example");
	Addr.add(Ldest);
	Addr.add(dest);
	add("North",Addr);
	
	Mess.add(Lmsg);
	Mess.add(msg);
	add("Center",Mess);
		
	Ctrl.add(go);
	Ctrl.add(close);
	add("South",Ctrl);
    }

    public boolean handleEvent(Event ev) {
        if (ev.id == Event.WINDOW_DESTROY) {
            hide();
            return true;
        }
        return super.handleEvent(ev);
    }

    public boolean action(Event ev, Object obj) {
	    if (ev.target == go) {
	        
	        aglet.message = msg.getText();
	        try {
		        AgletProxy p = (AgletProxy)aglet.clone();
		        p.sendOnewayMessage(new Message("Launch", dest.getText()));
	           } catch (Exception e) {
		            e.printStackTrace();
	                }	        
	        //aglet.handleMessage(new Message("Launch", dest.getText()));
        } else if (ev.target == close) {
            hide();
        } else {
            return false;
        }
        return true;
    }
}
