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

import administrador.datos.*;
import java.awt.*;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;

public final class FormAsignacionCapacidades extends javax.swing.JDialog {

    PanelServidor miPanel;
    ArrayList<MapaOperadores.RegistroOperador> operadores = null;
    ArrayList<RegistroCola> colas = null;
    ItemGrid[] itemColas;
    ItemGrid[] itemOperadores;
    static final Font fuenteNormal = new Font("Dialog", Font.BOLD, 12);
    static final Font fuenteCursiva = new Font("Dialog", Font.ITALIC, 12);
    String[] cabeceras = {"Nombre", "Permanente", "ACTUAL", "de Mesa", "Favorita", "Suplente"};
    boolean comenzado = false;

    public FormAsignacionCapacidades(PanelServidor panel) {
        super(administrador.utiles.Global.principal, true);
        miPanel = panel;
        initComponents();
        edNuevoNombre.setDocument(new administrador.utiles.JTextLimitado(35, true));
        edNuevoCodigo.setDocument(new administrador.utiles.JTextLimitado(12, true));
        cargaInicial();
    }

    public void cargaInicial() {
        cargaPanelPorColas();
        cargaPanelPorOperador();
        gridColas.setModel(new GridTableModel(itemColas, gridColas));
        gridOperadores.setModel(new GridTableModel(itemOperadores, gridOperadores));
        gridOperadores.getColumnModel().getColumn(0).setCellRenderer(new renderCeldaGris());
        comenzado = true;
        seleccionComboColas();
        seleccionComboOperadores();
        String centro = this.miPanel.CodigoCentro;
        this.edCentro.setText(centro);
        this.jListado.getColumnModel().getColumn(0).setPreferredWidth(70);
        this.jListado.getColumnModel().getColumn(2).setPreferredWidth(60);
        this.jListado.getColumnModel().getColumn(0).setMaxWidth(110);
        this.jListado.getColumnModel().getColumn(2).setMaxWidth(60);

    }

    void cargaPanelPorColas() {
        colas = new ArrayList<>();
        ColeccionRegistros col = miPanel.getColeccionColas();
        for (int i = 0; i < col.size(); i++) {
            colas.add((RegistroCola) col.getRegistro(i));
        }
        itemColas = new ItemGrid[colas.size()];
        for (int i = 0; i < colas.size(); i++) {
            RegistroCola reg = colas.get(i);
            comboColas.addItem(reg.getDescripcion());
            itemColas[i] = new ItemGrid(reg.getDescripcion());
            itemColas[i].id = reg.getId();
        }
    }

    void cargaPanelPorOperador() {
        operadores = new ArrayList<>();
        for (MapaOperadores.RegistroOperador reg : miPanel.getMapaOperadores()) {
            operadores.add(reg);
        }
        Collections.sort(operadores);
        itemOperadores = new ItemGrid[operadores.size()];
        comboOperadores.removeAllItems();
        for (int i = 0; i < operadores.size(); i++) {
            MapaOperadores.RegistroOperador op = operadores.get(i);
            comboOperadores.addItem(op.nombre);
            itemOperadores[i] = new ItemGrid(op.nombre);
            itemOperadores[i].id = op.codigo;
        }
    }

    public void refrescarGrids() {
        seleccionComboColas();
        seleccionComboOperadores();
    }

    void seleccionComboColas() {
        if (!comenzado) {
            return;
        }
        int idx = comboColas.getSelectedIndex();
        if (idx == -1) {
            return;
        }
        RegistroCola reg = colas.get(idx);
        String codCola = reg.getId();
        MapaOperadores ops = miPanel.getMapaOperadores();
        for (ItemGrid itemOperadore : itemOperadores) {
            MapaOperadores.RegistroOperador op = ops.get(itemOperadore.id);
            itemOperadore.borrarValores();
            if (op.capacidades.containsKey(codCola)) {
                itemOperadore.dc = new DatosCapacidad(op.capacidades.get(codCola));
            }
            itemOperadore.suplente = op.esSuplente(codCola);
        }
        gridOperadores.repaint();
    }

