package practica1.ui.dialog;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.File;
import java.util.ArrayList;
import javax.swing.*;
import practica1.Practica1;
import practica1.language.Language;
import practica1.manejoExperimento.ManejoExperimento;
import practica1.util.JTextFieldNumerico;
/**
* JDialog que permite crear un nuevo experimento
* @author Miguel González - Ceura
*/
public class DialogNuevoExperimento extends JDialog {
public static final int CANCELAR = 0;
public static final int ACEPTAR = 1;
private JTextField txtNombreExperimento;
private JTextField txtRutaExperimento;
private JTextField txtTipoBacteria;
private JTextField txtNombreInvestigador;
private JTextField txtProyectoInvestigacion;
private JTextFieldNumerico txtNumDiasExperimento;
private JTextFieldNumerico txtLimiteAlimentacionMaxima;
private JComboBox lstUnidadesMedida;
private JCheckBox chkGuardarBD;
private JButton btnExaminarExperimento;
private JLabel lblAviso;
private int action = 0;
private ArrayList<String> experimentosBD;
/**
* Constructor del JDialog
* @param parent Frame sobre el que se localiza
*/
public DialogNuevoExperimento(Frame parent) {
super(parent);
init();
setLocationRelativeTo(parent);
}
/**
* Constructor del JDialog
*/
public DialogNuevoExperimento() {
super();
init();
}
/**
* Inicializa los componentes Swing
*/
private void init() {
experimentosBD = ManejoExperimento.obtenerExperimentosBD();
Container contentPane = getContentPane();
setSize(550, 300);
setTitle(Language.getI().getP("NUEVO_EXPERIMENTO"));
setModal(true);
contentPane.setLayout(new BorderLayout());
//Inicializamos los componentes Swing
JLabel lblNombreExperimento = new JLabel(
Language.getI().getP("NOMBRE_EXPERIMENTO"));
txtNombreExperimento = new JTextField(15);
txtNombreExperimento.addKeyListener(new CambioNombreExperimento());
txtNombreExperimento.addActionListener(new PulsadoIntro());
JLabel lblRutaExperimento = new JLabel(
Language.getI().getP("RUTA_EXPERIMENTO"));
txtRutaExperimento = new JTextField(15);
txtRutaExperimento.setText(System.getProperty("user.home"));
txtRutaExperimento.setEditable(false);
txtRutaExperimento.setBackground(Color.WHITE);
btnExaminarExperimento = new JButton(
Language.getI().getP("EXAMINAR"));
btnExaminarExperimento.addActionListener(new PulsadoExaminar());
JLabel lblTipoBacteria = new JLabel(
Language.getI().getP("TIPO_BACTERIA"));
txtTipoBacteria = new JTextField(15);
txtTipoBacteria.addActionListener(new PulsadoIntro());
JLabel lblNombreInvestigador = new JLabel(
Language.getI().getP("NOMBRE_INVESTIGADOR"));
txtNombreInvestigador = new JTextField(15);
txtNombreInvestigador.addActionListener(new PulsadoIntro());
JLabel lblProyectoInvestigacion = new JLabel(
Language.getI().getP("PROYECTO_INVESTIGACION"));
txtProyectoInvestigacion = new JTextField(15);
txtProyectoInvestigacion.addActionListener(new PulsadoIntro());
JLabel lblNumDiasExperimento = new JLabel(
Language.getI().getP("DURACION_EXPERIMENTO_DIAS"));
txtNumDiasExperimento = new JTextFieldNumerico(15);
txtNumDiasExperimento.addActionListener(new PulsadoIntro());
JLabel lblLimiteAlimentacionMaxima = new JLabel(
Language.getI().getP("ALIMENTACION_MAXIMA"));
txtLimiteAlimentacionMaxima = new JTextFieldNumerico(15);
txtLimiteAlimentacionMaxima.addActionListener(new PulsadoIntro());
lstUnidadesMedida = new JComboBox(new String[]{
Language.getI().getP("MILIGRAMOS"),
Language.getI().getP("MICROGRAMOS")});
lblAviso = new JLabel();
lblAviso.setForeground(Color.RED);
JButton btnAceptar = new JButton(Language.getI().getP("ACEPTAR"));
btnAceptar.addActionListener(new PulsadoAceptar());
JButton btnCancelar = new JButton(Language.getI().getP("CANCELAR"));
btnCancelar.addActionListener(new PulsadoCancelar());
chkGuardarBD = new JCheckBox(Language.getI().getP("GUARDAR_BD"));
chkGuardarBD.addActionListener(new EscuchadorGuardarBD());
//Si no hay conexión contra base de datos
if(!ManejoExperimento.isConectado()) {
chkGuardarBD.setEnabled(false);
lblAviso.setText(Language.getI().getP("NO_HAY_CONEXION"));
}
//Panel superior
JPanel panelSuperior = new JPanel();
panelSuperior.add(new JLabel(
Language.getI().getP("PROPIEDADES_EXPERIMENTO")));
contentPane.add(panelSuperior, BorderLayout.NORTH);
//Panel centro
JPanel panelCentro = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;
c.ipadx = 25;
c.gridx = 0;
c.gridy = 0;
c.gridwidth = 1;
panelCentro.add(lblNombreExperimento, c);
c.gridx = 1;
c.gridy = 0;
c.gridwidth = 2;
panelCentro.add(txtNombreExperimento, c);
c.gridx = 0;
c.gridy = 1;
c.gridwidth = 1;
panelCentro.add(lblRutaExperimento, c);
c.gridx = 1;
c.gridy = 1;
c.gridwidth = 2;
panelCentro.add(txtRutaExperimento, c);
c.gridx = 1;
c.gridy = 2;
c.gridwidth = 1;
c.insets = new Insets(5,0,5,5); //Padding boton
panelCentro.add(btnExaminarExperimento, c);
c.gridx = 2;
c.gridy = 2;
c.insets = new Insets(0,0,0,0); //Restauramos el padding
panelCentro.add(chkGuardarBD, c);
c.gridx = 0;
c.gridy = 3;
c.gridwidth = 1;
panelCentro.add(lblTipoBacteria, c);
c.gridx = 1;
c.gridy = 3;
c.gridwidth = 2;
panelCentro.add(txtTipoBacteria, c);
c.gridx = 0;
c.gridy = 4;
c.gridwidth = 1;
panelCentro.add(lblNombreInvestigador, c);
c.gridx = 1;
c.gridy = 4;
c.gridwidth = 2;
panelCentro.add(txtNombreInvestigador, c);
c.gridx = 0;
c.gridy = 5;
c.gridwidth = 1;
panelCentro.add(lblProyectoInvestigacion, c);
c.gridx = 1;
c.gridy = 5;
c.gridwidth = 2;
panelCentro.add(txtProyectoInvestigacion, c);
c.gridx = 0;
c.gridy = 6;
c.gridwidth = 1;
panelCentro.add(lblNumDiasExperimento, c);
c.gridx = 1;
c.gridy = 6;
c.gridwidth = 2;
panelCentro.add(txtNumDiasExperimento, c);
c.gridx = 0;
c.gridy = 7;
c.gridwidth = 1;
panelCentro.add(lblLimiteAlimentacionMaxima, c);
c.gridx = 1;
c.gridy = 7;
panelCentro.add(txtLimiteAlimentacionMaxima, c);
c.gridx = 2;
c.gridy = 7;
panelCentro.add(lstUnidadesMedida, c);
contentPane.add(panelCentro, BorderLayout.CENTER);
//Panel inferior
JPanel panelInferior = new JPanel(new FlowLayout(FlowLayout.RIGHT));
panelInferior.add(lblAviso);
panelInferior.add(btnCancelar);
panelInferior.add(btnAceptar);
contentPane.add(panelInferior, BorderLayout.SOUTH);
}
/**
* Devuelve el nombre del experimento
* @return String nombreExperimento
*/
public String getNombreExperimento() {
return txtNombreExperimento.getText();
}
/**
* Devuelve la ruta del experiment
* @return String rutaExperimento
*/
public String getRutaExperimento() {
return txtRutaExperimento.getText();
}
/**
* Devuelve el tipo de bacteria
* @return String tipoBacteria
*/
public String getTipoBacteria() {
return txtTipoBacteria.getText();
}
/**
* Devuelve el nombre del investigador
* @return String nombreInvestigador
*/
public String getNombreInvestigador() {
return txtNombreInvestigador.getText();
}
/**
* Devuelve el proyecto de investigación
* @return String proyectoInvestigacion
*/
public String getProyectoInvestigacion() {
return txtProyectoInvestigacion.getText();
}
public int getNumDiasExperimento() {
return Integer.parseInt(txtNumDiasExperimento.getText());
}
public int getLimiteAlimentacionMaxima() {
return Integer.parseInt(txtLimiteAlimentacionMaxima.getText());
}
public String getUnidadesMedida() {
return lstUnidadesMedida.getSelectedItem().toString();
}
public boolean isGuardarBD() {
return chkGuardarBD.isSelected();
}
/**
* Devuelve la acción realizada
* @return int action
*/
public int getAction() {
return action;
}
/**
* Evento producido al tippear el nombre del experimento y comprueba si
* ya existe
*/
private class CambioNombreExperimento extends KeyAdapter {
@Override
public void keyTyped(KeyEvent e) {
//Comprobamos si el experimento existe en la ruta dada
String rutaCompleta;
if(e.getModifiers() == 0) {
//Controlamos si borramos
if((int)e.getKeyChar() == 8) {
if(txtNombreExperimento.getText().isEmpty()) {
rutaCompleta = "";
} else {
rutaCompleta = txtNombreExperimento.getText();
}
} else if((int)e.getKeyChar() == 10) {
//Si pulsamos intro no hacemos nada
rutaCompleta = txtNombreExperimento.getText();
}
else {
rutaCompleta = txtNombreExperimento.getText() + e.getKeyChar();
}
} else {
//No se ha introducido texto, no añadimos el caracter
if(txtNombreExperimento.getText().isEmpty()) {
rutaCompleta = "";
} else {
rutaCompleta = txtNombreExperimento.getText();
}
}
if(!chkGuardarBD.isSelected()) {
if(!rutaCompleta.isEmpty()) {
rutaCompleta = txtRutaExperimento.getText() + "/" + rutaCompleta;
}
}
comprobarNombre(rutaCompleta);
}
}
private void comprobarNombre(String rutaCompleta) {
if(!rutaCompleta.isEmpty() && !chkGuardarBD.isSelected() &&
new File(rutaCompleta).exists()) {
lblAviso.setText(Language.getI().getP("EXPERIMENTO_YA_EXISTE"));
} else if(rutaCompleta.isEmpty()) {
lblAviso.setText(Language.getI().getP("NOMBRE_NO_PUEDE_VACIO"));
} else if(chkGuardarBD.isSelected() && !rutaCompleta.isEmpty() &&
experimentosBD.contains(rutaCompleta)) {
lblAviso.setText(Language.getI().getP("EXPERIMENTO_YA_EXISTE"));
} else {
lblAviso.setText("");
}
}
/**
* Evento producido al pulsar aceptar
*/
private class PulsadoAceptar implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
aceptarAccion();
}
}
/**
* Accion producida al aceptar la acción
*/
private void aceptarAccion() {
if(estanTextosIntroducidos()) {
if(lblAviso.getText().isEmpty()) {
action = ACEPTAR;
setVisible(false);
}
} else {
JOptionPane.showMessageDialog(Practica1.getInstance(),
Language.getI().getP("FALTAN_DATOS"),
Language.getI().getP("ADVERTENCIA"),
JOptionPane.WARNING_MESSAGE);
}
}
/**
* Evento que se produce al pulsar cancelar
*/
private class PulsadoCancelar implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
action = CANCELAR;
setVisible(false);
}
}
/**
* Evento que se produce al pulsar examinar
*/
private class PulsadoExaminar implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser fc = new JFileChooser();
//Solo permitimos mostrar directorios
fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
fc.setDialogTitle(Language.getI().getP("RUTA_EXPERIMENTO"));
fc.setCurrentDirectory(new File(txtRutaExperimento.getText()));
//Mostramos la ventana y obtenemos su respuesta
int res = fc.showOpenDialog(null);
if(res == JFileChooser.APPROVE_OPTION) {
//Crear un objeto File la ruta elegida
File rutaElegida = fc.getSelectedFile();
//Mostramos la ruta elegida
txtRutaExperimento.setText(rutaElegida.getAbsolutePath());
//Comprobamos la nueva ruta
if(!txtNombreExperimento.getText().isEmpty()) {
String nuevaRuta = txtRutaExperimento.getText() + "/" +
txtNombreExperimento.getText();
if(new File(nuevaRuta).exists()) {
lblAviso.setText(
Language.getI().getP("EXPERIMENTO_YA_EXISTE"));
} else {
lblAviso.setText("");
}
}
}
}
}
private class EscuchadorGuardarBD implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
if(chkGuardarBD.isSelected()) {
txtRutaExperimento.setEnabled(false);
btnExaminarExperimento.setEnabled(false);
comprobarNombre(txtNombreExperimento.getText());
} else {
txtRutaExperimento.setEnabled(true);
btnExaminarExperimento.setEnabled(true);
comprobarNombre(txtRutaExperimento.getText() + "/" +
txtNombreExperimento.getText());
}
}
}
/**
* Evento que se produce al pulsar intro en un JTextField
*/
private class PulsadoIntro implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
aceptarAccion();
}
}
/**
* Función que comprueba si están escritos todos los campos
* @return Si están escritos todos los campos devuelve verdad, sino falso
*/
private boolean estanTextosIntroducidos() {
return (!txtNombreExperimento.getText().isEmpty() &&
!txtTipoBacteria.getText().isEmpty() &&
!txtNombreInvestigador.getText().isEmpty() &&
!txtProyectoInvestigacion.getText().isEmpty() &&
!txtNumDiasExperimento.getText().isEmpty() &&
!txtLimiteAlimentacionMaxima.getText().isEmpty());
}
}