import java.applet.Applet;
import java.awt.
*;
import java.awt.
event.*;
import java.lang.String;
import java.net.URL;
import java.net.MalformedURLException;
import java.io.File;
import java.io.IOException;
import java.util.Properties;
import javax.media.
*;

import com.sun.media.
*;

/**
  * This is a Java Applet that demonstrates how to create a simple
  * media player with a media event listener. It will play the
  * media clip right away and continuously loop.
  * 
  * <!-- Sample HTML
  * <applet code=TVApplet width=587 height=510>
  * <param name=file value="sun.avi">
  * </applet>
  * -->
  
*/
public class TVApplet extends Applet implements ControllerListener 
{
    
private String fileToPlay = "";//要播放的文件(完整的路径名称)
    
// media Player
    Player player = null;//播放器
    
// component in which video is playing
    Component visualComponent = null;//可视组件
    
// controls gain, position, start, stop
    Component controlComponent = null;//控制组件
    
// displays progress during download
    Component progressBar = null;//进度条
long CachingSize = 0L;  
    Panel panel 
= null;
    Panel vPanel 
= null;
    
int controlPanelHeight = 0;
    Image [] showmeImage 
= null;
    Image [] zoomImageUp 
= null;
    Image [] zoomImageDn 
= null;
    CPanel cPanel 
= null;
    ZoomButton zoomButton;
    
    final 
int [] VLEFT = {59120};
    final 
int [] VTOP  = {3367};
    final 
int [] VRIGHT = {59 + 175120 + 351};
    final 
int [] VBOTTOM = {17367 + 287 + 11};
    final 
int [] WIDTH = {176352};
    final 
int [] HEIGHT = {138288};

