/* 
* Copyright 2016 Agencia Estatal de Administración Tibutaria
*
* Licencia con arreglo a la EUPL, Versión 1.1 o –en cuanto
* sean aprobadas por la Comisión Europea– versiones
* posteriores de la EUPL (la «Licencia»);
* Solo podrá usarse esta obra si se respeta la Licencia.
* Puede obtenerse una copia de la Licencia en:
*  
* https://joinup.ec.europa.eu/software/page/eupl
*  
* Salvo cuando lo exija la legislación aplicable o se acuerde
* por escrito, el programa distribuido con arreglo a la
* Licencia se distribuye «TAL CUAL», SIN GARANTÍAS NI CONDICIONES
* DE NINGÚN TIPO, ni expresasni implícitas.
*
* Véase la Licencia en el idioma concreto que rige los permisos y 
* limitaciones que establece la Licencia.
*/ 

package gestor;

import gestor.datos.*;
import gestor.utiles.*;
import java.awt.Point;
import java.util.*;
import javax.swing.*;
import gestor.datos.TModelCandidatos;
import gestor.datos.TModelCandidatosVinculadosManual;
import gestor.datos.TablaCandidatos;
import gestor.utiles.Global;
import java.awt.Dimension;
import java.util.logging.Level;

public final class FormCandidatos extends javax.swing.JFrame implements ISmartCardAvisable {

    TModelCandidatos tmCandidatos;
    TModelCandidatosVinculadosManual tmCandidatosVinculados;
    TablaCandidatos tabla;
    Configuracion conf;
    TablaColas Colas;
    boolean modoVinculacion = false;
    LogGenerico logEstadoABlanco = null;
    Popup popup;

    public FormCandidatos() {
        conf = Configuracion.instanciaUnica();
        initComponents();
        ckbTicket.setSelected(conf.imprimirTicket);
        menuItemReimprimir.setEnabled(conf.imprimirTicket);
        cambiadoEstadoTickets();
        preparaGridCandidatos();
        tabla = TablaCandidatos.getTablaCandidatos();
        Colas = TablaColas.getTablaColas();
        preparaGridCandidatosVinculados();
        prepararVentanaVinculacion(false);
        ModificadoTamaño();
        int columnaHoraCita = TModelCandidatos.COLCANDIDATO.HORACITA.ordinal();
        gridCandidatos.ordenar(columnaHoraCita, false);
        insertarMenusScript();
    }

    void insertarMenusScript() {
        if (conf.scriptsCandidato.size() > 0) {
            popupMenuGridCandidatos.add(new javax.swing.JSeparator());
            for (final Configuracion.ScriptCandidato sc : conf.scriptsCandidato) {
                javax.swing.JMenuItem mit = new javax.swing.JMenuItem();
                mit.setText(sc.menuTxt);
                mit.addActionListener(new java.awt.event.ActionListener() {

                    @Override
                    public void actionPerformed(java.awt.event.ActionEvent evt) {
                        java.io.File fprog = new java.io.File(sc.path);
                        if (!fprog.exists()) {
                            MsgBox("'" + sc.path + "'\nArchivo no encontrado");
                            return;
                        }
                        RegistroCandidatos reg = registroSeleccionadoEnGrid();
                        if (sc.argumentos != null) {
                            if (sc.argumentos.equalsIgnoreCase("registroCompleto")) {
                                gestor.utiles.ProgramaExterno.run(sc.path, reg.toString());
                            }
                        }
                        gestor.utiles.ProgramaExterno.run(sc.path, reg.numeroTicket, reg.nif, reg.nombre);
                    }
                });
                popupMenuGridCandidatos.add(mit);
            }
        }
    }

    void MsgBox(String msg) {
        JOptionPane.showMessageDialog(this, msg);
    }

    void preparaGridCandidatos() {
        gridCandidatos.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        gridCandidatos.getTableHeader().setReorderingAllowed(false);
        tmCandidatos = new TModelCandidatos(gridCandidatos);
    }

    void preparaGridCandidatosVinculados() {
        this.jScrollPane2.getViewport().setBackground(new java.awt.Color(247, 242, 231));
        gridVinculados.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        gridVinculados.getTableHeader().setReorderingAllowed(false);
        tmCandidatosVinculados = new TModelCandidatosVinculadosManual(gridVinculados);
    }

    void cabeceraGridPulsada(int columna, int modificadores) {
        gridCandidatos.guardaPosicion();
        if ((modificadores & java.awt.event.InputEvent.CTRL_DOWN_MASK) == java.awt.event.InputEvent.CTRL_DOWN_MASK) {
            gridCandidatos.quitarOrden();
        } else {
            gridCandidatos.ordenar(columna, true);
        }
        gridCandidatos.recuperarPosicion();
        gridCandidatos.requestFocus();
        gridCandidatos.repaint();
    }

    public int columnaOrdenacion() {
        return gridCandidatos.columnaOrdenacionDatos();
    }

    public boolean ordenAscendente() {
        return gridCandidatos.ordenAscendente();
    }

    void seleccionarFilaGrid(Point p) {
        int r = gridCandidatos.rowAtPoint(p);
        if (r != -1) {
            gridCandidatos.changeSelection(r, 0, false, false);
        }
    }

    void mostrarMenuPopupGrid(int x, int y) {
        if (gridCandidatos.getSelectedRowCount() > 0) {
            if (modoVinculacion) {
                OpcionesMenu(false);
            } else {
                OpcionesMenu(true);
            }
        }
        this.popupMenuGridCandidatos.show(gridCandidatos, x, y);
    }

    void OpcionesMenu(boolean op) {
        this.menuItemCambiarCola.setEnabled(op);
        this.menuItemCambiarEstado.setEnabled(op);
        this.menuItemMarcarPresente.setEnabled(op);
        this.menuItemMesaPreferente.setEnabled(op);
    }

    void cambiadoEstadoTickets() {
        boolean marcado = ckbTicket.isSelected();
        Global.principal.marcarImprimirTicket(marcado);
    }
    public boolean verCitaPrevia = false;
    public boolean verRenta = false;
    public boolean filtrarTerminados = false;
    public String vistaTurnoSeleccionada = "S";

