package appletreproductorswing;

import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import javax.swing.*;
import com.borland.jbcl.layout.*;
import javax.swing.border.*;
import javax.media.*;
import javax.media.control.*;
import java.net.*;
import java.io.*;

/**
 * <p>Título: Applet Reproductor basado en Swing</p>
 * <p>Descripción: Applet versatil que utiliza JMF y Swing para reproducir cualquier formato multimedia a traves de una interfaz visual</p>
 * <p>Copyright: Copyright (c) 2003 Universidad de Malaga</p>
 * <p>Empresa: Universidad de Malaga</p>
 * @author Manuel Vegas Santiago
 * @version 1.0
 */

public class AppletReproductorUI extends JApplet implements IFReproduccionJMFUI{

  private boolean isStandalone = false;
  //Cadena de caracteres que contiene el nombre del archivo a reproducir
  private String cadenaContenidoMM = null;
  //Objeto que se encarga de la reproducción de el/los contenido/s multimedia
  private ReproduccionJMF reproduccionJMF = null;
  JPanel contentPane;
  JMenuBar jMenuBar1 = new JMenuBar();
  JMenu jMenu1 = new JMenu();
  JMenu jMenu2 = new JMenu();
  JMenu jMenu3 = new JMenu();
  JMenu jMenu4 = new JMenu();
  JMenuItem abrirURL = new JMenuItem();
  JMenuItem jMenuItemExaminar = new JMenuItem();
  JMenuItem abrirSesionRTP = new JMenuItem();
  JMenuItem jMenuItem7 = new JMenuItem();
  JMenuItem jMenuItem8 = new JMenuItem();
  JMenuItem jMenuItem9 = new JMenuItem();
  BorderLayout borderLayout1 = new BorderLayout();
  JPanel barraEstado = new JPanel();
  BorderLayout borderLayout2 = new BorderLayout();
  JLabel textoBarraEstado = new JLabel();
  JPanel panelCentral = new JPanel();
  BorderLayout borderLayout3 = new BorderLayout();
  JLabel imagenJMF = new JLabel();
  JCheckBoxMenuItem jAutoRepetirCheckBoxMenuItem = new JCheckBoxMenuItem();
  JCheckBoxMenuItem jAutoReproducirCheckBoxMenuItem = new JCheckBoxMenuItem();
  JCheckBoxMenuItem jActivarEstadoExtraCheckBoxMenuItem = new JCheckBoxMenuItem();
  JLabel jLabel1 = new JLabel();
  private String textoEstado = null;
  JMenuItem jMenuItemCerrar = new JMenuItem();
  JFileChooser jSelectorArchivo = new JFileChooser();

  private Component componenteControl = null;
  private Component componenteVisual = null;
  private Component componenteBarraProgreso = null;
  JCheckBoxMenuItem jMostrarBarraEstadoCheckBoxMenuItem = new JCheckBoxMenuItem();

  //Obtener el valor de un parámetro
  public String getParameter(String key, String def) {
    return isStandalone ? System.getProperty(key, def) :
      (getParameter(key) != null ? getParameter(key) : def);
  }

  //Construir el applet
  public AppletReproductorUI() {
  }

