import java.io.*;
import java.net.*;
import java.awt.event.*;
import javax.swing.*;

/**
 * Implementacion de ActionListener para determinar la accion a seguir
 * al apretar el boton send.
 * @author Luis Fuentes Weber
 */
public class sendListener implements ActionListener{
    
    private Socket s;
    private clientPane  pane;
    private PrintWriter out;
    private String in;
    private final String  uname;

    /**
     * Constructor que inicializa con el nombre de usuario del cliente.
     * @param n Nombre de usuario utilizado en el chat.
     */
    public sendListener(String n){
        uname = n;
    }

    /**
     * Accion al presionar el boton.
     * @param e Evento registrado.
     */
    public void actionPerformed(ActionEvent e) {

       in = pane.getText();
       pane.clearText();
       //Envia los datos dentro de una hebra para no bloquear al programa en
       //casos extremos
       new Thread(){
            @Override
             public void run(){
                sendData(in);
             }
        }
       .start();
       
    }

    /**
     * Actualizacion de los datos usados por el listener, ya que es creado
     * antes de la creacion de los demas parametros necesarios para la ejecucion
     * de este.
     * @param s Socket al cual de desea enviar.
     * @param p Panel desde donde se desea obtener el texto.
     */
    public void updateData(Socket s, clientPane p){
        this.s = s;
        pane = p;
        try {
            out = new PrintWriter(s.getOutputStream(), true);
        } catch (IOException ex) {
            JOptionPane.showMessageDialog(pane, "Couldn't create the printer writer.","Error",JOptionPane.ERROR_MESSAGE);
            System.exit(1);
        }
    }

    /**
     * Envio de datos obtenido desde el cuadro de input. Antes de cada linea
     * agrega el nombre de usuario, para evitar suplantaciones:
     * Sincronizado con el nombre de usuario, para que en caso de que se mandan
     * 2 textos largos consecutivamente, las lineas no se envien mezcladas.
     * @param in String de texto a enviar.
     */
    
    public void sendData(String in){
        synchronized(uname){
            //Divide en tokens separados por un retorno
            String [] tok = in.split("\n");
            for(int i=0; i<tok.length; i++){
                out.println(uname + ": " + tok[i]);
            }
        }
    }

    
}

