import java.awt.*;
import java.awt.event.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
import java.util.*;
import javax.swing.*; 
import javax.swing.event.*;
import java.io.*;

/**
 * Clase para implementar el dialogo de configuracion de correo
 */
public class Dialogo implements ActionListener
{ private JDialog dialogo;
  private JFrame owner;
  private JPanel panel;
  private JTextField smtp, user, mailAdd;
  private JLabel smtpL, userL, mailAddL, passL;
  private JCheckBox check;
  private JPasswordField pass;
  private JButton ok = new JButton("Aceptar");
  private JButton cancel = new JButton("Cancelar");
  private String mailMsg, filename;
  private SendMailUsingAuthentication smtpMailSender;
  private boolean rec;
  
  private final int width = 270;
  private final int height = 300;
  private final int size = 20;

 /**
  * Construye un Dialogo dependiente de un marco dado.
  * @param frame El marco del cual depende
  * @param sss El mensaje que se enviara
  * @param name El nombre de archivo para adjuntar
  */
 public Dialogo(JFrame frame, String sss, String name)
 { owner = frame;
   mailMsg = sss;
   filename = name;
   rec = true;
   common();
   smtp = new JTextField(size);   
   user = new JTextField(size);
   pass = new JPasswordField(size);
   common2(); 
  }
 
  /**
  * Construye un Dialogo dependiente de un marco dado.
  * @param frame El marco del cual depende
  * @param s Un arreglo con informacion acerca del servidor SMTP,
  *          el username y la password.
  * @param sss El mensaje que se enviara
  * @param name El nombre de archivo para adjuntar
  */
 public Dialogo(JFrame frame, String[] s, String sss, String name)
 { owner = frame;
   mailMsg = sss;
   filename = name;
   rec = true;
   common();
   smtp = new JTextField(s[0], size);   
   user = new JTextField(s[1], size);
   pass = new JPasswordField(s[2], size);
   common2();
  }
 
  /**
  * Construye un Dialogo dependiente de un marco dado.
  * @param frame El marco del cual depende
  * @param sss El mensaje que se enviara
  */ 
 public Dialogo(JFrame frame, String sss)
 { owner = frame;
   mailMsg = sss;
   rec = false;
   common();
   smtp = new JTextField(size);   
   user = new JTextField(size);
   pass = new JPasswordField(size);
   common2(); 
  }
 
  /**
  * Construye un Dialogo dependiente de un marco dado.
  * @param frame El marco del cual depende
  * @param s Un arreglo con informacion acerca del servidor SMTP,
  *          el username y la password.
  * @param sss El mensaje que se enviara
  */ 
 public Dialogo(JFrame frame, String[] s, String sss)
 { owner = frame;
   mailMsg = sss;
   rec = false;
   common();
   smtp = new JTextField(s[0], size);   
   user = new JTextField(s[1], size);
   pass = new JPasswordField(s[2], size);
   common2();
  }
 
 /**
  * Metodo interno para agrupar acciones de configuracion grafica comunes
  * a los 4 constructores
  */
 protected void common()
 {
  dialogo = new JDialog(owner, "Configuracion de Correo", true);
  panel = new JPanel();
  smtpL = new JLabel("Servidor SMTP");
  userL = new JLabel("Nombre de Usuario");
  passL = new JLabel("Password");
  check = new JCheckBox("Recordar estos datos");
  mailAddL = new JLabel("Direccion de E-mail");
  mailAdd = new JTextField(size);
 }
 
  /**
  * Metodo interno para agrupar acciones de configuracion grafica comunes
  * a los 4 constructores
  */
 protected void common2()
 {
   panel.add(smtpL);
   panel.add(smtp);
   panel.add(userL);
   panel.add(user);
   panel.add(passL);
   panel.add(pass);
   panel.add(check);
   panel.add(mailAddL);
   panel.add(mailAdd);
   panel.add(ok);
   panel.add(cancel);
   ok.addActionListener(this);
   cancel.addActionListener(this);
   dialogo.setSize(width, height);
   dialogo.setDefaultCloseOperation(dialogo.EXIT_ON_CLOSE);
   dialogo.getContentPane().add(panel);
   dialogo.setVisible(true);
 }
 
 /**
  * Atiende los eventos de botones Aceptar y Cancelar. Además, lee
  * el contenido del CheckBox para almacenar o no los datos de correo
  * @param e El ActionEvent asociado a los botones
  */
 public void actionPerformed(ActionEvent e)
 {
  if (e.getSource() == ok)
  { 
    if (check.isSelected())
    { try
      { makeDataFile(); }
      catch (IOException et)
      { /*nada aun*/ }
    }
    String[] mailAddArray = {mailAdd.getText()};
    if (rec)
    { smtpMailSender = new 
      SendMailUsingAuthentication(smtp.getText(), user.getText(), 
      new String(pass.getPassword()), mailMsg, mailAddArray, filename); }
    else
    { smtpMailSender = new 
      SendMailUsingAuthentication(smtp.getText(), user.getText(), 
      new String(pass.getPassword()), mailMsg, mailAddArray); }
    try
    { smtpMailSender.postMail(); }
    catch (MessagingException et)
    { /*System.err.println("Info: "+et.getNextException().getMessage());*/ }
    dialogo.dispose(); 
   }
  if (e.getSource() == cancel)
  { dialogo.dispose(); }
 }
 
 /**
  * Genera un archivo de datos de configuracion de correo
  * cuando el usuario lo escoge. Serializa los campos de texto
  * y el PasswordField
  */
 protected void makeDataFile() throws IOException
 {
  File saveDataFile = new File("mailConfig.cfg");
  FileOutputStream fstream = new FileOutputStream(saveDataFile);
  ObjectOutputStream oosout = new ObjectOutputStream(fstream);
  
  oosout.writeObject(smtp.getText());
  oosout.writeObject(user.getText());
  oosout.writeObject(pass.getPassword());
  
  oosout.close();
 }
 
}