    void aplicaFiltro() {
        popup.hide();
        popup = null;
        Global.main.cambiarFiltrosCandidatos();
        gridCandidatos.requestFocus();
    }

    void cambiadoVerTurno() {
        int indice = comboVerTurno.getSelectedIndex();
        if (indice > -1) {
            vistaTurnoSeleccionada = codigosTurno[indice];
        }
        Global.main.cambiarFiltrosCandidatos();
        gridCandidatos.requestFocus();
    }

    void cambiadoVistaCitaPrevia() {
        verCitaPrevia = jCheckVerCitaPrevia.isSelected();
        if (verCitaPrevia) {

            verRenta = false;
        }
        aplicaFiltro();
    }

    void cambiadoFiltroRenta() {
        verRenta = false;

        aplicaFiltro();
    }

    void cambiadoFiltroTerminados() {
        filtrarTerminados = this.jCheckVerTerminados.isSelected();
        aplicaFiltro();
    }

    public void ponMarcarImprimir(boolean poner) {
        ckbTicket.setSelected(poner);
        menuItemReimprimir.setEnabled(poner);
    }

    public void refrescarDatos(boolean reordenar) {
        if (reordenar) {
            gridCandidatos.guardaPosicion();
            if (gridCandidatos.comprobarYOrdenar()) {
                gridCandidatos.recuperarPosicion();
            }
        }
        gridCandidatos.revalidate();
        gridCandidatos.repaint();
    }

    public void refrescarDatosV() {
        gridVinculados.revalidate();
        gridVinculados.repaint();
    }

    public void resetComboTurno() {
        this.comboVerTurno.setSelectedIndex(0);
    }

    public void refrescarDatosYTurno() {
        // pedir datos al servidor
        gridCandidatos.revalidate();
        gridCandidatos.repaint();
    }

    // Esta viene rebotada desde FormNuevoCandidato
    public void procesarPresente(RegistroCandidatos reg) {
        RegistroCandidatos reg2 = tabla.buscarPorNif(reg.nif);
        procesarPresente(reg2, false);
    }

