package interfaz;

import javax.swing.BorderFactory;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import java.awt.Frame;
import java.awt.BorderLayout;
import javax.swing.JDialog;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import java.awt.GridBagConstraints;
import javax.swing.JLabel;

import negocio.BloqueConstructivo;
import negocio.ComponenteBloque;
import negocio.ComponenteInstancia;
import negocio.ContenidoLista;
import negocio.Fase;
import negocio.FaseBloque;
import negocio.FasePlantilla;
import negocio.Idioma;
import negocio.Instancia;
import negocio.Plantilla;
import negocio.Proyecto;
import negocio.SeleccionComponenteListaBloque;
import negocio.Vista;
import negocio.VistaBloque;
import negocio.VistaPlantilla;

import javax.swing.JTextField;

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

import com.sun.org.apache.xpath.internal.operations.Bool;

import persistencia.UtilidadHibernate;

import java.awt.Color;
import java.awt.Insets;
import java.awt.FlowLayout;
import java.awt.Dimension;
import java.awt.SystemColor;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JCheckBox;
import javax.swing.SwingConstants;

public class DuplicarProyectoPlantilla extends JDialog {

	private static final long serialVersionUID = 1L;

	private JPanel jContentPane = null;

	private JPanel jPanel = null;

	private JPanel jPanel1 = null;

	private JButton jButton = null;

	private JLabel jLabel = null;
	
	private Principal padrePrincipal;

	private JTextField jTextField = null;
	
	private Proyecto padreProyecto;
	
	private Plantilla padrePlantilla;

	private JScrollPane jScrollPane = null;

	private JTextArea jTextArea = null;

	private JLabel jLabel1 = null;

	private JLabel jLabel2 = null;

	private JLabel jLabel3 = null;

	private JLabel jLabel4 = null;

	private JLabel jLabel5 = null;

	private JCheckBox jCheckBox = null;

	private JCheckBox jCheckBox1 = null;

	private JCheckBox jCheckBox2 = null;

	private JLabel jLabel6 = null;

	private JCheckBox jCheckBox3 = null;

	private JLabel jLabel7 = null;

	private JCheckBox jCheckBox4 = null;

	/**
	 * @param owner
	 */
	public DuplicarProyectoPlantilla(Principal p, Proyecto pr, Plantilla pl) {
		padrePrincipal = p;
		padreProyecto = pr;
		padrePlantilla = pl;
		initialize();
	}
	
	public DuplicarProyectoPlantilla(Principal p, Plantilla pl) {
		padrePrincipal = p;
		padrePlantilla = pl;
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setSize(576, 383);
		if (padrePrincipal.idioma.equals("español")){
			if (padrePrincipal.usuario.getRol().equals("Implanter"))
				this.setTitle("Duplicar proyecto");
			else
				this.setTitle("Duplicar plantilla");
		}
		else{
			if (padrePrincipal.usuario.getRol().equals("Implanter"))
				this.setTitle("Duplicate project");
			else
				this.setTitle("Duplicate framework");
		}
		this.setContentPane(getJContentPane());
		this.addWindowListener(new java.awt.event.WindowAdapter() {
			public void windowOpened(java.awt.event.WindowEvent e) {
				jCheckBox.setSelected(true);
				jCheckBox1.setSelected(true);
				jCheckBox2.setSelected(true);
				jCheckBox3.setSelected(true);
				//Copiamos a la fuerza si se trata de proyectos, ya que estos heredan los componentes de su plantilla.
				if (padrePrincipal.usuario.getRol().equals("Implanter")){
					jCheckBox.setEnabled(false);
					jCheckBox1.setEnabled(false);
					jCheckBox2.setEnabled(false);
					jCheckBox3.setEnabled(false);
					jCheckBox4.setSelected(true);
				}
				else if (padrePrincipal.usuario.getRol().equals("Developer")){
					jLabel7.setVisible(false);
					jCheckBox4.setVisible(false);
					GridBagConstraints gridBagConstraints = new GridBagConstraints();
					gridBagConstraints.gridx = 0;
					gridBagConstraints.anchor = GridBagConstraints.NORTHWEST;
					gridBagConstraints.insets = new Insets(5, 50, 20, 0);
					gridBagConstraints.gridy = 7;
					GridBagConstraints gridBagConstraints2 = new GridBagConstraints();
					gridBagConstraints2.gridx = 1;
					gridBagConstraints2.anchor = GridBagConstraints.NORTHWEST;
					gridBagConstraints2.insets = new Insets(5, 150, 20, 0);
					gridBagConstraints2.gridy = 7;
					jPanel1.add(jLabel6,gridBagConstraints);
					jPanel1.add(jCheckBox3,gridBagConstraints2);
				}
			}
		});
	}
	
