/**
 * @version     001.01
 * @date        20/jan/2003
 * @author      Luiz H Celeguim
 * @description applet client do servidor (echo) multi-thread
 */

import java.awt.*;
import java.awt.event.*;
import java.net.Socket;
import java.io.*;


public class ThreadedClient extends java.applet.Applet
                        implements ActionListener, TextListener
{
  final int defaultPort = 8080;
  String defaultPortStr;

  int port;
  String host;
  Socket socket;
  BufferedReader in;
  PrintWriter out;

  TextField textfield;
  TextArea textarea;
  Button button;

  String connectLabel = "   Connect   ";
  String disconnectLabel = "Disconnect";

  String prompt = "> ";   // não deve terminar com \n ou \r

  public void init()
  {

    host = this.getCodeBase().getHost();
    defaultPortStr = ( new Integer( defaultPort ) ).toString();


    Panel controlPanel = new Panel();
    controlPanel.add( new Label( "Port:" ) );
    textfield = new TextField( defaultPortStr );
    controlPanel.add( textfield );
    button = new Button( connectLabel );
    controlPanel.add( button );


    setLayout( new BorderLayout() );
    add( controlPanel, BorderLayout.NORTH );
    textarea = new TextArea( 8, 60 );
    add( textarea, BorderLayout.CENTER );

    button.addActionListener( this );
    textarea.addTextListener( this );


    button.requestFocus();

  }

  public void actionPerformed( ActionEvent event )
  {
   if ( button.getLabel().equals( connectLabel ) )
    { openConnection();
    }
    else
    { closeConnection();
    }

  }

  public void textValueChanged( TextEvent event )
  {
    String text = textarea.getText();
    if ( text.endsWith( "\n" ) ) {


      int index = text.lastIndexOf( prompt ) + prompt.length();
      String output = text.substring( index ).trim();


      out.println( output );

      try
       {
         textarea.append( serverResponse() );
       }
      catch ( IOException e )
       {
        System.err.println( e );
        textarea.setText( e.getMessage() );
        closeConnection();
       }
    }

  }

  private void openConnection()
  {
    try
    {

        int port = Integer.parseInt( textfield.getText() );
        socket = new Socket( host, port );


        in = new BufferedReader(
               new InputStreamReader( socket.getInputStream() ) );
        boolean autoflush;
        out =
          new PrintWriter( socket.getOutputStream(), autoflush = true );


        textarea.setText( serverResponse() );


        button.setLabel( disconnectLabel );

       }
      catch ( NumberFormatException nfe )
       {
        System.err.println( nfe );
        textfield.setText( defaultPortStr );
        textarea.setText( nfe.getMessage() );

       }
      catch ( IOException e )
       {
        System.err.println( e );
        textarea.setText( e.getMessage() );
        closeConnection();
       }
  }

  private String serverResponse() throws IOException
  {
    String text = "";
    String input = in.readLine();
    if ( input == null )
     {
      throw new IOException( "Socket fechado inesperadamente" );
     }
     else
     {
      text += input + "\n";
     }
    return text + prompt;

  }

  private void closeConnection()
  {
   try
    {
      socket.close();
    }
   catch ( IOException e )
    {
      System.err.println( e );
    }

    textarea.setText( "" );
    button.setLabel( connectLabel );
    button.requestFocus();

  }

}