    void seleccionComboOperadores() {
        if (!comenzado) {
            return;
        }
        int idx = comboOperadores.getSelectedIndex();
        if (idx == -1) {
            return;
        }
        MapaOperadores.RegistroOperador op = operadores.get(idx);
        for (int i = 0; i < colas.size(); i++) {
            RegistroCola reg = colas.get(i);
            String codCola = reg.getId();
            itemColas[i].borrarValores();
            if (op.capacidades.containsKey(codCola)) {
                itemColas[i].dc = new DatosCapacidad(op.capacidades.get(codCola));
            } else {
                itemColas[i].dc.nombre = codCola;
            }
            itemColas[i].suplente = op.esSuplente(codCola);
        }
        gridColas.repaint();
        if (operadorConectado(op.codigo)) {
            lbConectado.setFont(fuenteNormal);
            lbConectado.setText("Conectado");
            lbConectado.setForeground(Color.BLACK);
        } else {
            lbConectado.setFont(fuenteCursiva);
            lbConectado.setText("Desconectado");
            lbConectado.setForeground(Color.DARK_GRAY);
        }
    }

    void confirmarCambiosPorCola() {
        int idx = comboColas.getSelectedIndex();
        String cola = colas.get(idx).getId();
        MapaOperadores ops = miPanel.getMapaOperadores();
        for (ItemGrid item : itemOperadores) {
            MapaOperadores.RegistroOperador op = ops.get(item.id);
            if (item.modificado) {
                item.dc.nombre = cola;
                op.cargaCapacidad(item.dc, item.suplente);
                op.enviarCapacidad();
                item.modificado = false;
            }
        }
        miPanel.calcularOperadores();
        miPanel.repintaGrids();
    }

    void confirmarCambiosPorOperador() {
        int idx = comboOperadores.getSelectedIndex();
        MapaOperadores.RegistroOperador op = operadores.get(idx);
        op.borraCapacidades();
        for (ItemGrid itemCola : itemColas) {
            op.cargaCapacidad(itemCola.dc, itemCola.suplente);
        }
        op.enviarCapacidad();
        miPanel.calcularOperadores();
        miPanel.repintaGrids();
    }

    void nuevoOperador() {
        String codigo = this.edNuevoCodigo.getText().trim();
        if (codigo.length() > 12 || codigo.length() == 0) {
            javax.swing.JOptionPane.showMessageDialog(this, "El código debe tener 12 digitos max.", "ERROR EN LOS DATOS", javax.swing.JOptionPane.PLAIN_MESSAGE);
            edNuevoCodigo.requestFocus();
            return;
        }
        String nombre = this.edNuevoNombre.getText().trim();
        if (nombre.length() == 0) {
            javax.swing.JOptionPane.showMessageDialog(this, "El nombre no puede estar en blanco", "ERROR EN LOS DATOS", javax.swing.JOptionPane.PLAIN_MESSAGE);
            edNuevoNombre.requestFocus();
            return;
        }
        String centro = this.edCentro.getText().trim();
        if (centro.length() > 5) {
            javax.swing.JOptionPane.showMessageDialog(this, "Formato Centro solo admite 5 digitos", "ERROR EN LOS DATOS", javax.swing.JOptionPane.PLAIN_MESSAGE);
            edCentro.requestFocus();
            return;
        }
        if (centro.length() < 5 && centro.length() > 0) {
            javax.swing.JOptionPane.showMessageDialog(this, "Formato Centro solo admite 5 digitos", "ERROR EN LOS DATOS", javax.swing.JOptionPane.PLAIN_MESSAGE);
            edCentro.requestFocus();
            return;
        }
        if (centro.length() == 0) {
            centro = " ";
        }
        miPanel.enviarAltaOperador(codigo, nombre, centro);
        edNuevoCodigo.setText("");
        edNuevoNombre.setText("");
        edNuevoNombre.requestFocus();
    }