	public ArrayList ListaBloques(int id_estructura_seleccionada){
		ArrayList lista = new ArrayList();
		try{

			Session session=null;
			
			session = UtilidadHibernate.getSessionFactory().openSession();
			
			Transaction tx = session.beginTransaction();
			
			List messages = null;
			if (padrePrincipal.usuario.getRol().equals("Implanter")){
				messages = session.createQuery("from BloqueConstructivo m where id_proyecto = '"+id_estructura_seleccionada+"' order by nombre asc").list();
			}
			else if (padrePrincipal.usuario.getRol().equals("Developer")){
				messages = session.createQuery("from BloqueConstructivo m where id_plantilla = '"+id_estructura_seleccionada+"' order by nombre asc").list();
			}
				
			//System.out.println("Número de elementos: " + messages.size());
			for ( Iterator iter = messages.iterator(); iter.hasNext(); ) {
				BloqueConstructivo bloque = (BloqueConstructivo) iter.next();
				lista.add(bloque);
			}
			
			session.close();		
			
		}	
		catch (Exception exp) {
			// TODO: handle exception
			JOptionPane.showMessageDialog(null, exp.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
		}
		
		return lista;
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(new BorderLayout());
			jContentPane.add(getJPanel(), BorderLayout.EAST);
			jContentPane.add(getJPanel1(), BorderLayout.CENTER);
		}
		return jContentPane;
	}