    public void procesarPresente(RegistroCandidatos reg, boolean comprobarHora) {
        try {
            if (reg.estado == null || reg.estado.equals("")) {
                reg.estado = " ";
            }
            int r = 0;
            if (reg.citaMultiple > 1) {
                reg.citaMultiple = tabla.contarVinculados(reg.citaVinculada);
            }
            String nifVinculados = "";
            String mensajeOpcion = "";
            java.sql.Timestamp horaCalculada;
            long ahoraMismo = System.currentTimeMillis();
            if (comprobarHora) {
                horaCalculada = reg.horaCita;
                r = Global.compruebaHoraCalculada(ahoraMismo, reg.horaCita.getTime());
            } else {
                horaCalculada = reg.horaCalculada;
                r = 0;
            }
            if (!reg.tieneTicket() && reg.citaMultiple < 2) {
                if (r == 3) {
                    MsgBox("Este contribuyente no puede ser atendido.\nEstá fuera del margen horario establecido\nPuede rehabilitar la cita mediante el menú emergente..\n ");
                    return;
                }
                if (r <= 2) {
                    if (comprobarHora) {
                        horaCalculada = Global.calcularHora(r, reg.horaCita, ahoraMismo);
                    }
                }
            }
            if (reg.estadoVacio() && reg.citaMultiple > 1 && !reg.tieneTicket()) {
                TablaCandidatos miniTabla = new TablaCandidatos();
                nifVinculados = tabla.getListaVinculados(reg.citaVinculada, miniTabla);
                int opcion = crearMensajeOpcion(nifVinculados);
                if (opcion == 0) {
                    return;
                }
                RegistroCandidatos reg2 = reg;
                if (comprobarHora) {
                    reg2 = miniTabla.primeroEnHora();
                    if (reg2 == null) {
                        MsgBox("Todos los candidatos de esta cita vinculada están fuera del margen horario establecido\nPuede habilitarlas mediante el menú emergente.\n ");
                        return;
                    }
                } else {
                    miniTabla.igualarHoraCalculada(horaCalculada);
                }
                if (opcion == 1) {
                    horaCalculada = reg2.horaCalculada;
                    reg2.cambiaEstado("P", new java.sql.Timestamp(ahoraMismo), horaCalculada);
                    miniTabla.cambiaEstadoVinculados(reg.citaVinculada, "X", new java.sql.Timestamp(ahoraMismo), horaCalculada);
                }
                if (opcion == 2) {
                    prepararVentanaVinculacion(true);
                    popupMenuGridVinculados.setEnabled(true);
                    adicionaVinculado();
                }
                return;
            }
            if (reg.estadoVacio() && reg.citaMultiple == 1 && !reg.tieneTicket()) {
                reg.cambiaEstado("P", new java.sql.Timestamp(ahoraMismo), horaCalculada);
                return;
            }
            if (!reg.estadoVacio() && reg.citaMultiple == 1 && reg.tieneTicket()) {
                reg.forzarEstado("P");
                return;
            }
            if (!reg.estadoVacio() && reg.citaMultiple > 1 && reg.tieneTicket()) {
                nifVinculados = tabla.getListaVinculados(reg.citaVinculada, null);
                mensajeOpcion = "Esta es una cita vinculada.\n" + nifVinculados + "\n¿Volver a poner PRESENTE a todas las citas ?";
                if (JOptionPane.showConfirmDialog(this, mensajeOpcion,
                        "CITA VINCULADA", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
                    reg.forzarEstado("P");
                    tabla.cambiaEstadoVinculados(reg.citaVinculada, "X", new java.sql.Timestamp(ahoraMismo), horaCalculada);
                } else {
                    return;
                }
                return;
            }
            if (!reg.estadoVacio() && reg.citaMultiple > 1 && !reg.tieneTicket()) {
                mensajeOpcion = "Esta es una cita vinculada.\n ¿Romper la vinculacion para esta cita ?";
                if (JOptionPane.showConfirmDialog(this, mensajeOpcion,
                        "CITA VINCULADA", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
                    reg.cambiaEstado("P", new java.sql.Timestamp(ahoraMismo), horaCalculada, 1);
                }
            }
        } catch (Exception exc) {
            Main.log.log(Level.SEVERE, "Excepci\u00f3n al cambiar estado de registro {0} a  Presente\n{1}", new Object[]{reg.id, exc.getMessage()});
        }
    }

    public int crearMensajeOpcion(String vinculados) {
        String string1 = "Si";
        String string2 = "No, Cancelar ";
        String string3 = "Modificar Vinculados";

        Object[] options = {string1, string2, string3};
        String mensajeOpcion = "Esta es una cita vinculada.\n\n" + vinculados + "\n" + "¿Enviar juntos a la misma mesa?";

        int n = JOptionPane.showOptionDialog(null,
                mensajeOpcion,
                "CITAS VINCULADAS",
                JOptionPane.YES_NO_CANCEL_OPTION,
                JOptionPane.QUESTION_MESSAGE,
                null,
                options,
                string1);
        if (n == JOptionPane.YES_OPTION) {
            return 1;
        } else if (n == JOptionPane.NO_OPTION) {
            return 0;
        } else if (n == JOptionPane.CANCEL_OPTION) {
            return 2;
        } else {
            return 0;
        }
    }

    public void ProcesarBlanco(RegistroCandidatos reg) {
        if (reg.estadoVacio()) {
            return;
        }
        String nifVinculados = "";
        String mensajeOpcion = "";
        java.sql.Timestamp horaCalculada = reg.horaCita;
        try {
            if (logEstadoABlanco == null) {
                logEstadoABlanco = new LogGenerico("EstadoNoPresente.log", "");
                logEstadoABlanco.aligerar(24, 12);
            }
            logEstadoABlanco.escribir(Fecha.formatoHoraHMS(new Date()) + " -> " + reg.nif + "  " + reg.numeroTicket + "  por " + conf.codigoGestor);
        } catch (Exception exc) {
        }
        // no es vinculado...
        if (reg.citaMultiple == 1) {
            reg.cambiaEstado(" ", horaCalculada, horaCalculada);
            return;
        }
        // si llega aqui SI es vinculado
        TablaCandidatos miniTabla = new TablaCandidatos();
        nifVinculados = tabla.getListaVinculados(reg.citaVinculada, miniTabla);
        if (reg.tieneTicket()) {
            if (miniTabla.recordsCount() < 2) {
                reg.cambiaEstado(" ", Fecha.horaNula, Fecha.horaNula, 1);
                return;
            }
            mensajeOpcion = "Esta es una cita vinculada.\n" + nifVinculados + "\n¿Cambiar todos a NO PRESENTES?";
            if (JOptionPane.showConfirmDialog(this, mensajeOpcion,
                    "CITA VINCULADA", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
                reg.cambiaEstado(" ", Fecha.horaNula, Fecha.horaNula);
                tabla.cambiaEstadoVinculados(reg.citaVinculada, " ", Fecha.horaNula, Fecha.horaNula);
            }
        } else {   // forma parte de una cita vinculada pero NO es el del tique
            mensajeOpcion = "Este candidato forma parte de una cita vinculada :\n" + nifVinculados + "\n¿Separarlo de la cita vinculada?";
            if (JOptionPane.showConfirmDialog(this, mensajeOpcion,
                    "CITA VINCULADA", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
                reg.cambiaEstado(" ", Fecha.horaNula, Fecha.horaNula, 1);
            }
        }
    }

    public boolean ponerMarcaEstado(String marca) {
        RegistroCandidatos reg = registroSeleccionadoEnGrid();
        if (reg == null) {
            return false;
        }
        if (reg.estado.equals(marca)) {
            return false;
        }
        if (!Colas.contieneCola(reg.cola)) {
            JOptionPane.showMessageDialog(this, reg.cola + "  " + reg.nif + " -- " + reg.nombre + "\n No se Gestiona en esta Sala de Espera");
            return false;
        }
        if (reg.estado.equals("B") && marca.equals("P")) {
            JOptionPane.showMessageDialog(this, reg.nif + " -- " + reg.nombre + " está ANULADO\nCambie primero a no PRESENTE");
            return false;
        }
        if (marca.equals("P")) {
            if (!reg.nif.equals("000000000")) {
                if (Global.nifValido(reg.nif)) {
                    RegistroCandidatos regP = tabla.buscarPorNifPresente(reg.nif);
                    if (regP != null) {
                        JOptionPane.showMessageDialog(this, reg.nif + " -- " + regP.nombre + "  tiene el Tique " + regP.numeroTicket + " pendiente de ser atendido\n No emitir nuevo Tique");
                        return false;
                    }
                }
            }
            procesarPresente(reg, true);
            gridCandidatos.repaint();
            return true;
        }
        if (marca.equals(" ")) {
            ProcesarBlanco(reg);
            Global.principal.refrescarDatos(false);
            gridCandidatos.repaint();
            return true;
        }

        Global.principal.refrescarDatos(false);
        gridCandidatos.repaint();
        return true;
    }

    void pedirMesaPreferente() {
        RegistroCandidatos reg = registroSeleccionadoEnGrid();
        if (reg != null) {
            if (!Colas.contieneCola(reg.cola)) {
                JOptionPane.showMessageDialog(this, reg.cola + "  " + reg.nif + " -- " + reg.nombre + "\n No se Gestiona en esta Sala de Espera");
                return;
            }
            if (!reg.estado.equals("P") && !reg.estado.equals(" ")) {
                MsgBox("No se puede asignar mesa a esta cita");
                return;
            }
            if (!reg.estado.equals("P")) {
                if (JOptionPane.showConfirmDialog(this, "El estado debe ser PRESENTE para asignar mesa obligatoria\n"
                        + "pulse Aceptar para marcar como Presente tras asignar la mesa o CANCELAR en otro caso",
                        "MESA PREFERENTE", JOptionPane.OK_CANCEL_OPTION) != JOptionPane.OK_OPTION) {
                    return;
                }
            }
            Object[] opciones = formarListaMesas();
            String respuesta = (String) JOptionPane.showInputDialog(this, "Seleccione la mesa: ",
                    "SELECCIÓN DE MESA OBLIGATORIA", JOptionPane.PLAIN_MESSAGE, null, opciones, "ninguna");
            if (respuesta != null) {
                if (respuesta.equals("ninguna")) {
                    respuesta = " ";
                }
                if (!reg.estado.equals("P")) {  // para los NO presentes
                    if (respuesta.equals(" ")) {  // si no eligio mesa no se hace nada
                        return;
                    }
                    ponerMarcaEstado("P"); //lo hacemos presente
                }
                reg.mesa = respuesta;
                tabla.igualarMesaYCola(reg);
                Global.main.comunicaciones.enviar(Comunicaciones.ENVIO_CAMBIO_COLA_O_MESA,
                        Global.main.numeroGestor, reg.toString());
                Global.principal.refrescarDatos(false);
            }
            if (!reg.estado.equals("P")) {
                ponerMarcaEstado("P");
            }
        }
    }

    Object[] formarListaColas() {
        ArrayList<String> temp = new ArrayList<>();
        TablaColas colas = TablaColas.getTablaColas();
        for (RegistroCola rc : colas) {
            if (rc.activa && !rc.cerrada) {
                temp.add(rc.cola + " - " + rc.descripcion);
            }
        }
        String[] opciones = new String[temp.size()];
        opciones = temp.toArray(opciones);
        ordenarColas(opciones);
        return opciones;
    }

    Object[] formarListaMesas() {
        ArrayList<String> temp = new ArrayList<>();
        TablaPuestos tpuestos = TablaPuestos.getTablaPuestos();
        temp.add("ninguna");
        for (int i = 0; i < tpuestos.numPuestos(); i++) {
            TablaPuestos.Puesto p = tpuestos.puesto(i);
            temp.add(p.nombre);
        }
        String[] opciones = new String[temp.size()];
        opciones = temp.toArray(opciones);
        return opciones;
    }

    void pedirCambioDeCola() {
        RegistroCandidatos reg = registroSeleccionadoEnGrid();
        if (reg != null) {
            if (!reg.estado.equals("P") && !reg.estado.equals(" ")) {
                MsgBox("El estado debe ser BLANCO o PRESENTE para cambiar de cola");
                return;
            }
            if (!Colas.contieneCola(reg.cola)) {
                JOptionPane.showMessageDialog(this, reg.cola + "  " + reg.nif + " -- " + reg.nombre + "\n No se Gestiona en esta Sala de Espera");
                return;
            }

            RegistroCola rc = Colas.buscar(reg.cola);
            String colaActual = reg.cola + " - " + rc.descripcion;
            String salaActual = rc.salaEspera;
            Object[] opciones = formarListaColas();
            String respuesta = (String) JOptionPane.showInputDialog(this, "Seleccione la cola: ",
                    "PASO A OTRA COLA", JOptionPane.PLAIN_MESSAGE, null, opciones, colaActual);
            if (respuesta != null) {
                String[] pp = Global.split(respuesta, '-');
                reg.cola = pp[0].trim();
                tabla.igualarMesaYCola(reg);
                Global.main.comunicaciones.enviar(Comunicaciones.ENVIO_CAMBIO_COLA_O_MESA,
                        Global.main.numeroGestor, reg.toString());
                refrescarDatos(false);
                String nuevaSala = Colas.buscar(reg.cola).salaEspera;
                if (!salaActual.equals(nuevaSala)) {
                    java.awt.Toolkit.getDefaultToolkit().beep();
                    String texto = "<html><center><H2>Advierta al contribuyente que debe dirigirse a la sala de espera<br>"
                            + "- " + nuevaSala + " -</H2></center></html>";
                    JOptionPane.showMessageDialog(this, texto, "* ATENCIÓN * ATENCIÓN * ATENCIÓN * ATENCIÓN *", JOptionPane.WARNING_MESSAGE);
                }
            }
        }
    }

    void ordenarColas(String[] colas) {
        java.util.Arrays.sort(colas, (String s1, String s2) -> {
            String[] p1 = Global.split(s1, '-');
            String[] p2 = Global.split(s2, '-');
            int c = p1[0].length() - p2[0].length();
            if (c == 0) {
                return (s1).compareTo(s2);
            }
            return c;
        });
    }

    void reimprimirTicket() {
        RegistroCandidatos reg = registroSeleccionadoEnGrid();
        if (reg != null) {
            if (!Colas.contieneCola(reg.cola)) {
                JOptionPane.showMessageDialog(this, reg.cola + "  " + reg.nif + " -- " + reg.nombre + "\n No se Gestiona en esta Sala de Espera");
                return;
            }

            Global.main.imprimirTicket(reg);
        }
    }

    RegistroCandidatos registroSeleccionadoEnGrid() {
        int f = gridCandidatos.getSelectedRow();
        if (f >= 0) {
            return tmCandidatos.getRegistro(f);
        }
        return null;
    }

    void nuevaCita() {
        Global.principal.abreFormNuevoCandidato(null);
    }

    void buscarNifEnCandidatos(String nif) {
        for (int i = 0; i < gridCandidatos.getRowCount(); i++) {
            String rNif = (String) gridCandidatos.getValueAt(i, 1);
            if (rNif.equalsIgnoreCase(nif)) {
                gridCandidatos.changeSelection(i, 0, false, false);
                return;
            }
        }
    }

    void busquedaIncremental(char c) {
        int r = gridCandidatos.busquedaIncremental(c);
        if (r >= 0) {
            gridCandidatos.changeSelection(r, 0, false, false);
        }
    }
    String[] codigosTurno = {"S", "M", "T", " "};

    void citaManual() {
        RegistroCandidatos reg = registroSeleccionadoEnGrid();
        if (reg != null) {
            if (!Colas.contieneCola(reg.cola)) {
                JOptionPane.showMessageDialog(this, reg.cola + "  " + reg.nif + " -- " + reg.nombre + "\n No se Gestiona en esta Sala de Espera");
                return;
            }
            Global.principal.abreFormNuevoCandidato(reg);
        }
    }

    void anularCita() {
        RegistroCandidatos reg = registroSeleccionadoEnGrid();
        if (reg != null) {
            if (!Colas.contieneCola(reg.cola)) {
                JOptionPane.showMessageDialog(this, reg.cola + "  " + reg.nif + " -- " + reg.nombre + " \nNo se Gestiona en esta Sala de Espera");
                return;
            }
            if (reg.citaMultiple > 1) {
                MsgBox("No es posible anular una cita Vinculada");
                return;
            }
            if (reg.estado.equals("B")) {
                MsgBox("No es posible anular una cita Anulada");
                return;
            }
            if (reg.estado.equals("F") || reg.estado.equals("S")) {
                MsgBox("No es posible anular una cita Finalizada");
                return;
            }
            if (JOptionPane.showConfirmDialog(this, "Confirme anulación de cita :\n" + reg.nif + "  " + reg.nombre + "\n" + reg.cola + "  " + reg.numeroTicket,
                    "ANULAR CITA", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
                reg.cambiaEstado("B", Fecha.horaNula, Fecha.horaNula);
            }
        }
    }

    void vincular() {
        RegistroCandidatos reg = registroSeleccionadoEnGrid();

        if (reg != null) {
            if (!Colas.contieneCola(reg.cola)) {
                JOptionPane.showMessageDialog(this, reg.cola + "  " + reg.nif + " -- " + reg.nombre + "\n No se Gestiona en esta Sala de Espera");
                return;
            }
            if (!reg.estado.equals("P") && !reg.estado.equals(" ")) {
                MsgBox("El estado debe ser BLANCO o PRESENTE para poder VINCULAR");
                return;
            }
        }
        prepararVentanaVinculacion(true);
        adicionaVinculado();
    }

    void prepararVentanaVinculacion(boolean v) {
        modoVinculacion = v;
        this.menuItemMarcarPresente.setEnabled(!v);
        this.btPresente.setEnabled(!v);
        jLabel2.setVisible(v);
        gridVinculados.setVisible(v);
        jbAceptar.setVisible(v);
        jbCancelar.setVisible(v);
        Dimension d = new Dimension(10, 10);
        if (v) {
            d.height = 172;
            d.width = jPanel1.getWidth();
            Dimension h = new Dimension(jScrollPane1.getWidth(), jScrollPane2.getHeight());
            jScrollPane2.setSize(h);
            jLabel2.setSize(d.width, 10);

        }
        jScrollPane2.setVisible(v);
        gridVinculados.setVisible(v);
        jPanel2.setPreferredSize(d);
        jPanel2.setSize(d);
        jbAceptar.setVisible(v);
        jbCancelar.setVisible(v);
        popupMenuGridVinculados.setEnabled(v);
        this.repaint();
    }

    void ModificadoTamaño() {
        if (jScrollPane2.isVisible()) {
            Dimension d = new Dimension();
            d.width = jScrollPane1.getWidth();
            d.height = this.jScrollPane2.getHeight();
            jScrollPane2.setSize(d);
        }
    }

    void adicionaVinculado() {
        if (tmCandidatosVinculados.nifDistintos() >= 3) {
            MsgBox("Limite 3 candidatos");
            return;
        }
        RegistroCandidatos reg = registroSeleccionadoEnGrid();
        if (reg != null) {
            if (!reg.estado.equals("P") && !reg.estado.equals(" ")) {
                MsgBox("El estado debe ser BLANCO o PRESENTE para poder VINCULAR");
                return;
            }
            if (!tmCandidatosVinculados.colaAceptable(reg.cola)) {
                MsgBox("Todos los vinculados deben ser del mismo servicio");
                return;
            }
            ////// Adicionar Citas que ya estan Vinculadas
            if (reg.citaMultiple > 1) {
                TablaCandidatos miniVinculado = new TablaCandidatos();
                tabla.getListaVinculados(reg.citaVinculada, miniVinculado);
                if ((tmCandidatosVinculados.nifDistintos() + miniVinculado.nifDistintos()) > 3) {
                    MsgBox("Limite 3 candidatos");
                    return;
                }
                for (int i = 0; i < miniVinculado.recordsCount(); i++) {
                    tmCandidatosVinculados.add(miniVinculado.getRegistroNum(i));
                }
            } else {
                tmCandidatosVinculados.add(reg);
            }
            refrescarDatosV();
        }
    }

    void cancelarVinculacion() {
        prepararVentanaVinculacion(false);
        vaciarVinculacion();
    }

    void seleccionarFilaGridVinculados(Point p) {
        int r = gridVinculados.rowAtPoint(p);
        if (r != -1) {
            gridVinculados.changeSelection(r, 0, false, false);
        }
    }

    void mostrarMenuPopupGridVinculados(int x, int y) {
        if (gridVinculados.getSelectedRowCount() > 0 && popupMenuGridVinculados.isEnabled()) {
            popupMenuGridVinculados.show(gridVinculados, x, y);
        }
    }

    void deseleccionarVinculado() {
        int fila = gridVinculados.getSelectedRow();
        tmCandidatosVinculados.borrarFila(fila);
        gridVinculados.repaint();
        if (tmCandidatosVinculados.getRowCount() == 0) {
            cancelarVinculacion();
        }
    }

    void vaciarVinculacion() {
        tmCandidatosVinculados.vaciar();
    }

    void pulsadoVinculacionManual() {
        ProcesarVinculacionManual();
        prepararVentanaVinculacion(false);
        vaciarVinculacion();
    }

    void ProcesarVinculacionManual() {
        if (tmCandidatosVinculados.getRowCount() == 0) {
            return;
        }
        for (int i = 0; i < tmCandidatosVinculados.size(); i++) {
            RegistroCandidatos regVin = tmCandidatosVinculados.getRegistro(i);
            regVin.citaMultiple = 1;
            regVin.citaVinculada = "     ";
        }
        tmCandidatosVinculados.recargardatosVinculados(tabla);
        RegistroCandidatos presente = tmCandidatosVinculados.HayPresentes();
        RegistroCandidatos reg = tmCandidatosVinculados.primeroEnHora();
        if (presente == null) { // No hay ningun presente
            if (reg == null) {
                MsgBox("Todos los candidatos están fuera de hora");
                return;
            }
            Global.main.comunicaciones.procesarDeInmediato = true;
            procesarPresente(reg);
            int pasos = 0;
            while (true) {
                if (reg.tieneTicket()) {
                    break;
                }
                Global.sleep(100);
                if (pasos++ > 30) {
                    MsgBox("No se ha recibido la asignación de nº de Tique desde el Servidor.\nOperación cancelada");
                    return;
                }
            }
            Global.main.comunicaciones.procesarDeInmediato = false;
            presente = reg;
            tmCandidatosVinculados.recargardatosVinculados(tabla);
        } else {
            if (reg == null) {
                reg = presente;
            }
        }
        tmCandidatosVinculados.corregirDatosVinculados(presente.numeroTicket, reg);
        tmCandidatosVinculados.enviarCambiosAlServidor();
    }

    void test() {
        tmCandidatosVinculados.recargardatosVinculados(tabla);
    }
    
    void verFiltros() {
        if (popup != null) {
            popup.hide();
            popup = null;
        } else {
            Point p = new Point(btVerFiltros.getX(), btVerFiltros.getY() + btVerFiltros.getHeight());
            SwingUtilities.convertPointToScreen(p, this.getContentPane());
            popup = PopupFactory.getSharedInstance().getPopup(this, desplegableFiltros, p.x, p.y);
            popup.show();
        }
    }

    @Override
    public void avisoSmartCardInsertada(String nif, String nombre) {
        this.buscarNifEnCandidatos(nif);
    }

    @Override
    public void avisoSmartCardExtraida() {
    }

//   class renderCeldaRoja extends javax.swing.table.DefaultTableCellRenderer {
//
//      public renderCeldaRoja() {
//         super();
//      }
//
//      @Override
//      public java.awt.Component getTableCellRendererComponent(javax.swing.JTable table, Object value, boolean isSelected,
//              boolean hasFocus, int row, int column) {
//         try {
//            Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
//            JGrid grid = (JGrid) table;
//            String val = (String) grid.getValueAt(row, TModelCandidatos.COLCANDIDATO.NOTIFI.ordinal());
//            if (val != null && !val.equalsIgnoreCase("-")) {
//               comp.setForeground(Color.red);
//            } else {
//               comp.setForeground(Color.black);
//            }
//            return comp;
//         } catch (Exception exc) {
//            exc.printStackTrace();
//            return null;
//         }
//      }
//   }
    /**
     * 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.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        popupMenuGridCandidatos = new javax.swing.JPopupMenu();
        menuItemMarcarPresente = new javax.swing.JMenuItem();
        menuItemCambiarEstado = new javax.swing.JMenuItem();
        menuItemCambiarCola = new javax.swing.JMenuItem();
        menuItemMesaPreferente = new javax.swing.JMenuItem();
        menuItemReimprimir = new javax.swing.JMenuItem();
        menuItemVinculacion = new javax.swing.JMenuItem();
        menuItemCitaManual = new javax.swing.JMenuItem();
        menuItemAnularCita = new javax.swing.JMenuItem();
        popupMenuGridVinculados = new javax.swing.JPopupMenu();
        menuItemElminiarVinculacion = new javax.swing.JMenuItem();
        desplegableFiltros = new javax.swing.JPanel();
        jCheckVerCitaPrevia = new javax.swing.JCheckBox();
        jCheckVerTerminados = new javax.swing.JCheckBox();
        jPanel1 = new javax.swing.JPanel();
        btPresente = new javax.swing.JButton();
        btNuevaCita = new javax.swing.JButton();
        ckbTicket = new javax.swing.JCheckBox();
        comboVerTurno = new javax.swing.JComboBox();
        btVerFiltros = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        gridCandidatos = new javax.swing.grid.JGrid();
        jPanel2 = new javax.swing.JPanel();
        jLabel2 = new javax.swing.JLabel();
        jbAceptar = new javax.swing.JButton();
        jbCancelar = new javax.swing.JButton();
        jScrollPane2 = new javax.swing.JScrollPane();
        gridVinculados = new javax.swing.JTable();
        jLabel3 = new javax.swing.JLabel();

        menuItemMarcarPresente.setText("Marcar como Presente");
        menuItemMarcarPresente.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                menuItemMarcarPresenteActionPerformed(evt);
            }
        });
        popupMenuGridCandidatos.add(menuItemMarcarPresente);

        menuItemCambiarEstado.setText("Cambiar a NO PRESENTE");
        menuItemCambiarEstado.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                menuItemCambiarEstadoActionPerformed(evt);
            }
        });
        popupMenuGridCandidatos.add(menuItemCambiarEstado);

        menuItemCambiarCola.setText("Cambiar de cola");
        menuItemCambiarCola.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                menuItemCambiarColaActionPerformed(evt);
            }
        });
        popupMenuGridCandidatos.add(menuItemCambiarCola);

        menuItemMesaPreferente.setText("Mesa obligatoria");
        menuItemMesaPreferente.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                menuItemMesaPreferenteActionPerformed(evt);
            }
        });
        popupMenuGridCandidatos.add(menuItemMesaPreferente);

        menuItemReimprimir.setText("Reimprimir tique");
        menuItemReimprimir.setEnabled(false);
        menuItemReimprimir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                menuItemReimprimirActionPerformed(evt);
            }
        });
        popupMenuGridCandidatos.add(menuItemReimprimir);

        menuItemVinculacion.setText("Vincular");
        menuItemVinculacion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                menuItemVinculacionActionPerformed(evt);
            }
        });
        popupMenuGridCandidatos.add(menuItemVinculacion);

        menuItemCitaManual.setText("Habilitar Cita");
        menuItemCitaManual.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                menuItemCitaManualActionPerformed(evt);
            }
        });
        popupMenuGridCandidatos.add(menuItemCitaManual);

        menuItemAnularCita.setText("Anular Cita");
        menuItemAnularCita.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                menuItemAnularCitaActionPerformed(evt);
            }
        });
        popupMenuGridCandidatos.add(menuItemAnularCita);

        menuItemElminiarVinculacion.setText("Deseleccionar");
        menuItemElminiarVinculacion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                menuItemElminiarVinculacionActionPerformed(evt);
            }
        });
        popupMenuGridVinculados.add(menuItemElminiarVinculacion);

        desplegableFiltros.setBorder(javax.swing.BorderFactory.createBevelBorder(0));
        desplegableFiltros.setMaximumSize(new java.awt.Dimension(150, 100));
        desplegableFiltros.setMinimumSize(new java.awt.Dimension(150, 100));
        desplegableFiltros.setPreferredSize(new java.awt.Dimension(150, 100));
        desplegableFiltros.setLayout(new java.awt.FlowLayout(0));

        jCheckVerCitaPrevia.setText("Ver sólo Cita Previa");
        jCheckVerCitaPrevia.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jCheckVerCitaPreviaActionPerformed(evt);
            }
        });
        desplegableFiltros.add(jCheckVerCitaPrevia);

        jCheckVerTerminados.setText("Filtrar terminados");
        jCheckVerTerminados.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jCheckVerTerminadosActionPerformed(evt);
            }
        });
        desplegableFiltros.add(jCheckVerTerminados);

        setTitle("RELACION DE CANDIDATOS");
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowActivated(java.awt.event.WindowEvent evt) {
                formWindowActivated(evt);
            }
        });
        addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                formKeyPressed(evt);
            }
        });

        jPanel1.setBorder(javax.swing.BorderFactory.createBevelBorder(0));
        jPanel1.setDoubleBuffered(false);

        btPresente.setText("Presente");
        btPresente.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btPresenteActionPerformed(evt);
            }
        });
        jPanel1.add(btPresente);

        btNuevaCita.setText("Nueva cita");
        btNuevaCita.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btNuevaCitaActionPerformed(evt);
            }
        });
        jPanel1.add(btNuevaCita);

        ckbTicket.setText("Imprimir tique");
        ckbTicket.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ckbTicketActionPerformed(evt);
            }
        });
        jPanel1.add(ckbTicket);

        comboVerTurno.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "ver turno SERVIDOR", "ver turno MAÑANA", "ver turno TARDE", "ver TODO" }));
        comboVerTurno.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                comboVerTurnoActionPerformed(evt);
            }
        });
        jPanel1.add(comboVerTurno);

        btVerFiltros.setText("Filtros");
        btVerFiltros.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btVerFiltrosActionPerformed(evt);
            }
        });
        jPanel1.add(btVerFiltros);

        getContentPane().add(jPanel1, java.awt.BorderLayout.NORTH);

        jScrollPane1.addComponentListener(new java.awt.event.ComponentAdapter() {
            public void componentResized(java.awt.event.ComponentEvent evt) {
                jScrollPane1ComponentResized(evt);
            }
        });

        gridCandidatos.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        gridCandidatos.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_ALL_COLUMNS);
        gridCandidatos.setCabeceraPulsable(true);
        gridCandidatos.addCabeceraPulsadaListener(new javax.swing.grid.CabeceraPulsadaListener() {
            public void cabeceraPulsada(javax.swing.grid.CeldaPulsadaEvent evt) {
                gridCandidatosCabeceraPulsada(evt);
            }
        });
        gridCandidatos.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                gridCandidatosMouseClicked(evt);
            }
            public void mousePressed(java.awt.event.MouseEvent evt) {
                gridCandidatosMousePressed(evt);
            }
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                gridCandidatosMouseReleased(evt);
            }
        });
        gridCandidatos.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                gridCandidatosKeyTyped(evt);
            }
        });
        jScrollPane1.setViewportView(gridCandidatos);

        getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER);

        jPanel2.setDoubleBuffered(false);
        jPanel2.setPreferredSize(new java.awt.Dimension(40, 172));
        jPanel2.setLayout(null);

        jLabel2.setForeground(new java.awt.Color(0, 51, 255));
        jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel2.setText("Candidatos a vincular");
        jPanel2.add(jLabel2);
        jLabel2.setBounds(8, 6, 550, 27);

        jbAceptar.setText("Vincular");
        jbAceptar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbAceptarActionPerformed(evt);
            }
        });
        jPanel2.add(jbAceptar);
        jbAceptar.setBounds(117, 136, 110, 30);

        jbCancelar.setText("Cancelar");
        jbCancelar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbCancelarActionPerformed(evt);
            }
        });
        jPanel2.add(jbCancelar);
        jbCancelar.setBounds(316, 136, 110, 30);

        jScrollPane2.setOpaque(false);

        gridVinculados.setBackground(new java.awt.Color(247, 242, 231));
        gridVinculados.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        gridVinculados.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
        gridVinculados.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                gridVinculadosMousePressed(evt);
            }
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                gridVinculadosMouseReleased(evt);
            }
        });
        jScrollPane2.setViewportView(gridVinculados);

        jPanel2.add(jScrollPane2);
        jScrollPane2.setBounds(0, 40, 650, 90);

        jLabel3.setFont(new java.awt.Font("MS Sans Serif", 0, 10)); // NOI18N
        jLabel3.setText("<html><FONT FACE=\"arial\" SIZE=2 COLOR=red>Click en botón derecho para eliminar de la lista</FONT><html> ");
        jLabel3.setDoubleBuffered(true);
        jPanel2.add(jLabel3);
        jLabel3.setBounds(436, 130, 130, 40);

        getContentPane().add(jPanel2, java.awt.BorderLayout.SOUTH);

        pack();
    }// </editor-fold>//GEN-END:initComponents
    private void formWindowActivated(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowActivated
        Global.main.registrarVentanaEnLectorSC(this);
        gridCandidatos.requestFocus();
    }//GEN-LAST:event_formWindowActivated

    private void formKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_formKeyPressed
        gridCandidatos.requestFocus();
    }//GEN-LAST:event_formKeyPressed

    private void menuItemCitaManualActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_menuItemCitaManualActionPerformed
        citaManual();
    }//GEN-LAST:event_menuItemCitaManualActionPerformed

    private void gridVinculadosMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_gridVinculadosMouseReleased
        if (evt.getButton() == java.awt.event.MouseEvent.BUTTON3) {
            mostrarMenuPopupGridVinculados(evt.getPoint().x, evt.getPoint().y);
        }
}//GEN-LAST:event_gridVinculadosMouseReleased

   private void gridVinculadosMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_gridVinculadosMousePressed
       seleccionarFilaGridVinculados(evt.getPoint());
}//GEN-LAST:event_gridVinculadosMousePressed

   private void menuItemElminiarVinculacionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_menuItemElminiarVinculacionActionPerformed
       deseleccionarVinculado();
   }//GEN-LAST:event_menuItemElminiarVinculacionActionPerformed

   private void gridCandidatosMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_gridCandidatosMouseClicked
       if (evt.getClickCount() > 1 && modoVinculacion) {
           adicionaVinculado();
       }
}//GEN-LAST:event_gridCandidatosMouseClicked

    private void jbAceptarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbAceptarActionPerformed
        pulsadoVinculacionManual();
        gridCandidatos.requestFocus();
    }//GEN-LAST:event_jbAceptarActionPerformed

    private void jScrollPane1ComponentResized(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_jScrollPane1ComponentResized
        ModificadoTamaño();
    }//GEN-LAST:event_jScrollPane1ComponentResized

    private void menuItemVinculacionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_menuItemVinculacionActionPerformed
        vincular();
    }//GEN-LAST:event_menuItemVinculacionActionPerformed

   private void jbCancelarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbCancelarActionPerformed
       cancelarVinculacion();
       gridCandidatos.requestFocus();
   }//GEN-LAST:event_jbCancelarActionPerformed

   private void menuItemCambiarColaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_menuItemCambiarColaActionPerformed
       pedirCambioDeCola();
   }//GEN-LAST:event_menuItemCambiarColaActionPerformed

   private void menuItemMesaPreferenteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_menuItemMesaPreferenteActionPerformed
       pedirMesaPreferente();
   }//GEN-LAST:event_menuItemMesaPreferenteActionPerformed

   private void ckbTicketActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ckbTicketActionPerformed
       cambiadoEstadoTickets();
       gridCandidatos.requestFocus();
   }//GEN-LAST:event_ckbTicketActionPerformed

   private void menuItemReimprimirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_menuItemReimprimirActionPerformed
       reimprimirTicket();
   }//GEN-LAST:event_menuItemReimprimirActionPerformed

   private void btNuevaCitaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btNuevaCitaActionPerformed
       nuevaCita();
   }//GEN-LAST:event_btNuevaCitaActionPerformed

   private void btPresenteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btPresenteActionPerformed
       ponerMarcaEstado("P");
       gridCandidatos.requestFocus();
   }//GEN-LAST:event_btPresenteActionPerformed

   private void menuItemCambiarEstadoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_menuItemCambiarEstadoActionPerformed
       ponerMarcaEstado(" ");
   }//GEN-LAST:event_menuItemCambiarEstadoActionPerformed

   private void gridCandidatosMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_gridCandidatosMousePressed
       seleccionarFilaGrid(evt.getPoint());
}//GEN-LAST:event_gridCandidatosMousePressed

   private void menuItemMarcarPresenteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_menuItemMarcarPresenteActionPerformed
       ponerMarcaEstado("P");
   }//GEN-LAST:event_menuItemMarcarPresenteActionPerformed

   private void gridCandidatosMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_gridCandidatosMouseReleased
       if (evt.getButton() == java.awt.event.MouseEvent.BUTTON3) {
           mostrarMenuPopupGrid(evt.getPoint().x, evt.getPoint().y);
       }
}//GEN-LAST:event_gridCandidatosMouseReleased

   private void gridCandidatosCabeceraPulsada(javax.swing.grid.CeldaPulsadaEvent evt) {//GEN-FIRST:event_gridCandidatosCabeceraPulsada
       cabeceraGridPulsada(evt.getColumna(), evt.getModificadores());
}//GEN-LAST:event_gridCandidatosCabeceraPulsada

   private void gridCandidatosKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_gridCandidatosKeyTyped
       busquedaIncremental(evt.getKeyChar());
}//GEN-LAST:event_gridCandidatosKeyTyped

private void jCheckVerCitaPreviaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jCheckVerCitaPreviaActionPerformed
    cambiadoVistaCitaPrevia();
}//GEN-LAST:event_jCheckVerCitaPreviaActionPerformed

private void jCheckVerTerminadosActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jCheckVerTerminadosActionPerformed
    cambiadoFiltroTerminados();
}//GEN-LAST:event_jCheckVerTerminadosActionPerformed

private void btVerFiltrosActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btVerFiltrosActionPerformed
    verFiltros();
}//GEN-LAST:event_btVerFiltrosActionPerformed

private void comboVerTurnoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_comboVerTurnoActionPerformed
    cambiadoVerTurno();
    gridCandidatos.requestFocus();
}//GEN-LAST:event_comboVerTurnoActionPerformed

private void menuItemAnularCitaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_menuItemAnularCitaActionPerformed
    anularCita();
}//GEN-LAST:event_menuItemAnularCitaActionPerformed
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btNuevaCita;
    private javax.swing.JButton btPresente;
    private javax.swing.JButton btVerFiltros;
    private javax.swing.JCheckBox ckbTicket;
    private javax.swing.JComboBox comboVerTurno;
    private javax.swing.JPanel desplegableFiltros;
    private javax.swing.grid.JGrid gridCandidatos;
    private javax.swing.JTable gridVinculados;
    private javax.swing.JCheckBox jCheckVerCitaPrevia;
    private javax.swing.JCheckBox jCheckVerTerminados;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JButton jbAceptar;
    private javax.swing.JButton jbCancelar;
    private javax.swing.JMenuItem menuItemAnularCita;
    private javax.swing.JMenuItem menuItemCambiarCola;
    private javax.swing.JMenuItem menuItemCambiarEstado;
    private javax.swing.JMenuItem menuItemCitaManual;
    private javax.swing.JMenuItem menuItemElminiarVinculacion;
    private javax.swing.JMenuItem menuItemMarcarPresente;
    private javax.swing.JMenuItem menuItemMesaPreferente;
    private javax.swing.JMenuItem menuItemReimprimir;
    private javax.swing.JMenuItem menuItemVinculacion;
    private javax.swing.JPopupMenu popupMenuGridCandidatos;
    private javax.swing.JPopupMenu popupMenuGridVinculados;
    // End of variables declaration//GEN-END:variables
}
