import javax.media.*;
import javax.media.util.*;
import javax.media.format.*;
import javax.media.bean.playerbean.*;
import javax.media.control.*;


import org.mozilla.pluglet.*;
import org.mozilla.pluglet.mozilla.*;
import org.mozilla.pluglet.mozilla.PlugletTagInfo2;
import java.awt.*;
import java.awt.event.*;
import java.awt.print.*;
import java.io.*;
import java.util.*;


public class JMPlayer implements PlugletFactory {
    public JMPlayer() {
    }

    public Pluglet createPluglet(String mimeType) {
 	return new Player();
    }

    public void initialize(PlugletManager manager) {	
    }

    public void shutdown() {
    }
}

class Player implements Pluglet, ControllerListener {
    PlugletPeer peer;
    Dimension defaultSize;
    Frame frm;
    int w, h;
    MediaPlayer player = null;

    Panel panel;

    public synchronized void controllerUpdate(ControllerEvent ce) {
	if(ce instanceof RealizeCompleteEvent) {
	    player.prefetch();
	}
	if(ce instanceof PrefetchCompleteEvent) {
	    Dimension dim = player.getPreferredSize();
	    frm.pack();
	    panel.setSize(dim);
//	    player.setBounds(0, 0, w, h);
	    frm.setSize(defaultSize);
	    player.start();
	    frm.show();
	}
    }

    public Player() {
    }

    public void initialize(PlugletPeer peer) {
	PlugletTagInfo2 info = (PlugletTagInfo2)peer.getTagInfo();
	w = info.getWidth();
	h = info.getHeight();
	defaultSize = new Dimension(w, h);
	this.peer = peer;
    }

    public boolean playFile(String url) {
	player.setMediaLocator(new MediaLocator(url));
	if(player.getPlayer() == null) {
	    return false;
	} else {
	    player.addControllerListener(this);
	    player.realize();
	}
	return true;
    }
	
    public void start() {
	player = new MediaPlayer();
	panel = new Panel();
	panel.add(player);
    }

    public void stop() {
	(new Exception()).printStackTrace();
	player.stop();
	player.deallocate();
	player.close();
    }

    public void destroy() {
    }

    public PlugletStreamListener newStream() {
	org.mozilla.util.Debug.print("--TestInstance.newStream\n");
	JMPlayerStreamListener listener = new JMPlayerStreamListener();
	listener.setPlayer(this);
	return listener;
    }

    public void setWindow(Frame frame) {
	if(frame == null) {
	    return;
	}
	if(panel == null) {
	    System.out.println("++ Initialize failed.");
	    return;
	}
//	PlugletTagInfo2 info = (PlugletTagInfo2)peer.getTagInfo();
//	defaultSize = new Dimension(info.getWidth(), info.getHeight());
	frame.setSize(defaultSize);
	frame.setLayout(new BorderLayout());
	frame.add(panel);
	frm=frame;
    }

    public void print(PrinterJob printerJob) {
    }
}

class JMPlayerStreamListener implements PlugletStreamListener {
    Player jmp;
    int total=0;

    public JMPlayerStreamListener() {
    }

    public void onStartBinding(PlugletStreamInfo streamInfo) {


	if(!jmp.playFile(streamInfo.getURL())) {
    	    System.out.println("++ Error starting player ");
    	    return;
	} 

    }

    public void setPlayer(Player jmp) {
	this.jmp = jmp;
    }

    public void onDataAvailable(PlugletStreamInfo streamInfo, InputStream input,int  length) {
    }

    public void onFileAvailable(PlugletStreamInfo plugletInfo, String fileName) {
    }

    public void onStopBinding(PlugletStreamInfo plugletInfo,int status) {
	    System.out.println("++ On stop binding.");
    }

    public int  getStreamType() {
	return 1;
    }

}