package interfaz;

//PINTAR COMPONENTE LISTA
//SE UTILIZA EN LA VENTANA RELLENAR INSTANCIA
// Cómo copiar elementos de una lista a otra.
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

import javax.swing.*;

import org.hibernate.Session;
import org.hibernate.Transaction;

import persistencia.UtilidadHibernate;

import negocio.BloqueConstructivo;
import negocio.ComponenteBloque;
import negocio.ComponenteInstancia;
import negocio.ContenidoLista;
import negocio.Instancia;
import negocio.Proyecto;
import negocio.SeleccionComponenteListaBloque;

public class ComponenteLista_RellenarInstancia extends JFrame
{
  private JList listaBloques;
  private JButton botonCopiar, botonEliminar, botonVer;
  private JLabel etiqueta_cardinalidad;
  private DefaultListModel modelo = new DefaultListModel();

  public ComponenteLista_RellenarInstancia(Container c, final ComponenteBloque co, final ComponenteInstancia coi, final BloqueConstructivo p,final JList lista, final DefaultListModel m, int tamaño_lista, final Principal princ, boolean es_mantenimiento_bloque)
  {
      super( "Listas de selección múltiple" );
      
      Session session=null;
		
		session = UtilidadHibernate.getSessionFactory().openSession();
		
		Transaction tx = session.beginTransaction();
		
		Proyecto proyecto = null;
		if (!es_mantenimiento_bloque){
			if (princ.marco_seleccionado != null){
				int id_proyecto = princ.jList.getSelectedIndex();
				proyecto = (Proyecto) princ.modelo.getElementAt(id_proyecto);
			}
		}
		
		modelo.removeAllElements();
		List messages = session.createQuery("from SeleccionComponenteListaBloque m where id_componente_bloque = '"+co.getIdComponenteBloque()+"'").list();
		//System.out.println("Número de elementos: " + messages.size());
		for ( Iterator iter = messages.iterator(); iter.hasNext(); ) {
			SeleccionComponenteListaBloque seleccioncomponente = (SeleccionComponenteListaBloque) iter.next();
			
			//Si estamos en la ventana de Editor
			if (es_mantenimiento_bloque){
				messages = session.createQuery("from Instancia m where id_bloque = '"+seleccioncomponente.getBloqueConstructivo().getIdBloque()+"'").list();
				for ( Iterator iter2 = messages.iterator(); iter2.hasNext(); ) {
					Instancia instancia = (Instancia) iter2.next();
					modelo.addElement(instancia);
				}
			}
			//Si estamos en la ventana de Rellenar Instancia
			else{
				messages = session.createQuery("from Instancia m where id_bloque = '"+seleccioncomponente.getBloqueConstructivo().getIdBloque()+"' AND id_proyecto = '"+proyecto.getIdProyecto()+"'").list();
				for ( Iterator iter2 = messages.iterator(); iter2.hasNext(); ) {
					Instancia instancia = (Instancia) iter2.next();
					modelo.addElement(instancia);
				}
			}
		}
		
		tx.commit();
		session.close();	

	  //Creamos el panel donde almacenaremos todo (las dos listas y los botones de añadir y eliminar).
      Container contenedor = getContentPane();
      contenedor.setLayout( new FlowLayout() );
      
      // Creamos la lista de bloques
      listaBloques = new JList( );
      //listaBloques.setPreferredSize(new Dimension(200,60));
      listaBloques.setVisibleRowCount( 5 );
      
      listaBloques.setSelectionMode(
        ListSelectionModel.MULTIPLE_INTERVAL_SELECTION );
      listaBloques.setModel(modelo);
      //La añadimos al contenedor principal
      contenedor.add( new JScrollPane( listaBloques ));

      //Creamos el botón copiar y le asignamos el evento de copia.
      if (princ.idioma.equals("español"))
    	  botonCopiar = new JButton( "Añadir >>>" );
      else
    	  botonCopiar = new JButton( "Add >>>" );
      if (es_mantenimiento_bloque)
    	  botonCopiar.setEnabled(false);
      botonCopiar.addActionListener(

        new ActionListener() {  // clase interna anónima

            // manejar evento de botón
            public void actionPerformed( ActionEvent evento )
            {
              // colocar valores seleccionados en listaCopia
              //listaCopia.setListData( listaBloques.getSelectedValues() );
            	int elemento = listaBloques.getSelectedIndex();
            	if (elemento == -1){
            		if (princ.idioma.equals("español"))
            			JOptionPane.showMessageDialog(null, "Selecciona una instancia de la lista", "Error", JOptionPane.ERROR_MESSAGE);
            		else
            			JOptionPane.showMessageDialog(null, "Select a instance of the list", "Error", JOptionPane.ERROR_MESSAGE);
            	}
            	else if (co.getCardinalidadLista()>0 && m.size()>=co.getCardinalidadLista()){
            		if (princ.idioma.equals("español"))
            			JOptionPane.showMessageDialog(null, "Excede de la cardinalidad máxima permitida en la lista", "Error", JOptionPane.ERROR_MESSAGE);
            		else
            			JOptionPane.showMessageDialog(null, "The list exceeds the maximum allowed cardinality", "Error", JOptionPane.ERROR_MESSAGE);
            	}
            	else{
            		Instancia instancia = (Instancia) modelo.getElementAt(elemento);
            		m.addElement(instancia);
            		lista.setModel(m);
            	}
            }

        } // fin de clase interna anónima
      ); // fin de la llamada a addActionListener
      
      //Lo añadimos al contenidor principal
      contenedor.add( botonCopiar );
      
//    Me creo otro contenedor para meter el contenido de los dos botones de añadir y quitar
      JPanel contenedor2 = new JPanel();
      contenedor2.setLayout( new FlowLayout() );
      contenedor2.setPreferredSize(new Dimension(80, 80));
      
//    Creamos el botón elminar y le asignamos el evento de eliminación de bloque de la lista de copia.
      if (princ.idioma.equals("español"))
    	  botonEliminar = new JButton( "Eliminar" );
      else
    	  botonEliminar = new JButton( "Remove" );
      botonEliminar.setPreferredSize(new Dimension(80,26));
      if (es_mantenimiento_bloque)
    	  botonEliminar.setEnabled(false);
      botonEliminar.addActionListener(

        new ActionListener() {  // clase interna anónima

            // manejar evento de botón
            public void actionPerformed( ActionEvent evento )
            {
              // colocar valores seleccionados en listaCopia
            	int elemento = lista.getSelectedIndex();
            	if (elemento != -1){
            		Instancia instancia = (Instancia) m.getElementAt(elemento);
            		m.removeElement(instancia);
            		lista.setModel(m);
            	}
            }

        } // fin de clase interna anónima
      ); // fin de la llamada a addActionListener
      
      session = UtilidadHibernate.getSessionFactory().openSession();
      
      List messages_contenido = session.createQuery("from ContenidoLista where id_componente_instancia = '"+coi.getIdComponenteInstancia()+"'").list();
      for ( Iterator iter_contenido = messages_contenido.iterator(); iter_contenido.hasNext(); ) {
    	  ContenidoLista contenido_lista = (ContenidoLista) iter_contenido.next();
    	
    	  List messages_instancia = session.createQuery("from Instancia where id_instancia = '"+contenido_lista.getInstancia().getIdInstancia()+"'").list();
    	  for ( Iterator iter_instancia = messages_instancia.iterator(); iter_instancia.hasNext(); ) {
        	  Instancia instancia = (Instancia) iter_instancia.next();
        	  
        	  m.addElement(instancia);
    	  }
    	  
      }
      
      lista.setModel(m);
      
      session.close();
      
      //Creamos el botón ver y le asignamos el evento de vista de bloque de la lista de copia.
      if (princ.idioma.equals("español"))
    	  botonVer = new JButton( "Ver" );
      else
    	  botonVer = new JButton( "See" );
      botonVer.setPreferredSize(new Dimension(80,26));
      if (es_mantenimiento_bloque)
    	  botonVer.setEnabled(false);
      botonVer.addActionListener(

        new ActionListener() {  // clase interna anónima

            // manejar evento de botón
            public void actionPerformed( ActionEvent evento )
            {
              // colocar valores seleccionados en listaCopia
            	int elemento = lista.getSelectedIndex();
            	if (elemento != -1){
            		Instancia instancia = (Instancia) m.getElementAt(elemento);
            		VerInstancia ventana = new VerInstancia(instancia, p, princ);
            		//ventana.setLocationRelativeTo(CopiarListaAOtra2.this);
            		ventana.setVisible(true);
            		ventana.setModal(false);
            	}
            }

        } // fin de clase interna anónima
      ); // fin de la llamada a addActionListener
      
      etiqueta_cardinalidad = new JLabel();
      if (co.getCardinalidadLista()<=0){
    	  if (princ.idioma.equals("español"))
    		  etiqueta_cardinalidad.setText("Máx: " + "Infinito");
    	  else
    		  etiqueta_cardinalidad.setText("Max: " + "Infinite");
      }
      else{
    	  if (princ.idioma.equals("español"))
    		  etiqueta_cardinalidad.setText("Máx: " + co.getCardinalidadLista());
    	  else
    		  etiqueta_cardinalidad.setText("Max: " + co.getCardinalidadLista());
      }
      etiqueta_cardinalidad.setVisible(true);
      
        //Asignamos la lista al contenedor principal
      	contenedor.add( new JScrollPane( lista ) );
      	
      	
      	//Asignamos los botones de manejo de la lista de copia al panel secundario.
      	contenedor2.add(botonVer);
      	contenedor2.add( botonEliminar );
      	contenedor2.add(etiqueta_cardinalidad);
      	contenedor2.setBackground(new Color(238, 238, 238));
      	
      	//Asignamos el panel secundario al contenedor principal.
      	contenedor.add(contenedor2);
      	contenedor.setBackground(new Color(238, 238, 238));
      	
      	//Asignamos el contenedor creado al contenedor principal
      	//contenedor.add(contenedor2);
      	
      GridBagConstraints gridBagConstraints = new GridBagConstraints();
		gridBagConstraints.gridx = 1;
		gridBagConstraints.gridy = co.getPosicion();;
		gridBagConstraints.insets = new Insets(5, 10, 0, 5);
		gridBagConstraints.anchor = GridBagConstraints.WEST;
		c.add( contenedor, gridBagConstraints);
		

      setSize( 325, 130 );
      
  } // fin del constructor PruebaSeleccionMultiple

} // fin de la clase PruebaSeleccionMultiple