  /**
   * Inicializa el applet a través de la inicialización de los componentes
   * swing visuales que componen la GUI
   */
  //Inicializar el applet
  public void init() {
    try {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }

  /**
   * Se detiene la reproducción y libera los recursos antes de abandonar la página
   */
  public void stop() {
    if (reproduccionJMF != null){
      reproduccionJMF.detener();
      reproduccionJMF.destruir();
    }
  }

  //Inicialización de componentes
  private void jbInit() throws Exception {
    this.setJMenuBar(jMenuBar1);
    this.setSize(new Dimension(350,300));
    contentPane=(JPanel)this.getContentPane();
    jMenu1.setText("Archivo");
    jMenu2.setText("Opciones");
    jMenu3.setText("Ayuda");
    jMenu4.setText("Abrir");
    abrirURL.setText("URL...");
    abrirURL.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        abrirURL_actionPerformed(e);
      }
    });
    jMenuItemExaminar.setText("Examimar Sistema...");
    jMenuItemExaminar.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        jMenuItemExaminar_actionPerformed(e);
      }
    });
    abrirSesionRTP.setText("Sesion RTP...");
    abrirSesionRTP.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        abrirSesionRTP_actionPerformed(e);
      }
    });
    jMenuItem7.setText("Configurar...");
    jMenuItem8.setText("Ayuda...");
    jMenuItem9.setText("Acerca de este applet...");
    contentPane.setLayout(borderLayout1);
    barraEstado.setBorder(BorderFactory.createLoweredBevelBorder());
    barraEstado.setDebugGraphicsOptions(0);
    barraEstado.setLayout(borderLayout2);
    textoBarraEstado.setBackground(Color.white);
    textoBarraEstado.setFont(new java.awt.Font("Dialog", 0, 12));
    textoBarraEstado.setForeground(Color.gray);
    textoBarraEstado.setHorizontalTextPosition(SwingConstants.TRAILING);
    textoBarraEstado.setText(" Seleccione contenido multimedia mediante Archivo:Abrir");
    panelCentral.setLayout(borderLayout3);
    imagenJMF.setBackground(Color.white);
    imagenJMF.setFont(new java.awt.Font("Dialog", 0, 12));
    imagenJMF.setOpaque(true);
    imagenJMF.setHorizontalAlignment(SwingConstants.CENTER);
    imagenJMF.setHorizontalTextPosition(SwingConstants.TRAILING);
    imagenJMF.setIcon(new ImageIcon(new URL(this.getDocumentBase(),"appletreproductorswing/LogoJMF.png")));
    imagenJMF.setIconTextGap(0);
    imagenJMF.setText("");
    panelCentral.setBackground(Color.white);
    panelCentral.setDebugGraphicsOptions(0);
    contentPane.setBorder(BorderFactory.createLineBorder(Color.black));
    jAutoRepetirCheckBoxMenuItem.setText("Repetir automáticamente");
    jAutoRepetirCheckBoxMenuItem.setArmed(false);
    jAutoRepetirCheckBoxMenuItem.setState(true);
    jAutoReproducirCheckBoxMenuItem.setEnabled(true);
    jAutoReproducirCheckBoxMenuItem.setText("Reproducir automáticamente");
    jAutoReproducirCheckBoxMenuItem.setState(true);
    jActivarEstadoExtraCheckBoxMenuItem.setText("Mostrar información extra acerca de la reproduccion");
    jActivarEstadoExtraCheckBoxMenuItem.setState(true);
    jActivarEstadoExtraCheckBoxMenuItem.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        jActivarEstadoExtraCheckBoxMenuItem_actionPerformed(e);
      }
    });
    jLabel1.setFont(new java.awt.Font("Dialog", 0, 12));
    jLabel1.setForeground(new Color(204, 204, 204));
    jLabel1.setHorizontalAlignment(SwingConstants.RIGHT);
    jLabel1.setText("AppletReproductor v1.0 ");
    jMenuItemCerrar.setText("Cerrar");
    jMenuItemCerrar.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        jMenuItemCerrar_actionPerformed(e);
      }
    });
    jSelectorArchivo.setBackground(SystemColor.control);
    jSelectorArchivo.setAcceptAllFileFilterUsed(true);
    jSelectorArchivo.setDialogTitle("Seleccione archivo a reproducir");
    jMostrarBarraEstadoCheckBoxMenuItem.setText("Mostrar barra de estado");
    jMostrarBarraEstadoCheckBoxMenuItem.setState(true);
    jMostrarBarraEstadoCheckBoxMenuItem.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        jMostrarBarraEstadoCheckBoxMenuItem_actionPerformed(e);
      }
    });
    jMenuBar1.add(jMenu1);
    jMenuBar1.add(jMenu2);
    jMenuBar1.add(jMenu3);
    jMenu1.add(jMenu4);
    jMenu1.add(jMenuItemCerrar);
    jMenu4.add(abrirURL);
    jMenu4.add(jMenuItemExaminar);
    jMenu4.add(abrirSesionRTP);
    jMenu2.add(jAutoRepetirCheckBoxMenuItem);
    jMenu2.add(jAutoReproducirCheckBoxMenuItem);
    jMenu2.add(jMostrarBarraEstadoCheckBoxMenuItem);
    jMenu2.add(jActivarEstadoExtraCheckBoxMenuItem);
    jMenu2.addSeparator();
    jMenu2.add(jMenuItem7);
    jMenu3.add(jMenuItem8);
    jMenu3.add(jMenuItem9);
    contentPane.add(barraEstado, BorderLayout.SOUTH);
    barraEstado.add(textoBarraEstado,  BorderLayout.CENTER);
    contentPane.add(panelCentral, BorderLayout.CENTER);
    panelCentral.add(imagenJMF, BorderLayout.CENTER);
    panelCentral.add(jLabel1, BorderLayout.SOUTH);
  }


  //Obtener información del applet
  public String getAppletInfo() {
    return "Información del applet";
  }


  //Obtener información del parámetro
  public String[][] getParameterInfo() {
    return null;
  }


  public void addComponenteVisual(Component componenteVisual,
                           ReproduccionJMF reproduccionJMF){
    this.componenteVisual = componenteVisual;
    panelCentral.add("Center", this.componenteVisual);
  }


  public void addComponenteControl(Component componenteControl,
                            ReproduccionJMF reproduccionJMF){
    this.componenteControl = componenteControl;
    panelCentral.add("South", this.componenteControl);
  }


  public void addComponenteBarraProgreso(Component componenteBarraProgreso,
                                  ReproduccionJMF reproduccionJMF){
    this.componenteBarraProgreso = componenteBarraProgreso;
    panelCentral.add("North", this.componenteBarraProgreso);
  }


  public void removeComponenteVisual(Component componenteVisual,
                              ReproduccionJMF reproduccionJMF){
    panelCentral.remove(this.componenteVisual);
  }


  public void removeComponenteControl(Component componenteControl,
                               ReproduccionJMF reproduccionJMF){
    panelCentral.remove(this.componenteControl);
  }


  public void removeComponenteBarraProgreso(Component componenteBarraProgreso,
                                     ReproduccionJMF reproduccionJMF){
    panelCentral.remove(this.componenteBarraProgreso);
  }


  public void setTextoEstado(String textoEstado, ReproduccionJMF reproduccionJMF){
    this.textoEstado = textoEstado;
    textoBarraEstado.setText(textoEstado);
  }


  public void setTextoEstadoExtra(String textoEstado, int set, boolean nuevoSet,
                           ReproduccionJMF reproduccionJMF){
    if (nuevoSet){
      textoBarraEstado.setText(this.textoEstado + "    " + textoEstado);
    }
    else{
      textoBarraEstado.setText((textoBarraEstado.getText()) + "    " + textoEstado);
    }
  }


  void abrirURL_actionPerformed(ActionEvent e) {
    cadenaContenidoMM = (String)JOptionPane.showInputDialog(
        this,"Introduzca la URL que desea reproducir\n"
        + "Ej: http://www.uma.es/prueba.mov\n\n",
        "Introduzca URL...",JOptionPane.PLAIN_MESSAGE);
    if (reproduccionJMF != null) {
      reproduccionJMF.detener();
      reproduccionJMF.destruir();
    }
    reproduccionJMF = new ReproduccionJMF(this,
                                          jAutoRepetirCheckBoxMenuItem.getState(),
                                          jAutoReproducirCheckBoxMenuItem.
                                          getState(),
                                          jActivarEstadoExtraCheckBoxMenuItem.getState());
    reproduccionJMF.abrirContenidoMM(cadenaContenidoMM);
  }


  void abrirSesionRTP_actionPerformed(ActionEvent e) {
    cadenaContenidoMM = (String)JOptionPane.showInputDialog(
        this,"Introduzca sesión RTP que desea abrir\n"
        + "Ej: rtp://224.144.251.104:49150/audio/1\n\n",
        "Introduzca Sesión RTP...", JOptionPane.PLAIN_MESSAGE);
    if (reproduccionJMF !=null){
      reproduccionJMF.detener();
      reproduccionJMF.destruir();
    }
    reproduccionJMF = new ReproduccionJMF (this, jAutoRepetirCheckBoxMenuItem.getState(),
                                           jAutoReproducirCheckBoxMenuItem.getState(),
                                           jActivarEstadoExtraCheckBoxMenuItem.getState());
    reproduccionJMF.abrirContenidoMM(cadenaContenidoMM);
  }


  void jMenuItemCerrar_actionPerformed(ActionEvent e) {
    if (reproduccionJMF != null) {
      reproduccionJMF.detener();
      reproduccionJMF.destruir();
    }
  reproduccionJMF = null;
  }

  void jMenuItemExaminar_actionPerformed(ActionEvent e) {
    int returnVal = jSelectorArchivo.showOpenDialog(this);
    if(returnVal == JFileChooser.APPROVE_OPTION){
      cadenaContenidoMM = ("file:///" +
                           jSelectorArchivo.getSelectedFile().getAbsolutePath());
      System.out.println(cadenaContenidoMM);
    }
    if (reproduccionJMF !=null){
      reproduccionJMF.detener();
      reproduccionJMF.destruir();
    }
    reproduccionJMF = new ReproduccionJMF (this, jAutoRepetirCheckBoxMenuItem.getState(),
                                           jAutoReproducirCheckBoxMenuItem.getState(),
                                           jActivarEstadoExtraCheckBoxMenuItem.getState());
    reproduccionJMF.abrirContenidoMM(cadenaContenidoMM);
  }

  void jActivarEstadoExtraCheckBoxMenuItem_actionPerformed(ActionEvent e) {
    if (reproduccionJMF != null){
      reproduccionJMF.setOpciones(jAutoRepetirCheckBoxMenuItem.getState(),
                                  jAutoReproducirCheckBoxMenuItem.getState(),
                                  jActivarEstadoExtraCheckBoxMenuItem.getState());
    }
  }

  void jMostrarBarraEstadoCheckBoxMenuItem_actionPerformed(ActionEvent e) {
    if (jMostrarBarraEstadoCheckBoxMenuItem.getState()){
      barraEstado.setVisible(true);
    }
    else{
      barraEstado.setVisible(false);
    }
  }


  //inicializador estático definir el aspecto
  static {
    try {
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
      //UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
      JFrame.setDefaultLookAndFeelDecorated(true);
      JDialog.setDefaultLookAndFeelDecorated(true);
    }
    catch(Exception e) {
    }
  }

}