    final 
int HALF = 0;//小屏
    final int FULL = 1;//全屏

    
int tSize = 0;
    
    
/**
     * Read the applet file parameter and create the media 
     * player.
     
*/
    
public void init() 
    {

    setLayout(
null);
    setBackground(Color.white);
    
    cPanel 
= new CPanel( );
    add(cPanel);

    
// Figure out what size to use
    
// The applet tag takes an optional parameter "SIZE" whose value
    
// can be "half" or "full"
    
// Eg. <param name=size value=half>
    
    String szSize 
= "full" ;//getParameter("SIZE");
    
//屏幕一般是1024*768
    if (Toolkit.getDefaultToolkit().getScreenSize().getWidth() > 800)
        tSize 
= 1;
    
else
        tSize 
= 0;
    
    
if (szSize != null)
    {
        
if (szSize.toLowerCase().equals("full"))
            tSize 
= 1;
        
else if (szSize.toLowerCase().equals("half"))
            tSize 
= 0;
    }

    cPanel.setBounds(VLEFT[tSize], VTOP[tSize], WIDTH[tSize], HEIGHT[tSize]);
//设置播放器上部分的窗口矩阵的位置

    
// Get the images
    showmeImage = new Image[FULL + 1];
    zoomImageUp 
= new Image[FULL + 1];
    zoomImageDn 
= new Image[FULL + 1];
    
    showmeImage[HALF] 
= getImage(getDocumentBase(), "ShowMeS2.jpg");
    showmeImage[FULL] 
= getImage(getDocumentBase(), "ShowMeS.jpg");
    zoomImageUp[HALF] 
= getImage(getDocumentBase(), "InUp.gif");
    zoomImageDn[HALF] 
= getImage(getDocumentBase(), "InDn.gif");
    zoomImageUp[FULL] 
= getImage(getDocumentBase(), "OutUp.gif");
    zoomImageDn[FULL] 
= getImage(getDocumentBase(), "OutDn.gif");
    addZoomButton();

    
// URL for our media file
    URL url = null;

    
this.fileToPlay = "d://rr.mp3";
    File fileToPlay 
= new File(this.fileToPlay);
    
try 
    {
        
// Create an url from the file name and the url to the
        
// document containing this applet.
        if ((url = fileToPlay.toURL()) == null)
        Fatal(
"Can't build URL for " + this.fileToPlay);
        
// Create an instance of a player for this media
        try 
        {
            player 
= Manager.createPlayer(url);//创建播放器
        } 
        
catch (NoPlayerException e) 
        {
        System.
out.println(e);
        Fatal(
"Could not create player for " + url);
        }
        
// Add ourselves as a listener for a player's events
        player.addControllerListener(this);//为播放器事件增加监听者 

    }
    
catch (MalformedURLException e) 
    {
        Fatal(
"Invalid media file URL!");
    }
    
catch (IOException e) 
    {
        Fatal(
"IO exception creating player for " + url);
    }
}

    
/**
     * Start media file playback. This function is called the
     * first time that the Applet runs and every
     * time the user re-enters the page.
     
*/

    
public void start() 
    {
        
if (player != null)
            player.realize();
    }

    
/**
     * Stop media file playback and release resource before
     * leaving the page.
     
*/
    
public void stop() 
    {
        
if (player != null)
        {
            player.stop();
            player.deallocate();
        }
    }

    
public void destroy() 
    {
        player.close();
    }

    
public void paint(Graphics g) 
    {
    
if (showmeImage[tSize] != null)
        g.drawImage(showmeImage[tSize], 
00this);
    super.paint(g);
    }

    
public synchronized void reSize() 
    {
    cPanel.setBounds(VLEFT[tSize], VTOP[tSize], WIDTH[tSize], HEIGHT[tSize]);
    
if (visualComponent != null) {
        Dimension size 
= visualComponent.getPreferredSize();
        
int width = size.width;
        
int height = size.height;

        
while (true) {
        
// Scale to fit
        if (width > WIDTH[tSize] || height > HEIGHT[tSize]) {
            width 
/= 2;
            height 
/= 2;
        } 
else if (width < WIDTH[tSize] && height < HEIGHT[tSize]) {
            
if (width * 2 <= WIDTH[tSize] && height*2 <= HEIGHT[tSize]) {
            width 
*= 2;
            height 
*= 2;
            } 
else
            
break;
        } 
else
            
break;
        }
        visualComponent.setBounds((WIDTH[tSize] 
- width) / 2,
                      (HEIGHT[tSize] 
- height) / 2,
                      width, height);
    }
    
    
if (controlComponent != null) {
        controlComponent.setBounds(VLEFT[tSize], VBOTTOM[tSize],
                       WIDTH[tSize], 
24);
        controlComponent.invalidate();
    }
    
    remove(zoomButton);
    addZoomButton();
    repaint();
    }

    
public void addZoomButton()
    {
    zoomButton 
= new ZoomButton(zoomImageUp[tSize], zoomImageDn[tSize], 1 - tSize);
    add(zoomButton);
    zoomButton.setBounds(showmeImage[tSize].getWidth(
this- 24, showmeImage[tSize].getHeight(this- 242424);
    }
    
    
/**
     * This controllerUpdate function must be defined in order to
     * implement a ControllerListener interface. This 
     * function will be called whenever there is a media event
     
*/
    
public synchronized void controllerUpdate(ControllerEvent event
    {
    
// If we're getting messages from a dead player, 
    
// just leave
    if (player == null)
        
return;
    
    
// When the player is Realized, get the visual 
    
// and control components and add them to the Applet
    if (event instanceof RealizeCompleteEvent)
    {
        
if (( visualComponent =
          player.getVisualComponent())
!= null) {
        cPanel.add(visualComponent);
        }

        
if (( controlComponent = 
          player.getControlPanelComponent()) 
!= null) {
        
        add(controlComponent);
        controlComponent.setBounds(VLEFT[tSize], VBOTTOM[tSize],
                       WIDTH[tSize], 
24);
        controlComponent.invalidate();
        controlComponent.repaint();
        }
        reSize();
        player.prefetch();

    } 
else if (event instanceof EndOfMediaEvent) 
    {
        
// We've reached the end of the media; rewind and
        
// start over
        player.setMediaTime(new Time(0));
        player.prefetch();
    } 
else if (event instanceof ControllerErrorEvent) {
        player 
= null;
        Fatal(((ControllerErrorEvent)
event).getMessage());
    } 
else if (event instanceof PrefetchCompleteEvent) {
        
if (visualComponent != null) {
        reSize();
        }
        player.start();
        } 
else if (event instanceof SizeChangeEvent) {
        reSize();
    }
    }

    
void Fatal (String s) 
    {
    
// Applications will make various choices about what
    
// to do here. We print a message and then exit
    System.err.println("FATAL ERROR: " + s);
    
throw new Error(s); // Invoke the uncaught exception
                
// handler System.exit() is another
                
// choice.
    
    }

    
/*************************************************************************
     * INNER CLASSES
     ************************************************************************
*/

    
public class CPanel extends Panel 
    {
        
public CPanel() 
        {
            super();
            setBackground(Color.black);
            setLayout( 
null );
        }
    }

    
public class ZoomButton extends Component
    {
        Image up, down;
        
int newSize;
    
        boolean mouseUp 
= true;
        
        
public ZoomButton(Image up, Image down, int newSize) 
        {
            
this.up = up;
            
this.down = down;
            
this.newSize = newSize;
            setSize(
2424);
            addMouseListener( 
new MouseAdapter() 
            {
                
public void mousePressed(MouseEvent me) 
                {
                    mouseUp 
= false;
                    repaint();
                }
    
                
public synchronized void mouseReleased(MouseEvent me) 
                {
                    mouseUp 
= true;
                    TVApplet.
this.tSize = ZoomButton.this.newSize;
                    reSize();
                }
            } );
        }

        
public void paint(Graphics g)
        {
            
if (mouseUp)
            g.drawImage(up, 
00this);
            
else
            g.drawImage(down, 
00this);
        }
    }
    
}