	/**
	 * This method initializes jPanel	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanel() {
		if (jPanel == null) {
			jPanel = new JPanel();
			jPanel.setLayout(new FlowLayout());
			jPanel.setBackground(SystemColor.controlHighlight);
			jPanel.setBorder(BorderFactory.createMatteBorder(0, 1, 0, 0, Color.lightGray));
			jPanel.add(getJButton(), null);
		}
		return jPanel;
	}

	/**
	 * This method initializes jPanel1	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanel1() {
		if (jPanel1 == null) {
			GridBagConstraints gridBagConstraints22 = new GridBagConstraints();
			gridBagConstraints22.gridx = 1;
			gridBagConstraints22.insets = new Insets(5, 150, 20, 0);
			gridBagConstraints22.anchor = GridBagConstraints.WEST;
			gridBagConstraints22.gridy = 8;
			GridBagConstraints gridBagConstraints11 = new GridBagConstraints();
			gridBagConstraints11.gridx = 0;
			gridBagConstraints11.insets = new Insets(5, 0, 20, 0);
			gridBagConstraints11.anchor = GridBagConstraints.EAST;
			gridBagConstraints11.gridy = 8;
			jLabel7 = new JLabel();
			jLabel7.setText("Instancias");
			GridBagConstraints gridBagConstraints9 = new GridBagConstraints();
			gridBagConstraints9.gridx = 1;
			gridBagConstraints9.insets = new Insets(5, 150, 0, 0);
			gridBagConstraints9.anchor = GridBagConstraints.WEST;
			gridBagConstraints9.gridy = 7;
			GridBagConstraints gridBagConstraints8 = new GridBagConstraints();
			gridBagConstraints8.gridx = 0;
			gridBagConstraints8.gridwidth = 1;
			gridBagConstraints8.anchor = GridBagConstraints.EAST;
			gridBagConstraints8.insets = new Insets(5, 0, 0, 0);
			gridBagConstraints8.gridy = 7;
			jLabel6 = new JLabel();
			if (padrePrincipal.idioma.equals("español"))
				jLabel6.setText("Componentes");
			else
				jLabel6.setText("Components");
			GridBagConstraints gridBagConstraints7 = new GridBagConstraints();
			gridBagConstraints7.gridx = 1;
			gridBagConstraints7.anchor = GridBagConstraints.WEST;
			gridBagConstraints7.insets = new Insets(5, 150, 0, 0);
			gridBagConstraints7.gridy = 6;
			GridBagConstraints gridBagConstraints61 = new GridBagConstraints();
			gridBagConstraints61.gridx = 1;
			gridBagConstraints61.anchor = GridBagConstraints.WEST;
			gridBagConstraints61.insets = new Insets(5, 150, 0, 0);
			gridBagConstraints61.gridy = 5;
			GridBagConstraints gridBagConstraints51 = new GridBagConstraints();
			gridBagConstraints51.gridx = 1;
			gridBagConstraints51.anchor = GridBagConstraints.WEST;
			gridBagConstraints51.insets = new Insets(5, 150, 0, 0);
			gridBagConstraints51.gridy = 4;
			GridBagConstraints gridBagConstraints4 = new GridBagConstraints();
			gridBagConstraints4.gridx = 0;
			gridBagConstraints4.insets = new Insets(5, 0, 0, 0);
			gridBagConstraints4.anchor = GridBagConstraints.EAST;
			gridBagConstraints4.gridy = 6;
			jLabel5 = new JLabel();
			if (padrePrincipal.idioma.equals("español"))
				jLabel5.setText("Bloques");
			else
				jLabel5.setText("Blocks");
			GridBagConstraints gridBagConstraints3 = new GridBagConstraints();
			gridBagConstraints3.gridx = 0;
			gridBagConstraints3.insets = new Insets(5, 0, 0, 0);
			gridBagConstraints3.anchor = GridBagConstraints.EAST;
			gridBagConstraints3.gridy = 5;
			jLabel4 = new JLabel();
			if (padrePrincipal.idioma.equals("español"))
				jLabel4.setText("Vistas");
			else
				jLabel4.setText("Views");
			GridBagConstraints gridBagConstraints21 = new GridBagConstraints();
			gridBagConstraints21.gridx = 0;
			gridBagConstraints21.insets = new Insets(5, 0, 0, 0);
			gridBagConstraints21.anchor = GridBagConstraints.EAST;
			gridBagConstraints21.gridy = 4;
			jLabel3 = new JLabel();
			if (padrePrincipal.idioma.equals("español"))
				jLabel3.setText("Fases");
			else
				jLabel3.setText("Phases");
			GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
			gridBagConstraints1.gridx = 0;
			gridBagConstraints1.gridwidth = 2;
			gridBagConstraints1.fill = GridBagConstraints.NONE;
			gridBagConstraints1.anchor = GridBagConstraints.WEST;
			gridBagConstraints1.gridy = 2;
			jLabel2 = new JLabel();
			if (padrePrincipal.idioma.equals("español"))
				jLabel2.setText("                                                             Selecciona los objetos que desees copiar:");
			else
				jLabel2.setText("                                                             Select objects you want to copy:");
			jLabel2.setHorizontalAlignment(SwingConstants.CENTER);
			jLabel2.setHorizontalTextPosition(SwingConstants.CENTER);
			GridBagConstraints gridBagConstraints6 = new GridBagConstraints();
			gridBagConstraints6.gridx = 0;
			gridBagConstraints6.anchor = GridBagConstraints.NORTHEAST;
			gridBagConstraints6.insets = new Insets(5, 20, 0, 0);
			gridBagConstraints6.gridy = 1;
			jLabel1 = new JLabel();
			if (padrePrincipal.idioma.equals("español"))
				jLabel1.setText("Nueva descripción:");
			else
				jLabel1.setText("New description:");
			GridBagConstraints gridBagConstraints5 = new GridBagConstraints();
			gridBagConstraints5.fill = GridBagConstraints.BOTH;
			gridBagConstraints5.gridy = 1;
			gridBagConstraints5.weightx = 1.0;
			gridBagConstraints5.weighty = 1.0;
			gridBagConstraints5.insets = new Insets(5, 5, 10, 20);
			gridBagConstraints5.gridx = 1;
			GridBagConstraints gridBagConstraints2 = new GridBagConstraints();
			gridBagConstraints2.fill = GridBagConstraints.BOTH;
			gridBagConstraints2.gridy = 0;
			gridBagConstraints2.weightx = 1.0;
			gridBagConstraints2.insets = new Insets(20, 5, 0, 20);
			gridBagConstraints2.gridx = 1;
			GridBagConstraints gridBagConstraints = new GridBagConstraints();
			gridBagConstraints.gridx = 0;
			gridBagConstraints.insets = new Insets(20, 20, 0, 0);
			gridBagConstraints.anchor = GridBagConstraints.EAST;
			gridBagConstraints.gridy = 0;
			jLabel = new JLabel();
			if (padrePrincipal.idioma.equals("español"))
				jLabel.setText("Nuevo nombre:");
			else
				jLabel.setText("New name:");
			jPanel1 = new JPanel();
			jPanel1.setLayout(new GridBagLayout());
			jPanel1.add(jLabel, gridBagConstraints);
			jPanel1.add(getJTextField(), gridBagConstraints2);
			jPanel1.add(getJScrollPane(), gridBagConstraints5);
			jPanel1.add(jLabel1, gridBagConstraints6);
			jPanel1.add(jLabel2, gridBagConstraints1);
			jPanel1.add(jLabel3, gridBagConstraints21);
			jPanel1.add(jLabel4, gridBagConstraints3);
			jPanel1.add(jLabel5, gridBagConstraints4);
			jPanel1.add(getJCheckBox(), gridBagConstraints51);
			jPanel1.add(getJCheckBox1(), gridBagConstraints61);
			jPanel1.add(getJCheckBox2(), gridBagConstraints7);
			jPanel1.add(jLabel6, gridBagConstraints8);
			jPanel1.add(getJCheckBox3(), gridBagConstraints9);
			jPanel1.add(jLabel7, gridBagConstraints11);
			jPanel1.add(getJCheckBox4(), gridBagConstraints22);
		}
		return jPanel1;
	}

	/**
	 * This method initializes jButton	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJButton() {
		if (jButton == null) {
			jButton = new JButton();
			if (padrePrincipal.idioma.equals("español"))
				jButton.setText("Aceptar");
			else
				jButton.setText("Accept");
			jButton.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					try{
						String nombre, descripcion;
						Session session = null;
						if((nombre=jTextField.getText().trim()).length()<=0){
							if (padrePrincipal.idioma.equals("español"))
								throw new Exception("El nombre está vacío.");
							else
								throw new Exception("The name is empty.");
						}else{	
							if (padrePrincipal.usuario.getRol().equals("Implanter")){
								//Creamos el proyecto
								Proyecto proyecto=new Proyecto();
								proyecto.setNombre(nombre);
								proyecto.setDescripcion(jTextArea.getText());
								proyecto.setPlantilla(padrePlantilla);
								
 
								padrePrincipal.modelo.addElement(proyecto);
								
								//Creamos la sesión para almacenar el nombre del proyecto en la BD
								session = UtilidadHibernate.getSessionFactory().openSession();
								
								Transaction tx = session.beginTransaction();
								//Convertimos los objetos en persistentes y los guardamos
								session.save(proyecto);
																		
								tx.commit();
								
								ArrayList<Instancia> vector_instancias = new ArrayList<Instancia>();
								ArrayList<Instancia> vector_instancias_nuevas = new ArrayList<Instancia>();
								
								if (jCheckBox4.isSelected()){
									//Copiamos las instancias
									List messages = session.createQuery("from Instancia where id_proyecto ='"+padreProyecto.getIdProyecto()+"'").list();
									
									for ( Iterator iter = messages.iterator(); iter.hasNext(); ) {
										
										Instancia instancia = (Instancia) iter.next();
										
										//instancias originales
										vector_instancias.add(instancia);
										
										Instancia instancia_copia = new Instancia();
										
										instancia_copia.setBloqueConstructivo(instancia.getBloqueConstructivo());
										instancia_copia.setProyecto(proyecto);
										instancia_copia.setNombre(instancia.getNombre());
										
										Transaction tx2 = session.beginTransaction();
										
										//Convertimos los objetos en persistentes y los guardamos
										session.save(instancia_copia);
										tx2.commit();
										
										//Instancias copiadas
										vector_instancias_nuevas.add(instancia_copia);
										
									}
									
									int diferencia_entre_id_instancia = 0;
									for (int i = 0; i< vector_instancias.size(); i++){
									
										Instancia instancia =  vector_instancias.get(i);
										Instancia instancia_copia = vector_instancias_nuevas.get(i);
										
										diferencia_entre_id_instancia = instancia_copia.getIdInstancia() - instancia.getIdInstancia();
										
										//Copiamos los componentes de instancia
										List messages2 = session.createQuery("from ComponenteInstancia where id_instancia ='"+instancia.getIdInstancia()+"'").list();
										
										for ( Iterator iter2 = messages2.iterator(); iter2.hasNext(); ) {
											
											ComponenteInstancia componente_instancia = (ComponenteInstancia) iter2.next();
											ComponenteInstancia componente_instancia_copia = new ComponenteInstancia();
											
											//Copiar
											componente_instancia_copia.setInstancia(instancia_copia);
											componente_instancia_copia.setComponenteBloque(componente_instancia.getComponenteBloque());
											componente_instancia_copia.setFecha(componente_instancia.getFecha());
											componente_instancia_copia.setTexto(componente_instancia.getTexto());
											componente_instancia_copia.setCheckbox(componente_instancia.getCheckbox());
											componente_instancia_copia.setPortafolio(componente_instancia.getPortafolio());
											componente_instancia_copia.setModeloMadurezPuntuacion(componente_instancia.getModeloMadurezPuntuacion());
											componente_instancia_copia.setModeloMadurezMediaParcial(componente_instancia.getModeloMadurezMediaParcial());
											componente_instancia_copia.setModeloMadurezMediaGlobal(componente_instancia.getModeloMadurezMediaGlobal());
											componente_instancia_copia.setFechaModeloMadurez(componente_instancia.getFechaModeloMadurez());
											
											Transaction tx3 = session.beginTransaction();
											//Convertimos los objetos en persistentes y los guardamos
											session.save(componente_instancia_copia);
											tx3.commit();
											
											int contador = 1;
											int id_instancia = 0;
											//Copiamos el contenido del componente lista
											List messages3 = session.createQuery("from ContenidoLista where id_componente_instancia ='"+componente_instancia.getIdComponenteInstancia()+"'").list();
											for ( Iterator iter3 = messages3.iterator(); iter3.hasNext(); ) {
												ContenidoLista contenido_lista = (ContenidoLista) iter3.next();
												ContenidoLista contenido_lista_copia = new ContenidoLista();
												
												contenido_lista_copia.setComponenteInstancia(componente_instancia_copia);
												
												id_instancia = contenido_lista.getInstancia().getIdInstancia();
												//Calculamos el nuevo id_instancia de las instancias de la lista
												for (int j = 0; j< vector_instancias.size(); j++){
													if (id_instancia > vector_instancias.get(j).getIdInstancia())
														contador ++;
												}
												
												List messages4 = session.createSQLQuery("Select MAX(id_instancia) from Instancia").list();
												Iterator iter5 = messages4.iterator();
												Integer ultima_instancia = (Integer) iter5.next();
												//int idInstancia = contenido_lista.getInstancia().getIdInstancia() + diferencia_entre_id_instancia;
												
												int idInstancia = ultima_instancia - vector_instancias_nuevas.size() + contador;
												
												Instancia instancia_ = (Instancia) session.get(Instancia.class, idInstancia);
												
												contenido_lista_copia.setInstancia(instancia_);
												
												Transaction tx4 = session.beginTransaction();
												
												contador=1;
												
												//Convertimos los objetos en persistentes y los guardamos
												session.save(contenido_lista_copia);
												tx4.commit();
											}
										}
									}
								}

							}
							else if (padrePrincipal.usuario.getRol().equals("Developer")){
//								Creamos el proyecto
								//Proyecto proyecto=new Proyecto();
								//proyecto.setNombre(nombre);
								int numero_fases_nuevas;
								
								//proyecto.setEstado(1);  //Proyecto activo
								padrePlantilla.setNombre(jTextField.getText());
								padrePlantilla.setDescripcion(jTextArea.getText());
								//Creamos un modelo de lista
								//DefaultListModel modelo = new DefaultListModel(); 
								padrePrincipal.modelo.addElement(padrePlantilla);
								//MantenimientoProyecto.jList.setModel(modelo);
								int id_plantilla_seleccionada = padrePlantilla.getIdPlantilla();
								
								//Creamos la sesión para almacenar el nombre del proyecto en la BD
								
								session = UtilidadHibernate.getSessionFactory().openSession();
								
								Transaction tx = session.beginTransaction();
								//Convertimos los objetos en persistentes y los guardamos
								session.save(padrePlantilla);
																		
								tx.commit();
								
								session = UtilidadHibernate.getSessionFactory().openSession();
								
								//Variable para almacenar las fases a copiar (posteriormente utilizada en el alta del bloque)
								ArrayList listaFasesOriginal = new ArrayList();
								ArrayList listaFasesNueva = new ArrayList();
								
								if (jCheckBox.isSelected()){
									//Copiamos las FASES de la plantilla que estamos duplicando.
									List messages = session.createQuery("from FasePlantilla where id_plantilla ='"+id_plantilla_seleccionada+"'").list();
									//Integer tamaño_fases_original = messages.size();
									numero_fases_nuevas = messages.size();
									for ( Iterator iter = messages.iterator(); iter.hasNext(); ) {
										Transaction tx2 = session.beginTransaction();
										FasePlantilla fase = (FasePlantilla) iter.next();
										listaFasesOriginal.add(fase);
										FasePlantilla fase_nueva = new FasePlantilla();
										
										//COPIAR
										fase_nueva.setNombre(fase.getNombre());
										fase_nueva.setOrden(fase.getOrden());
										fase_nueva.setPlantilla(padrePlantilla);
										
										session.save(fase_nueva);
										
										//Almacenamos cada fase en la lista
										listaFasesNueva.add(fase_nueva);
										tx2.commit();
										//listaFasesCopiaModoGuiado
									}
								}
	//							Variable para almacenar las vistas a copiar (posteriormente utilizada en el alta del bloque)
								ArrayList listaVistasOriginal = new ArrayList();
								ArrayList listaVistasNueva = new ArrayList();
								
								if (jCheckBox1.isSelected()){
									//Copiamos las VISTAS del proyecto que estamos duplicando.
									List messages = session.createQuery("from VistaPlantilla where id_plantilla ='"+id_plantilla_seleccionada+"'").list();
									
									for ( Iterator iter = messages.iterator(); iter.hasNext(); ) {
										Transaction tx2 = session.beginTransaction();
										VistaPlantilla vista = (VistaPlantilla) iter.next();
										listaVistasOriginal.add(vista);
										VistaPlantilla vista_nueva = new VistaPlantilla();
										
										//COPIAR
										vista_nueva.setNombre(vista.getNombre());
										vista_nueva.setPlantilla(padrePlantilla);
										
										session.save(vista_nueva);
										
										listaVistasNueva.add(vista_nueva);
										tx2.commit();
									}
								}

								ArrayList<BloqueConstructivo> vector_bloques = new ArrayList<BloqueConstructivo>();
								ArrayList<BloqueConstructivo> vector_bloques_nuevos = new ArrayList<BloqueConstructivo>();
								ArrayList<Integer> vector_id_bloques_nuevos = new ArrayList<Integer>();
								if (jCheckBox2.isSelected()){
									//Copiamos los BLOQUES_CONSTRUCTIVOS del proyecto que estamos duplicando.
									List messages = session.createQuery("from BloqueConstructivo where id_plantilla ='"+id_plantilla_seleccionada+"'").list();
									
									for ( Iterator iter = messages.iterator(); iter.hasNext(); ) {
										
										BloqueConstructivo bloque = (BloqueConstructivo) iter.next();
										BloqueConstructivo bloque_nuevo = new BloqueConstructivo();
										
										bloque_nuevo.setNombre(bloque.getNombre());
										bloque_nuevo.setTipo(bloque.getTipo());
										bloque_nuevo.setPlantilla(padrePlantilla);
										
										Transaction tx2 = session.beginTransaction();
										session.save(bloque_nuevo);
										tx2.commit();
										
//										Añadimos los bloques para construirla lista de bloques seleccionados del componente tipo lista
										vector_bloques.add(bloque);
										
										//Añadimos los bloques nuevos para construirla lista de bloques seleccionados del componente tipo lista
										vector_bloques_nuevos.add(bloque_nuevo);
										vector_id_bloques_nuevos.add(bloque_nuevo.getIdBloque());
										
										int fase_modo_guiado_nueva = 0;
										//Copiamos las fases asociadas al bloque
										for (int i=0; i< listaFasesOriginal.size(); i++){
											FasePlantilla fase_original = (FasePlantilla) listaFasesOriginal.get(i);

											List messages_for = session.createQuery("from FaseBloque where id_bloque = '"+bloque.getIdBloque()+"' AND id_fase_plantilla = '"+fase_original.getIdFasePlantilla()+"'").list();
											for (Iterator iter_for = messages_for.iterator(); iter_for.hasNext(); ){
												FaseBloque fase_bloque = (FaseBloque) iter_for.next();
												FaseBloque fase_bloque_copia = new FaseBloque();
												
												fase_bloque_copia.setBloqueConstructivo(bloque_nuevo);
				
//												
												
												FasePlantilla fase_nueva = (FasePlantilla) listaFasesNueva.get(i);
												fase_bloque_copia.setFasePlantilla(fase_nueva);
												
												Transaction tx3 = session.beginTransaction();
												session.save(fase_bloque_copia);
												tx3.commit();
												
												//Fase modo guiado
												if (fase_bloque.getIdFaseBloque() == bloque.getFaseModoGuiado())
													fase_modo_guiado_nueva = fase_bloque_copia.getIdFaseBloque();
											}
										}
										
										//Actualizamos el bloque duplicado con la fase modo guiado correspondiente
										Transaction tx4 = session.beginTransaction();
										bloque_nuevo.setFaseModoGuiado(fase_modo_guiado_nueva);
										session.update(bloque_nuevo);
										
										tx4.commit();
										
										//Copiamos las vistas asociadas al bloque
										for (int i=0; i< listaVistasOriginal.size(); i++){
											VistaPlantilla vista_original = (VistaPlantilla) listaVistasOriginal.get(i);

											List messages_for = session.createQuery("from VistaBloque where id_bloque = '"+bloque.getIdBloque()+"' AND id_vista_plantilla = '"+vista_original.getIdVistaPlantilla()+"'").list();
											for (Iterator iter_for = messages_for.iterator(); iter_for.hasNext(); ){
												VistaBloque vista_bloque = (VistaBloque) iter_for.next();
												VistaBloque vista_bloque_copia = new VistaBloque();
												
												vista_bloque_copia.setBloqueConstructivo(bloque_nuevo);
				
												VistaPlantilla vista_nueva = (VistaPlantilla) listaVistasNueva.get(i);
												vista_bloque_copia.setVistaPlantilla(vista_nueva);
												
												Transaction tx3 = session.beginTransaction();
												session.save(vista_bloque_copia);
												tx3.commit();
											}
											
										}

									}
								}
								
								int diferencia_entre_id_bloques = 0;
								if (jCheckBox3.isSelected()){
								//Copiar componentes
									
									List messages = session.createQuery("from BloqueConstructivo where id_plantilla ='"+id_plantilla_seleccionada+"'").list();
									int cont = 0;
									for ( Iterator iter = messages.iterator(); iter.hasNext(); ) {
										
										BloqueConstructivo bloque = (BloqueConstructivo) iter.next();
									
										BloqueConstructivo bloque_nuevo = vector_bloques_nuevos.get(cont);
										
										diferencia_entre_id_bloques = bloque_nuevo.getIdBloque() - bloque.getIdBloque();
										
										//Integer id_bloque_nuevo = vector_id_bloques_nuevos.get(cont);
										
										List messages2 = session.createQuery("from ComponenteBloque where id_bloque ='"+bloque.getIdBloque()+"'").list();
										
										for ( Iterator iter3 = messages2.iterator(); iter3.hasNext(); ) {
											Transaction tx3 = session.beginTransaction();
											ComponenteBloque componente = (ComponenteBloque) iter3.next();
											
											ComponenteBloque componente_nuevo = new ComponenteBloque();
											
											//COPIAR
											componente_nuevo.setBloqueConstructivo(bloque_nuevo);
											componente_nuevo.setTipo(componente.getTipo());
											componente_nuevo.setNombre(componente.getNombre());
											componente_nuevo.setOrden(componente.getOrden());
											componente_nuevo.setPosicion(componente.getPosicion());
											componente_nuevo.setCardinalidadLista(componente.getCardinalidadLista());
											
											session.save(componente_nuevo);
											tx3.commit();
											
											
											if (componente.getTipo()==1){
												List messages3 = session.createQuery("from SeleccionComponenteListaBloque where id_componente_bloque ='"+componente.getIdComponenteBloque()+"'").list();
												
												int contador = 1;
												int id_bloque = 0;
												//int cont2=0;
												for ( Iterator iter4 = messages3.iterator(); iter4.hasNext(); ) {
													Transaction tx4 = session.beginTransaction();
													SeleccionComponenteListaBloque seleccion_componente = (SeleccionComponenteListaBloque) iter4.next();
													SeleccionComponenteListaBloque seleccion_componente_copia = new SeleccionComponenteListaBloque();
													
													seleccion_componente_copia.setComponenteBloque(componente_nuevo);
													
													id_bloque = seleccion_componente.getBloqueConstructivo().getIdBloque();
													//Calculamos el nuevo id_instancia de las instancias de la lista
													for (int j = 0; j< vector_bloques.size(); j++){
														if (id_bloque > vector_bloques.get(j).getIdBloque())
															contador ++;
													}
													
													List messages4 = session.createSQLQuery("Select MAX(id_bloque) from Bloque_Constructivo").list();
													Iterator iter5 = messages4.iterator();
													Integer ultimo_bloque = (Integer) iter5.next();
													//int idInstancia = contenido_lista.getInstancia().getIdInstancia() + diferencia_entre_id_instancia;
													
													int idbloqueConstructivo = ultimo_bloque - vector_bloques.size() + contador;
													

													BloqueConstructivo bloqueConstructivo = (BloqueConstructivo) session.get(BloqueConstructivo.class, idbloqueConstructivo);
													
													seleccion_componente_copia.setBloqueConstructivo(bloqueConstructivo);
													//cont2++;
													contador = 1;

													session.save(seleccion_componente_copia);
													tx4.commit();
												}
											}
										}
										cont++;
									}
								}
							}
							
							padrePrincipal.ActualizaListaProyectosPlantillas(padrePrincipal.marco_seleccionado);
							session.close();
							
							padrePrincipal.jList.setSelectedIndex(padrePrincipal.modelo.size()-1);
							
							//JOptionPane.showMessageDialog(null, "El proyecto se ha dado de alta correctamente, el responsable de proyecyo podrá modificarlos para añadirle los participantes y los participantes externos", "Información", JOptionPane.INFORMATION_MESSAGE);
							DuplicarProyectoPlantilla.this.dispose();
						}
					}	
					catch (Exception exp) {
						// TODO: handle exception
						JOptionPane.showMessageDialog(null, exp.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
					}
				}
			});
		}
		return jButton;
	}

	/**
	 * This method initializes jTextField	
	 * 	
	 * @return javax.swing.JTextField	
	 */
	private JTextField getJTextField() {
		if (jTextField == null) {
			jTextField = new JTextField();
		}
		return jTextField;
	}

