package javacodebook.media.player;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import javax.media.*;

/**
 * Ein einfacher Frame, der die Abspielfunktionen des Java Media Frameworks
 * demonstriert.
 */
public class MediaPlayer extends JFrame implements ControllerListener {
    //Der Player
    javax.media.Player player;
    //Die Kontrollleiste für den Player
    Component playerControls = null;
    //Die Anzeige des Players (nur bei Videos)
    Component playerView = null;

    /**
     * Einen Frame mit einfacher Benutzerführung erstellen und anzeigen.
     */
    public MediaPlayer() {
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout());
        //Einen Button zum Öffnen von Dateien erstellen
        JPanel buttonPanel = new JPanel();
        getContentPane().add(buttonPanel, BorderLayout.NORTH);
        JButton openButton = new JButton("Datei öffnen");
        buttonPanel.add(openButton);
        //Einen ActionLister auf den Button legen, der einen FileChooser öffnet
        openButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                JFileChooser chooser = new JFileChooser(new File("d:\\win2000\\media"));
                int status = chooser.showOpenDialog(MediaPlayer.this);
                if (status == JFileChooser.APPROVE_OPTION) {
                    //ausgewählte Datei ermitteln und abspielen
                    File file = chooser.getSelectedFile();
                    playFile(file);
                }
            }
        });
    }

    /** Eine Datei abspielen. */
    public void playFile(File file) {
        if(player != null)
            player.stop();
        try {
            //den Player erzeugen
            player = Manager.createPlayer(file.toURL());
            //Einen Listener für den Player erzeugen
            player.addControllerListener(this);
        } catch(Exception e) {
            e.printStackTrace(System.out);
        }
        player.start();//Das abspielen beginnen
    }

    /**
     * Hier werden je nach Art der abzuspielenden Datei eine visuelle Komponente
     * (für Video-Dateien) und ein Control-Panel mit Steuerungsmöglichkeiten
     * angezeigt.
     */
    public void controllerUpdate(javax.media.ControllerEvent evt) {
        //Nur das RealizeCompleteEvent ist hier von Interesse. Es zeigt an, dass
        //die Medien-Datei vollständig geladen wurde.
        if (evt instanceof RealizeCompleteEvent) {
            //Der Player selbst liefert die visuelle Komponente
            Component vc = player.getVisualComponent();
            if (vc != null) {
                //evtl. vorhandene alte Komponente entfernen
                if(playerView != null)
                    getContentPane().remove(playerView);
                //Neue Komponente ins Zentrum des Frames legen
                getContentPane().add(vc, BorderLayout.CENTER);
                //Neue Komponente merken, um sie später entfernen zu können,
                //wenn eine andere Datei geladen wird
                playerView = vc;
            } else {
                //Wenn es keine visuelle Komponente gibt, da eine Audio-Datei
                //geladen wurde, wird eine evtl. vorhandene entfernt.
                if(playerView != null)
                    getContentPane().remove(playerView);
            }
            Component cpc = player.getControlPanelComponent();
            if (cpc != null) {
                //Altes Control-Panel entfernen, da sonst u.U. die vorherige
                //Datei abgespielt wird
                if(playerControls != null)
                    getContentPane().remove(playerControls);
                //Control-Panel unten anordnen
                getContentPane().add(cpc, BorderLayout.SOUTH);
                //Control-Panel merken
                playerControls = cpc;
            } else {
                //Wenn kein Control-Panel vorhanden, das alte entfernen
                if(playerControls != null)
                    getContentPane().remove(playerControls);
            }
            pack();//Frame neu layouten, um Steuerelemente auch anzuzeigen
        }
    }

    public static void main(String[] args) {
        //Erzeuge einen neuen MediaPlayer und zeige ihn an
        MediaPlayer mediaPlayer = new MediaPlayer();
        mediaPlayer.setSize(320, 200);
        mediaPlayer.pack();
        mediaPlayer.show();
    }


}