    void llenarListadoOperadores() {
        DefaultTableModel model = (DefaultTableModel) jListado.getModel();

        for (MapaOperadores.RegistroOperador op : operadores) {
            Vector row = new Vector();
            row.add(op.codigo);
            row.add(op.nombre);
            row.add(op.centro);
            model.addRow(row);
        }
    }

    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jTabbedPane1 = new javax.swing.JTabbedPane();
        jPanel1 = new javax.swing.JPanel();
        jPanel3 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        comboColas = new javax.swing.JComboBox();
        btConfirmarCola = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        gridOperadores = new javax.swing.JTable();
        jPanel2 = new javax.swing.JPanel();
        jPanel4 = new javax.swing.JPanel();
        jLabel2 = new javax.swing.JLabel();
        comboOperadores = new javax.swing.JComboBox();
        btConfirmarOperador = new javax.swing.JButton();
        lbConectado = new javax.swing.JLabel();
        jScrollPane2 = new javax.swing.JScrollPane();
        gridColas = new javax.swing.JTable();
        jPanel5 = new javax.swing.JPanel();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        edNuevoNombre = new javax.swing.JTextField();
        jLabel5 = new javax.swing.JLabel();
        edNuevoCodigo = new javax.swing.JTextField();
        btConfirmarNuevoOperador = new javax.swing.JButton();
        edCentro = new javax.swing.JTextField();
        jLabel6 = new javax.swing.JLabel();
        jLabel7 = new javax.swing.JLabel();
        jPanel6 = new javax.swing.JPanel();
        jScrollPane3 = new javax.swing.JScrollPane();
        jListado = new javax.swing.JTable();
        jExportar = new javax.swing.JButton();

        setTitle("Gestión de Capacidades de Operadores");