	/**
	 * This method initializes jScrollPane	
	 * 	
	 * @return javax.swing.JScrollPane	
	 */
	private JScrollPane getJScrollPane() {
		if (jScrollPane == null) {
			jScrollPane = new JScrollPane();
			jScrollPane.setViewportView(getJTextArea());
		}
		return jScrollPane;
	}

	/**
	 * This method initializes jTextArea	
	 * 	
	 * @return javax.swing.JTextArea	
	 */
	private JTextArea getJTextArea() {
		if (jTextArea == null) {
			jTextArea = new JTextArea();
		}
		return jTextArea;
	}

	/**
	 * This method initializes jCheckBox	
	 * 	
	 * @return javax.swing.JCheckBox	
	 */
	private JCheckBox getJCheckBox() {
		if (jCheckBox == null) {
			jCheckBox = new JCheckBox();
		}
		return jCheckBox;
	}

	/**
	 * This method initializes jCheckBox1	
	 * 	
	 * @return javax.swing.JCheckBox	
	 */
	private JCheckBox getJCheckBox1() {
		if (jCheckBox1 == null) {
			jCheckBox1 = new JCheckBox();
		}
		return jCheckBox1;
	}

	/**
	 * This method initializes jCheckBox2	
	 * 	
	 * @return javax.swing.JCheckBox	
	 */
	private JCheckBox getJCheckBox2() {
		if (jCheckBox2 == null) {
			jCheckBox2 = new JCheckBox();
			jCheckBox2.addChangeListener(new javax.swing.event.ChangeListener() {
				public void stateChanged(javax.swing.event.ChangeEvent e) {
					if (!jCheckBox2.isSelected()){
						jCheckBox3.setEnabled(false);
						jCheckBox3.setSelected(false);
					}
					else{
						jCheckBox3.setEnabled(true);
						//jCheckBox3.setSelected(false);
					}
				}
			});
		}
		return jCheckBox2;
	}

	/**
	 * This method initializes jCheckBox3	
	 * 	
	 * @return javax.swing.JCheckBox	
	 */
	private JCheckBox getJCheckBox3() {
		if (jCheckBox3 == null) {
			jCheckBox3 = new JCheckBox();
		}
		return jCheckBox3;
	}

	/**
	 * This method initializes jCheckBox4	
	 * 	
	 * @return javax.swing.JCheckBox	
	 */
	private JCheckBox getJCheckBox4() {
		if (jCheckBox4 == null) {
			jCheckBox4 = new JCheckBox();
		}
		return jCheckBox4;
	}

}  //  @jve:decl-index=0:visual-constraint="10,10"
