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

/**
 * Clase principal del proyecto aca se configura la interfaz grafica,
 * se instancia el servidor o el cliente y se instancia la clase para encriptat o
 * desencriptar.
 * @author José Antonio Silva, Mario Ungemach, Jorge Mellings
 */
public class JSecureTransfer extends javax.swing.JFrame {

    /** Constructor de la clase JSecureTransfer()*/
    public JSecureTransfer() {
        initComponents();
       
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jPopupMenu1 = new javax.swing.JPopupMenu();
        jPopupMenu2 = new javax.swing.JPopupMenu();
        menuBar1 = new java.awt.MenuBar();
        menu1 = new java.awt.Menu();
        menu2 = new java.awt.Menu();
        jPopupMenu3 = new javax.swing.JPopupMenu();
        jPopupMenu4 = new javax.swing.JPopupMenu();
        jPopupMenu5 = new javax.swing.JPopupMenu();
        jTextField1 = new javax.swing.JTextField();
        jTextField2 = new javax.swing.JTextField();
        jLabel1 = new javax.swing.JLabel();
        jTextField3 = new javax.swing.JTextField();
        jLabel2 = new javax.swing.JLabel();
        jTextField4 = new javax.swing.JTextField();
        jButton1 = new javax.swing.JButton();
        jLabel3 = new javax.swing.JLabel();
        jTextField5 = new javax.swing.JTextField();
        jTextField6 = new javax.swing.JTextField();
        jLabel4 = new javax.swing.JLabel();
        jTextField7 = new javax.swing.JTextField();
        jButton2 = new javax.swing.JButton();
        jLabel5 = new javax.swing.JLabel();
        jTextField8 = new javax.swing.JTextField();
        jSeparator1 = new javax.swing.JSeparator();
        jTextField9 = new javax.swing.JTextField();
        jLabel6 = new javax.swing.JLabel();
        jTextField10 = new javax.swing.JTextField();
        jButton3 = new javax.swing.JButton();
        jLabel7 = new javax.swing.JLabel();
        jTextField11 = new javax.swing.JTextField();
        jTextField12 = new javax.swing.JTextField();
        textArea1 = new java.awt.TextArea();
        jTextField13 = new javax.swing.JTextField();
        jLabel8 = new javax.swing.JLabel();
        jTextField14 = new javax.swing.JTextField();
        jButton5 = new javax.swing.JButton();
        jLabel9 = new javax.swing.JLabel();
        jComboBox1 = new javax.swing.JComboBox();
        jTextField15 = new javax.swing.JTextField();
        jTextField16 = new javax.swing.JTextField();
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        jMenu2 = new javax.swing.JMenu();

        menu1.setLabel("File");
        menuBar1.add(menu1);

        menu2.setLabel("Edit");
        menuBar1.add(menu2);

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jTextField1.setBackground(new java.awt.Color(236, 233, 216));
        jTextField1.setEditable(false);
        jTextField1.setText("ESTABLECER CLIENTE/SERVIDOR");

        jTextField2.setBackground(new java.awt.Color(236, 233, 216));
        jTextField2.setEditable(false);
        jTextField2.setText("Conección tipo Cliente");

        jLabel1.setText("HOST/IP");

        jTextField3.setText("127.0.0.1");

        jLabel2.setText("PUERTO");

        jTextField4.setText("1025");

        jButton1.setText("Conectar!");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jLabel3.setText("ESTADO CLIENTE");

        jTextField5.setBackground(new java.awt.Color(236, 250, 216));
        jTextField5.setText("No se ha establecido conección");

        jTextField6.setBackground(new java.awt.Color(236, 233, 216));
        jTextField6.setEditable(false);
        jTextField6.setText("Conección tipo Servidor");

        jLabel4.setText("PUERTO");

        jTextField7.setText("1025");

        jButton2.setText("Levantar!");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        jLabel5.setText("ESTADO SERVIDOR");

        jTextField8.setBackground(new java.awt.Color(236, 250, 216));
        jTextField8.setText("No se ha levantado servidor");

        jTextField9.setBackground(new java.awt.Color(236, 233, 216));
        jTextField9.setEditable(false);
        jTextField9.setText("TRANSFERENCIA DE ARCHIVOS");

        jLabel6.setText("Seleccionar archivo");

        jTextField10.setText("file.txt");

        jButton3.setText("Enviar");
        jButton3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton3ActionPerformed(evt);
            }
        });

        jLabel7.setText("ESTADO TRANSFERENCIA");

        jTextField11.setBackground(new java.awt.Color(236, 250, 216));
        jTextField11.setEditable(false);
        jTextField11.setForeground(new java.awt.Color(255, 0, 0));

        jTextField12.setBackground(new java.awt.Color(236, 233, 216));
        jTextField12.setEditable(false);
        jTextField12.setText("CHAT");

        jTextField13.setText("Escribe un mensaje...");
        jTextField13.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jTextField13ActionPerformed(evt);
            }
        });

        jLabel8.setText("Carpeta recepción");

        jTextField14.setText("recibido.txt");

        jButton5.setText("Recibir");
        jButton5.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton5ActionPerformed(evt);
            }
        });

        jLabel9.setText("Tipo Encriptación");

        jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "AES/RSA" }));

        jTextField15.setBackground(new java.awt.Color(236, 233, 216));
        jTextField15.setEditable(false);
        jTextField15.setText("Bienvenido");

        jTextField16.setBackground(new java.awt.Color(236, 233, 216));
        jTextField16.setEditable(false);
        jTextField16.setText("JSecureTransfer v1.0:");

        jMenu1.setText("Opciones");
        jMenuBar1.add(jMenu1);
        javax.swing.JMenuItem elementoGuardar = new javax.swing.JMenuItem( "Guardar chat" );
        jMenu1.add( elementoGuardar );

        javax.swing.JMenuItem elementoSalir = new javax.swing.JMenuItem( "Salir" );
        jMenu1.add( elementoSalir );

        elementoSalir.addActionListener(
            new ActionListener() {  // clase interna anónima
                public void actionPerformed( ActionEvent evento )
                {
                    System.exit(0);
                }
            }
        ); // fin de la llamada a addActionListener

        elementoGuardar.addActionListener(
            new ActionListener() {  // clase interna anónima
                public void actionPerformed( ActionEvent evento )
                {
                    File file = new File("chat.txt");

                    try{
                        Writer writer = new BufferedWriter(new FileWriter(file));
                        writer.write(textArea1.getText());
                        writer.flush();
                        writer.close();
                    }
                    catch (Exception ex) {
                        System.out.println("error");
                    }
                }
            }
        ); // fin de la llamada a addActionListener

        jMenu2.setText("About");
        jMenuBar1.add(jMenu2);
        javax.swing.JMenuItem elementoAcerca = new javax.swing.JMenuItem( "Acerca de..." );
        jMenu2.add( elementoAcerca );

        // DESARROLLO DEL jBAR
        class sAbout extends JFrame {

            sAboutGUI gui = new sAboutGUI();
            public sAbout() {
                setTitle("[ABOUT]");
                setSize( 300, 200);
                this.setResizable(false);
                getContentPane().add(gui);
                setVisible(true);
            }
        }

        elementoAcerca.addActionListener(
            new ActionListener() {  // clase interna anónima
                public void actionPerformed( ActionEvent evento )
                {
                    new sAbout();
                    System.out.println("[ABOUT]\n");
                }
            }
        ); // fin de la llamada a addActionListener

        setJMenuBar(jMenuBar1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                        .addGap(31, 31, 31)
                        .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                        .addGap(49, 49, 49)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(jTextField5)
                            .addGroup(layout.createSequentialGroup()
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                    .addGroup(layout.createSequentialGroup()
                                        .addComponent(jLabel2)
                                        .addGap(18, 18, 18)
                                        .addComponent(jTextField4))
                                    .addGroup(layout.createSequentialGroup()
                                        .addComponent(jLabel1)
                                        .addGap(18, 18, 18)
                                        .addComponent(jTextField3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                                    .addComponent(jLabel3))
                                .addGap(18, 18, 18)
                                .addComponent(jButton1)))))
                .addGap(105, 105, 105)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jTextField6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(10, 10, 10)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel5)
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(jLabel4)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(jTextField7, javax.swing.GroupLayout.PREFERRED_SIZE, 43, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                .addComponent(jButton2)
                                .addComponent(jTextField8, javax.swing.GroupLayout.PREFERRED_SIZE, 168, javax.swing.GroupLayout.PREFERRED_SIZE)))))
                .addGap(113, 113, 113))
            .addComponent(jSeparator1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 688, Short.MAX_VALUE)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jTextField9, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(30, 30, 30)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(layout.createSequentialGroup()
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                    .addComponent(jLabel8, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                    .addComponent(jLabel6, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                    .addComponent(jLabel9, javax.swing.GroupLayout.Alignment.LEADING))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                    .addComponent(jComboBox1, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                    .addComponent(jTextField14, javax.swing.GroupLayout.Alignment.TRAILING)
                                    .addComponent(jTextField10, javax.swing.GroupLayout.DEFAULT_SIZE, 92, Short.MAX_VALUE)))
                            .addComponent(jTextField11, javax.swing.GroupLayout.PREFERRED_SIZE, 194, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel7))))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jButton3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jButton5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addGap(63, 63, 63)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jTextField13)
                    .addComponent(jTextField12, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(textArea1, javax.swing.GroupLayout.DEFAULT_SIZE, 275, Short.MAX_VALUE))
                .addGap(24, 24, 24))
            .addGroup(layout.createSequentialGroup()
                .addComponent(jTextField16, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jTextField15, javax.swing.GroupLayout.DEFAULT_SIZE, 568, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jTextField6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jTextField3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel4)
                    .addComponent(jTextField7, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel2)
                    .addComponent(jTextField4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButton1)
                    .addComponent(jButton2))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel3)
                    .addComponent(jLabel5))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jTextField5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jTextField8, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(10, 10, 10)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jTextField9, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jTextField12, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jLabel6)
                            .addComponent(jTextField10, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jButton3))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jLabel8)
                            .addComponent(jTextField14, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jButton5))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jLabel9)
                            .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(33, 33, 33)
                        .addComponent(jLabel7))
                    .addComponent(textArea1, javax.swing.GroupLayout.PREFERRED_SIZE, 124, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jTextField13, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jTextField11, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 17, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jTextField15, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jTextField16, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
        );

        pack();
    }// </editor-fold>

  /**
 * Accion que invoca al metodo para enviar archivos.
 */
    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
 Runnable miRunnable = new Runnable()
      {
         public void run()
         {
            try
            {
                if(modo=="SERVER"){

               System.out.println("enviar archivo");
               Server.enviarDatos("Ack-Env");   // Se le envia al cliente un aviso de que hay un archivo listo para enviar.
                 jTextField11.setText("Enviando archivo...");      // Se modifica el cuadro de texto que indica el estado del envio o recepcion de archivos.
               new MainFEencrypt(jTextField10.getText());   // El servidor encripta el archivo y genera la llave encriptada.
               
            Server.env("encryptedFile.txt");   //El servidor comienza a enviar el archivo encriptado al cliente.
    
               System.out.println("Terminé");
                }


                else if(modo=="CLIENT") {    // No se implemento esta funcionalidad.
                 System.out.println("enviar archivo");
                  Client.enviarDatossm("Nack2");
                  jTextField11.setText("Enviando archivo...");
                 new MainFEencrypt(jTextField10.getText());
              Thread.sleep(1000); 
                    Client.env("encryptedFile.txt");
               System.out.println("Terminé");
                }





            }
            catch (Exception e)
            {
               e.printStackTrace();
            }
         }
      };
      Thread hilo = new Thread (miRunnable);  // Se declara un hilo nuevo para correr el codigo necesario para el envio de archivos.
      hilo.start();    //Se inicia el hilo.
    }                                        

      /**
 * Accion que invoca al metodo para recibir archivos.
 */
    private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {                                         
         Runnable miRunnable = new Runnable()
      {
         public void run()
         {
            try
            {


                if(modo=="SERVER"){     // No se implemento esta funcionalidad
               System.out.println("recibir archivo");
               Thread.sleep(1000);
               System.out.println("despertar");
              Server.enviarDatossm("Nack2");
              Server.pedir("encryptedKeyFile.txt");

               System.out.println("Terminé");
                }
                


                else if(modo=="CLIENT") {

                 System.out.println("recibir archivo");
                 jTextField11.setText("Recibiendo archivo...");
                Client.pedir("encryptedFile.txt");     //Cliente se prepara a recibir un archivo cuyo nombre sera "encryptedFile.txt".
               Thread.sleep(1000);
               System.out.println("despertar");
              Client.enviarDatossm("Nack4");    //Cliente le avisa al servidor que ya recibio el archivo.
              jTextField11.setText("Archivo recibido con exito!");

              Client.pedir("encryptedKeyFile.txt");   //Cliente se prepara a recibir un archivo cuyo nombre sera "encryptedKeyFile.txt".

                     Thread.sleep(1000);
                 new MainFEdecrypt(jTextField14.getText());  // Se desencripta el archivo recibido
  
              
               System.out.println("Terminé");
 
            }
            }
            catch (Exception e)
            {
               e.printStackTrace();
            }
         }
      };
      Thread hilo = new Thread (miRunnable);  // Se declara un hilo nuevo para correr el codigo necesario para la recepcion de archivos.
      hilo.start();    //Se inicia el hilo.
// TODO add your handling code here:
    }                                        

 /**
 * Metodo para apagar o lenvatar el servidor.
 */
    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        
        // Si esta levanado el servidor, se busca cerrarlo.
        if(jButton2.getText() == "ShutDown!") {

            if(Server.flag_conexion == 1) {
                Server.enviarDatos("Nack");    // Se envia al cliente un Nack
                Server.cerrarConexion();        //Se cierra el servidor
            }


            jButton1.setEnabled(true);
            jButton5.setEnabled(true);
            jButton2.setText("Levantar!");
            jTextField8.setText("No se ha levantado servidor");
            jTextField5.setText("No se ha establecido conección");
            jTextField15.setText("");
        }

        else {
        Runnable miRunnable = new Runnable()
        {
         public void run()
         {
            try
            {
              // Serv = true;
               modo="SERVER";
              new Server();
              Server.ejecutarServidor(Integer.parseInt(jTextField7.getText()));
               // Thread.sleep(10000); //Tarea que consume diez segundos.
               System.out.println("Terminé");
            }
            catch (Exception e)
            {
               e.printStackTrace();
            }
         }
        };

        Thread hilo = new Thread (miRunnable);
        hilo.start();
        // Se cambian los estados
        jButton2.setText("ShutDown!");
        jButton1.setEnabled(false);
        jButton5.setEnabled(false);

        jTextField8.setText("Servidor corriendo...");
        jTextField5.setText("Bloqueado");

        jTextField15.setText("Servidor corriendo en puerto "+jTextField7.getText());

        }

    }                                        

 /**
 * Metodo para inciar o terminar la conexion con el servidor.
 */
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        if(jButton1.getText() == "Desconectar!") {
            Client.enviarDatos("Nack");
            Client.cerrarConexion();
            jButton3.setEnabled(true);
            jButton2.setEnabled(true);
            
            jButton1.setText("Conectar!");
            jTextField8.setText("No se ha levantado servidor");
            jTextField5.setText("No se ha establecido conección");
            jTextField15.setText("Desconectado");
        }
        else {
      Runnable miRunnable = new Runnable()
      {
         public void run()
         {
            try
            {
            modo="CLIENT";
            new Client();
            Client.ejecutarCliente(jTextField3.getText(), Integer.parseInt(jTextField4.getText()));
 }
            catch (Exception e)
            {
               e.printStackTrace();
            }
         }
      };
      Thread hilo = new Thread (miRunnable);
      hilo.start();

          // Cambiar de estado
      jButton1.setText("Desconectar!");
      jTextField5.setText("Conectado..." );
      jTextField8.setText("Bloqueado");
      jButton2.setEnabled(false);
      jButton3.setEnabled(false);

      jTextField15.setText("Conectado a "+jTextField3.getText());
     }
    }                                        
 /**
 * Metodo para enviar mensajes al otro terminal (cliente o servidor).
 */
    private void jTextField13ActionPerformed(java.awt.event.ActionEvent evt) {                                             
       if(modo=="SERVER")Server.enviarDatos(jTextField13.getText());         //Envia el mensaje que esta en jTextField13 al cliente.
       else if(modo=="CLIENT")Client.enviarDatos(jTextField13.getText());   //Envia el mensaje que esta en jTextField13 al servidor.
       // TODO add your handling code here:
    }                                            

    /**
    * Main de la clase JSecureTransfer aca se instancia la clase principal.
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new JSecureTransfer().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
	/**
	 * Boton que sirve para, en modo cliente, conectarse al servidor 
	 * Para esto se instancia la clase Client.
	 */
    public static javax.swing.JButton jButton1;
	/**
	 * Boton que sirve para, en modo servidor, instancian la clase Server.
	 */
    public static javax.swing.JButton jButton2;
	/**
	 * Boton que se utiliza para invocar al metodo que sirve para enviar archivos.
	 */
    public static javax.swing.JButton jButton3;
	/**
	 * Boton que se utiliza para invocar al metodo que sirve para recibir archivos.
	 */
    public static javax.swing.JButton jButton5;
	/**
	 * Aca se define el tipo de encriptacion a utilizar.
	 */
    public javax.swing.JComboBox jComboBox1;
	/**
	 * Objeto para indicar la utilidad del cuadro de texto de la derecha.
	 * Para este caso se indica la IP hacia la cual conectarse.
	 */
    public javax.swing.JLabel jLabel1;
	/**
	 * Objeto para indicar la utilidad del cuadro de texto de la derecha.
	 * Para este caso se indica el puerto hacia el cual conectarse.
	 */
    public javax.swing.JLabel jLabel2;
	/**
	 * Objeto para indicar la utilidad del cuadro de texto de abajo.
	 * Para este caso se indica el estado del cliente.
	 */
    public javax.swing.JLabel jLabel3;
	/**
	 * Objeto para indicar la utilidad del cuadro de texto de la derecha.
	 * Para este caso se indica el puerto que usara el servido para escuchar peticiones.
	 */
    public javax.swing.JLabel jLabel4;
	/**
	 * Objeto para indicar la utilidad del cuadro de texto de abajo.
	 * Para este caso se indica el estado del servidor.
	 */
    public javax.swing.JLabel jLabel5;
	/**
	 * Objeto para indicar la utilidad del cuadro de texto de la derecha.
	 * Para este caso se indica la ruta del archivo que se va a enviar.
	 */
    public javax.swing.JLabel jLabel6;
	/**
	 * Objeto para indicar la utilidad del cuadro de texto de abajo.
	 * Para este caso se indica el estado del servidor.
	 */
    public javax.swing.JLabel jLabel7;
	/**
	 * Objeto para indicar la utilidad del cuadro de texto de la derecha.
	 * Para este caso se indica el nombre qeu tendra el archivo recibido.
	 */
    public javax.swing.JLabel jLabel8;
	/**
	 * Objeto para indicar que el control de la derecha sirve para elegir el tipo
	 * de encriptacion.
	 */
    public javax.swing.JLabel jLabel9;
	/**
	 * Aca se define el boton para el menu1 que despliega las opciones.
	 */
    private javax.swing.JMenu jMenu1;
	/**
	 * Aca se define el boton para el menu2 que despliega el cuadro about.
	 */
    private javax.swing.JMenu jMenu2;
	/**
	 * Aca se define la barra donde van los dos botones para menu1 y menu2.
	 */
    private javax.swing.JMenuBar jMenuBar1;
	
	/**
	 * Objeto necesario para el funcionamiento de la GUI.
	 */
    private javax.swing.JPopupMenu jPopupMenu1;
	/**
	 * Objeto necesario para el funcionamiento de la GUI.
	 */
    private javax.swing.JPopupMenu jPopupMenu2;
	/**
	 * Objeto necesario para el funcionamiento de la GUI.
	 */
    private javax.swing.JPopupMenu jPopupMenu3;
	/**
	 * Objeto necesario para el funcionamiento de la GUI.
	 */
    private javax.swing.JPopupMenu jPopupMenu4;
	/**
	 * Objeto necesario para el funcionamiento de la GUI.
	 */
    private javax.swing.JPopupMenu jPopupMenu5;
	/**
	 * Objeto para separar los dos paneles principales que forman la GUI.
	 */
    public javax.swing.JSeparator jSeparator1;
	/**
	 * Cuadro de texto donde se da la primera instruccion dirigida hacia el usuario:
	 * ESTABLECER CLIENTE/SERVIDOR
	 */
    public javax.swing.JTextField jTextField1;
	/**
	 * Cuadro de texto donde se ingresa la ruta del archivo que se va a enviar.
	 */	
    public static javax.swing.JTextField jTextField10;
	/**
	 * Cuadro de texto donde se muestra el estado de la transferencia.
	 */	
    public static javax.swing.JTextField jTextField11;
	/**
	 * Cuadro de texto donde se indica que el area de mas abajo es para el uso del 
	 * chat.
	 */	
    public javax.swing.JTextField jTextField12;
	/**
	 * Cuadro de texto donde se ingresan los mensajes que se se quieren enviar hacia el 
	 * el otro terminal.
	 */	
    public static javax.swing.JTextField jTextField13;
	/**
	 * Cuadro de texto donde se indica el nombre que tendra el archivo recibido.
	 */	
    public static javax.swing.JTextField jTextField14;
	/**
	 * Cuadro de texto donde se muestran el estado del programa. Al inicio se muestra una bienvenida.
	 */	
    public static javax.swing.JTextField jTextField15;
	/**
	 * Cuadro de texto donde se muestra la version del programa.
	 */	
    public javax.swing.JTextField jTextField16;
	/**
	 * Cuadro de texto donde se indica que los controles de mas abajo son para una conexion
	 * del tipo Cliente.
	 */	
    public javax.swing.JTextField jTextField2;
	/**
	 * Cuadro de texto donde se ingresa la IP del servidor para que el cliente sepa hacia que
	 * direccion conectarse.
	 */	
    public static javax.swing.JTextField jTextField3;
	/**
	 * Cuadro de texto donde se ingresa el puerto que esta usando el servidor para escuchar las
	 * peticiones, para que el cliente sepa a que puerto conectarse.
	 */	
    public static javax.swing.JTextField jTextField4;
	/**
	 * Cuadro de texto donde se muestra el estado del cliente.
	 */	
    public static javax.swing.JTextField jTextField5;
	/**
	 * Cuadro de texto donde se indica que los controles de mas abajo son para una conexion
	 * del tipo Servidor.
	 */	
    public javax.swing.JTextField jTextField6;
	/**
	 * Cuadro de texto donde se ingresa el puerto que usara el servidor para escuchar las peticiones.
	 */	
    public static javax.swing.JTextField jTextField7;
	/**
	 * Cuadro de texto donde se muestra el estado del servidor.
	 */	
    public static javax.swing.JTextField jTextField8;
	/**
	 * Cuadro de texto donde se indica que los controles de mas abajo son para hacer uso de la funcionalidad
	 * de recibir o enviar archivos.
	 */	
    public javax.swing.JTextField jTextField9;
	/**
	 * Cuadro de texto donde se da la primera instruccion dirigida hacia el usuario:
	 */	
    private java.awt.Menu menu1;
    private java.awt.Menu menu2;
    private java.awt.MenuBar menuBar1;
	/**
	 * Area de texto donde se muestran los mensajes enviados hacia el otro terminal y los recibidos.
	 */		
    public static java.awt.TextArea textArea1;
    // End of variables declaration
	/**
	 * Variable para definir en que modo esta corriendo el programa.
	 */		
    public static String modo = "ninguno";

}

