package docen_swing;

import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import javax.swing.*;

/********************************************************************************
 * JApplet que muestra interacciones entre JList JButton, JTextField y JEditorPane
 * Eventos:
 * - Botón "Añadir": toma texto del JTextField y lo añade al JList y al JEditorPane
 * - Botón "Eliminar": elimina el item seleccionado en el JList y añade al JEditorPane
 **********************************************************************************/
public class lista_texto extends JApplet {
   JButton bot_añadir = new JButton( "Añadir a lista" );
   JButton bot_eliminar = new JButton( "Eliminar de lista" );
   JList lista = new JList();
   JTextField text = new JTextField();
   JEditorPane panel_text = new JEditorPane();

   /********** Inicializar el applet **********/
   public void init() {
      try { jbInit(); }
      catch(Exception e) {  e.printStackTrace(); }
   }

   /********** Configura e instala componentes y paneles ***********/
   private void jbInit() throws Exception {

      /**** Asignamos listener de eventos a los botones *****/
      bot_añadir.addActionListener(new adaptador_bot_añadir(this));
      bot_eliminar.addActionListener(new adaptador_bot_eliminar(this));

      /**** Configurar campo de edición: color y texto inicial *****/
      text.setBackground( Color.ORANGE );
      text.setText("Ponga aquí (JTextField) lo que desea añadir");

      /*** Configuramos la lista: cargar datos y poner scroll ***/
      cargar_datos_lista();
      JScrollPane scroll_lista = new JScrollPane( lista );     // Asignamos scroll a lista

      /***** Configuramos el panel de texto (mitad inferior del applet) *****/
      JScrollPane scroll_text = new JScrollPane( panel_text ); // Asignamos scroll al panel de texto
      panel_text.setBackground(Color.CYAN);
      panel_text.setText( "Esto es un pequeño editor de texto (clase JEditorPane) " +
			  " con scroll (clase JScrollPane)" );

      /**** Obtener panel principal y poner gestor de diseño grid ***/
      Container cont_global = this.getContentPane();
      cont_global.setLayout( new GridLayout(2,1,5,5) );

      /*** Creamos los paneles. panel_sup ocupa la mitad superior del applet y
           panel_botones ocupa la parte norte de panel_sup ***/
      JPanel panel_sup = new JPanel( new BorderLayout() );
      JPanel panel_botones = new JPanel( new FlowLayout() );

      /*** Ponemos en panel_botones los botones ****/
      panel_botones.add( bot_añadir );
      panel_botones.add( bot_eliminar );

      /*** Ponemos en panel_sup el panel_botones, lista y campo de texto ****/
      panel_sup.add( panel_botones, BorderLayout.NORTH );
      panel_sup.add( scroll_lista, BorderLayout.CENTER );
      panel_sup.add( text, BorderLayout.SOUTH );

      /*** Ponemos en el panel global (container) el panel_sup y el editor (con scroll) ****/
      cont_global.add( panel_sup );
      cont_global.add( scroll_text );

   }  /////////////////// FIN de jbInit() \\\\\\\\\\\\\\\\\\\\\

   /*************************************************************************
    * Carga datos en la lista.
    * Muestra que los datos se pueden manejar con un modelo de datos por defecto
    * (DefaultListModel).
    * Retorna el número de elementos
    *************************************************************************/
   int cargar_datos_lista( ) {
      DefaultListModel modelo = new DefaultListModel();
      modelo.addElement( "Buenos dias" );
      modelo.addElement( "Buenas noches" );
      modelo.addElement( "¿Me sigue?" );
      modelo.addElement( "Pues va a ser que no" );
      modelo.addElement( "Me llamo Pablo" );
      modelo.addElement( "¿Qué tal está?" );
      lista.setModel(modelo);
      return modelo.getSize();
   }

   /********************************************************************************
    * Gestión de Evento:
    * - Botón "Añadir": toma texto del JTextField y lo añade al JList y al JEditorPane
    **********************************************************************************/
   void bot_añadir_actionPerformed(ActionEvent e) {

      String t = text.getText();      // Obtener texto de JTextField

      /**** Añadir texto al modelo de la lista (actualiza automáticamente la lista) ***/
      DefaultListModel model = (DefaultListModel) lista.getModel();
      model.addElement( t );

      /*** Seleccionar el item añadido a la lista ***/
      int num_item = model.getSize();
      lista.setSelectedIndex( num_item-1 );

      /**** Añadir texto al JEditorPane ************/
      String texto_anterior = panel_text.getText();
      panel_text.setText(  texto_anterior + "\n" + t );
   }

   /********************************************************************************
    * Gestión de Evento:
    * - Botón "Eliminar": elimina el item seleccionado en el JList y añade al JEditorPane
    **********************************************************************************/
   void bot_eliminar_actionPerformed(ActionEvent e) {

      /*** Obtener el modelo de la lista y el número de item seleccionado ***/
      DefaultListModel model = (DefaultListModel) lista.getModel();
      int num_item_selected = lista.getSelectedIndex();       // Obtener nº de item seleccionado

      /**** Si hay un item seleccionado, se elimina del modelo de la lista y se
            añade a panel de texto ****/
      if ( num_item_selected > -1) {

	 /**** Eliminar item seleccionado del modelo de la lista (ésta se actualiza) ****/
	 String t = (String) model.getElementAt(num_item_selected); // Obtener item seleccionado
	 model.remove(lista.getSelectedIndex());

	 /**** Añadir texto al JEditorPane ************/
	 String texto_anterior = panel_text.getText();
	 panel_text.setText(  texto_anterior + "\n" + t );
      }
   }
}


/*****************************************************************
 * El listener del botón añadir
 *****************************************************************/
class adaptador_bot_añadir implements java.awt.event.ActionListener {
   lista_texto adaptee;  // El JApplet

   adaptador_bot_añadir(lista_texto adaptee) {
      this.adaptee = adaptee;                   // JApplet
   }
   public void actionPerformed(ActionEvent e) {
      adaptee.bot_añadir_actionPerformed(e);    // Método del applet que recibe el evento
   }
}

/*****************************************************************
 * El listener del botón eliminar
 *****************************************************************/
class adaptador_bot_eliminar implements java.awt.event.ActionListener {
   lista_texto adaptee;

   adaptador_bot_eliminar(lista_texto adaptee) {
      this.adaptee = adaptee;
   }
   public void actionPerformed(ActionEvent e) {
      adaptee.bot_eliminar_actionPerformed(e);
   }
}