        jTabbedPane1.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                jTabbedPane1StateChanged(evt);
            }
        });

        jPanel1.setLayout(new java.awt.BorderLayout());

        jPanel3.setPreferredSize(new java.awt.Dimension(490, 35));
        jPanel3.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT));

        jLabel1.setText("Seleccione:"); // NOI18N
        jLabel1.setMaximumSize(new java.awt.Dimension(57, 14));
        jLabel1.setMinimumSize(new java.awt.Dimension(57, 14));
        jLabel1.setPreferredSize(new java.awt.Dimension(57, 14));
        jPanel3.add(jLabel1);

        comboColas.setForeground(new java.awt.Color(51, 51, 255));
        comboColas.setMaximumSize(new java.awt.Dimension(200, 21));
        comboColas.setMinimumSize(new java.awt.Dimension(200, 21));
        comboColas.setPreferredSize(new java.awt.Dimension(200, 21));
        comboColas.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                comboColasActionPerformed(evt);
            }
        });
        jPanel3.add(comboColas);

        btConfirmarCola.setText("Confirmar cambios"); // NOI18N
        btConfirmarCola.setEnabled(false);
        btConfirmarCola.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btConfirmarColaActionPerformed(evt);
            }
        });
        jPanel3.add(btConfirmarCola);

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

        gridOperadores.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"
            }
        ));
        jScrollPane1.setViewportView(gridOperadores);

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

        jTabbedPane1.addTab("Por cola", jPanel1);

        jPanel2.setLayout(new java.awt.BorderLayout());

        jPanel4.setPreferredSize(new java.awt.Dimension(490, 35));
        jPanel4.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT));

        jLabel2.setText("Seleccione: "); // NOI18N
        jPanel4.add(jLabel2);

        comboOperadores.setForeground(new java.awt.Color(255, 51, 51));
        comboOperadores.setMaximumSize(new java.awt.Dimension(200, 21));
        comboOperadores.setMinimumSize(new java.awt.Dimension(200, 21));
        comboOperadores.setPreferredSize(new java.awt.Dimension(200, 21));
        comboOperadores.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                comboOperadoresActionPerformed(evt);
            }
        });
        jPanel4.add(comboOperadores);

        btConfirmarOperador.setText("Confirmar cambios"); // NOI18N
        btConfirmarOperador.setEnabled(false);
        btConfirmarOperador.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btConfirmarOperadorActionPerformed(evt);
            }
        });
        jPanel4.add(btConfirmarOperador);

        lbConectado.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        lbConectado.setText("jLabel3"); // NOI18N
        lbConectado.setPreferredSize(new java.awt.Dimension(90, 14));
        jPanel4.add(lbConectado);

        jPanel2.add(jPanel4, java.awt.BorderLayout.NORTH);

        gridColas.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"
            }
        ));
        jScrollPane2.setViewportView(gridColas);

        jPanel2.add(jScrollPane2, java.awt.BorderLayout.CENTER);

        jTabbedPane1.addTab("Por operador", jPanel2);

        jLabel3.setText("<html>Introduzca los datos del nuevo operador.<br>\nSi existe un operador inactivo con este código será reactivado.<br>\nEn cualquier caso, se cambiará el nombre por el aquí propuesto.\n</html>");

        jLabel4.setText("Nombre:");

        jLabel5.setText("Código:");

        edNuevoCodigo.setColumns(12);
        edNuevoCodigo.setToolTipText("Codigo de usuario corporativo del operador");

        btConfirmarNuevoOperador.setText("Confirmar");
        btConfirmarNuevoOperador.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btConfirmarNuevoOperadorActionPerformed(evt);
            }
        });

        edCentro.setToolTipText("Codigo de centro. Valores permitidos: En blanco o 5 digitos");

        jLabel6.setText("Código:");

        jLabel7.setFont(new java.awt.Font("Tahoma", 0, 10)); // NOI18N
        jLabel7.setText("<html>Campo no obligatorio<br> Valor por defecto el codigo del centro del servidor</html> ");
        jLabel7.setToolTipText("");

        org.jdesktop.layout.GroupLayout jPanel5Layout = new org.jdesktop.layout.GroupLayout(jPanel5);
        jPanel5.setLayout(jPanel5Layout);
        jPanel5Layout.setHorizontalGroup(
            jPanel5Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanel5Layout.createSequentialGroup()
                .add(jPanel5Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(jPanel5Layout.createSequentialGroup()
                        .addContainerGap()
                        .add(jPanel5Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                            .add(jLabel4, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 52, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                            .add(jLabel5, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 46, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(jPanel5Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                            .add(edNuevoNombre, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 451, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                            .add(jPanel5Layout.createSequentialGroup()
                                .add(jPanel5Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                    .add(jPanel5Layout.createSequentialGroup()
                                        .add(edNuevoCodigo, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 165, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                        .add(48, 48, 48)
                                        .add(jLabel6, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 46, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                                    .add(btConfirmarNuevoOperador, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 184, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                                .add(18, 18, 18)
                                .add(jPanel5Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                    .add(edCentro, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 75, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                    .add(jLabel7, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 154, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))))
                    .add(jPanel5Layout.createSequentialGroup()
                        .add(12, 12, 12)
                        .add(jLabel3, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 540, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(79, Short.MAX_VALUE))
        );
        jPanel5Layout.setVerticalGroup(
            jPanel5Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanel5Layout.createSequentialGroup()
                .add(12, 12, 12)
                .add(jLabel3, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 54, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(29, 29, 29)
                .add(jPanel5Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(jLabel4, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 20, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(edNuevoNombre, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .add(35, 35, 35)
                .add(jPanel5Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(edNuevoCodigo, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(jLabel5)
                    .add(edCentro, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(jLabel6))
                .add(jPanel5Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(jPanel5Layout.createSequentialGroup()
                        .add(23, 23, 23)
                        .add(btConfirmarNuevoOperador, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 36, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                    .add(jPanel5Layout.createSequentialGroup()
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(jLabel7, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 43, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );

        jLabel6.getAccessibleContext().setAccessibleName("Centro:");
        jLabel6.getAccessibleContext().setAccessibleDescription("");

        jTabbedPane1.addTab("Alta operador", jPanel5);

        jListado.setAutoCreateRowSorter(true);
        jListado.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Codigo", "Nombre", "Centro"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.String.class, java.lang.String.class
            };
            boolean[] canEdit = new boolean [] {
                false, false, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        jScrollPane3.setViewportView(jListado);
        if (jListado.getColumnModel().getColumnCount() > 0) {
            jListado.getColumnModel().getColumn(0).setMinWidth(80);
            jListado.getColumnModel().getColumn(0).setPreferredWidth(80);
            jListado.getColumnModel().getColumn(2).setMinWidth(80);
            jListado.getColumnModel().getColumn(2).setPreferredWidth(80);
        }

        jExportar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/recursos/EXCEL.gif"))); // NOI18N
        jExportar.setText("Exportar");
        jExportar.setDoubleBuffered(true);
        jExportar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jExportarActionPerformed(evt);
            }
        });

        org.jdesktop.layout.GroupLayout jPanel6Layout = new org.jdesktop.layout.GroupLayout(jPanel6);
        jPanel6.setLayout(jPanel6Layout);
        jPanel6Layout.setHorizontalGroup(
            jPanel6Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jScrollPane3, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 631, Short.MAX_VALUE)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, jPanel6Layout.createSequentialGroup()
                .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .add(jExportar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 110, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(43, 43, 43))
        );
        jPanel6Layout.setVerticalGroup(
            jPanel6Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, jPanel6Layout.createSequentialGroup()
                .add(jExportar)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jScrollPane3, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 233, Short.MAX_VALUE)
                .addContainerGap())
        );

        jTabbedPane1.addTab("Listado", null, jPanel6, "");

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

        pack();
    }// </editor-fold>//GEN-END:initComponents
   private void jTabbedPane1StateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jTabbedPane1StateChanged
       seleccionComboColas();
       seleccionComboOperadores();
       int sele = jTabbedPane1.getSelectedIndex();
       if (sele == 3) {
           llenarListadoOperadores();
       }
   }//GEN-LAST:event_jTabbedPane1StateChanged

   private void btConfirmarColaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btConfirmarColaActionPerformed
       confirmarCambiosPorCola();
       btConfirmarCola.setEnabled(false);
   }//GEN-LAST:event_btConfirmarColaActionPerformed

   private void btConfirmarOperadorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btConfirmarOperadorActionPerformed
       confirmarCambiosPorOperador();
       btConfirmarOperador.setEnabled(false);
   }//GEN-LAST:event_btConfirmarOperadorActionPerformed

   private void comboOperadoresActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_comboOperadoresActionPerformed
       seleccionComboOperadores();
   }//GEN-LAST:event_comboOperadoresActionPerformed

   private void comboColasActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_comboColasActionPerformed
       seleccionComboColas();
   }//GEN-LAST:event_comboColasActionPerformed

   private void btConfirmarNuevoOperadorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btConfirmarNuevoOperadorActionPerformed
       nuevoOperador();
   }//GEN-LAST:event_btConfirmarNuevoOperadorActionPerformed

    private void jExportarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jExportarActionPerformed
        ExportaAHojaExcell();
    }//GEN-LAST:event_jExportarActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btConfirmarCola;
    private javax.swing.JButton btConfirmarNuevoOperador;
    private javax.swing.JButton btConfirmarOperador;
    private javax.swing.JComboBox comboColas;
    private javax.swing.JComboBox comboOperadores;
    private javax.swing.JTextField edCentro;
    private javax.swing.JTextField edNuevoCodigo;
    private javax.swing.JTextField edNuevoNombre;
    private javax.swing.JTable gridColas;
    private javax.swing.JTable gridOperadores;
    private javax.swing.JButton jExportar;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JTable jListado;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JPanel jPanel4;
    private javax.swing.JPanel jPanel5;
    private javax.swing.JPanel jPanel6;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JTabbedPane jTabbedPane1;
    private javax.swing.JLabel lbConectado;
    // End of variables declaration//GEN-END:variables
   class ItemGrid {

        String texto;
        String id;
        public DatosCapacidad dc = new DatosCapacidad();
        public boolean suplente;
        boolean modificado = false;

        ItemGrid(String txt) {
            texto = txt;
        }

        public void borrarValores() {
            dc.Actual = false;
            dc.Permanente = false;
            dc.DeMesa = false;
            dc.Favorita = false;
            suplente = false;
        }
    }

    class GridTableModel extends AbstractTableModel {

        ItemGrid[] datos;
        JTable grid;

        public GridTableModel(ItemGrid[] datos, JTable grid) {
            this.datos = datos;
            this.grid = grid;
        }

        @Override
        public Object getValueAt(int row, int col) {
            switch (col) {
                case 0:
                    return datos[row].texto;
                case 1:
                    return datos[row].dc.Permanente;
                case 2:
                    return datos[row].dc.Actual;
                case 3:
                    return datos[row].dc.DeMesa;
                case 4:
                    return datos[row].dc.Favorita;
                case 5:
                    return datos[row].suplente;
            }
            return "";
        }

        @Override
        public void setValueAt(Object v, int row, int col) {
            switch (col) {
                case 0:
                    datos[row].texto = (String) v;
                    break;
                case 1:
                    if (!datos[row].dc.Permanente && !datos[row].dc.Actual) {
                        datos[row].dc.Actual = true;
                    }
                    datos[row].dc.Permanente = ((Boolean) v);
                    if (!datos[row].dc.Permanente) {
                        datos[row].dc.Favorita = false;
                    }
                    grid.repaint();
                    break;
                case 2:
                    datos[row].dc.Actual = ((Boolean) v);
                    break;
                case 3:
                    datos[row].dc.DeMesa = ((Boolean) v);
                    break;
                case 4:
                    datos[row].dc.Favorita = ((Boolean) v);
                    if (datos[row].dc.Favorita) {
                        datos[row].dc.Permanente = true;
                    }
                    grid.repaint();
                    break;
                case 5:
                    datos[row].suplente = ((Boolean) v);
                    break;
            }
            datos[row].modificado = true;
            activarBotonConfirmar();
        }

        void activarBotonConfirmar() {
            if (grid == gridOperadores) {
                btConfirmarCola.setEnabled(true);
            } else {
                btConfirmarOperador.setEnabled(true);
            }
        }

        @Override
        public Class getColumnClass(int col) {
            if (col == 0) {
                return java.lang.String.class;
            } else {
                return java.lang.Boolean.class;
            }
        }

        @Override
        public int getColumnCount() {
            return 6;
        }

        @Override
        public int getRowCount() {
            return datos.length;
        }

        @Override
        public String getColumnName(int col) {
            return cabeceras[col];
        }

        @Override
        public boolean isCellEditable(int row, int col) {
            return !(col == 0 || col == 3);
        }
    }

    boolean operadorConectado(String cod) {
        int n = miPanel.colMesas.size();
        for (int i = 0; i < n; i++) {
            RegistroMesa rm = (RegistroMesa) miPanel.colMesas.getRegistro(i);
            if (!rm.estaDesconectado() && rm.codigo.equals(cod)) {
                return true;
            }
        }
        return false;
    }

    public void ExportaAHojaExcell() {
        try {
            this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
            DefaultTableModel model = (DefaultTableModel) jListado.getModel();
            String ficheroExcel = crearFicheroXLS(model);
            Runtime.getRuntime().exec("rundll32 shell32.dll,ShellExec_RunDLL \"" + ficheroExcel + "\"");
            setCursor(Cursor.getDefaultCursor());

        } catch (IOException ex) {
            setCursor(Cursor.getDefaultCursor());

            ex.printStackTrace();
        }
    }

    public String crearFicheroXLS(DefaultTableModel modelo) {
        try {
            File temp = File.createTempFile("Operadores", ".xls");
            int cab = modelo.getColumnCount();
            int row = modelo.getRowCount();

            PrintWriter out = new PrintWriter(new FileWriter(temp));
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < cab; i++) {
                sb.append(modelo.getColumnName(i)).append("\t");
            }
            out.println(sb.toString());
            for (int i = 0; i < row; i++) {
                sb = new StringBuffer();
                for (int col = 0; col < (cab); col++) {
                    sb.append(modelo.getValueAt(i, col)).append("\t");
                }
                out.println(sb.toString());
            }
            out.close();
            return temp.getAbsolutePath();
        } catch (IOException e) {
            return "error";
        }
    }

    public class renderCeldaGris extends javax.swing.table.DefaultTableCellRenderer {

        public renderCeldaGris() {
            super();
        }

        @Override
        public java.awt.Component getTableCellRendererComponent(javax.swing.JTable table, Object value, boolean isSelected,
                boolean hasFocus, int row, int column) {
            setText((String) value);
            if (operadorConectado(itemOperadores[row].id)) {
                setFont(fuenteNormal);
                setForeground(java.awt.Color.BLACK);
            } else {
                setFont(fuenteCursiva);
                setForeground(java.awt.Color.LIGHT_GRAY);
            }
            if (isSelected) {
                this.setBackground(table.getSelectionBackground());
            } else {
                this.setBackground(table.getBackground());
            }
            return this;
        }
    }
}
