/* 
* 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 monitor;

import java.awt.event.KeyEvent;
import java.io.*;
import java.awt.*;
import java.util.*;
import java.util.logging.*;
import javax.swing.SwingUtilities;
import monitor.utiles.*;
import monitor.datos.*;

public final class Ventana extends javax.swing.JFrame {

    Configuracion conf;
    GridRecuerdo grid;
    GridRecuerdo gridAnt;
    java.applet.AudioClip clip = null;
    ReproductorVoz voz = null;
    colaBase inmediata;
    colaRecuerdo recuerdo;
    ListaTickets listaTickets;
    ArrayList<String> colasConPendientes;
    boolean anterioresDesdeElPrimero = true;
    public java.awt.image.BufferedImage fondo = null;
    public Cursor cursorTransparente;
    public boolean bucleIniciado = false;
    public static Logger log;
    public static Ventana main;
    AlmacenStrings trad;
    AlmacenStringSecundario tradJar;
    String palabraMesa = "Mesa";
    String palabraHoraCita = "horaCita";
    String panelActual;
    PercentLayout pcly;
    Comunicaciones com;
    public boolean errorEnVoz = false;
    public volatile long tiempoInicioBucle;
    public volatile long tiempoProximoRecuerdo;
    public long demasiadoParado;
    public boolean continuarBucle = true;

    BannerGrafico bg;
    boolean bannerOculto;
    Container contenedorPrincipal;
    int porcentajeBanner = 8;

    TablaColas colas;

    public Ventana(GraphicsConfiguration gc) {
        super(gc);
        main = this;
        prepararLogging();
        conf = Configuracion.instanciaUnica();
        trad = new AlmacenStrings();
        tradJar = new AlmacenStringSecundario();
        tradJar.cargar("traduccion.txt");
        if (trad.cargar("traduccion.txt")) {
            if (trad.consolidar(tradJar)) {
                trad.guardar();
            }
        } else {
            trad = tradJar;
            trad.guardar();
        }
        palabraMesa = trad.valor("mesa");   //"<html><h3>mesa</h3></html>";
        palabraHoraCita = trad.valor("horaCita");
        setUndecorated(!conf.enVentana);
        initComponents();
        grid = new GridPendientes(this);
        panel_Recordatorio.add(grid, java.awt.BorderLayout.CENTER);
        gridAnt = new GridAnteriores(this);
        panel_Anteriores.add(gridAnt, java.awt.BorderLayout.CENTER);
        creaCursorOculto();

        tiempoProximoRecuerdo = System.currentTimeMillis() + 60000;

        ((PanelAnuncio) panel_Imagen).preparaFondo();

        if (conf.vozActivada) {
            voz = new ReproductorVoz();
        } else if (conf.sonidoActivado) {
            File wav = new File(conf.rutaRecursos + "\\notify.wav");
            if (!wav.exists()) {
                wav = new File("notify.wav");
            }
            try {
                clip = java.applet.Applet.newAudioClip(wav.toURI().toURL());
            } catch (Exception exc) {
                clip = null;
                conf.sonidoActivado = false;
            }
        }
        inmediata = new colaBase();
        recuerdo = new colaRecuerdo();
        listaTickets = new ListaTickets();
        colasConPendientes = new ArrayList<>();
        com = new Comunicaciones(this);
        colas = TablaColas.getTablaColas();
        demasiadoParado = conf.milisegPanel * 4;
        if (demasiadoParado < 20000) {
            demasiadoParado = 20000;
        }
        contenedorPrincipal = getContentPane();
        pcly = new PercentLayout(PercentLayout.VERTICAL, 0);

        bg = new BannerGrafico(panelBanner);
        ocultarBanner();
        panelBanner.add(bg);
    }

    void iniciarBanner() {
        try {
            File fichLineas = new File("MensajesBanner.txt");
            if (fichLineas.exists()) {
                String[] lineas = Global.FileReadAllLineNotEmpty(fichLineas);
                if (lineas.length > 0) {
                    bg.stop();
                    bg.removeAll();
                    for (String s : lineas) {
                        bg.addText(s);
                    }
                    mostrarBanner();
                    bg.start();
                    return;
                }
            }
            bg.stop();
            ocultarBanner();
        } catch (Exception exc) {
            exc.printStackTrace();
        }
    }

    void mostrarBanner() {
        PercentLayout pcly = new PercentLayout(PercentLayout.VERTICAL, 0);
        pcly.addLayoutComponent(panelPrincipal, (100 - porcentajeBanner) + "%");
        pcly.addLayoutComponent(panelBanner, porcentajeBanner + "%");
        contenedorPrincipal.setLayout(pcly);
        validate();
        bg.start();
        bannerOculto = false;
        //BannerGrafico banner= new BannerGrafico(panelBanner);
        //banner.setText(textoBanner);
    }

    void ocultarBanner() {
        PercentLayout pcly = new PercentLayout(PercentLayout.VERTICAL, 0);
        pcly.addLayoutComponent(panelPrincipal, "100%");
        pcly.addLayoutComponent(panelBanner, "0%");
        contenedorPrincipal.setLayout(pcly);
        validate();
        bg.stop();
        bannerOculto = true;
    }

    void prepararLogging() {
        try {
            File logdir = new File("logs\\");
            if (!logdir.exists()) {
                logdir.mkdir();
            }
            log = Logger.getLogger("Logger");
            FileHandler fh = new FileHandler("logs\\monitor.log", 10000, 10);
            fh.setFormatter(new SimpleFormatter());
            log.addHandler(fh);
            log.setLevel(Level.FINEST);
        } catch (Exception exc) {
            javax.swing.JOptionPane.showMessageDialog(null, "No se ha podido iniciar el proceso de LOG");
            System.exit(-1);
        }
    }

    public static void logException(String s, Exception ex) {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        ex.printStackTrace(pw);
        log.log(Level.WARNING, "{0}\n{1}", new Object[]{s, sw.toString()});
    }

    public void creaCursorOculto() {
        int[] pixels = new int[16 * 16];
        Image image = Toolkit.getDefaultToolkit().createImage(new java.awt.image.MemoryImageSource(16, 16, pixels, 0, 16));
        cursorTransparente = Toolkit.getDefaultToolkit().createCustomCursor(image, new Point(0, 0), "invisibleCursor");
    }

    public void ajustar(GraphicsConfiguration gc) {
        Rectangle rec = gc.getBounds();
        if (conf.enVentana) {
            setSize(600, 375);
        } else {
            setBounds(rec);
        }
        setVisible(true);
        preparaPaneles();
    }

    void preparaPaneles() {
        Rectangle rec = this.getRootPane().getBounds();
        boolean mostrarColumnaSala = conf.mostrarSalaAtencion & conf.mostrarColumnaSalaAtencion;
        grid.prepararGrid(rec, mostrarColumnaSala, false, conf.colorBanda1, conf.colorBanda2);
        gridAnt.prepararGrid(rec, true, true, conf.colorBanda3, conf.colorBanda4);
        monitor.utiles.SmoothLabel lb = new monitor.utiles.SmoothLabel();
        lb.setText(trad.valor("ultimosTickets"));
        lb.setForeground(conf.colorBanda3);
        lb.setBackground(conf.colorBanda4);
        lb.setPreferredSize(new Dimension((int) rec.getWidth(), gridAnt.getRowHeight()));
        lb.setFont(gridAnt.fuenteCelda);
        lb.setOpaque(true);
        lb.setHorizontalAlignment(javax.swing.JLabel.CENTER);
        panel_Anteriores.add(lb, java.awt.BorderLayout.NORTH);
        panel_Anteriores.add(gridAnt, java.awt.BorderLayout.CENTER);

        pcly = new PercentLayout(PercentLayout.VERTICAL, 0);
        int porcentajeHora, porcentajeSala, porcentajeTicket;
        porcentajeHora = conf.ocultarHora ? 0 : 13;
        porcentajeSala = conf.mostrarSalaAtencion ? 19 : 0;
        porcentajeTicket = (100 - (porcentajeHora + porcentajeSala)) / 2;
        pcly.addLayoutComponent(lbMesa, porcentajeTicket + "%");
        pcly.addLayoutComponent(lbNumeroTicket, porcentajeTicket + "%");
        pcly.addLayoutComponent(lbLocalizacion, porcentajeSala + "%");
        pcly.addLayoutComponent(lbHoraTicket, porcentajeHora + "%");

        lbNumeroTicket.setFont(lbNumeroTicket.getFont().deriveFont(rec.height * 0.24f));
        lbNumeroTicket.setForeground(conf.colorTicket);
        lbMesa.setFont(lbMesa.getFont().deriveFont(rec.height * 0.22f));
        lbMesa.setForeground(conf.colorMesa);
        lbHoraTicket.setFont(lbHoraTicket.getFont().deriveFont(rec.height * 0.12f));
        lbHoraTicket.setForeground(conf.colorHora);
        lbLocalizacion.setFont(lbHoraTicket.getFont().deriveFont(rec.height * 0.14f));
        lbLocalizacion.setForeground(conf.colorSala);

        panel_Inmediato.setLayout(pcly);
        panel_Inmediato.setBackground(conf.colorBanda2);

        panel_Imagen.setCursor(cursorTransparente);
        panel_Inmediato.setCursor(cursorTransparente);
        panel_Recordatorio.setCursor(cursorTransparente);
        panel_Anteriores.setCursor(cursorTransparente);
    }

    public void iniciar() {
        if (!com.conectar()) {
            MsgBox(trad.valor("error_conexion") + conf.ipServidor);
            System.exit(-1);
        }
        listaTickets.clear();
        iniciarBanner();
        com.enviarConexion();
        while (!bucleIniciado) {
            bucleIniciado = true;
            mirarListas();
            log.log(Level.WARNING, "El bucle principal se ha interrumpido. \n\u00daltimo ticket: {0}\nSe ejecuta de nuevo...", lbNumeroTicket.getText());
            bucleIniciado = false;
        }
    }

    void espera(long lapso) {
        while (lapso > 0 || voz.reproduccionEnCurso) {
            if (panelActual.equals("cardImagen") && inmediata.size() > 0) {
                return;
            }
            Global.sleep(100);
            lapso -= 100;
        }
    }

    void cambiarPanel(final String nombre) {
        if (nombre.equals(panelActual)) {
            if (panelActual.equals("cardInmediato")) {
                repintar();
            }
            return;
        }

        if (nombre.equalsIgnoreCase("cardAnteriores")) {
            if (tiempoProximoRecuerdo > tiempoInicioBucle) {
                return;
            } else {
                tiempoProximoRecuerdo = System.currentTimeMillis() + 30000;
            }
        }
        panelActual = nombre;
        final Container c = this.panelPrincipal;
        if (SwingUtilities.isEventDispatchThread()) {
            ((CardLayout) c.getLayout()).show(c, nombre);
            repintar();
        } else {
            try {
                javax.swing.SwingUtilities.invokeLater(new Runnable() {

                    @Override
                    public void run() {
                        try {
                            ((CardLayout) c.getLayout()).show(c, nombre);
                        } catch (Exception exc) {
                            log.log(Level.WARNING, "Excepcion en cambiarPanel: {0}", exc.getMessage());
                        }
                    }
                });
            } catch (Exception exc) {
                log.log(Level.WARNING, "Excepcion en cambiarPanel: {0}", exc.getMessage());
            }
        }
    }

    void repintar() {
        Graphics gr = main.getGraphics();
        main.update(gr);
        gr.dispose();
    }

    // *** BUCLE PRINCIPAL DEL PROGRAMA ***
    boolean turnoFoto;

    void mirarListas() {
        turnoFoto = true;
        continuarBucle = true;
        boolean tocaRecordatorio = true;
        while (true) {
            try {
                tiempoInicioBucle = System.currentTimeMillis();
                // PRIMER INTENTO: mostrar el ultimo ticket llegado
                if (inmediata.size() > 0) {
                    imprimirPanelInmediato();
                    tocaRecordatorio = true;
                } else {
                    recuerdo.borrarMensajesCaducados();
                    // SEGUNDO INTENTO: mostrar los tickets en tránsito
                    if (conf.mostrarTiquesEnTransito && recuerdo.size() > 0
                            && (!conf.alternarTiquesYCarteles || tocaRecordatorio)) {
                        imprimirPanelRecordatorio();
                        tocaRecordatorio = false;
                    } else {
                        // TERCER INTENTO: Mostrar grid con tickets anteriores y/o pantallas de relleno
                        imprimirPanelImagenes();
                        tocaRecordatorio = true;
                    }
                }
                long lapso = conf.milisegPanel - (System.currentTimeMillis() - tiempoInicioBucle);
                if (lapso > conf.milisegPanel) {
                    lapso = conf.milisegPanel;
                } else if (lapso <= 0) {
                    lapso = 50;
                }
                espera(lapso);
                com.enviarTestConexion();
            } catch (Exception exc) {
                exc.printStackTrace();
                log.log(Level.SEVERE, "Excepcion en bucle principal: {0}", exc.getMessage());
            }
        }
    }

    void imprimirPanelInmediato() {
        try {
            javax.swing.SwingUtilities.invokeAndWait(new Runnable() {

                @Override
                public void run() {
                    anterioresDesdeElPrimero = true;
                    datosMensaje dm = (datosMensaje) inmediata.desencola();
                    lbNumeroTicket.setText(dm.tiket);
                    lbMesa.setText(palabraMesa + ": " + dm.mesa);
                    lbHoraTicket.setText(palabraHoraCita + dm.hora);
                    lbLocalizacion.setText(dm.localizacion);
                    cambiarPanel("cardInmediato");
                    sonido(dm.tiket, dm.mesa, conf.mostrarSalaAtencion ? dm.localizacion : "");
                }
            });
        } catch (Exception exc) {
            exc.printStackTrace();
            logException("", exc);
        }
    }

    void imprimirPanelRecordatorio() {
        try {
            javax.swing.SwingUtilities.invokeAndWait(new Runnable() {

                @Override
                public void run() {
                    anterioresDesdeElPrimero = true;
                    actualizarGridRecordatorio();
                    cambiarPanel("cardRecordatorio");
                }
            });
        } catch (Exception exc) {
            exc.printStackTrace();
            logException("", exc);
        }
    }

    void imprimirPanelImagenes() {
        try {
            javax.swing.SwingUtilities.invokeAndWait(new Runnable() {

                @Override
                public void run() {
                    boolean hayDatosAnteriores = actualizarGridAnteriores();
                    if (turnoFoto || !hayDatosAnteriores) {
                        ((PanelAnuncio) panel_Imagen).preparaFondo();
                        cambiarPanel("cardImagen");
                        if (conf.mostrarAnteriores) {
                            turnoFoto = false;
                        }
                    } else {
                        if (hayDatosAnteriores) {
                            cambiarPanel("cardAnteriores");
                        }
                        turnoFoto = true;
                    }
                }
            });
        } catch (Exception exc) {
            exc.printStackTrace();
            logException("", exc);
        }
    }

    void actualizarGridRecordatorio() {
        int numeroMostrar;
        if (conf.numFilas <= recuerdo.size()) {
            numeroMostrar = conf.numFilas;
        } else {
            numeroMostrar = recuerdo.size();
        }
        for (int i = 0; i < numeroMostrar; i++) {
            datosMensaje dm = (datosMensaje) recuerdo.desencola();
            grid.setValueAt(dm.tiket, i, 0);
            grid.setValueAt(palabraMesa + " " + dm.mesa, i, 1);
            grid.setValueAt(dm.localizacionCorta, i, 2);
            recuerdo.encolaSinOrden(dm);
        }
        for (int i = numeroMostrar; i < conf.numFilas; i++) {
            grid.setValueAt(" ", i, 0);
            grid.setValueAt(" ", i, 1);
            grid.setValueAt(" ", i, 2);
        }
    }

    boolean actualizarGridAnteriores() {
        String[] tickets = listaTickets.generarDatosParaMostrar(colasConPendientes);
        int numTickets = tickets.length;
        if (numTickets == 0) {
            return false;
        }
        try {
            int idx = 0;
            if (!anterioresDesdeElPrimero) {
                idx = numTickets - 15;
                if (idx < 0) {
                    idx = 0;
                }
            }
            // rellenamos con lo que tengamos
            for (int f = 0; f < 5; f++) {
                for (int c = 0; c < 3; c++) {
                    if (idx < numTickets) {
                        gridAnt.setValueAt(tickets[idx], f, c);
                    } else {
                        gridAnt.setValueAt(" ", f, c);
                    }
                    idx++;
                }
            }
            anterioresDesdeElPrimero = !anterioresDesdeElPrimero;
            return true;

        } catch (Exception exc) {
            logException("", exc);
            return false;
        }
    }

    datosMensaje leeMensaje(String msg) {
        String x[] = Global.split(msg, '|');
        if (conf.nombreMonitor.equalsIgnoreCase(x[5])) {
            x[5] = "";
        }
        return new datosMensaje(x[2], x[0], x[1], x[3], x[4], x[5]);
    }

    void Baja(String msj) {
        try {
            String x[] = Global.split(msj, '|');
            recuerdo.eliminaMesa(x[0]);
        } catch (Exception exc) {
            logException("Error en 'Baja'. Mensaje:\n" + msj, exc);
        }
    }

    void Alta(String msj) {
        try {
            datosMensaje mensaje = leeMensaje(msj);
            if (ColaValida(mensaje.salaEspera.trim().toUpperCase())) {
                if (conf.mostrarInmediato) {
                    inmediata.encola(mensaje);
                }
                recuerdo.eliminaMesa(mensaje.mesa);
                recuerdo.encola(mensaje);
                listaTickets.put(mensaje.tiket);
            }
        } catch (Exception exc) {
            logException("Error en 'Alta'. Mensaje:\n" + msj, exc);
        }
    }

    public void nuevoRegistroColas(String sreg) {
        try {
            if (!sreg.equals("FIN_REGISTROS")) {
                colas.nuevoRegistro(sreg);
            } else {
                colasConPendientes.clear();
            }
        } catch (Exception exc) {
        }
    }

    void altaMensajeBanner(String msj) {
        if (bg != null) {
            bg.addText(msj);
        }
        if (bannerOculto) {
            mostrarBanner();
        }
    }

    void bajaMensajeBanner(String msj) {
        if (bg != null) {
            if (msj.equalsIgnoreCase("TODOS")) {
                bg.removeAll();
            } else {
                bg.removeText(msj);
            }
        }
        if (!bannerOculto && bg.numeroMensajes() == 0) {
            ocultarBanner();
        }
    }

    void actualizarColasConPendientes(String msj) {
        try {
            colasConPendientes.clear();
            String infoCola[] = Global.split(msj, '|');
            for (String infoCola1 : infoCola) {
                String[] partes = Global.split(infoCola1, '=');
                if (!partes[1].equals("0") && partes[0].length() > 0) {
                    colasConPendientes.add(partes[0]);
                }
            }
        } catch (Exception exc) {
            logException("Error en 'actualizarColaConPendientes'. Mensaje:\n" + msj, exc);
        }
    }

    void nuevoRecuerdo(String msj) {
        try {
            datosMensaje mensaje = leeMensaje(msj);
            if (ColaValida(mensaje.salaEspera.trim().toUpperCase())) {
                recuerdo.eliminaMesa(mensaje.mesa);
                recuerdo.encola(mensaje);
            }
        } catch (Exception exc) {
            logException("Error en 'nuevoRecuerdo'. Mensaje:\n" + msj, exc);
        }
    }

    boolean ColaValida(String nombreSala) {
        // si existen Salas Validas, comprobar...
        if (conf.salasValidas != null && conf.salasValidas.length > 0) {
            for (String salasValida : conf.salasValidas) {
                if (salasValida.trim().equals(nombreSala)) {
                    return true;
                }
            }
            return false;
        }
        // si no hay ni Salas, valen todas.
        return true;
    }

    void sonido(String ticket, String mesa, String zona) {
        if (conf.vozActivada) {
            errorEnVoz = false;
            try {
                voz.reproduce(ticket, mesa, zona);
            } catch (Exception exc) {
                String txtError = "Error al reproducir voz para " + ticket + ", " + mesa + ", " + zona + ":\n" + exc.getMessage();
                log.warning(txtError);
                StringWriter sw = new StringWriter();
                PrintWriter pw = new PrintWriter(sw);
                exc.printStackTrace(pw);
                System.err.println(txtError + "\r\n" + sw.toString());
                errorEnVoz = true;
            }
        } else if (conf.sonidoActivado) {
            if (clip != null) {
                clip.play();
            }
        }
    }

    void pruebaSonido() {
        sonido("CS-847", "0", "puerta m");
    }

    void testSonido(String msg) {
        String[] pts = Global.split(msg, '|');
        sonido(pts[0], pts[1], pts.length == 3 ? pts[2] : "");
    }

    void cambiaFuenteGrid(int delta) {
        conf.altoTipo += delta;
        grid.cambiaFont();
        gridAnt.cambiaFont();
    }

    void procesoTeclas(java.awt.event.KeyEvent evt) {
        if (evt.getKeyCode() == KeyEvent.VK_Q) {
            cerrar();
        }
        if (evt.getKeyCode() == KeyEvent.VK_P && evt.isAltDown() && evt.isControlDown()) {
            pruebaSonido();
        }
    }

    void cerrar() {
        conf.guardar();
        System.exit(0);
    }

    void reiniciarConScript(String msg) {
        com.cerrar();
        main.reiniciarConScript(msg);
    }

    public void enviarEstoyVivo() {
        //if (System.currentTimeMillis() - tiempoInicioBucle > demasiadoParado || errorEnVoz) {}
        com.enviarEstoyVivo();
    }

    /**
     * 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() {

        panelPrincipal = new javax.swing.JPanel();
        panel_Imagen = new PanelAnuncio();
        panel_Recordatorio = new javax.swing.JPanel();
        panel_Inmediato = new javax.swing.JPanel();
        lbNumeroTicket = new monitor.utiles.SmoothLabel();
        lbMesa = new monitor.utiles.SmoothLabel();
        lbLocalizacion = new monitor.utiles.SmoothLabel();
        lbHoraTicket = new monitor.utiles.SmoothLabel();
        panel_Anteriores = new javax.swing.JPanel();
        panelBanner = new javax.swing.JPanel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Monitores");
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                formWindowClosing(evt);
            }
        });
        addComponentListener(new java.awt.event.ComponentAdapter() {
            public void componentResized(java.awt.event.ComponentEvent evt) {
                formComponentResized(evt);
            }
        });
        addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                formKeyPressed(evt);
            }
        });
        getContentPane().setLayout(null);

        panelPrincipal.setLayout(new java.awt.CardLayout());

        panel_Imagen.setLayout(null);
        panelPrincipal.add(panel_Imagen, "cardImagen");

        panel_Recordatorio.setLayout(new java.awt.BorderLayout());
        panelPrincipal.add(panel_Recordatorio, "cardRecordatorio");

        panel_Inmediato.setLayout(null);

        lbNumeroTicket.setFont(new java.awt.Font("Arial", 1, 140)); // NOI18N
        lbNumeroTicket.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        lbNumeroTicket.setText("N-988");
        lbNumeroTicket.setMaximumSize(new java.awt.Dimension(9328, 152));
        lbNumeroTicket.setVerticalTextPosition(javax.swing.SwingConstants.TOP);
        panel_Inmediato.add(lbNumeroTicket);
        lbNumeroTicket.setBounds(0, 0, 721, 140);

        lbMesa.setFont(new java.awt.Font("Arial", 1, 130)); // NOI18N
        lbMesa.setForeground(new java.awt.Color(51, 51, 255));
        lbMesa.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        lbMesa.setText("Mesa 99");
        lbMesa.setVerticalAlignment(javax.swing.SwingConstants.TOP);
        lbMesa.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        panel_Inmediato.add(lbMesa);
        lbMesa.setBounds(0, 144, 720, 140);

        lbLocalizacion.setFont(new java.awt.Font("Arial", 1, 60)); // NOI18N
        lbLocalizacion.setForeground(new java.awt.Color(255, 51, 51));
        lbLocalizacion.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        lbLocalizacion.setText("Sala Z");
        lbLocalizacion.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        lbLocalizacion.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        panel_Inmediato.add(lbLocalizacion);
        lbLocalizacion.setBounds(0, 296, 720, 74);

        lbHoraTicket.setFont(new java.awt.Font("Arial", 1, 70)); // NOI18N
        lbHoraTicket.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        lbHoraTicket.setText("hora");
        lbHoraTicket.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        panel_Inmediato.add(lbHoraTicket);
        lbHoraTicket.setBounds(0, 376, 720, 51);

        panelPrincipal.add(panel_Inmediato, "cardInmediato");

        panel_Anteriores.setLayout(new java.awt.BorderLayout());
        panelPrincipal.add(panel_Anteriores, "cardAnteriores");

        getContentPane().add(panelPrincipal);
        panelPrincipal.setBounds(60, 50, 100, 100);

        panelBanner.setLayout(new java.awt.BorderLayout());
        getContentPane().add(panelBanner);
        panelBanner.setBounds(-20, 10, 100, 100);

        pack();
    }// </editor-fold>//GEN-END:initComponents
   private void formComponentResized(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_formComponentResized
       if (grid != null && conf.enVentana) {
           grid.ajustaGrid(this.getBounds());
       }
   }//GEN-LAST:event_formComponentResized

   private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
       cerrar();
   }//GEN-LAST:event_formWindowClosing

   private void formKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_formKeyPressed
       procesoTeclas(evt);
   }//GEN-LAST:event_formKeyPressed
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel lbHoraTicket;
    private javax.swing.JLabel lbLocalizacion;
    private javax.swing.JLabel lbMesa;
    private javax.swing.JLabel lbNumeroTicket;
    private javax.swing.JPanel panelBanner;
    private javax.swing.JPanel panelPrincipal;
    private javax.swing.JPanel panel_Anteriores;
    private javax.swing.JPanel panel_Imagen;
    private javax.swing.JPanel panel_Inmediato;
    private javax.swing.JPanel panel_Recordatorio;
    // End of variables declaration//GEN-END:variables

    void MsgBox(String txt) {
        javax.swing.JOptionPane.showMessageDialog(this, txt);
    }

}
