/*
 * MainFrame.java
 *
 */
package com.uvigo.tMaestro.SCOCreator.tool;

import com.uvigo.tMaestro.SCOCreator.tool.adaptation.Assistant;
import com.uvigo.tMaestro.SCOCreator.tool.properties.PropertiesSheet;
import com.uvigo.tMaestro.SCOCreator.tool.hierarchy.HierarchySheet;
import com.uvigo.tMaestro.SCOCreator.tool.properties.Propiedad;
import com.uvigo.tMaestro.SCOCreator.tool.optionGenerator.OptionsGenerator;
import com.uvigo.tMaestro.SCOCreator.tool.packer.Packer;
import com.uvigo.tMaestro.SCOCreator.tool.adaptation.Rule;
import com.uvigo.tMaestro.SCOCreator.tool.adaptation.ParameterManager;
import com.uvigo.tMaestro.SCOCreator.tool.adaptation.Assistant;
import com.uvigo.tMaestro.SCOCreator.tool.adaptationGenerator.AdaptationGenerator;
import com.uvigo.tMaestro.SCOCreator.tool.metadata.MetadataForm;
import com.uvigo.tMaestro.SCOCreator.tool.metadata.MetadataManager;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import java.awt.*;
import java.net.URL;
import java.util.jar.JarInputStream;
import uk.ac.reload.editor.EditorFrame;
import uk.ac.reload.editor.prefs.EditorPrefs;


/**
 * Clase Main (ejecutable) que representa y lanza la ventana principal de la
 * herramienta
 * @author  raul
 * @version 0.1
 */
public class MainFrame extends javax.swing.JFrame {
    
    /**
     * Referencia a la splash screen que se visualiza al iniciar
     */
    private static InitWindow oInitWindow;
    /**
     * Referencia al Entorno actual de la herramienta
     */
    public static MainFrame oMainFrame = null;
    /**
     * Esta variable indica la c�psula que se encuentra activa.
     */
    private Capsula oActivo;
    /**
     * Esta c�psula es la contenedora de la plantilla en su conjunto (El panel
     * que se asienta directamente sobre el PanelPrincipal)
     * @see PanelPrincipal
     */
    private Capsula oTop = null;
    /**
     * Nombre de la plantilla cargada actualmente
     */
    private String sNombre = null;
    /**
     * Panel sobre el que se dibuja una representaci�n de la plantilla para su
     * edici�n
     */
    private PanelPrincipal oJPanel;
    /**
     * Referencia al editor de propiedades. Es un JDialog
     */
    private PropertiesSheet oPSheet;
    /**
     * Referencia al visor de jerarqu�a. Es un JDialog
     */
    private HierarchySheet oHSheet;
    /**
     * Nombre de las diferentes opciones que salen en en la hoja de
     * propiedades.
     */
    private java.util.ArrayList<String> oOpciones;
    /**
     * Conjunto de reglas de adaptaci�n definidas para el
     * proyecto actualmente cargado. Si no se ha definido ninguna su "size" es 0 o vale null.
     */
    private java.util.ArrayList<Rule> oRules;
    /**
     * Lista con los distintos conjuntos de valores de los diferentes campos del fomulario de metadatos
     * para el proyecto actualmente cargado. Si no se ha definido ninguno su "size" es 0 o
     * vale NULL. Cada conjunto se corresponde con un vocabulario de metadatos correspondiente cada uno
     * a un fichero de schema del directorio metadata.
     */
    private java.util.ArrayList<java.util.HashMap<String, Object>> oMetadata;
    /**
     * Almacena el n�mero de veces que un fichero es usado por una opci�n de una propidad.
     * Por ejemplo si tenemos una imagen llamada imagen.gif que se utiliza en dos opciones
     * de dos etiquetas de la plantilla, la key ser� imagen.gif y el value 4.
     */
    private java.util.HashMap<String, Integer> oUses;
    /**
     * HashMap con las diferentes cadenas de texto en el idioma cargado
     * que se presentan al usuario en el programa (men�s, di�logos)
     */
    private java.util.HashMap<String, String> oIdioma;
    /**
     * Agrupa los botones JRadioButton del men� Ver opciones.
     */
    private javax.swing.ButtonGroup oGrupoOpciones;
    /**
     * Agrupa los botones JRadioButton del men� Ver Idioma
     */
    private javax.swing.ButtonGroup oGrupoIdioma;
    /**
     * Agrupa los JRadioButton del menu Look And Feel
     */
    private javax.swing.ButtonGroup oGrupoLookAndFeel;
    /**
     * El �ndice de la opci�n que se encuentra marcado en los RadioButton de opciones
     */
    private int iBoton;
    /**
     * El idioma que se encuentra cargado en el entorno
     */
    private String sLanguage;
    /**
     * El look and feel cargado en el entorno
     */
    private String sLookAndFeel;
    /**
     * El C�digo del idioma
     */
    private String sCode;
    /**
     * El elemento Menu en el que se cargan los posibles idiomas entre los cuales
     * elegir
     */
    private javax.swing.JMenu oJMenu21;
    /**
     * Este es el CheckBox que activa o desactiva la ayuda contextual de los Capsulas (ToolTips)
     */
    private javax.swing.JCheckBoxMenuItem oJCheckBoxMenuItem35;
    /**
     * Nombre del proyecto actualmente cargado en el entorno
     */
    private String sProjectName;
    /**
     * Indica si hay cambios (sin salvar) en el proyecto actual
     */
    private boolean bSaved = true;
    /**
     * El fichero del proyecto cargado actualmente en el entorno
     * y que ha sido guardado previamente. Valdr� NULL si el proyecto
     * no ha sido guardado nunca
     */
    private java.io.File oProjectFile;
    /**
     * Instante de creaci�n del proyecto actualmente cargado.
     */
    private long lCreationTime;
    /**
     * Esta variable guarda el directorio en que resid�a el �ltimo
     * fichero abierto a trav�s de un JFileChooser, a excepci�n de los
     * ficheros de plantilla. Es una variable de proyecto.
     */
    private java.io.File oLastDir;
    /**
     * HashMap que se utiliza para recuperar
     * los valores (tama�os, posiciones, valores de las propiedades) de todos
     * los componentes de una plantilla previamente salvada en un fichero de proyecto
     */
    private java.util.HashMap<String, Component> oComponents;
    /**
     * Referencia a la propiedad actualmente en edici�n en el entorno
     */
    private Propiedad oEditionProperty;
    /**
     * EL directorio donde guarda los datos la aplicaci�n
     */
    private java.io.File oToolDir;
    
    /**
     * Ayuda contextual en el idioma cargado
     * La key es el nombre de la clase del componente
     * y el Value otra hashMap donde la key es el nombre de la propiedad del componente
     * y el Value el texto de ayuda. La key "contextFile" se usa para indexar el fichero .html de ayuda para el componente
     * y que se mostrar� como un ToolTip
     */
    private java.util.HashMap<String, java.util.HashMap<String, String>> oContextHelp;
    /**
     * Esta variable funciona de la misma forma que la anterior. La diferencia es que esta almacena
     * la ayuda contextual para la plantilla actualmente cargada en el entorno.
     * La forma de funcionar del entorno es la que sigue:
     * Si al buscar un elemento no se encuentra su ayuda en esta variable entonces
     * se busca en oContextHelp.
     */
    private java.util.HashMap<String, java.util.HashMap<String, String>> oContextTemplateHelp;
    /**
     * Referencia al generador de opciones (genera los ficheros .xml de configuraci�n de cada opci�n)
     */
    private OptionsGenerator oOptionsGenerator;
    /**
     * Referencia al empaquetador (genera los .jar, es decir los SCOs del proyecto)
     */
    private Packer oPacker;
    /**
     * Referencia al gestor de par�metros. Agrupa y gestiona los par�metros utilizados
     * para crear las reglas de adaptaci�n de los SCOs.
     */
    private ParameterManager oParameterManager;
    /**
     * Referencia al gestor de metadatos.
     */
    private MetadataManager oMetadataManager;
    /**
     * Referencia al asistente para la generaci�n de reglas de adaptaci�n.
     * Vale Null cuando est� cerrado (y nunca ha sido abierto en la ejecuci�n actual), y apunta al asistente cuando este se encuentra
     * activo en el entorno.
     */
    private Assistant oAssistant;
    /**
     * Referencia al di�logo (Formulario) que permite cubrir los metadatos
     * de un SCO. Vale Null cuando est� cerrado (y nunca ha sido abierto en la ejecuci�n actual), y apunta al formulario cuando este se encuentra
     * activo en el entorno
     */
    private MetadataForm oMetadataForm;
    //Carpetas en el directorio de trabajo
    public final java.io.File fTemplates;
    public final java.io.File fResources;
    public java.io.File fTemp;
    //Direcci�n del directorio de trabajo
    public final String sDir;
    
    //Origen de la llamada a genera SCO: 0-directamente, 1-desde nuevo proyecto,
    //2-desde abrir SCO, 3-desde salir, 4-desde x (cerrar ventana)
    private int origen = 0;
    public Thread th;
    
    //SSSS
    //TODO cambié el tipo de clase por EditorFrame para pode acceder a sus variables
    static private EditorFrame parent;
    public java.io.File oFile;
    public boolean acabo=false;
    
    //------------------------------------------------------------------------//
    // METODOS
    //------------------------------------------------------------------------//
    /**
     * Constructor de la clase. Crea un nueva instancia de MainForm.
     * Crea tambi�n los cuadros de di�logo asociados. Tambi�n calcula
     * el tama�o y la posici�n adecuados a la pantalla de todos estos
     * elementos
     */
    //TODO cambié el tipo de clase por EditorFrame para poder acceder a sus variables
    public MainFrame(final EditorFrame parent) {//SSSS
        //parent: variable que necesito para manejar la ventana de Reload
        //para devolverle el Enabled
        this.parent=parent;
        //TODO si estamos desde jws sDir tiene que apuntar al directorio de preferencias
        if (this.parent.jws) {
            sDir = EditorPrefs.getInstance().getPrefsFolder().getAbsolutePath();
        } else {
            sDir = System.getProperties().getProperty("user.dir");
        }
        //System.out.println(sDir);
        fTemplates = new java.io.File(sDir, "TEMPLATES");
        fResources = new java.io.File(sDir, "RESOURCES");
        fTemp = new java.io.File(sDir, "TEMP");
        
        MainFrame.oMainFrame = this;
        //oBar.addValue();
        //oBar.setLabelText("Creating folders and files");
        
        //Comprobamos si existe el directorio de la aplicaci�n
        //Si no existe lo creamos.
        String sHomeDir = System.getProperties().getProperty("user.home");
        //System.out.println(sHomeDir);
        if (sHomeDir != null) oToolDir = new java.io.File(sHomeDir, "SCOCreator");
        else oToolDir = new java.io.File("SCOCreator");
        if (!oToolDir.exists()) oToolDir.mkdir();
        
        //oBar.addValue();
        //oBar.setLabelText("Loading languages");
        
        oJMenu21 = new javax.swing.JMenu(); //Menu que contendr� los idiomas seleccionables
        vFindLanguages();
        //En la estructura oIdioma intentamos cargar el Idioma seleccionado por el usuario en una ejecuci�n anterior
        //o si no lo ha hecho el idioma correspondiente a su Localizaci�n
        java.util.prefs.Preferences oPrefs = java.util.prefs.Preferences.userNodeForPackage(this.getClass());
        sLanguage = oPrefs.get("Language", java.util.Locale.getDefault().getDisplayLanguage());
        //Comprobamos que efectivamente disponenmos de sLanguage, sino seleccionamos el Espanol.
        boolean bFound = false;
        java.util.Enumeration<javax.swing.AbstractButton> oGrupo = oGrupoIdioma.getElements();
        javax.swing.JRadioButtonMenuItem oBoton;
        while (oGrupo.hasMoreElements()) {
            oBoton = (javax.swing.JRadioButtonMenuItem) oGrupo.nextElement();
            if (oBoton.getText().equals(sLanguage)) {
                bFound = true;
                break;
            }
        }
        if (!bFound) sLanguage = new String("Espanol");
        vCargarIdioma(sLanguage);
        
        //oBar.addValue();
        //oBar.setLabelText("Creating and starting graphic elements");
        
        
        initComponents(); //Creamos e inicilizamos los elementos gr�ficos del entorno
        
        //SSSSS
        setDefaultCloseOperation(HIDE_ON_CLOSE);
        
        //Escuchamos los cambios de estado de la ventana (minimizar,maximizar,etc)
        addWindowStateListener(new java.awt.event.WindowStateListener() {
            
            public void windowStateChanged(java.awt.event.WindowEvent oE) {
                MainFrameStateChanged(oE);
            }
        });
        
        
        oJMenu21.setText(oIdioma.get("Menu21"));
        oJMenu2.add(oJMenu21);
        oJMenu2.add(new javax.swing.JSeparator());
        
        //Vemos los lookandfeel disponibles y los cargamos en el menu de elecci�n
        findLookAndFeels();
        
        
        //A�adimos el CheckBox que permite no mostrar los ToolTip de los C�psulas
        oJCheckBoxMenuItem35 = new javax.swing.JCheckBoxMenuItem();
        oJCheckBoxMenuItem35.setSelected(true);
        oJCheckBoxMenuItem35.setText(oIdioma.get("Checkbox35"));
        oJCheckBoxMenuItem35.setToolTipText(oIdioma.get("ToolText35"));
        oJCheckBoxMenuItem35.addItemListener(new java.awt.event.ItemListener() {
            
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                oJCheckBoxMenuItem35ItemStateChanged(evt);
            }
        });
        oJMenu2.add(oJCheckBoxMenuItem35);
        
        
        
        
        oJPanel = new PanelPrincipal(); //Creamos el panel de dibujado
        oJPanel.setLayout(null);
        oJPanel1.add(oJPanel); // Lo situamos sobre el JPanel1 (�rea de plantillas)
        
        java.awt.Dimension oScreenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        
        //Debido a que las plantillas ser�n mostradas en un STB (resoluci�n 720*576), tienen
        //resoluci�n fija de 720*576. Para evitar hacer escalados en todos los elementos
        //el entorno debe trabajar a una resoluci�n suficientemente alta para mostrar
        //la totalidad de la plantilla. Hemos elegido la m�nima resoluci�n en 1024*768, resoluci�n,
        //por otra parte, habitual en la mayor parte de los monitores actuales
        //El entorno no arrancar� con resoluciones anteriores.
        //Nota: podr�amos optar porque arrancase, aunque el resultado fuese desastroso
        if ((oScreenSize.width < 1024) || (oScreenSize.height < 768)) {
            java.awt.Toolkit.getDefaultToolkit().beep();
            MyOptionPane.showMessageDialog(MainFrame.oMainFrame, oIdioma.get("Error9"), oIdioma.get("Title12"), javax.swing.JOptionPane.WARNING_MESSAGE);
            System.exit(-1);
        }
        
        oJPanel.setBounds(0, 0, 740, 596); // 720 x 576 m�s 20 pixeles de seguridad para bordes
        
        //Creamos la hoja de propiedades
        oPSheet = new PropertiesSheet(MainFrame.oMainFrame, oOpciones);
        oPSheet.setTitle(oIdioma.get("Title5"));
        oPSheet.vDesactiva();
        
        
        //Creamos la hoja de jerarquia
        oHSheet = new HierarchySheet(MainFrame.oMainFrame);
        oHSheet.setTitle(oIdioma.get("Title8"));
        oHSheet.vDesactiva();
        
        //Creamos el generador de opciones
        oOptionsGenerator = new OptionsGenerator();
        
        
        //Creamos el empaquetador
        oPacker = new Packer();
        
        
        //Creamos el gestor de par�metros
        oParameterManager = new ParameterManager();
        
        
        //Creamos el gestor del formulario de metadatos
        oMetadataManager = new MetadataManager();
        
        
        //Desactivamos el menu de opciones
        //Tambi�n el de renombrar proyecto y el Men� de SCO
        //(solo tienen sentido cuando haya un proyecto cargado)
        oJMenu4.setEnabled(false);
        oJMenuItem23.setEnabled(false);
        oJMenu5.setEnabled(false);
        
        
        java.awt.event.KeyListener oListener = new java.awt.event.KeyListener() {
            
            public void keyPressed(java.awt.event.KeyEvent oEvento) {
                textFieldPressed(oEvento);
            }
            
            public void keyTyped(java.awt.event.KeyEvent evt) {
            }
            
             
            ;
            
              
            public  void keyReleased(java.awt.event.KeyEvent evt) {
                
                
               
            }
            ;
                
        };
        
        oJFormattedTextField1.addKeyListener(oListener);
        oJFormattedTextField2.addKeyListener(oListener);
        oJFormattedTextField3.addKeyListener(oListener);
        oJFormattedTextField4.addKeyListener(oListener);
        oJButton1.addActionListener(new java.awt.event.ActionListener(){
            public void actionPerformed(java.awt.event.ActionEvent oEvento) {
                updateDimension();
            }
        });
        activateDimensionPanel(Capsula.NOTSIZEMOVE); //desactivamos la barra de dimensionamiento
        
        //Dimensionamos y posicionamos todas las ventanas del entorno
        positionAndSizeWindows(oScreenSize);
        
        //oBar.addValue();
        //oBar.setLabelText("Loading enviroment preferences");
        
        //Cargamos las preferencias del entorno
        loadEnviroment();
        
        //oBar.addValue();
        //oBar.setLabelText("Showing windows");
        
        setIconImage(new javax.swing.ImageIcon(getClass().getResource("/com/uvigo/tMaestro/SCOCreator/tool/Icon.jpg")).getImage());
        
        //oBar.addValue();
        //oBar.setLabelText("Processing previous template");
        
        //Configuramos los tiempos de los ToolTips: alargamos el tiempo inicial de espera,
        //y  tambi�n el timepo que permanece visible el tooltip (est�n pensados para contener
        //buenas cantidades de informaci�n (al menos los de las c�psulas).
        javax.swing.ToolTipManager oManager = javax.swing.ToolTipManager.sharedInstance();
        oManager.setInitialDelay(1500);
        oManager.setDismissDelay(10000);
        
        
        
    }
    
    /** 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() {
        java.awt.GridBagConstraints gridBagConstraints;

        oJPopupMenu1 = new javax.swing.JPopupMenu();
        oJPMenuItem1 = new javax.swing.JMenuItem();
        oJPMenuItem1.setText(oIdioma.get("PMenuItem1"));
        oJPMenuItem2 = new javax.swing.JMenuItem();
        oJPMenuItem2.setText(oIdioma.get("PMenuItem2"));
        oJPanel1 = new javax.swing.JPanel();
        oJPanel2 = new javax.swing.JPanel();
        oJLabel1 = new javax.swing.JLabel();
        oJLabel6 = new javax.swing.JLabel();
        oJPanel3 = new javax.swing.JPanel();
        oJCheckBox1 = new javax.swing.JCheckBox();
        oJLabel2 = new javax.swing.JLabel();
        oJLabel2.setToolTipText(oIdioma.get("TooltextLabel2"));
        oJFormattedTextField1 = new javax.swing.JFormattedTextField(java.text.NumberFormat.getIntegerInstance());
        oJLabel3 = new javax.swing.JLabel();
        oJLabel3.setToolTipText(oIdioma.get("TooltextLabel3"));
        oJFormattedTextField2 = new javax.swing.JFormattedTextField(java.text.NumberFormat.getIntegerInstance());
        oJLabel4 = new javax.swing.JLabel();
        oJLabel4.setText(oIdioma.get("Label4"));
        oJLabel4.setToolTipText(oIdioma.get("TooltextLabel4"));
        oJFormattedTextField3 = new javax.swing.JFormattedTextField(java.text.NumberFormat.getIntegerInstance());
        oJLabel5 = new javax.swing.JLabel();
        oJLabel5.setText(oIdioma.get("Label5"));
        oJLabel5.setToolTipText(oIdioma.get("TooltextLabel5"));
        oJFormattedTextField4 = new javax.swing.JFormattedTextField(java.text.NumberFormat.getIntegerInstance());
        oJLabelSpinner = new javax.swing.JLabel();
        oJLabelSpinner.setToolTipText(oIdioma.get("TooltextLabelSpinner"));
        oJSpinner1 = new javax.swing.JSpinner();
        oJButton1 = new javax.swing.JButton();
        oJButton1.setText(oIdioma.get("Button4"));
        oJButton1.setToolTipText(oIdioma.get("TooltextButton1"));
        oJMenuBar = new javax.swing.JMenuBar();
        oJMenu1 = new javax.swing.JMenu();
        oJMenu1.setText(oIdioma.get("Menu1"));
        oJMenuItem11 = new javax.swing.JMenuItem();
        oJMenuItem11.setText(oIdioma.get("Menuitem11"));
        oJMenuItem11.setToolTipText(oIdioma.get("Tooltext11"));
        oJMenuItem12 = new javax.swing.JMenuItem();
        oJMenuItem12.setText(oIdioma.get("Menuitem12"));
        oJMenuItem12.setToolTipText(oIdioma.get("Tooltext12"));
        jSeparator1 = new javax.swing.JSeparator();
        oJMenuItem14 = new javax.swing.JMenuItem();
        oJMenuItem14.setText(oIdioma.get("Menuitem14"));
        oJMenuItem14.setToolTipText(oIdioma.get("Tooltext14"));
        oJSeparator4 = new javax.swing.JSeparator();
        oJMenuItem13 = new javax.swing.JMenuItem();
        oJMenuItem13.setText(oIdioma.get("Menuitem13"));
        oJMenuItem13.setToolTipText(oIdioma.get("Tooltext13"));
        oJMenu2 = new javax.swing.JMenu();
        oJMenu2.setText(oIdioma.get("Menu2"));
        oJMenuItem23 = new javax.swing.JMenuItem();
        oJMenuItem23.setText(oIdioma.get("Menuitem23"));
        oJMenuItem23.setToolTipText(oIdioma.get("Tooltext23"));
        oJSeparator6 = new javax.swing.JSeparator();
        oJMenuItem21 = new javax.swing.JMenuItem();
        oJMenuItem21.setText(oIdioma.get("Menuitem21"));
        oJMenuItem21.setToolTipText(oIdioma.get("Tooltext21"));
        oJMenuItem22 = new javax.swing.JMenuItem();
        oJMenuItem22.setText(oIdioma.get("Menuitem22"));
        oJMenuItem22.setToolTipText(oIdioma.get("Tooltext22"));
        oJMenuItem24 = new javax.swing.JMenuItem();
        oJMenuItem24.setText(oIdioma.get("Menuitem24"));
        oJMenuItem24.setToolTipText(oIdioma.get("Tooltext24"));
        oJMenu22 = new javax.swing.JMenu();
        oJCheckBoxMenuItem21 = new javax.swing.JCheckBoxMenuItem();
        oJCheckBoxMenuItem21.setSelected(Boolean.getBoolean("swing.aatext"));
        oJSeparator1 = new javax.swing.JSeparator();
        oJMenu3 = new javax.swing.JMenu();
        oJMenu3.setText(oIdioma.get("Menu3"));
        oJCheckBoxMenuItem31 = new javax.swing.JCheckBoxMenuItem();
        oJCheckBoxMenuItem31.setText(oIdioma.get("Checkbox31"));
        oJCheckBoxMenuItem32 = new javax.swing.JCheckBoxMenuItem();
        oJCheckBoxMenuItem32.setText(oIdioma.get("Checkbox32"));
        oJCheckBoxMenuItem33 = new javax.swing.JCheckBoxMenuItem();
        oJCheckBoxMenuItem33.setText(oIdioma.get("Checkbox33"));
        oJSeparator3 = new javax.swing.JSeparator();
        oJCheckBoxMenuItem34 = new javax.swing.JCheckBoxMenuItem();
        oJCheckBoxMenuItem34.setText(oIdioma.get("Checkbox34"));
        oJMenu4 = new javax.swing.JMenu();
        oJMenu4.setText(oIdioma.get("Menu4"));
        oJMenuItem41 = new javax.swing.JMenuItem();
        oJMenuItem41.setText(oIdioma.get("Menuitem41"));
        oJMenuItem42 = new javax.swing.JMenuItem();
        oJMenuItem42.setText(oIdioma.get("Menuitem42"));
        oJMenuItem43 = new javax.swing.JMenuItem();
        oJMenuItem43.setText(oIdioma.get("Menuitem43"));
        oJSeparator2 = new javax.swing.JSeparator();
        oJMenu41 = new javax.swing.JMenu();
        oJMenu41.setText(oIdioma.get("Menu41"));
        oJMenu5 = new javax.swing.JMenu();
        oJMenu4.setText(oIdioma.get("Menu4"));
        oJMenuItem51 = new javax.swing.JMenuItem();
        oJMenuItem51.setText(oIdioma.get("Menuitem51"));
        oJMenuItem51.setToolTipText(oIdioma.get("Tooltext51"));
        oJMenuItem53 = new javax.swing.JMenuItem();
        oJMenuItem53.setText(oIdioma.get("Menuitem53"));
        oJMenuItem53.setToolTipText(oIdioma.get("Tooltext53"));
        oJSeparator8 = new javax.swing.JSeparator();
        oJMenuItem52 = new javax.swing.JMenuItem();
        oJMenuItem52.setText(oIdioma.get("Menuitem52"));
        oJMenuItem52.setToolTipText(oIdioma.get("Tooltext52"));

        oJPopupMenu1.add(oJPMenuItem1);
        oJPopupMenu1.add(oJPMenuItem2);

        setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
        setTitle("SCO Creator Tool");
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                formWindowClosing(evt);
            }
        });
        getContentPane().setLayout(new java.awt.GridBagLayout());

        oJPanel1.setMaximumSize(new java.awt.Dimension(740, 596));
        oJPanel1.setMinimumSize(new java.awt.Dimension(740, 596));
        oJPanel1.setPreferredSize(new java.awt.Dimension(740, 596));
        oJPanel1.setLayout(new java.awt.GridLayout(1, 1));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.weighty = 1.0;
        getContentPane().add(oJPanel1, gridBagConstraints);

        oJPanel2.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        oJPanel2.setMaximumSize(new java.awt.Dimension(180, 30));
        oJPanel2.setMinimumSize(new java.awt.Dimension(180, 30));
        oJPanel2.setPreferredSize(new java.awt.Dimension(180, 30));
        oJPanel2.setLayout(new java.awt.GridBagLayout());

        oJLabel1.setFont(new java.awt.Font("Tahoma", 1, 10));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START;
        gridBagConstraints.weightx = 2.0;
        oJPanel2.add(oJLabel1, gridBagConstraints);

        oJLabel6.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END;
        gridBagConstraints.weightx = 1.0;
        oJPanel2.add(oJLabel6, gridBagConstraints);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 2;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START;
        getContentPane().add(oJPanel2, gridBagConstraints);

        oJPanel3.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        oJPanel3.setMaximumSize(new java.awt.Dimension(180, 40));
        oJPanel3.setMinimumSize(new java.awt.Dimension(180, 40));
        oJPanel3.setPreferredSize(new java.awt.Dimension(180, 40));
        oJPanel3.setLayout(new java.awt.GridBagLayout());

        oJCheckBox1.setText("visible");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 20);
        oJPanel3.add(oJCheckBox1, gridBagConstraints);

        oJLabel2.setText("X:");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 0;
        oJPanel3.add(oJLabel2, gridBagConstraints);

        oJFormattedTextField1.setMaximumSize(new java.awt.Dimension(69, 19));
        oJFormattedTextField1.setMinimumSize(new java.awt.Dimension(69, 19));
        oJFormattedTextField1.setPreferredSize(new java.awt.Dimension(69, 19));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 2;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 20);
        oJPanel3.add(oJFormattedTextField1, gridBagConstraints);

        oJLabel3.setText("Y:");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 3;
        gridBagConstraints.gridy = 0;
        oJPanel3.add(oJLabel3, gridBagConstraints);

        oJFormattedTextField2.setMaximumSize(new java.awt.Dimension(69, 19));
        oJFormattedTextField2.setMinimumSize(new java.awt.Dimension(69, 19));
        oJFormattedTextField2.setPreferredSize(new java.awt.Dimension(69, 19));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 4;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 20);
        oJPanel3.add(oJFormattedTextField2, gridBagConstraints);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 5;
        gridBagConstraints.gridy = 0;
        oJPanel3.add(oJLabel4, gridBagConstraints);

        oJFormattedTextField3.setMaximumSize(new java.awt.Dimension(69, 19));
        oJFormattedTextField3.setMinimumSize(new java.awt.Dimension(69, 19));
        oJFormattedTextField3.setPreferredSize(new java.awt.Dimension(69, 19));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 6;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 20);
        oJPanel3.add(oJFormattedTextField3, gridBagConstraints);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 7;
        gridBagConstraints.gridy = 0;
        oJPanel3.add(oJLabel5, gridBagConstraints);

        oJFormattedTextField4.setMaximumSize(new java.awt.Dimension(69, 19));
        oJFormattedTextField4.setMinimumSize(new java.awt.Dimension(69, 19));
        oJFormattedTextField4.setPreferredSize(new java.awt.Dimension(69, 19));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 8;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 20);
        oJPanel3.add(oJFormattedTextField4, gridBagConstraints);

        oJLabelSpinner.setText("Z:");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 9;
        gridBagConstraints.gridy = 0;
        oJPanel3.add(oJLabelSpinner, gridBagConstraints);

        oJSpinner1.setMinimumSize(new java.awt.Dimension(40, 19));
        oJSpinner1.setPreferredSize(new java.awt.Dimension(40, 19));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 10;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 20);
        oJPanel3.add(oJSpinner1, gridBagConstraints);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 11;
        gridBagConstraints.gridy = 0;
        oJPanel3.add(oJButton1, gridBagConstraints);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START;
        getContentPane().add(oJPanel3, gridBagConstraints);

        oJMenuItem11.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                oJMenuItem11ActionPerformed(evt);
            }
        });
        oJMenu1.add(oJMenuItem11);

        oJMenuItem12.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                oJMenuItem12ActionPerformed(evt);
            }
        });
        oJMenu1.add(oJMenuItem12);
        oJMenu1.add(jSeparator1);

        oJMenuItem14.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                oJMenuItem14ActionPerformed(evt);
            }
        });
        oJMenu1.add(oJMenuItem14);
        oJMenu1.add(oJSeparator4);

        oJMenuItem13.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                oJMenuItem13ActionPerformed(evt);
            }
        });
        oJMenu1.add(oJMenuItem13);

        oJMenuBar.add(oJMenu1);

        oJMenuItem23.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                oJMenuItem23ActionPerformed(evt);
            }
        });
        oJMenu2.add(oJMenuItem23);
        oJMenu2.add(oJSeparator6);

        oJMenuItem21.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                oJMenuItem21ActionPerformed(evt);
            }
        });
        oJMenu2.add(oJMenuItem21);

        oJMenuItem22.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                oJMenuItem22ActionPerformed(evt);
            }
        });
        oJMenu2.add(oJMenuItem22);

        oJMenuItem24.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                oJMenuItem24ActionPerformed(evt);
            }
        });
        oJMenu2.add(oJMenuItem24);

        oJMenu22.setText("Look And Feel");
        oJMenu2.add(oJMenu22);

        oJCheckBoxMenuItem21.setText("Antialiasing");
        oJCheckBoxMenuItem21.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                oJCheckBoxMenuItem21ItemStateChanged(evt);
            }
        });
        oJMenu2.add(oJCheckBoxMenuItem21);
        oJMenu2.add(oJSeparator1);

        oJMenuBar.add(oJMenu2);

        oJCheckBoxMenuItem31.setSelected(true);
        oJCheckBoxMenuItem31.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                oJCheckBoxMenuItem31ItemStateChanged(evt);
            }
        });
        oJMenu3.add(oJCheckBoxMenuItem31);

        oJCheckBoxMenuItem32.setSelected(true);
        oJCheckBoxMenuItem32.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                oJCheckBoxMenuItem32ItemStateChanged(evt);
            }
        });
        oJMenu3.add(oJCheckBoxMenuItem32);

        oJCheckBoxMenuItem33.setSelected(true);
        oJCheckBoxMenuItem33.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                oJCheckBoxMenuItem33ItemStateChanged(evt);
            }
        });
        oJMenu3.add(oJCheckBoxMenuItem33);
        oJMenu3.add(oJSeparator3);

        oJCheckBoxMenuItem34.setSelected(true);
        oJMenu3.add(oJCheckBoxMenuItem34);

        oJMenuBar.add(oJMenu3);

        oJMenuItem41.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                oJMenuItem41ActionPerformed(evt);
            }
        });
        oJMenu4.add(oJMenuItem41);

        oJMenuItem42.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                oJMenuItem42ActionPerformed(evt);
            }
        });
        oJMenu4.add(oJMenuItem42);

        oJMenuItem43.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                oJMenuItem43ActionPerformed(evt);
            }
        });
        oJMenu4.add(oJMenuItem43);
        oJMenu4.add(oJSeparator2);
        oJMenu4.add(oJMenu41);

        oJMenuBar.add(oJMenu4);

        oJMenu5.setText("SCO");

        oJMenuItem51.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                oJMenuItem51ActionPerformed(evt);
            }
        });
        oJMenu5.add(oJMenuItem51);

        oJMenuItem53.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                oJMenuItem53ActionPerformed(evt);
            }
        });
        oJMenu5.add(oJMenuItem53);
        oJMenu5.add(oJSeparator8);

        oJMenuItem52.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                oJMenuItem52ActionPerformed(evt);
            }
        });
        oJMenu5.add(oJMenuItem52);

        oJMenuBar.add(oJMenu5);

        setJMenuBar(oJMenuBar);
    }// </editor-fold>//GEN-END:initComponents
    /**
     * Esta funcion es llamada cuando el usuario pulsa sobre el Men�Item Cambiar
     * color de bordes.
     * Muestra al usuario el cuadro de di�logo para cambiar el color de los bordes.
     */
    private void oJMenuItem24ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_oJMenuItem24ActionPerformed
        java.awt.Color oColor = javax.swing.JColorChooser.showDialog(this, oIdioma.get("Title9"), java.awt.Color.BLUE);
        if (oColor == null) return;
        oJPanel.oGetBordeMovimiento().vSetColor(oColor);
        //Si hay una plantilla cargada la actualizamos
        if (sNombre != null) {
            showTemplate(sProjectName, sNombre, false);
        }
    }//GEN-LAST:event_oJMenuItem24ActionPerformed
    
    /**
     * M�todo llamado cuando el usuario pulsa sobre el checkbox de antialiasing
     */
    private void oJCheckBoxMenuItem21ItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_oJCheckBoxMenuItem21ItemStateChanged
        MyOptionPane.showMessageDialog(this, oIdioma.get("Information2"), oIdioma.get("Title2"), javax.swing.JOptionPane.INFORMATION_MESSAGE);
    }//GEN-LAST:event_oJCheckBoxMenuItem21ItemStateChanged
    
    /**
     * M�todo llamado cuando el usuario pulsa sobre el MenuItem de borrar opciones
     */
    private void oJMenuItem43ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_oJMenuItem43ActionPerformed
        DeleteOptionDialog oDialogo = new DeleteOptionDialog(this);
        oDialogo.setTitle(oIdioma.get("Title45"));
        oDialogo.setLocation(this.getX() + (this.getWidth() - oDialogo.getWidth()) / 2, this.getY() + (this.getHeight() - oDialogo.getHeight()) / 2);
        oDialogo.setVisible(true);
    }//GEN-LAST:event_oJMenuItem43ActionPerformed
    
    /**
     * M�todo llamado cuando el usuario pulsa sobre el MenuItem de Metadatos
     */
    private void oJMenuItem53ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_oJMenuItem53ActionPerformed
        if (oMetadataForm != null) {
            //oMetadataForm.setLocation(this.getX()+(this.getWidth()-oMetadataForm.getWidth())/2,this.getY()+(this.getHeight()-oMetadataForm.getHeight())/2);
            oMetadataForm.setVisible(true);
        } else {
            MetadataForm oDialog = new MetadataForm(this);
            oMetadataForm = oDialog;
            oDialog.setTitle(oIdioma.get("Title43"));
            oDialog.setLocation(this.getX() + (this.getWidth() - oDialog.getWidth()) / 2, this.getY() + (this.getHeight() - oDialog.getHeight()) / 2);
            oDialog.setVisible(true);
        }
    }//GEN-LAST:event_oJMenuItem53ActionPerformed
    
    /**
     * M�todo llamado cuando el usuario pulsa sobre el Checbox
     * de generar SCO como un jar
     */
    /**
     * M�todo llamado cuando el usuario pulsa el MenuItem de Crear SCO.
     * Pregunta al usuario por el lugar en donde guardar el SCO generado.
     */
    private void oJMenuItem52ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_oJMenuItem52ActionPerformed
        //Si no hay reglas de adaptaci�n definidas avisamos que el SCO que se va a crear no ser� v�lido
        if (oRules == null || oRules.size() == 0) {
            Object[] options = {oIdioma.get("Label27"), oIdioma.get("Label28")};
            int iSeleccion = javax.swing.JOptionPane.showOptionDialog(this, oIdioma.get("Question16"), oIdioma.get("Title2"),
                    javax.swing.JOptionPane.YES_NO_OPTION, javax.swing.JOptionPane.WARNING_MESSAGE, null, options, options[0]);
            if (iSeleccion == javax.swing.JOptionPane.NO_OPTION)   oJMenuItem51ActionPerformed(new java.awt.event.ActionEvent(oJMenuItem51, java.awt.event.ActionEvent.ACTION_PERFORMED, ""));
        }
        
        //Vemos si el usuario ha definido los metadatos (al menos, uno)
        if (oMetadata == null || oMetadata.size() == 0) {
            MyOptionPane.showMessageDialog(this, oIdioma.get("Error28"), oIdioma.get("Title2"), javax.swing.JOptionPane.WARNING_MESSAGE);
            int iValue = MyOptionPane.showConfirmDialog(this, oIdioma.get("Question10"), oIdioma.get("Title44"), javax.swing.JOptionPane.YES_NO_OPTION, javax.swing.JOptionPane.QUESTION_MESSAGE);
            if (iValue == javax.swing.JOptionPane.YES_OPTION) oJMenuItem53ActionPerformed(new java.awt.event.ActionEvent(oJMenuItem53, java.awt.event.ActionEvent.ACTION_PERFORMED, ""));
        }
        
        //Preguntamos al usuario por la opci�n por defecto
        final String sDefaultOption = (String) MyOptionPane.showInputDialog(this, oIdioma.get("Text9"), oIdioma.get("Title42"), javax.swing.JOptionPane.QUESTION_MESSAGE, null, oOpciones.toArray(), oOpciones.get(0));
        if (sDefaultOption == null) return;
        
        //M: Preguntamos si desea generar fichero de proyecto (para futuras modificaciones)
        Object[] options = {oIdioma.get("Button11"), oIdioma.get("Button12")};
        int ifProyecto = javax.swing.JOptionPane.showOptionDialog(this, oIdioma.get("Question15"), oIdioma.get("Title50"),
                javax.swing.JOptionPane.YES_NO_OPTION, javax.swing.JOptionPane.QUESTION_MESSAGE,
                null, options, options[0]);
        
        javax.swing.JFileChooser oChooser = new javax.swing.JFileChooser();
        oChooser.setFileSelectionMode(javax.swing.JFileChooser.DIRECTORIES_ONLY);
        oChooser.setDialogTitle(oIdioma.get("Title32"));
        int iVal = oChooser.showSaveDialog(this);
        if (iVal == javax.swing.JFileChooser.APPROVE_OPTION) {
            String sFile = oChooser.getSelectedFile().getName();
            String sParent = oChooser.getSelectedFile().getParent();
            
            //M: si se pidi� fichero de proyecto
            if (ifProyecto == javax.swing.JOptionPane.YES_OPTION) generaFicheroProyecto(sParent + "/" + sFile);
            
            sFile = sFile.concat("/" + sProjectName + "_SCO");
            oFile = new File(sParent, sFile);
            
            //System.out.println(oFile.getAbsolutePath());
            if (oFile.exists()) {
                int iOpcion = MyOptionPane.showConfirmDialog(this, oIdioma.get("Question1"), oIdioma.get("Title2"), javax.swing.JOptionPane.YES_NO_OPTION);
                if (iOpcion == javax.swing.JOptionPane.NO_OPTION) return;
            } else oFile.mkdir();
            
            //Definimos el comportamiento del hilo que va a realizar la operaci�n
            final Code oCodigo = new Code() {
                
                public void run(final ProgressBar oBar) {
                    try {
                        oBar.addValue();
                        System.out.println("Creando ficheros de opciones");
                        oBar.setLabelText(MainFrame.oMainFrame.getMessage("Label10"));
                        oOptionsGenerator.generateConfigurationFiles(MainFrame.oMainFrame);
                        System.out.println("Creando fichero de adaptaci�n");
                        oBar.setLabelText(MainFrame.oMainFrame.getMessage("Label25"));
                        AdaptationGenerator.generateAdaptationFile(MainFrame.oMainFrame, sDefaultOption);
                        System.out.println("Creando los ficheros de metadatos");
                        oBar.setLabelText(MainFrame.oMainFrame.getMessage("Label26"));
                        MainFrame.oMainFrame.getMetadataManager().createMetadataFiles(oFile.getParentFile(), oFile.getName(), oMetadata);
                        System.out.println("pack");
                        oPacker.pack(oFile, oBar);
                        System.out.println("volvi� de pack");
                        oBar.termina();
                        //SSSSS
                        acabo=true;
                        
                    } catch (final Exception oE) {
                        oE.printStackTrace();
                        javax.swing.SwingUtilities.invokeLater(new Runnable() {
                            
                            public void run() {
                                oBar.dispose();
                                java.awt.Toolkit.getDefaultToolkit().beep();
                                MyOptionPane.showMessageDialog(MainFrame.oMainFrame, oE.getMessage(), MainFrame.oMainFrame.getMessage("Title12"), javax.swing.JOptionPane.ERROR_MESSAGE);
                            }
                        });
                    }
                    
                }
            };
            th = new Thread(new Runnable() { //Lanzamos la progressBar (ella ser� la encargada de lanzar el hilo que realice la tarea definida por oCodigo
                
                public void run() {
                    new ProgressBar(MainFrame.oMainFrame, 0, 0, MainFrame.oMainFrame.getMessage("Title33"), true, oCodigo, 300);
                }
            });
            th.start();
            
            bSaved = true;//M: lo uso para saber si hay cambios despu�s (y avisar de que se perder�n si no se genera sco de nuevo)
        }
        //System.out.println("Aqui salgo cuando guardo");
        
    }//GEN-LAST:event_oJMenuItem52ActionPerformed
    
    //M: m�todo para redireccionamiento - simulaci�n de evento para volver a donde se invoc� questionsave()
    public void finHiloCreaSCO() {
        System.out.println(th.isAlive());
        switch (origen) {
            case 0:
                return;
            case 1:
                origen = 0;
                oJMenuItem11ActionPerformed(new java.awt.event.ActionEvent(oJMenuItem52, java.awt.event.ActionEvent.ACTION_PERFORMED, ""));
                return;
            case 2:
                origen = 0;
                oJMenuItem14ActionPerformed(new java.awt.event.ActionEvent(oJMenuItem52, java.awt.event.ActionEvent.ACTION_PERFORMED, ""));
                return;
            case 3:
                origen = 0;
                oJMenuItem13ActionPerformed(new java.awt.event.ActionEvent(oJMenuItem52, java.awt.event.ActionEvent.ACTION_PERFORMED, ""));
                return;
            case 4:
                origen = 0;
                formWindowClosing(new java.awt.event.WindowEvent(this, java.awt.event.WindowEvent.WINDOW_CLOSING));
                return;
        }
        
    }
    
    //M: m�todo de generaci�n de fichero de proyecto (.sco)
    private void generaFicheroProyecto(String sF) {
        try {
            System.out.println("------------------------ " + sF);
            File fProyecto = new File(sF, sProjectName + ".sco");
            java.io.ObjectOutputStream oOOS = new java.io.ObjectOutputStream(new java.io.FileOutputStream(fProyecto));
            //Guardamos el nombre del proyecto
            oOOS.writeObject(sProjectName);
            //Guardamos la clase de la plantilla cargada
            oOOS.writeObject(sNombre);
            //Guardamos las opciones definidas en el entorno
            oOOS.writeObject(oOpciones);
            //Guardamos la opci�n elegida
            oOOS.writeInt(iBoton);
            //Guardamos las reglas de adaptaci�n creadas
            oOOS.writeObject(oRules);
            //Guardamos las metadatos creadas
            oOOS.writeObject(oMetadata);
            //Guardamos el Fichero en el que se guarda el proyecto
            oOOS.writeObject(fProyecto);
            //Guardamos la ruta del �ltimo fichero abierto por los JFileChoosers
            oOOS.writeObject(oLastDir);
            //Obtenemos las opciones de las propiedades de todos los elementos de la plantilla
            java.util.HashMap<String, Component> oHashMap = new java.util.HashMap<String, Component>();
            oTop.copyOptions(oHashMap);
            oOOS.writeObject(oHashMap);
            oOOS.writeObject(oUses);
            oOOS.flush();
            oOOS.close();
            this.oProjectFile = fProyecto;
        } catch (Exception oE) {
            oE.printStackTrace();
            java.awt.Toolkit.getDefaultToolkit().beep();
            MyOptionPane.showMessageDialog(this, oIdioma.get("Error10"), oIdioma.get("Title12"), javax.swing.JOptionPane.ERROR_MESSAGE);
        }
        
    }
    
    /**
     * M�todo llamado cuando el usuario pulsa sobre el MenuItem de Reglas de Adaptaci�n
     */
    private void oJMenuItem51ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_oJMenuItem51ActionPerformed
        if (oAssistant != null) {
            //Antes de hacerlo visible recargamos las opciones que se muestran en el asistente
            //por si han cambiado las opciones del MainFrame
            oAssistant.updateOptions();
            //oAssistant.setLocation(this.getX()+(this.getWidth()-oAssistant.getWidth())/2,this.getY()+(this.getHeight()-oAssistant.getHeight())/2);
            oAssistant.setVisible(true);
        } else {
            Assistant oDialog = new Assistant(this);
            oAssistant = oDialog;
            oDialog.setTitle(oIdioma.get("Title35"));
            oDialog.setLocation(this.getX() + (this.getWidth() - oDialog.getWidth()) / 2, this.getY() + (this.getHeight() - oDialog.getHeight()) / 2);
            oDialog.setVisible(true);
        }
        
    }//GEN-LAST:event_oJMenuItem51ActionPerformed
    
    /**
     * Esta funci�n es llamada cuando el usuario pulsa sobre el bot�n
     * de eliminar proyecto.
     */
    /**
     * Esta funci�n es llamada cuando el usuario pulsa sobre el MenuItem
     * de renombrar proyecto.
     */
    private void oJMenuItem23ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_oJMenuItem23ActionPerformed
        while (true) {
            String sNewName = MyOptionPane.showInputDialog(this, oIdioma.get("Text8"), oIdioma.get("Title17"), javax.swing.JOptionPane.QUESTION_MESSAGE);
            if (sNewName == null) return;
            if (!sNewName.equals("")) { //Si el usuario ha introducido un nombre, lo cambiamos
                sProjectName = sNewName;
                this.setTitle("SCO Creator Tool - " + sProjectName);
                bSaved = false;
                return;
                
            }
        }
    }//GEN-LAST:event_oJMenuItem23ActionPerformed
    
    
    
    /**
     * Cierra el proyecto cargado actualmente en el entorno
     */
    private void close() {
        sNombre = null;
        sProjectName = null;
        oProjectFile = null;
        oLastDir = null;
        oRules = null;
        oMetadata = null;
        oTop = null;
        oActivo = null;
        oContextTemplateHelp = null;
        oUses = null;
        oComponents = null;
        oAssistant = null;
        oMetadataForm = null;
        lCreationTime = 0;
        oJPanel.setVisible(false);
        oJPanel.removeAll();
        oJMenuItem23.setEnabled(false);
        oJMenu4.setEnabled(false);
        oJMenu5.setEnabled(false);
        oJLabel1.setText("");
        oJLabel6.setText("");
        oPSheet.vDesactiva();
        oHSheet.vDesactiva();
        setTitle("SCO Creator Tool");
        activateDimensionPanel(Capsula.NOTSIZEMOVE);
        bSaved = true;
    }
    
    /**
     * Borra el contenido del directorio denotado por oDir
     * Es una funci�n recursiva.
     */
    public static void deleteDir(java.io.File oDir) {
        java.io.File[] oFiles = oDir.listFiles();
        if (oFiles == null) return;
        for (java.io.File oFile : oFiles) {
            if (oFile.isDirectory()) {
                deleteDir(oFile);
            } else if (!oFile.delete()) System.out.println("NO PUEDE ELIMINARSE EL FICHERO: " + oFile);
            //NOTA: se imprime s�lo por motivos de depuraci�n.
        }
        if (!oDir.delete()) System.out.println("NO PUEDE ELIMINARSE EL DIR: " + oDir);
    }
    
    /**
     * Borra el contenido del directorio denotado por oDir
     * (pero no el propio directorio)
     * Es una funci�n recursiva.
     */
    public static void deleteContentDir(java.io.File oDir) { //-M-
        java.io.File[] oFiles = oDir.listFiles();
        if (oFiles == null) return;
        for (java.io.File oFile : oFiles) {
            if (oFile.isDirectory()) {
                deleteDir(oFile);
            } else if (!oFile.delete()) System.out.println("NO PUEDE ELIMINARSE EL FICHERO: " + oFile);
            //NOTA: se imprime s�lo por motivos de depuraci�n.
        }
    }
    
    /**
     * Esta funci�n es llamada cuando el usuario pulsa sobre el MenuItem
     * Salir
     */
    private void oJMenuItem13ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_oJMenuItem13ActionPerformed
        if (!bSaved) {
            origen = 3;
            int s = questionSave();
            if (s == 1) return;
        }
        
        //M: borramos contenido de las carpetas TEMP (COMPONENTS, ADAPTATION Y OPTIONS)
        java.io.File fComponents = new java.io.File(fTemp, "COMPONENTS");
        deleteContentDir(fComponents);
        java.io.File fAdaptation = new java.io.File(fTemp, "ADAPTATION");
        deleteContentDir(fAdaptation);
        java.io.File fOptions = new java.io.File(fTemp, "OPTIONS");
        deleteContentDir(fOptions);
        exit();
    }//GEN-LAST:event_oJMenuItem13ActionPerformed
    
    /**
     * Esta funci�n es llamada cuando el usuario cierra la ventana del Frame Principal
     */
    private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
        if (!bSaved) {
            
            origen = 4;
            int s = questionSave();
            if (s == 1) {
                //SSSS le devuelve el control a Reload
                this.setVisible(false);
                parent.setEnabled(true);
                return;
            }
        }
        
        //M: borramos contenido de las carpetas TEMP (COMPONENTS, ADAPTATION Y OPTIONS)
        java.io.File fComponents = new java.io.File(fTemp, "COMPONENTS");
        deleteContentDir(fComponents);
        java.io.File fAdaptation = new java.io.File(fTemp, "ADAPTATION");
        deleteContentDir(fAdaptation);
        java.io.File fOptions = new java.io.File(fTemp, "OPTIONS");
        deleteContentDir(fOptions);
        
        exit();
    }//GEN-LAST:event_formWindowClosing
    
    /**
     * Esta funci�n realiza las tareas necesarias antes de cerrar la aplicaci�n, y descpu�s
     * la cierra.
     */
    private void exit() {
        //Salvamos las variables del entorno
        saveEnviroment();
        
        //SSSS
        this.setVisible(false);
        parent.setEnabled(true);
        return;
        //cambio esto para que no me cierre tambi�n el Reload
        //System.exit(0);
    }
    
    /**
     * Se llama cuando el usuario pulsa sobre el CheckBox de Ver panel de dimensionado
     */
    private void oJCheckBoxMenuItem33ItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_oJCheckBoxMenuItem33ItemStateChanged
        oJPanel3.setVisible(oJCheckBoxMenuItem33.isSelected());
        if ((this.getExtendedState() & java.awt.Frame.MAXIMIZED_BOTH) == java.awt.Frame.MAXIMIZED_BOTH) maximizeDialogs();
    }//GEN-LAST:event_oJCheckBoxMenuItem33ItemStateChanged
    
    /**
     * Funci�n llamada cuando el usuario pulsa sobre el MenuItem Importar plantilla
     * Muestra un FileChooser para que el usuario pueda abrir una plantilla situada
     * en cualquier lugar del sistema de ficheros. Si la aplicaci�n se est� ejecutando desde
     * el �rbol de directorios copia la plantilla al directorio de plantillas
     */
    private void oJMenuItem12ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_oJMenuItem12ActionPerformed
        
        //M: Ahora..
        javax.swing.JFileChooser oChooser = new javax.swing.JFileChooser();
        MyFileFilter oFilter = new MyFileFilter();
        oFilter.vSetDescripcion(oIdioma.get("Description1"));
        oChooser.setFileFilter(oFilter);
        oChooser.setDialogTitle(oIdioma.get("Title1"));
        oChooser.setFileSelectionMode(javax.swing.JFileChooser.DIRECTORIES_ONLY);
        int iVal = oChooser.showOpenDialog(this);
        if (iVal == javax.swing.JFileChooser.APPROVE_OPTION) {
            try {
                File fTout = oChooser.getSelectedFile();
                String sT = fTout.getName();
                File fTin = new File(fTemplates, sT);
                fTin.mkdir();
                java.io.File[] fToutfiles = fTout.listFiles();
                for (int i = 0; i < fToutfiles.length; i++) {
                    File fTinfile = new File(fTin, fToutfiles[i].getName());
                    copyFile(fToutfiles[i], fTinfile);
                }
            } catch (Exception oE) {
                oE.printStackTrace();
                java.awt.Toolkit.getDefaultToolkit().beep();
                MyOptionPane.showMessageDialog(this, oIdioma.get("Error12"), oIdioma.get("Title12"), javax.swing.JOptionPane.ERROR_MESSAGE);
                return;
            }
        }
    }//GEN-LAST:event_oJMenuItem12ActionPerformed
    
    /**
     * Esta funci�n es llamada cuando el usuario pulsa sobre el bot�n
     * crear opci�n.
     */
    private void oJMenuItem41ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_oJMenuItem41ActionPerformed
        CreateOptionDialog oDialogo = new CreateOptionDialog(this);
        oDialogo.setTitle(oIdioma.get("Title13"));
        oDialogo.setLocation(this.getX() + (this.getWidth() - oDialogo.getWidth()) / 2, this.getY() + (this.getHeight() - oDialogo.getHeight()) / 2);
        oDialogo.setVisible(true);
    }//GEN-LAST:event_oJMenuItem41ActionPerformed
    
    /**
     * Esta funci�n es llamada cuando el usuario pulsa sobre el bot�n
     * renombrar opci�n.
     */
    private void oJMenuItem42ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_oJMenuItem42ActionPerformed
        RenameOptionDialog oDialogo = new RenameOptionDialog(this);
        oDialogo.setTitle(oIdioma.get("Title11"));
        oDialogo.setLocation(this.getX() + (this.getWidth() - oDialogo.getWidth()) / 2, this.getY() + (this.getHeight() - oDialogo.getHeight()) / 2);
        oDialogo.setVisible(true);
        
    }//GEN-LAST:event_oJMenuItem42ActionPerformed
    
    /**
     * Esta funci�n es llamada cuando el bot�n de ver hoja de jerarquia es
     * pulsado por el usuario causando un cambio en su estado.
     */
    private void oJCheckBoxMenuItem32ItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_oJCheckBoxMenuItem32ItemStateChanged
        if (oJCheckBoxMenuItem32.isSelected()) {
            if ((this.getExtendedState() & java.awt.Frame.MAXIMIZED_BOTH) == java.awt.Frame.MAXIMIZED_BOTH) {
                int iResta;
                if (oJPanel3.isVisible()) iResta = 115;
                else iResta = 75;
                java.awt.Insets oInsets = java.awt.Toolkit.getDefaultToolkit().getScreenInsets(java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration());
                int iWidth = java.awt.Toolkit.getDefaultToolkit().getScreenSize().width - oInsets.left - oInsets.right;
                oHSheet.setLocation(oInsets.left + iWidth - oHSheet.getWidth(), oInsets.top + iResta - 30 + oPSheet.getHeight());
            } else oHSheet.setLocation(this.getX() + this.getWidth(), this.getY() + oPSheet.getHeight());
            oHSheet.setVisible(true);
        } else oHSheet.setVisible(false);
    }//GEN-LAST:event_oJCheckBoxMenuItem32ItemStateChanged
    
    /**
     * Esta funci�n es llamada cuando el bot�n de ver hoja de propiedades es
     * pulsado por el usuario causando un cambio en su estado.
     */
    private void oJCheckBoxMenuItem31ItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_oJCheckBoxMenuItem31ItemStateChanged
     // System.out.println("entro en oJCheckBoxMenuItem31...");
        if (oJCheckBoxMenuItem31.isSelected()) {
            if ((this.getExtendedState() & java.awt.Frame.MAXIMIZED_BOTH) == java.awt.Frame.MAXIMIZED_BOTH) {
                int iResta;
                if (oJPanel3.isVisible()) iResta = 115;
                else iResta = 70;
                java.awt.Insets oInsets = java.awt.Toolkit.getDefaultToolkit().getScreenInsets(java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration());
                int iWidth = java.awt.Toolkit.getDefaultToolkit().getScreenSize().width - oInsets.left - oInsets.right;
                oPSheet.setLocation(oInsets.left + iWidth - oPSheet.getWidth(), iResta - 30);
            } else oPSheet.setLocation(this.getX() + this.getWidth(), this.getY());
            oPSheet.setVisible(true);
        } else oPSheet.setVisible(false);
    }//GEN-LAST:event_oJCheckBoxMenuItem31ItemStateChanged
    
    /**
     * Esta funci�n es llamada cuando el bot�n de Mostrar ToolTips es pulsado
     */
    private void oJCheckBoxMenuItem35ItemStateChanged(java.awt.event.ItemEvent evt) {
        if (oJCheckBoxMenuItem35.isSelected()) {
            oTop.setCapsulaHelp(true);
        } else {
            oTop.setCapsulaHelp(false);
        }
    }
    
    /**
     * Esta funcion es llamada cuando el usuario pulsa sobre el Men�Item Cambiar
     * color de bordes.
     * Muestra al usuario el cuadro de di�logo para cambiar el color de los bordes.
     */
    private void oJMenuItem22ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_oJMenuItem22ActionPerformed
        java.awt.Color oColor = javax.swing.JColorChooser.showDialog(this, oIdioma.get("Title9"), java.awt.Color.RED);
        if (oColor == null) return;
        oJPanel.oGetBordeActivo().vSetColor(oColor);
        //Si hay una plantilla cargada la actualizamos
        if (sNombre != null) {
            showTemplate(sProjectName, sNombre, false);
        }
    }//GEN-LAST:event_oJMenuItem22ActionPerformed
    
    /**
     * Esta funci�n es llamada cuando el usuario pulsa sobre el Men�Item Cambiar grosor de bordes.
     * Muestra al usuario un cuadro de di�logo en el que elegir entre los posibles grosores
     */
    private void oJMenuItem21ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_oJMenuItem21ActionPerformed
        Integer[] oOpciones = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        Object oSeleccion = MyOptionPane.showInputDialog(this, oIdioma.get("Text1"), oIdioma.get("Title10"), javax.swing.JOptionPane.QUESTION_MESSAGE, null, oOpciones, new Integer(4));
        if (oSeleccion == null) return;
        oJPanel.oGetBordeActivo().vSetGrosor((Integer) oSeleccion);
        oJPanel.oGetBordeMovimiento().vSetGrosor((Integer) oSeleccion);
        //Si hay una plantilla cargada la actualizamos
        if (sNombre != null) {
            
            showTemplate(sProjectName, sNombre, false);
        }
        
    }//GEN-LAST:event_oJMenuItem21ActionPerformed
    
    /**
     * Esta funci�n es llamada cuando el usuario pulsa sobre el Men�Item
     * Nuevo proyecto. Muestra al usuario un cuadro de di�logo
     * para seleccionar la plantilla a elegir entre las disponibles
     * en el directorio de plantillas.
     */
    private void oJMenuItem11ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_oJMenuItem11ActionPerformed
        
        if (!bSaved) {
            origen = 1;
            int s = questionSave();
            if (s == 1) return;
        }
        
        if (sProjectName != null) close();//M: cerramos el anterior
        
        //M: borramos contenido de las carpetas TEMP (COMPONENTS, ADAPTATION Y OPTIONS)
        java.io.File fComponents = new java.io.File(fTemp, "COMPONENTS");
        deleteContentDir(fComponents);
        java.io.File fAdaptation = new java.io.File(fTemp, "ADAPTATION");
        deleteContentDir(fAdaptation);
        java.io.File fOptions = new java.io.File(fTemp, "OPTIONS");
        deleteContentDir(fOptions);
        
        String sTemplate;
        String sName;
        try {
            ChooseTemplate oDialog = new ChooseTemplate(this);
            oDialog.setTitle(oIdioma.get("Title14"));
            oDialog.setLocation(this.getX() + (this.getWidth() - oDialog.getWidth()) / 2, this.getY() + (this.getHeight() - oDialog.getHeight()) / 2);
            oDialog.setVisible(true);
            sTemplate = oDialog.getTemplateName();
            if (sTemplate == null) return; //Si el usuario pulso sobre cancelar salimos.
            sName = oDialog.getProjectName();
        } catch (Exception oE) {
            java.awt.Toolkit.getDefaultToolkit().beep();
            MyOptionPane.showMessageDialog(this, oIdioma.get("Error1"), oIdioma.get("Title2"), javax.swing.JOptionPane.WARNING_MESSAGE);
            return;
        }
        
        
        if (showTemplate(sName, sTemplate, true) != 0) { //Se ha producido un error al intentar cargar la plantilla
            return;
        }
        sProjectName = new String(sName);
        bSaved = false;
        oProjectFile = null;
        oLastDir = null;
        oRules = null;
        oMetadata = null;
        oAssistant = null;
        oMetadataForm = null;
        
    }//GEN-LAST:event_oJMenuItem11ActionPerformed
    
    /**
     * Funcion llamada cuando el usuario pulsa sobre el MenuItem
     * de Abrir SCO.
     */
    private void oJMenuItem14ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_oJMenuItem14ActionPerformed
        
        if (!bSaved) {
            origen = 2;
            int s = questionSave();
            if (s == 1) return;
        }
        
        javax.swing.JFileChooser oChooser = new javax.swing.JFileChooser();
        MyFileFilter oFilter = new MyFileFilter();
        oFilter.vAddExtension("sco");
        oFilter.vSetDescripcion(oIdioma.get("Description2"));
        oChooser.setFileFilter(oFilter);
        oChooser.setDialogTitle(oIdioma.get("Title15"));
        int iVal = oChooser.showOpenDialog(this);
        if (iVal == javax.swing.JFileChooser.APPROVE_OPTION) {
            java.io.File oProject = oChooser.getSelectedFile();
            if (loadSCO(oProject) != 0) return;
            if (showTemplate(sProjectName, sNombre, false) != 0) return;
            oAssistant = null;
            oMetadataForm = null;
        }
    }//GEN-LAST:event_oJMenuItem14ActionPerformed
    
    /**
     * Esta funci�n se encarga de activar o desactivar uns serie de elementos
     * del entorno de la herramienta
     * @param iSizeDimension Variable que indica si se activan los controles de dimension y posicion
     */
    protected void activateDimensionPanel(int iSizeDimension) {
        switch (iSizeDimension) {
            //Se puede dimensionar y mover
            case Capsula.SIZEMOVE:
                oJButton1.setEnabled(true);
                oJCheckBox1.setEnabled(true);
                oJLabel2.setEnabled(true);
                oJLabel3.setEnabled(true);
                oJLabel4.setEnabled(true);
                oJLabel5.setEnabled(true);
                oJLabelSpinner.setEnabled(true);
                oJFormattedTextField1.setEnabled(true);
                oJFormattedTextField2.setEnabled(true);
                oJFormattedTextField3.setEnabled(true);
                oJFormattedTextField4.setEnabled(true);
                //Restringimos los valores para el JSpinner
                if (oActivo.getLabel() != null) oJSpinner1.setModel(new javax.swing.SpinnerNumberModel(oActivo.getZ(iBoton), 0, oActivo.getLabel().getParent().getComponentCount() - 1, 1));
                else oJSpinner1.setModel(new javax.swing.SpinnerNumberModel(oActivo.getZ(iBoton), 0, oActivo.oGetBean().getParent().getComponentCount() - 1, 1));
                oJSpinner1.setEnabled(true);
                oJFormattedTextField1.setValue(oActivo.getX(iBoton));
                oJFormattedTextField2.setValue(oActivo.getY(iBoton));
                oJFormattedTextField3.setValue(oActivo.getWidth(iBoton));
                oJFormattedTextField4.setValue(oActivo.getHeight(iBoton));
                oJCheckBox1.setSelected(oActivo.isVisible(iBoton));
                break;
                //ni se puede mover ni dimensionar
            case Capsula.NOTSIZEMOVE:
                oJButton1.setEnabled(false);
                oJCheckBox1.setEnabled(false);
                oJLabel2.setEnabled(false);
                oJLabel3.setEnabled(false);
                oJFormattedTextField1.setEnabled(false);
                oJFormattedTextField2.setEnabled(false);
                oJLabel4.setEnabled(false);
                oJLabel5.setEnabled(false);
                oJLabelSpinner.setEnabled(false);
                oJFormattedTextField3.setEnabled(false);
                oJFormattedTextField4.setEnabled(false);
                oJSpinner1.setEnabled(false);
                oJFormattedTextField1.setValue(null);
                oJFormattedTextField2.setValue(null);
                oJFormattedTextField3.setValue(null);
                oJFormattedTextField4.setValue(null);
                oJSpinner1.setValue(0);
                oJCheckBox1.setSelected(false);
                break;
                //s�lo la coordenada Z
            case Capsula.ONLYZ:
                oJButton1.setEnabled(true);
                oJCheckBox1.setEnabled(false);
                oJLabel2.setEnabled(false);
                oJLabel3.setEnabled(false);
                oJFormattedTextField1.setEnabled(false);
                oJFormattedTextField2.setEnabled(false);
                oJLabel4.setEnabled(false);
                oJLabel5.setEnabled(false);
                oJLabelSpinner.setEnabled(true);
                oJFormattedTextField3.setEnabled(false);
                oJFormattedTextField4.setEnabled(false);
                oJSpinner1.setEnabled(true);
                oJFormattedTextField1.setValue(null);
                oJFormattedTextField2.setValue(null);
                oJFormattedTextField3.setValue(null);
                oJFormattedTextField4.setValue(null);
                //Restringimos los valores para el JSpinner
                if (oActivo.getLabel() != null) oJSpinner1.setModel(new javax.swing.SpinnerNumberModel(oActivo.getZ(iBoton), 0, oActivo.getLabel().getParent().getComponentCount() - 1, 1));
                else oJSpinner1.setModel(new javax.swing.SpinnerNumberModel(oActivo.getZ(iBoton), 0, oActivo.oGetBean().getParent().getComponentCount() - 1, 1));
                oJCheckBox1.setSelected(false);
                break;
        }
    }
    
    /**
     * Esta funci�n es llamada cuando el usuario pulsa sobre uno
     * de los RadioButton del men� Ver opciones.
     */
    private void vProcesarRadioButton(java.awt.event.ActionEvent oEvento) {
        iBoton = Integer.parseInt(oEvento.getActionCommand());
        oPSheet.vSeleccionaPagina(iBoton);
        if (!isChangeOptionSelected()) {
            oTop.updateBean(iBoton);
            //oJPanel.repaint();
            oJLabel6.setText(oIdioma.get("Label6") + oOpciones.get(iBoton));
            oHSheet.vActiva();
            oActivo.vActivar();
        }
        
    }
    
    /**
     * Esta funci�n es llamada cuando el usuario pulsa sobre uno
     * de los RadioButton del men� Ver idioma.
     */
    private void vProcesarRadioButtonIdioma(java.awt.event.ActionEvent oEvento) {
        if (!sLanguage.equals(oEvento.getActionCommand())) {
            sLanguage = oEvento.getActionCommand();
            String sNewCode = getCode(sLanguage);
            if (sNewCode != null) sCode = sNewCode;
            //Indicamos al usuario que los cambios tendr�n efecto al reiniciar la aplicaci�n
            MyOptionPane.showMessageDialog(this, oIdioma.get("Information1"), oIdioma.get("Title34"), javax.swing.JOptionPane.INFORMATION_MESSAGE);
        /*vCargarIdioma(sLanguage);
        changeLanguage();
        if (oJCheckBoxMenuItem35.isSelected()) {
        if (oActivo!=null) oTop.setCapsulaHelp(true);
        }*/
        }
    }
    
    /**
     * Esta funci�n es llamada cuando el usuario pulsa sobre uno
     * de los RadioButton del men� Look And Feel
     */
    private void vProcesarRadioButtonLookAndFeel(java.awt.event.ActionEvent oEvento) {
        if (!sLookAndFeel.equals(oEvento.getActionCommand())) {
            
            javax.swing.UIManager.LookAndFeelInfo[] oLooks = javax.swing.UIManager.getInstalledLookAndFeels();
            for (int i = 0; i < oLooks.length; i++) if (oLooks[i].getName().equals(oEvento.getActionCommand())) {
                sLookAndFeel = oLooks[i].getClassName();
                break;
            }
            //Indicamos al usuario que los cambios tendr�n efecto al reiniciar la aplicaci�n
            MyOptionPane.showMessageDialog(this, oIdioma.get("Information3"), oIdioma.get("Title48"), javax.swing.JOptionPane.INFORMATION_MESSAGE);
        }
    }
    
    /**
     * Esta funci�n cambia los textos de todos los elementos en pantalla al idioma
     * indicado por iBotonIdioma
     */
    /* private void changeLanguage() {
    // Cambiamos los textos de todos
    // los elementos en pantalla.
    oJMenu1.setText(oIdioma.get("Menu1"));
    oJMenuItem11.setText(oIdioma.get("Menuitem11"));
    oJMenuItem11.setToolTipText(oIdioma.get("Tooltext11"));
    oJMenuItem12.setText(oIdioma.get("Menuitem12"));
    oJMenuItem12.setToolTipText(oIdioma.get("Tooltext12"));
    oJMenuItem13.setText(oIdioma.get("Menuitem13"));
    oJMenuItem13.setToolTipText(oIdioma.get("Tooltext13"));
    oJMenuItem14.setText(oIdioma.get("Menuitem14"));
    oJMenuItem14.setToolTipText(oIdioma.get("Tooltext14"));
    oJMenuItem15.setText(oIdioma.get("Menuitem15"));
    oJMenuItem15.setToolTipText(oIdioma.get("Tooltext15"));
    oJMenuItem16.setText(oIdioma.get("Menuitem16"));
    oJMenuItem16.setToolTipText(oIdioma.get("Tooltext16"));
    oJMenuItem17.setText(oIdioma.get("Menuitem17"));
    oJMenuItem17.setToolTipText(oIdioma.get("Tooltext17"));
    oJMenuItem18.setText(oIdioma.get("Menuitem18"));
    oJMenuItem18.setToolTipText(oIdioma.get("Tooltext18"));
    oJMenu2.setText(oIdioma.get("Menu2"));
    oJMenu21.setText(oIdioma.get("Menu21"));
    oJMenuItem21.setText(oIdioma.get("Menuitem21"));
    oJMenuItem22.setText(oIdioma.get("Menuitem22"));
    oJMenuItem23.setText(oIdioma.get("Menuitem23"));
    oJMenuItem23.setToolTipText(oIdioma.get("Tooltext23"));
    oJMenu3.setText(oIdioma.get("Menu3"));
    oJCheckBoxMenuItem31.setText(oIdioma.get("Checkbox31"));
    oJCheckBoxMenuItem32.setText(oIdioma.get("Checkbox32"));
    oJCheckBoxMenuItem33.setText(oIdioma.get("Checkbox33"));
    oJCheckBoxMenuItem34.setText(oIdioma.get("Checkbox34"));
    oJMenu4.setText(oIdioma.get("Menu4"));
    oJMenuItem41.setText(oIdioma.get("Menuitem41"));
    oJMenuItem42.setText(oIdioma.get("Menuitem42"));
    oJMenu41.setText(oIdioma.get("Menu41"));
    oJMenuItem51.setText(oIdioma.get("Menuitem51"));
    oJMenuItem51.setToolTipText(oIdioma.get("Tooltext51"));
    oJMenuItem52.setText(oIdioma.get("Menuitem52"));
    oJMenuItem52.setToolTipText(oIdioma.get("Tooltext52"));
    oJLabel4.setText(oIdioma.get("Label4"));
    oJLabel5.setText(oIdioma.get("Label5"));
    oPSheet.setTitle(oIdioma.get("Title5"));
    oHSheet.setTitle(oIdioma.get("Title8"));
    oJButton1.setText(oIdioma.get("Button4"));
    oJCheckBoxMenuItem35.setText(oIdioma.get("Checkbox35"));
    oJPMenu1.setText(oIdioma.get("PMenu1"));
    oJPMenuItem1.setText(oIdioma.get("PMenuItem1"));
    oJPMenuItem2.setText(oIdioma.get("PMenuItem2"));
    if (oJMenu4.isEnabled()) {
    oActivo.vActivar();
    oJLabel6.setText(oIdioma.get("Label6")+oOpciones.get(iBoton));
    }
    }*/
    /**
     * Este m�todo trata de obtener una referencia a la plantilla (carga din�mica de clase)
     * para posteriormente presentarla adecuadamente en pantalla
     * Este m�todo es el encargado de convertir la plantilla (clase java que hereda
     * de com.uvigo.mhp.ui.HPanel (Hcontainer de org.havi.ui)) en el conjunto
     * de capuslas que "encapsular�n" a los diferentes elementos de la clase (estos
     * elementos heredan de org.havi.iu.HComponent). Estas c�psulas son las que manejar�
     * la herramienta, ya que extienden los elementos en aquellos aspectos necesarios para
     * poder "configurarlos".
     * NOTA IMPORTANTE: tal como est� programado este m�todo las plantillas
     * deben residir en el directiorio de plantillas, esto es: com.uvigo.tMaestro.SCOCreator.templates
     * Adem�s es esctrictamente necesario que los contenedores de las plantillas sean el NullLayout
     * REV:// Si m�s adelante se incorporase el creador de plantillas debe generarlas en el mencionado directorio
     * @param sNombre El nombre de la clase de la plantilla
     * @param bIsNew Indica si la plantilla se va a cargar desde un proyecto anterior (false)
     * o si se carga para un nuevo proyecto(true)
     * @return Cero si todo ha ido bien, -1 en caso contrario.
     */
    private int processTemplate(String sNombre, boolean bIsNew) {
        //M: ahora..
        try {
            oJPanel.removeAll();
            if (bIsNew) {
                oOpciones = new java.util.ArrayList<String>();
                oOpciones.add("Op 1");
                oOpciones.add("Op 2");
                iBoton = 0;
                oComponents = null;
                oUses = new java.util.HashMap<String, Integer>();
            }
            vEstableceOpciones();
            oPSheet.setOptions(oOpciones);
            Template template = new Template(sNombre);
            
            oJPanel.add(template);
            oTop = new Capsula(oJPanel, template, oOpciones.size(), Capsula.NOTSIZEMOVE, sNombre);
            oJPanel.setComponentZOrder(template, oJPanel.getComponentCount() - 1);//Reordenamos el Z-Orden de las c�spulas con relaci�n al Z-orden de los Beans que encapsulan
            this.sNombre = sNombre;
            return (0);
            
        } catch (Exception oE) {
            oE.printStackTrace();
            java.awt.Toolkit.getDefaultToolkit().beep();
            MyOptionPane.showMessageDialog(this, oIdioma.get("Error2") + ":\n" + oE.getMessage(), oIdioma.get("Title3"), javax.swing.JOptionPane.ERROR_MESSAGE);
            return (-1);
        }
    }
    
    /**
     * Muestra la plantilla sNombre en el entorno
     * @param sNombre El nombre de la plantilla que mostrar
     * @param bIsNew Indica si la plantilla se va a cargar desde un proyecto anterior (false)
     * o si se carga para un nuevo proyecto(true)
     * @return 0 si todo ha ido bien, -1 en caso contrario
     */
    private int showTemplate(String sProjectName, String sNombre, boolean bIsNew) {
        int iResul = 0;
        oJPanel.setVisible(false);
        setEnviromentCursor(java.awt.Cursor.WAIT_CURSOR);
        
        //Pimero guardamos los valores actuales por si falla el procesado de la plantilla
        //(si hay un proyecto cargado, claro)
        String sAntNombre = null;
        String sAntProjectName = null;
        java.util.ArrayList<String> oAntOpciones = null;
        int iAntBoton = 0;
        java.util.HashMap<String, Integer> oAntUses = null;
        java.util.HashMap<String, Component> oAntComponents = null;
        if (this.sNombre != null) {
            sAntNombre = this.sNombre;
            sAntProjectName = this.sProjectName;
            oAntOpciones = this.oOpciones;
            iAntBoton = this.iBoton;
            oAntUses = this.oUses;
            oAntComponents = this.oComponents;
        }
        //Intentamos procesar la nueva plantilla
        if (processTemplate(sNombre, bIsNew) != 0) {//Hubo error
            iResul = -1;
            //Si habia cargada antes una platilla volvemos a presentarla
            if (sAntNombre == null) {
                close();
                setEnviromentCursor(java.awt.Cursor.DEFAULT_CURSOR);
                return -1;
            } else {
                this.sNombre = sAntNombre;
                this.sProjectName = sAntProjectName;
                this.oOpciones = oAntOpciones;
                this.oUses = oAntUses;
                this.oComponents = oAntComponents;
                this.iBoton = iAntBoton;
                sNombre = sAntNombre;
                bIsNew = false;
                if (processTemplate(sNombre, bIsNew) != 0) {
                    setEnviromentCursor(java.awt.Cursor.DEFAULT_CURSOR);
                    return -1;
                }
            }
            
        }
        oJLabel6.setText(oIdioma.get("Label6") + oOpciones.get(iBoton));
        oHSheet.vActiva();
        //La primera c�psula activa es la c�psula ra�z.
        oTop.vActivar();
        this.setTitle("SCO Creator Tool - " + sProjectName);
        oJMenu4.setEnabled(true);
        oPSheet.vActiva();
        if (isChangeOptionSelected()) {
            oPSheet.vSeleccionaPagina(iBoton); //Seleccionamos la p�gina de opcion iBoton
            if (iBoton == 0) showOption(iBoton); //La p�gina seleccionada por defecto es la cero
            //por lo que si iBoton==0 no se produce ningun cambio y vSeleccionaPagina no llama a showOption
        } else { //Si no esta marcado el checkbox de actualizar opcion al cambiarla en el editor de propiedades
            //entonces el metodo seleccionaPagina nunca llama a showOption por lo que debemos llamarlo siempre
            oPSheet.vSeleccionaPagina(iBoton);
            showOption(iBoton);
        }
        oJMenuItem23.setEnabled(true);
        oJMenu5.setEnabled(true);
        //Intentamos cargar la ayuda contextual de los tooltips de esta plantilla
        loadTemplateContextHelp();
        oActivo.setCapsulaHelp(true);
        oPSheet.setContextHelp(null, null); //Para borrar cualquier texto de ayuda contextual cargado debido a alg�n proyecto anteriormente cargado.
        oJPanel.setVisible(true);
        setEnviromentCursor(java.awt.Cursor.DEFAULT_CURSOR);
        
        return iResul;
    }
    
    /**
     * Funci�n recursiva que cambia el orden de los Capsula en el Array de c�psulas hijas de su
     * C�psula padre. Es una funci�n recursiva.
     */
    private void setCapsulaZOrder(Capsula oCapsula) {
        if (oCapsula.getLabel() != null) {
            if (oCapsula.getLabel().getParent() != null) {
                int iOrder = oCapsula.getLabel().getParent().getComponentZOrder(oCapsula.getLabel());
                //Cambiamos el orden en la estructura de c�psula para que se refleje en el visor de jerarqu�as
                if (iOrder != oCapsula.getCapsulaParent().getIndexCapsula(oCapsula)) {
                    oCapsula.getCapsulaParent().removeCapsula(oCapsula);
                    oCapsula.getCapsulaParent().addCapsula(iOrder, oCapsula);
                }
            }
        } else if (oCapsula.oGetBean().getParent() != null && !(oCapsula.oGetBean() instanceof com.uvigo.mhp.Page)) {
            int iOrder = oCapsula.oGetBean().getParent().getComponentZOrder(oCapsula.oGetBean());
            //Cambiamos el orden en la estructura de c�psula para que se refleje en el visor de jerarqu�as
            if (iOrder != oCapsula.getCapsulaParent().getIndexCapsula(oCapsula)) {
                oCapsula.getCapsulaParent().removeCapsula(oCapsula);
                oCapsula.getCapsulaParent().addCapsula(iOrder, oCapsula);
            }
        }
        if (oCapsula.iGetNumHijos() != 0) {
            java.util.ArrayList<Capsula> oCopyCapsulas = new java.util.ArrayList<Capsula>();
            for (int i = 0; i < oCapsula.iGetNumHijos(); i++) oCopyCapsulas.add(oCapsula.oGetHijo(i));
            for (int i = 0; i < oCopyCapsulas.size(); i++) setCapsulaZOrder(oCopyCapsulas.get(i));
        }
    }
    
    /**
     * Se usa para establecer las opciones que aparecen en el men� opciones.
     * Tambi�n actualiza las opciones de la hoja de propiedades
     * Se toman del ArrayList con el nombre de las opciones
     */
    private void vEstableceOpciones() {
        oJMenu41.removeAll();
        javax.swing.JRadioButtonMenuItem oBoton;
        oGrupoOpciones = new javax.swing.ButtonGroup();
        int i = 0;
        for (String sOpcion : oOpciones) {
            oBoton = new javax.swing.JRadioButtonMenuItem(sOpcion);
            oBoton.setActionCommand(Integer.toString(i));
            oGrupoOpciones.add(oBoton);
            oBoton.addActionListener(new java.awt.event.ActionListener() {
                
                public void actionPerformed(java.awt.event.ActionEvent oEvento) {
                    vProcesarRadioButton(oEvento);
                }
            });
            oJMenu41.add(oBoton);
            i++;
        }
    }
    
    /**
     * Esta funci�n se utiliza para cargar el fichero de idioma seleccionado
     * del directorio language. Se proporcionan por defecto el espanol
     * y el ingl�s. Cualquiera puede a�adir un idioma proporcionando
     * el fichero xml siguiendo el "schema" languague.xsd.
     * Es importanste rese�ar que el programa no verifica que el fichero .xml
     * contenga todas las etiquetas. Si falta una el programa sigue funcionando
     * igualmente, si bien, cuando lleque el momento de presentarla, no podr�
     * ser mostrada (cadena en blanco en su lugar). Se recomienda cubrir el fichero
     * de idiomas con todas las etiquetas para una correcta visualizaci�n del programa
     * en ese idioma. Basta ver los ficheros Espanol.xml o English.xml para saber
     * cuales son esas etiquetas
     * La ayuda contextual de elementos y propiedades (para los elementos de com.uvigo.mhp)
     * es cargada del fichero generic.xml. Se proporciona en ingl�s y espanol, puedi�ndose ampliar
     * a m�s idiomas modificando el fichero indicado.
     * Esta ayuda es presentada siempre que el creador
     * de la plantilla no proporcione en un fichero de ayuda contextual para esa
     * plantilla la ayuda para dicho elemento o propiedad.
     * Es importante notar que si se a�ade un fichero de idiomas al directorio  Languages, es necesario
     * a�adir la ayuda en ese idioma al fichero generics.html. Si no, se producir� una excepci�n.
     * Esta herramienta utiliza facilidades proporcionadas por el lenguaje Java como son por ejemplo
     * los JFileChooser que se presentan al usuario en el idioma local de dicho usuario.
     * Es decir, el texto de estos elementos no se carga desde los ficheros .xml de Idiomas
     * No obstante la funci�n averigua cual es el idioma elegido por el usuario e intenta
     * establecerlo como idioma local. Comentamos esto, ya que cabe la posibilidad de que Java
     * no disponga de la traducci�n para ese idioma. Si no dispone de dicha traducci�n dichos
     * cuadros de di�logo se presentar�n al usuario en ingl�s.
     * @param sIdioma
     */
    private void vCargarIdioma(String sIdioma) {
        try {
            
            //Buscamos el fichero .xml en el directorio language
            //Tambien buscamos el fichero de ayuda contextual en el directorio contextHelp
            java.io.InputStream oLanguageFile = this.getClass().getResource("/com/uvigo/tMaestro/SCOCreator/tool/language/" + sIdioma + ".xml").openStream();
            java.io.InputStream oContextHelpFile = this.getClass().getResource("/com/uvigo/tMaestro/SCOCreator/tool/contextHelp/ContextHelp.xml").openStream();
            
            //Creamos el JAXBContext y el Unmarshaller que nos servir�n de ayuda
            //para leer los ficheros .xml de idioma.
            javax.xml.bind.JAXBContext oJC = javax.xml.bind.JAXBContext.newInstance("com.uvigo.tMaestro.SCOCreator.tool.language");
            javax.xml.bind.Unmarshaller oUn = oJC.createUnmarshaller();
            com.uvigo.tMaestro.SCOCreator.tool.language.Language oLanguage;
            
            oIdioma = new java.util.HashMap<String, String>();
            
            
            
            oLanguage = (com.uvigo.tMaestro.SCOCreator.tool.language.Language) oUn.unmarshal(oLanguageFile);
            if (!oLanguage.getLan().equals(sIdioma)) throw new Exception();
            //Averiguamos el Code del Idioma, y lo intentamos establecer como Local
            sCode = oLanguage.getCode();
            if (sCode == null) throw new Exception();
            
            
            java.util.Locale.setDefault(new java.util.Locale(sCode));
            
            //Cargamos el contenido del fichero de idioma en oIdioma (HashMap)
            java.util.List oItems = oLanguage.getItem();
            for (Object oObject : oItems) {
                com.uvigo.tMaestro.SCOCreator.tool.language.ItemType oItem = (com.uvigo.tMaestro.SCOCreator.tool.language.ItemType) oObject;
                oIdioma.put(oItem.getLabel(), oItem.getValue());
            }
            
            //Creamos el JAXBContext y el Unmarshaller que nos servir�n de ayuda
            //para leer el ficheros .xml de ayuda contextual.
            oJC = javax.xml.bind.JAXBContext.newInstance("com.uvigo.tMaestro.SCOCreator.tool.contextHelp");
            oUn = oJC.createUnmarshaller();
            com.uvigo.tMaestro.SCOCreator.tool.contextHelp.ContextHelp oXMLContextHelp;
            
            //Cargamos en oContextHelp las ayudas contextuales del sIdioma
            oContextHelp = new java.util.HashMap<String, java.util.HashMap<String, String>>();
            oXMLContextHelp = (com.uvigo.tMaestro.SCOCreator.tool.contextHelp.ContextHelp) oUn.unmarshal(oContextHelpFile);
            if (!oXMLContextHelp.getTemplate().equals("ContextHelp")) throw new Exception();
            java.util.List oHelps = oXMLContextHelp.getHelp();
            boolean bLanguageFound = false;
            for (Object oObject : oHelps) {
                com.uvigo.tMaestro.SCOCreator.tool.contextHelp.HelpType oHelp = (com.uvigo.tMaestro.SCOCreator.tool.contextHelp.HelpType) oObject;
                if (oHelp.getLanguage().equals(sIdioma)) {
                    bLanguageFound = true;
                    java.util.List oElements = oHelp.getElement();
                    for (Object oObject2 : oElements) {
                        com.uvigo.tMaestro.SCOCreator.tool.contextHelp.ElementType oElement = (com.uvigo.tMaestro.SCOCreator.tool.contextHelp.ElementType) oObject2;
                        java.util.HashMap<String, String> oTable = new java.util.HashMap<String, String>();
                        if (oElement.getFile() != null) {
                            oTable.put("contextFile", oElement.getFile()); //A�adimos la URL del fichero que muestra la ayuda del componente (no es una propiedad)
                        }
                        java.util.List oProperties = oElement.getProperty();
                        for (Object oObject3 : oProperties) {
                            com.uvigo.tMaestro.SCOCreator.tool.contextHelp.PropertyType oProperty = (com.uvigo.tMaestro.SCOCreator.tool.contextHelp.PropertyType) oObject3;
                            oTable.put(oProperty.getName(), oProperty.getTexthelp());
                        }
                        oContextHelp.put(oElement.getName(), oTable);
                    }
                }
            }
            
            if (!bLanguageFound) throw new Exception(); //Si no se encuentra la ayuda en el idioma solicitado --> error
            
        } catch (Exception oE) {
            //SSS
            //System.out.println("aqui1");
            oE.printStackTrace();
            java.awt.Toolkit.getDefaultToolkit().beep();
            MyOptionPane.showMessageDialog(null, "Error while processing language support. Program aborted", "Error", javax.swing.JOptionPane.ERROR_MESSAGE);
            System.exit(-1);
        }
    }
    
    /**
     * Esta funci�n trata de cargar la ayuda contextual propia de la plantilla
     * que se est� cargando en el entorno. Busca en el directorio de plantillas
     * un fichero .xml con el nombre de la plantilla. Si lo encuentra carga de �l
     * la ayuda correspondiente al idioma actual del entorno.
     */
    private void loadTemplateContextHelp() {
        try {
            //Buscamos el fichero de ayuda contextual en el directorio templates
            java.io.InputStream oContextHelpFile = this.getClass().getResource("/com/uvigo/tMaestro/SCOCreator/templates/" + sNombre + ".xml").openStream();
            
            //Creamos el JAXBContext y el Unmarshaller que nos servir�n de ayuda
            //para leer el ficheros .xml de ayuda contextual.
            javax.xml.bind.JAXBContext oJC = javax.xml.bind.JAXBContext.newInstance("com.uvigo.tMaestro.SCOCreator.tool.contextHelp");
            javax.xml.bind.Unmarshaller oUn = oJC.createUnmarshaller();
            com.uvigo.tMaestro.SCOCreator.tool.contextHelp.ContextHelp oXMLContextHelp;
            
            oContextTemplateHelp = new java.util.HashMap<String, java.util.HashMap<String, String>>();
            
            oXMLContextHelp = (com.uvigo.tMaestro.SCOCreator.tool.contextHelp.ContextHelp) oUn.unmarshal(oContextHelpFile);
            if (!oXMLContextHelp.getTemplate().equals(sNombre)) throw new Exception();
            java.util.List oHelps = oXMLContextHelp.getHelp();
            for (Object oObject : oHelps) {
                com.uvigo.tMaestro.SCOCreator.tool.contextHelp.HelpType oHelp = (com.uvigo.tMaestro.SCOCreator.tool.contextHelp.HelpType) oObject;
                if (oHelp.getLanguage().equals(sLanguage)) {
                    java.util.List oElements = oHelp.getElement();
                    for (Object oObject2 : oElements) {
                        com.uvigo.tMaestro.SCOCreator.tool.contextHelp.ElementType oElement = (com.uvigo.tMaestro.SCOCreator.tool.contextHelp.ElementType) oObject2;
                        java.util.HashMap<String, String> oTable = new java.util.HashMap<String, String>();
                        if (oElement.getFile() != null) {
                            oTable.put("contextFile", oElement.getFile()); //A�adimos la URL del fichero que muestra la ayuda del componente (no es una propiedad)
                        }
                        java.util.List oProperties = oElement.getProperty();
                        for (Object oObject3 : oProperties) {
                            com.uvigo.tMaestro.SCOCreator.tool.contextHelp.PropertyType oProperty = (com.uvigo.tMaestro.SCOCreator.tool.contextHelp.PropertyType) oObject3;
                            oTable.put(oProperty.getName(), oProperty.getTexthelp());
                        }
                        oContextTemplateHelp.put(oElement.getName(), oTable);
                    }
                }
            }
            
        } catch (Exception oE) {
            
        }
    }
    
    /**
     * Obtiene el codigo del idioma del fichero .xml. Devuelve null si no lo puede encontrar.
     */
    public String getCode(String sLanguage) {
        try {
            java.io.InputStream oLanguageFile = this.getClass().getResource("/com/uvigo/tMaestro/SCOCreator/tool/language/" + sLanguage + ".xml").openStream();
            
            if (oLanguageFile == null) throw new Exception();
            
            //Creamos el JAXBContext y el Unmarshaller que nos servir�n de ayuda
            //para leer los ficheros .xml de idioma.
            javax.xml.bind.JAXBContext oJC = javax.xml.bind.JAXBContext.newInstance("com.uvigo.tMaestro.SCOCreator.tool.language");
            javax.xml.bind.Unmarshaller oUn = oJC.createUnmarshaller();
            com.uvigo.tMaestro.SCOCreator.tool.language.Language oLanguage;
            
            oLanguage = (com.uvigo.tMaestro.SCOCreator.tool.language.Language) oUn.unmarshal(oLanguageFile);
            return oLanguage.getCode();
            
        } catch (Exception oE) {
            return null;
        }
    }
    
    /**
     * Esta funci�n averigua de que idiomas se dispone
     * para presentar al usuario y construye el men� de idiomas
     */
    private void vFindLanguages() {
        
        //Buscamos los ficheros .xml en el directorio language
        //Programamos dos comportamientos: si la aplicaci�n se ejecuta desde
        //un jar o desde el �rbol de directorios
        try {
            java.net.URI oURI = (this.getClass().getResource("")).toURI();
            java.util.ArrayList<String> oLanguages = new java.util.ArrayList<String>();
            //java.io.InputStream oContextHelpFile=null;
            if (oURI.getScheme().equals("jar")) { //La aplicaci�n se ejecuta desde el jar
                //TODO cambiamos la forma de acceder al manifest
                //Obtenemos una referencia al ClassLoader de eta clase
                ClassLoader cl = this.getClass().getClassLoader();
                //Obtenemos la url del paquete al que pertenece esta clase dentro del jar en la que está almacenado
                String packageUrl = cl.getResource(this.getClass().getPackage().getName().replace(".", "/")).toString();
                //Obtenemos la Url del jar del ReloadTotal
                String reloadUrl = packageUrl.substring(packageUrl.indexOf(":") + 1, packageUrl.indexOf("!"));
                //System.out.println("***Nombre Fichero: " + cl.getResource(this.getClass().getPackage().getName().replace(".", "/")).getFile());
                System.out.println(reloadUrl);
                //TODO ahora utilizo un JarInputStream en lugar de un JarFile
                JarInputStream oJarInputStream = new JarInputStream(new URL(reloadUrl).openStream(), false);
                String[] aLanguages = oJarInputStream.getManifest().getMainAttributes().getValue("Languages").split(" ");
                //SSSS
                //cambiamos scocreator.jar
                //java.util.jar.JarFile oJarFile = new java.util.jar.JarFile("ReloadTotalv4.jar", false);
                //String[] aLanguages = oJarFile.getManifest().getMainAttributes().getValue("Languages").split(" ");
                int i = 0;
                for (i = 0; i < aLanguages.length; i++) oLanguages.add(aLanguages[i].split(".xml")[0]);
            } else { // La aplicaci�n se ejecuta desde el �rbol de directorios
                java.io.File oTool = new java.io.File(oURI);
                MyDirectoryFilter oFiltro = new MyDirectoryFilter();
                oFiltro.vAddName("language");
                //Obtenemos los nombres de todos los ficheros del directorio language
               
                java.io.File[] oNames = (oTool.listFiles(oFiltro)[0]).listFiles();
                int i = 0;
                for (i = 0; i < oNames.length; i++) {
                      //Descartamos los ficheros que no sean .xml
                    if (!oNames[i].getName().contains(".xml")) continue;
                    oLanguages.add(oNames[i].getName().split(".xml")[0]);
                }
                
            }
            
            //Ahora creamos el ButtonGroup para mostrar en el Men�.
            javax.swing.JRadioButtonMenuItem oBoton;
            oGrupoIdioma = new javax.swing.ButtonGroup();
            for (String sIdioma : oLanguages) {
                oBoton = new javax.swing.JRadioButtonMenuItem(sIdioma);
                oGrupoIdioma.add(oBoton);
                oBoton.addActionListener(new java.awt.event.ActionListener() {
                    
                    public void actionPerformed(java.awt.event.ActionEvent oEvento) {
                        vProcesarRadioButtonIdioma(oEvento);
                    }
                });
                oJMenu21.add(oBoton);
            }
            
            
        } catch (Exception oE) {
             //SSS
            //System.out.println("aqui2");
            oE.printStackTrace();
            java.awt.Toolkit.getDefaultToolkit().beep();
            MyOptionPane.showMessageDialog(this, "Error while processing language support. Program aborted", "Error", javax.swing.JOptionPane.ERROR_MESSAGE);
            System.exit(-1);
        }
        
    }
    
    /**
     * Este m�todo busca los look and feel disponibles en la m�quina virtual
     * y crea el men� para que el usuario los pueda seleccionar
     */
    private void findLookAndFeels() {
        javax.swing.JRadioButtonMenuItem oBoton;
        oGrupoLookAndFeel = new javax.swing.ButtonGroup();
        javax.swing.UIManager.LookAndFeelInfo[] oLooks = javax.swing.UIManager.getInstalledLookAndFeels();
        for (int i = 0; i < oLooks.length; i++) {
            oBoton = new javax.swing.JRadioButtonMenuItem(oLooks[i].getName());
            oGrupoLookAndFeel.add(oBoton);
            oBoton.addActionListener(new java.awt.event.ActionListener() {
                
                public void actionPerformed(java.awt.event.ActionEvent oEvento) {
                    vProcesarRadioButtonLookAndFeel(oEvento);
                }
            });
            oJMenu22.add(oBoton);
        }
    }
    
    /**
     * Lee los valores de los JFormattedTextFields del panel de dimensionado
     * e intenta actualizar el componente seleccionado actualmente
     * con dichos valores
     */
    private void updateDimension() {
        
        bSaved = false;
        
        Object oValue = oJFormattedTextField1.getValue();
        if (oValue != null) { //Otra forma de comprobarlo es ver si oJFormattedTextField1 est� o no "enabled"
            Integer oX;
            if (oValue instanceof Integer) oX = (Integer) oValue;
            else oX = ((Long) oValue).intValue();
            
            oValue = oJFormattedTextField2.getValue();
            Integer oY;
            if (oValue instanceof Integer) oY = (Integer) oValue;
            else oY = ((Long) oValue).intValue();
            
            updateComponentLocation(oActivo, oX, oY);
        }
        
        oValue = oJFormattedTextField3.getValue();
        if (oValue != null) {
            Integer oWidth;
            if (oValue instanceof Integer) oWidth = (Integer) oValue;
            else oWidth = ((Long) oValue).intValue();
            
            
            
            oValue = oJFormattedTextField4.getValue();
            Integer oHeight;
            if (oValue instanceof Integer) oHeight = (Integer) oValue;
            else oHeight = ((Long) oValue).intValue();
            
            
            if (oActivo.oGetBean() instanceof com.uvigo.mhp.ui.HScrollPane) updateComponentDimension(oActivo.oGetHijo(0), oWidth, oHeight);
            else if (oActivo.oGetBean() instanceof com.uvigo.mhp.ui.HMultiPanel) {
                int i = 0;
                int iIncWidth = oWidth - oActivo.oGetBean().getWidth();
                int iIncHeight = oHeight - oActivo.oGetBean().getHeight();
                for (i = 0; i < oActivo.iGetNumHijos(); i++) {
                    System.out.println(iIncHeight + "v" + iIncWidth);
                    updateComponentDimension(oActivo.oGetHijo(i), oActivo.oGetHijo(i).oGetBean().getWidth() + iIncWidth, oActivo.oGetHijo(i).oGetBean().getHeight() + iIncHeight);
                }
            }
            updateComponentDimension(oActivo, oWidth, oHeight);
        }
        
        boolean bVisible = oJCheckBox1.isSelected();
        
        updateComponentVisibility(oActivo, bVisible);
        
        if (oJSpinner1.isEnabled()) {
            updateComponentZOrder(oActivo, (Integer) oJSpinner1.getValue());
        }
        
        
        
        //oJPanel.validate();
        oJPanel.repaint();
        
    }
    
    /**
     * Cambia las dimensiones del elemento oComponent
     * @param oComponent El componente cuyas dimension se desea cambiar
     * @param iWidth La nueva anchura
     * @param iHegiht La nueva altura
     */
    protected void updateComponentDimension(Capsula oComponent, int iWidth, int iHeight) {
        oComponent.setWidth(iBoton, iWidth);
        oComponent.setHeight(iBoton, iHeight);
        oComponent.setSize(iWidth, iHeight);
        if (oComponent.getLabel() != null) oComponent.getLabel().setSize(iWidth, iHeight);
        else oComponent.oGetBean().setSize(iWidth, iHeight);
    }
    
    /**
     * Cambia las posicion del elemento oComponent
     * @param oComponent El componente cuya posicion se desean cambiar
     * @param iX La nueva posicion en x
     * @param iY La nueva posicion en y
     */
    protected void updateComponentLocation(Capsula oComponent, int iX, int iY) {
        oComponent.setX(iBoton, iX);
        oComponent.setY(iBoton, iY);
        if (oComponent.getLabel() != null) oComponent.getLabel().setLocation(iX, iY);
        else oComponent.oGetBean().setLocation(iX, iY);
        oComponent.setLocation(iX, iY);
    }
    
    /**
     * Cambia la visibilidad del componente
     * @param oComponent El componente cuya visibilidad se desea cambiar
     * @param bVisible Indica si el componente va a ser o no visible
     */
    private void updateComponentVisibility(Capsula oComponent, boolean bVisible) {
        if (oComponent.isVisible() != bVisible) {
            oComponent.setVisible(iBoton, bVisible);
            oComponent.setVisible(bVisible);
            if (oComponent.getLabel() != null) oComponent.getLabel().setVisible(bVisible);
            else oComponent.oGetBean().setVisible(bVisible);
        }
    }
    
    /**
     * Cambia el Z-orden de oComponent
     * @param oComponent El componente cuyo Z-order se desea cambiar
     * @param oValue El nuevo valor
     */
    private void updateComponentZOrder(Capsula oComponent, int iValue) {
        if (oComponent.oGetBean() != null) {
            if (oComponent.getLabel() != null) oComponent.getLabel().getParent().setComponentZOrder(oComponent.getLabel(), iValue);
            else oComponent.oGetBean().getParent().setComponentZOrder(oComponent.oGetBean(), iValue);
            oComponent.getParent().setComponentZOrder(oComponent, iValue);
            oComponent.setZ(iBoton, iValue);
            oComponent.getCapsulaParent().removeCapsula(oComponent);
            oComponent.getCapsulaParent().addCapsula(iValue, oComponent);
            
            //Es necesario releer los nuevos valores para los dem�s componentes del panel
            for (int i = 0; i < oComponent.getCapsulaParent().iGetNumHijos(); i++) {
                Capsula oCapsula = oComponent.getCapsulaParent().oGetHijo(i);
                if (oCapsula.getLabel() != null) oCapsula.setZ(iBoton, oCapsula.getLabel().getParent().getComponentZOrder(oCapsula.getLabel()));
                else oCapsula.setZ(iBoton, oCapsula.oGetBean().getParent().getComponentZOrder(oCapsula.oGetBean()));
            }
            oHSheet.vActiva();
            oActivo.vActivar(); //Para volver a seleccionar el elemento en el visor de jerarqu�a
        }
    }
    
    /**
     * Funci�n llamada cuando cambia el estado de la ventana (MainFrame), es decir, cuando
     * se minimiza, se maximiza, etc
     * @param oE El WindowEvent que describe el cambio producido.
     */
    private void MainFrameStateChanged(java.awt.event.WindowEvent oE) {
        //Si se maximiza la ventana principal colocamos adecuadamente todos los di�logos
        if (((oE.getOldState() & java.awt.Frame.NORMAL) == java.awt.Frame.NORMAL) &&
                ((oE.getNewState() & java.awt.Frame.MAXIMIZED_BOTH) == java.awt.Frame.MAXIMIZED_BOTH)) {
            maximizeDialogs();
        } //Si se restaura la ventana principal volvemos a colocar los elementos
        else if (((oE.getOldState() & java.awt.Frame.MAXIMIZED_BOTH) == java.awt.Frame.MAXIMIZED_BOTH) &&
                ((oE.getNewState() & java.awt.Frame.NORMAL) == java.awt.Frame.NORMAL)) {
            positionAndSizeWindows(java.awt.Toolkit.getDefaultToolkit().getScreenSize());
        }
    }
    
    /**
     * Funci�n llamada para dimensionar y colocar los dialogos adecuadamente en pantalla
     * cuando el MainFrame se encuentra maximizado;
     */
    private void maximizeDialogs() {
        int iResta;
        if (oJPanel3.isVisible()) iResta = 115;
        else iResta = 75;
        java.awt.Dimension oScreenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        java.awt.Insets oInsets = java.awt.Toolkit.getDefaultToolkit().getScreenInsets(java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration());
        
        int iWidth = oScreenSize.width - oInsets.left - oInsets.right;
        int iTama = oScreenSize.height - oInsets.top - oInsets.bottom - iResta;
        oPSheet.setSize(oPSheet.getWidth(), 2 * iTama / 3);
        //oPSheet.setDividerLocation((int)(oPSheet.getHeight()*0.6));
        oHSheet.setSize(oHSheet.getWidth(), iTama / 3);
        oPSheet.setLocation(oInsets.left + iWidth - oPSheet.getWidth(), oInsets.top + iResta - 30);
        oHSheet.setLocation(oInsets.left + iWidth - oHSheet.getWidth(), oInsets.top + iResta - 30 + oPSheet.getHeight());
        oPSheet.validate();
        oHSheet.validate();
    }
    
    /**
     * Establece la posici�n y tama�o inicial de todas las ventanas del entorno
     * @param oScreenSize La resoluci�n actual de la pantalla
     */
    private void positionAndSizeWindows(java.awt.Dimension oScreenSize) {
        
        java.awt.Insets oInsets = java.awt.Toolkit.getDefaultToolkit().getScreenInsets(java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration());
        
        //Establecemos el tama�o del MainFrame y su localizaci�n
        this.setSize(750, 721);
        int iTama = (oScreenSize.width - this.getWidth() - oInsets.left - oInsets.right);
        if (iTama > 290) iTama = 290;
        this.setLocation(oInsets.left + (oScreenSize.width - this.getWidth() - oInsets.left - oInsets.right - iTama) / 2, oInsets.top + (oScreenSize.height - this.getHeight() - oInsets.top - oInsets.bottom) / 2);
        
        //Tama�os y posiciones de la hoja de propiedades y de jerarqu�a
        oPSheet.setSize(iTama, 2 * this.getHeight() / 3);
        oPSheet.setDividerLocation((int) (oPSheet.getHeight() * 0.6));
        oHSheet.setSize(iTama, this.getHeight() / 3);
        oPSheet.setLocation(this.getX() + this.getWidth(), this.getY());
        oHSheet.setLocation(this.getX() + this.getWidth(), this.getY() + oPSheet.getHeight());
        oPSheet.validate();
        oHSheet.validate();
        this.validate();
    }
    
    
    /**
     * Salva los valores de determinados elementos del entorno para
     * que puedan ser recuperados en la pr�xima ejecuci�n de la aplicaci�n
     * En una versi�n anterior opt�bamos por guardarlas en un archivo.
     * Ahora optamos por utilizar la API Preferences de Java. Esto
     * permite que la aplicaci�n funcione de forma separada para cada usuario
     * que la utilice
     */
    private void saveEnviroment() {
        //Cargamos el objeto de preferencias para MainFrame y el usuario actual
        java.util.prefs.Preferences oPrefs = java.util.prefs.Preferences.userNodeForPackage(this.getClass());
        oPrefs.putInt("BorderColor", oJPanel.oGetBordeActivo().oGetColor().getRGB());
        oPrefs.putInt("BorderThickness", oJPanel.oGetBordeActivo().iGetGrosor());
        oPrefs.put("Language", sLanguage);
        oPrefs.put("Code", sCode);
        oPrefs.put("LookAndFeel", sLookAndFeel);
        oPrefs.putBoolean("ShowProperties", oJCheckBoxMenuItem31.isSelected());
        oPrefs.putBoolean("ShowHierarchy", oJCheckBoxMenuItem32.isSelected());
        oPrefs.putBoolean("ShowDimensionPanel", oJCheckBoxMenuItem33.isSelected());
        oPrefs.putBoolean("Antialiasing", oJCheckBoxMenuItem21.isSelected());
        if ((this.getExtendedState() & java.awt.Frame.MAXIMIZED_BOTH) == java.awt.Frame.MAXIMIZED_BOTH) oPrefs.putBoolean("Maximized", true); //Si la ventana est� o no maximizada
        else oPrefs.putBoolean("Maximized", false);
        try {
            oPrefs.flush();
        }//Obligamos a que los cambios se lleven a disco
        catch (java.util.prefs.BackingStoreException oE) {
            //Si entra aqui es que no han podido salvarse la preferencias a disco
            //Es posible que al cerrar la aplicaci�n estas no se salven. No pasa
            //nada ya que se cargar�an los valores por defecto
            
        }
        
    }
    
    /**
     * Carga los valores de determinados elementos del entorno salvados
     * en una ejecuci�n anterior de la aplicaci�n
     */
    private void loadEnviroment() {
        //Cargamos el objeto de preferencias para MainFrame y el usuario actual
        java.util.prefs.Preferences oPrefs = java.util.prefs.Preferences.userNodeForPackage(this.getClass());
        oJPanel.oGetBordeActivo().vSetColor(new java.awt.Color(oPrefs.getInt("BorderColor", java.awt.Color.RED.getRGB()))); // Color de bordes de elemento activo
        int iGrosor = oPrefs.getInt("BorderThickness", 4);
        oJPanel.oGetBordeActivo().vSetGrosor(iGrosor); // Grosor de bordes de elemento activo
        oJPanel.oGetBordeMovimiento().vSetGrosor(iGrosor);
        //El idioma ya ha sido cargado anteriormente, solo falta seleccionarlo en el men�
        java.util.Enumeration<javax.swing.AbstractButton> oGrupo = oGrupoIdioma.getElements();
        javax.swing.JRadioButtonMenuItem oBoton;
        while (oGrupo.hasMoreElements()) {
            oBoton = (javax.swing.JRadioButtonMenuItem) oGrupo.nextElement();
            if (oBoton.getText().equals(sLanguage)) {
                oBoton.setSelected(true);
                break;
            }
        }
        //Seleccionamos el LookAndFeel cargado
        sLookAndFeel = javax.swing.UIManager.getLookAndFeel().getClass().getCanonicalName();
        javax.swing.UIManager.LookAndFeelInfo[] oLooks = javax.swing.UIManager.getInstalledLookAndFeels();
        String sLK = "none";
        for (int i = 0; i < oLooks.length; i++) if (oLooks[i].getClassName().equals(sLookAndFeel)) sLK = oLooks[i].getName();
        oGrupo = oGrupoLookAndFeel.getElements();
        while (oGrupo.hasMoreElements()) {
            oBoton = (javax.swing.JRadioButtonMenuItem) oGrupo.nextElement();
            if (oBoton.getText().equals(sLK)) {
                oBoton.setSelected(true);
                break;
            }
        }
       // System.out.println("entro en load environment "+oPrefs.getBoolean("ShowProperties", true));
        oJCheckBoxMenuItem31.setSelected(oPrefs.getBoolean("ShowProperties", true)); // Es visible el visor de propiedades?
        oJCheckBoxMenuItem32.setSelected(oPrefs.getBoolean("ShowHierarchy", true)); // Es visible el visor de jerarqu�a?
        oJCheckBoxMenuItem33.setSelected(oPrefs.getBoolean("ShowDimensionPanel", true));// Es visible el panel de dimensionado?
        if (oPrefs.getBoolean("Maximized", false)) { // Si la ventana estaba maximizada la maximizamos
            int iState = this.getExtendedState();
            iState |= java.awt.Frame.MAXIMIZED_BOTH;
            this.setExtendedState(iState);
            maximizeDialogs();
        }
    }
    
    /**
     * Esta funci�n comprueba si se han guardado todos los cambios, y ofrece
     * al usuario (si no se han guardado) la posibilidad de guardarlos.
     * @return 1 Si el usuario no quiere salvar el proyecto, 2 si no quiere salvar el proyecto y adem�s nunca ha sido salvado
     * 0 si lo ha decidido salvar, -1 si habiendo decidido salvarlo no ha sido as� por cancelaci�n posterior o error
     */
    //M: return: 1-salva, 0-no salva
    private int questionSave() {
        
        int iOpcion = MyOptionPane.showConfirmDialog(this, oIdioma.get("Question2"), oIdioma.get("Title2"), javax.swing.JOptionPane.YES_NO_OPTION, javax.swing.JOptionPane.WARNING_MESSAGE);
        if (iOpcion == javax.swing.JOptionPane.YES_OPTION) {
            oJMenuItem52ActionPerformed(new java.awt.event.ActionEvent(oJMenuItem52, java.awt.event.ActionEvent.ACTION_PERFORMED, ""));
            return (1);
        } else {
            origen = 0;
            return (0);
        }
    }
    
    
    //M: m�todo que carga un SCO guardado (con fichero de proyecto asociado)
    private int loadSCO(java.io.File oFile) {
        //Intentamos cargar la plantilla previa (la que estaba cargada la �ltima vez
        //antes de cerrar la aplicacion)
        try {
            java.io.ObjectInputStream oOIS = new java.io.ObjectInputStream(new java.io.FileInputStream(oFile));
            sProjectName = (String) oOIS.readObject();
            sNombre = (String) oOIS.readObject();
            oOpciones = (java.util.ArrayList<String>) oOIS.readObject();
            iBoton = oOIS.readInt();
            oRules = (java.util.ArrayList<Rule>) oOIS.readObject();
            oMetadata = (java.util.ArrayList<java.util.HashMap<String, Object>>) oOIS.readObject();
            oProjectFile = (java.io.File) oOIS.readObject();
            oLastDir = (java.io.File) oOIS.readObject();
            oComponents = (java.util.HashMap<String, Component>) oOIS.readObject();
            oUses = (java.util.HashMap<String, Integer>) oOIS.readObject();
            oOIS.close();
        } catch (Exception oE) { //no se puede cargar la plantilla previa
            java.awt.Toolkit.getDefaultToolkit().beep();
            MyOptionPane.showMessageDialog(this, oIdioma.get("Error11"), oIdioma.get("Title12"), javax.swing.JOptionPane.ERROR_MESSAGE);
            return -1;
            
        }
        //Copiamos recursos a la carpeta TEMP
        try {
            File fComponents = new File(fTemp, "COMPONENTS");
            File fC = new File(oFile.getParent(), sProjectName + "_SCO/COMPONENTS");
            java.io.File[] fCfiles = fC.listFiles();
            for (int i = 0; i < fCfiles.length; i++) {
                if (fCfiles[i].isDirectory()) {
                    //solo hay un caso - pseudovideos mhp (y sabemos que no contiene otros directorios)
                    File fComponentsD = new File(fComponents, fCfiles[i].getName());
                    fComponentsD.mkdir();
                    java.io.File[] fCDfiles = fCfiles[i].listFiles();
                    for (int j = 0; j < fCDfiles.length; j++) {
                        File fComponentsDfile = new File(fComponentsD, fCDfiles[j].getName());
                        copyFile(fCDfiles[j], fComponentsDfile);
                    }
                    continue;
                }
                File fComponentsfile = new File(fComponents, fCfiles[i].getName());
                copyFile(fCfiles[i], fComponentsfile);
            }
            
            File fAdaptation = new File(fTemp, "ADAPTATION");
            File fA = new File(oFile.getParent(), sProjectName + "_SCO/ADAPTATION");
            java.io.File[] fAfiles = fA.listFiles();
            for (int i = 0; i < fAfiles.length; i++) {
                File fAdaptationfile = new File(fAdaptation, fAfiles[i].getName());
                copyFile(fAfiles[i], fAdaptationfile);
            }
            
            File fOptions = new File(fTemp, "OPTIONS");
            File fO = new File(oFile.getParent(), sProjectName + "_SCO/OPTIONS");
            java.io.File[] fOfiles = fO.listFiles();
            for (int i = 0; i < fOfiles.length; i++) {
                File fOptionsfile = new File(fOptions, fOfiles[i].getName());
                copyFile(fOfiles[i], fOptionsfile);
            }
            
        } catch (IOException ex) {
            System.out.println(ex);
        }
        return 0;
    }
    
    /**
     * Esta funci�n devuelve la c�spsula activa actualmente
     * @return El elemento activo
     */
    public Capsula oGetCapsulaActiva() {
        return oActivo;
    }
    
    /**
     * Esta funcion devuelve la referencia a la plantilla como
     * la c�psula ra�z.
     * @return La referencia a la plantilla
     */
    public Capsula oGetPlantilla() {
        return oTop;
    }
    
    /**
     * Esta funci�n se utiliza para notificar al frame principal cual es el elemento activo
     * @param oActivo El nuevo elemento activado en el frame principal
     */
    public void vSetCapsulaActiva(Capsula oActivo) {
        this.oActivo = oActivo;
        oJLabel1.setText(oIdioma.get("Label1") + oActivo.oGetBean().getClass().getName());
        //oPSheet.vSeleccionaPagina(iBoton);
        oPSheet.vCubreTabla(oActivo);
        activateDimensionPanel(oActivo.getSizeMove());
    }
    
    /**
     * Devuelve el PanelPrincipal sobre el que se est� representando la plantilla.
     * @return El Panel
     */
    public PanelPrincipal oGetPanel() {
        return oJPanel;
    }
    
    /**
     * Devuelve el CheckBox que permite hacer visible o no la hoja de propiedades
     * @return El Checkbox
     */
    public javax.swing.JCheckBoxMenuItem oGetCheckPropertiesSheet() {
        return oJCheckBoxMenuItem31;
    }
    
    /**
     * Devuelve el CheckBox que permite hacer visible o no la hoja de jerarqu�a
     * @return El Checkbox
     */
    public javax.swing.JCheckBoxMenuItem oGetCheckHierarchySheet() {
        return oJCheckBoxMenuItem32;
    }
    
    /**
     * Devuelve la opci�n seleccionada actualmente en el grupo de RadioButtons
     * @return El �ndice de la opci�n
     */
    public int iGetOpcion() {
        return iBoton;
    }
    
    /**
     * Esta funcion devuelve el texto correspondiente a la etiqueta sName
     * en el idioma actualmente cargado en el entorno
     * @param sName El nombre de la etiqueta
     * @return El texto en el mencionado idioma
     */
    public String getMessage(String sName) {
        if (oIdioma == null) return null;
        return oIdioma.get(sName);
    }
    
    /**
     * Devuelve el n�mero de opciones comtempladas actualmente en la herramienta
     * @return El n�mero de opciones.
     */
    public int sizeOptions() {
        return oOpciones.size();
    }
    
    /**
     * Devuelve el nombre de la opcion de indice iIndex.
     * @param iIndex El �ndice de la opci�n en el ArrayList de opciones
     * @return Una cadena de texto con el nombre de la opci�n.
     */
    public String getOption(int iIndex) {
        return oOpciones.get(iIndex);
    }
    
    /**
     * Establece un nuevo nombre para una opci�n
     * @param iIndex El �ndice de la opci�n cuyo nombre se va a cambiar
     * @param sOption El nuevo nombre para la opci�n.
     * @param sAnterior El nombre anterior de la opci�n
     */
    public void setOption(int iIndex, String sOption, String sAnterior) {
        oOpciones.set(iIndex, sOption);
        oPSheet.renameOption(iIndex, sOption);
        java.util.Enumeration<javax.swing.AbstractButton> oBotones = oGrupoOpciones.getElements();
        while (oBotones.hasMoreElements()) {
            javax.swing.JRadioButtonMenuItem oBoton = (javax.swing.JRadioButtonMenuItem) oBotones.nextElement();
            if (oBoton.getText().equals(sAnterior)) {
                oBoton.setText(sOption);
                break;
            }
        }
        if (iIndex == iBoton) oJLabel6.setText(oIdioma.get("Label6") + oOpciones.get(iBoton));
    }
    
    /**
     * A�ade una nueva opci�n
     * @param sOption El nombre para la nueva opci�n.
     * @param bCurrent True si la nueva opci�n se crea a imagen y semejanza de la opci�n actual
     */
    public void addOption(String sOption, boolean bCurrent) {
        bSaved = false;
        oOpciones.add(sOption);
        oPSheet.addOption(sOption);
        javax.swing.JRadioButtonMenuItem oBoton = new javax.swing.JRadioButtonMenuItem(sOption);
        oBoton.setActionCommand(Integer.toString(oOpciones.size() - 1));
        oGrupoOpciones.add(oBoton);
        oBoton.addActionListener(new java.awt.event.ActionListener() {
            
            public void actionPerformed(java.awt.event.ActionEvent oEvento) {
                vProcesarRadioButton(oEvento);
            }
        });
        oJMenu41.add(oBoton);
        oTop.addOption(bCurrent);
        
    }
    
    /**
     * M�todo para borrar la opci�n de indice iIndex
     * @param iIndex El �ndice de la opci�n (en el array oOpciones) que se va a borrar
     */
    public void deleteOption(int iIndex) {
        if (iIndex < 2) return; //Los objetos que llamen a esta m�todo deben evitar que iIndex<2 (Las dos opciones por defecto no se pueden borrar)
        
        bSaved = false;
        //Si la opci�n a borrar es la activa, debemos activar otra opci�n, por defecto la anterior
        if (iIndex == iGetOpcion()) {
            if (isChangeOptionSelected()) {
                oPSheet.vSeleccionaPagina(iIndex - 1);
            } else {
                oPSheet.vSeleccionaPagina(iIndex - 1);
                showOption(iIndex - 1);
            }
        } else oPSheet.vSeleccionaPagina(iGetOpcion());
        
        
        //Procedemos al borrado de la opci�n
        oOpciones.remove(iIndex);
        
        vEstableceOpciones(); //Reestablece los botones de opciones
        //Establece opciones no activa ningun boton, hay que activar el boton de la nueva opcion
        int i = 0;
        javax.swing.AbstractButton oBoton;
        java.util.Enumeration<javax.swing.AbstractButton> oBotones = oGrupoOpciones.getElements();
        do {
            oBoton = oBotones.nextElement();
            i++;
        } while (i <= iBoton);
        oBoton.setSelected(true);
        oTop.removeOption(iIndex);
        oPSheet.removeOption(iIndex);
    }
    
    /**
     * La funci�n nos sirve para saber si la Opcion sOption ya est� incluida
     * en las opciones actuales en la herramienta.
     * @return True si la opcion ya est� incluida
     */
    public boolean containsOption(String sOption) {
        return oOpciones.contains(sOption);
    }
    
    /**
     * Esta funci�n nos informa si est� marcado el CkeckBox de mostrar
     * opci�n al cambiarla en el editor de propiedades
     * @return Una booleana de acuerdo con el valor del CkeckBox
     */
    public boolean isChangeOptionSelected() {
        return oJCheckBoxMenuItem34.isSelected();
    }
    
    /**
     * Esta funci�n visualiza la opci�n iOpcion en el frame principal
     * int iOpcion La nueva opci�n que se quiere visualizar
     */
    public void showOption(int iOpcion) {
        iBoton = iOpcion;
        int i = 0;
        javax.swing.AbstractButton oBoton;
        java.util.Enumeration<javax.swing.AbstractButton> oBotones = oGrupoOpciones.getElements();
        do {
            oBoton = oBotones.nextElement();
            i++;
        } while (i <= iOpcion);
        oBoton.setSelected(true);
        oTop.updateBean(iBoton);
        setCapsulaZOrder(oTop);
        //oJPanel.repaint();
        oJLabel6.setText(oIdioma.get("Label6") + oOpciones.get(iBoton));
        oHSheet.vActiva();
        oActivo.vActivar();
    }
    
    /**
     * Esta funci�n se utiliza para devolver un Componente
     * del HashMap oComponents.
     * @see oComponents
     * @sName El nombre del componente que se desea obtener
     * @return Un objeto Component
     */
    public Component getSavedComponent(String sName) {
        if (oComponents == null) return null;
        else return (oComponents.get(sName));
        
    }
    
    /**
     * Se utiliza para notificar a este MainFrame
     * de que el valor de una propiedad en una de las opciones
     * ha cambiado, o que cualquier otra cosa ha cambiado respecto al proyecto
     * salvado.
     */
    public void valueChanged() {
        this.bSaved = false;
    }
    
    /**
     * Devuelve una referencia a oHSheet.
     * @return La referencia al visor de jerarqu�a
     */
    public HierarchySheet getHSeet() {
        return oHSheet;
    }
    
    /**
     * Devuelve una referencia a oPSheet.
     * @return La referencia al visor de jerarqu�a
     */
    public PropertiesSheet getPSheet() {
        return oPSheet;
    }
    
    /**
     * Devuelve el nombre del proyecto.
     * @return El nombre del proyecto
     */
    public String getProjectName() {
        return this.sProjectName;
    }
    
    /**
     * Devuelve el momento de cracion del proyecto
     * cargado actualmente en el entorno
     * @return El tiempo en que se cre� el proyecto
     */
    public long getProjectCreationTime() {
        return this.lCreationTime;
    }
    
    /**
     * Establece la propiedad que se encuentra actualmente en edici�n
     * @param oProperty La propiedad
     */
    public void setEditionProperty(Propiedad oProperty) {
        this.oEditionProperty = oProperty;
    }
    
    /**
     * Devuelve la propiedad actualmente en edici�n
     */
    public Propiedad getEditionProperty() {
        return this.oEditionProperty;
    }
    
    /**
     * Devuelve la ruta del �ltimo fichero abierto por un
     * JFileChooser en el proyecto actual.
     */
    public java.io.File getLastDir() {
        return oLastDir;
    }
    
    /**
     * Establece la ruta del �ltimo fichero abierto por un
     * JFileChooser a la indicada por oLastDir
     * @param oLastDir La nueva ruta.
     */
    public void setLastDir(java.io.File oLastDir) {
        this.oLastDir = oLastDir;
    }
    
    /**
     * Esta funci�n delvuelve el texto de ayuda en el idioma seleccionado en
     * el entorno, para la propiedad y tipo de elemento indicados.
     * @param sElement El nombre de la clase del elemento
     * @param sProperty El nombre de la propiedad
     * @return La ayuda contextual. Null si no existe una ayuda con los par�metros
     * indicados o no hay ningun tipo de ayuda contextual
     */
    public String getContextHelp(String sElement, String sProperty) {
        if (oContextHelp == null) return null; //Realmente oContextHelp no deber�a ser null nunca
        java.util.HashMap<String, String> oElement = oContextHelp.get(sElement);
        if (oElement == null) return null;
        return oElement.get(sProperty);
    }
    
    /**
     * Esta funci�n delvuelve el texto de ayuda en el idioma seleccionado en
     * el entorno, para la propiedad y tipo de elemento indicados en la ayuda
     * contextual de plantilla.
     * @param sElement El nombre de la clase del elemento
     * @param sProperty El nombre de la propiedad
     * @return La ayuda contextual. Null si no existe una ayuda con los par�metros
     * indicados o no hay ningun tipo de ayuda contextual
     */
    public String getTemplateContextHelp(String sElement, String sProperty) {
        if (oContextTemplateHelp == null) return null;
        java.util.HashMap<String, String> oElement = oContextTemplateHelp.get(sElement);
        if (oElement == null) return null;
        return oElement.get(sProperty);
    }
    
    /**
     * Esta funci�n establece el cursor indicado a las tres ventanas de la aplicaci�n
     * @param oCursor El nuevo cursor
     */
    public void setEnviromentCursor(int iCursor) {
        setCursor(java.awt.Cursor.getPredefinedCursor(iCursor));
        oPSheet.setCursor(java.awt.Cursor.getPredefinedCursor(iCursor));
        oHSheet.setCursor(java.awt.Cursor.getPredefinedCursor(iCursor));
    }
    
    /**
     * Esta funci�n hace visible el entorno.
     */
    public void showEnviroment() {
        setVisible(true);
      // System.out.println("entro en showenviroment");
        oPSheet.setVisible(oJCheckBoxMenuItem31.isSelected());
        oHSheet.setVisible(oJCheckBoxMenuItem32.isSelected());
        oJPanel3.setVisible(oJCheckBoxMenuItem33.isSelected());
        toFront();
    }
    
    
    /**
     * Devuelve el directorio de la herramienta
     * @return El directorio.
     */
    public java.io.File getToolDir() {
        return oToolDir;
    }
    
    /**
     * Devuelve el nombre de la plantilla
     * cargada en el entorno
     * @return El nombre de la plantilla.
     */
    public String getTemplateName() {
        return sNombre;
    }
    
    /**
     * Esta funci�n copia el fichero oInput en oOutput
     * @param oInput El fichero a copiar
     * @param oOutput El fichero a escribir
     * @throws java.io.IOException Si se produce alg�n error en el proceso de copiado
     */
    public static void copyFile(java.io.File oInput, java.io.File oOutput) throws java.io.IOException {
        java.io.FileInputStream oInputStream = new java.io.FileInputStream(oInput);
        java.io.FileOutputStream oOutputStream = new java.io.FileOutputStream(oOutput);
        java.nio.channels.FileChannel oInputChannel = oInputStream.getChannel();
        java.nio.channels.FileChannel oOutputChannel = oOutputStream.getChannel();
        oInputChannel.transferTo(0, oInputChannel.size(), oOutputChannel);
        oInputStream.close();
        oOutputStream.close();
    }
    
    /**
     * Devuelve el numero de veces que es usado
     * el fichero sKey por los diferentes elementos de la plantilla
     * en todas las opciones
     * @param sKey El nombre del fichero
     * @return El n�mero de "usos"
     * @see MainFrame#oUses
     */
    public int getUses(String sKey) {
        Integer iUses = oUses.get(sKey);
        if (iUses == null) {
            return 0;
        } else return iUses;
    }
    
    /**
     * Incrementa en una unidad el n�mero
     * de utilizaciones del fichero sKey
     * @param sKey El nombre del fichero
     * @see MainFrame#oUses
     */
    public void incUses(String sKey) {
        Integer iUses = oUses.get(sKey);
        if (iUses == null) iUses = 0;
        iUses++;
        oUses.put(sKey, iUses);
    }
    
    /**
     * La funci�n devuelve el estado del CheckBoxMenuItem35.
     * Es decir indica la preferencia del usuario respecto
     * a los ToolTips
     * @return True si los ToolTips de deben mostrar, false en caso contrario
     */
    public boolean isShowToolTips() {
        return oJCheckBoxMenuItem35.isSelected();
    }
    
    /**
     * Decrementa en una unidad el n�mero
     * de utilizaciones del fichero sKey
     * @param sKey El nombre del fichero
     * @see MainFrame#oUses
     */
    public void decUses(String sKey) {
        Integer iUses = oUses.get(sKey);
        if (iUses == null) return;
        iUses--;
        if (iUses == 0) oUses.remove(sKey);
        else oUses.put(sKey, iUses);
    }
    
    /**
     * Devuelve la regla de adaptaci�n indicada
     * por iIndex;
     * @param iIndes El �ndice de la regla
     * @return La regla de adaptaci�n. Null si no existe
     */
    public Rule getRule(int iIndex) {
        if (oRules == null) return null;
        else return oRules.get(iIndex);
    }
    
    /**
     * Este m�todo permite desplazar (alterar) el orden de una regla
     * en el Array de reglas.
     * @param bArriba Si es true la regla se deplaza una posici�n hacia arriba (a indices menores). Si es false hacia abajo (hacia indices mayores).
     * @param iIndex El indice de la regla que se desplaza
     */
    public void moveRule(boolean bArriba, int iIndex) {
        if (bArriba) {
            if (iIndex == 0) return;
            Rule oTemp = oRules.get(iIndex - 1);
            oRules.set(iIndex - 1, oRules.get(iIndex));
            oRules.set(iIndex, oTemp);
        } else {
            if (iIndex == oRules.size() - 1) return;
            Rule oTemp = oRules.get(iIndex + 1);
            oRules.set(iIndex + 1, oRules.get(iIndex));
            oRules.set(iIndex, oTemp);
        }
    }
    
    /**
     * A�ade la regla de adaptaci�n indicada
     * @param oRule La regla a a�adir
     */
    public void addRule(Rule oRule) {
        if (oRules == null) {
            oRules = new java.util.ArrayList<Rule>();
            oRules.add(oRule);
        } else oRules.add(oRule);
    }
    
    /**
     * Indica el n�mero de reglas de oRules
     */
    public int sizeRules() {
        if (oRules == null) return 0;
        return oRules.size();
    }
    
    /**
     * Elimina la regla de oRules
     * @param iIndex El �ndice de la regla a borrar
     */
    public void removeRule(int iIndex) {
        if (iIndex < 0 || iIndex >= oRules.size()) return;
        oRules.remove(iIndex);
    }
    
    /**
     * Devuelve el valor del metadato de nombre
     * sName correspondiente al conjunto de �ndice i
     * @param iIndex. El �ndice del conjunto de metadatos
     * @param sName. El nombre del metadato
     * @return El valor del metadato. Null si no existe
     */
    public Object getMetadata(String sName, int iIndex) {
        if (oMetadata == null || oMetadata.size() == 0) return null;
        else if (iIndex >= 0 && iIndex < oMetadata.size()) return oMetadata.get(iIndex).get(sName);
        else return null;
    }
    
    /**
     * A�ade un conjunto de metadatos
     */
    public void addMetadataGroup(java.util.HashMap<String, Object> oMetadataGroup) {
        if (oMetadata == null) {
            oMetadata = new java.util.ArrayList<java.util.HashMap<String, Object>>();
        }
        oMetadata.add(oMetadataGroup);
    }
    
    /**
     * Indica el n�mero de metadatos del conjunto de �ndice iIndex
     */
    public int sizeMetadata(int iIndex) {
        if (oMetadata == null) return 0;
        return oMetadata.get(iIndex).size();
    }
    
    /**
     * Elimina el conjunto de metadatos de �ndice iIndex
     */
    public void removeMetadataGroup(int iIndex) {
        if (oMetadata == null) return;
        if (iIndex >= 0 && iIndex < oMetadata.size()) oMetadata.remove(iIndex);
    }
    
    /**
     * Devuelve la referencial al gestor de par�metros
     */
    public ParameterManager getParameterManager() {
        return oParameterManager;
    }
    
    /**
     * Devuelve la referencial al gestor del formulario de metadatos
     */
    public MetadataManager getMetadataManager() {
        return oMetadataManager;
    }
    
    /**
     * Devuelve la referencia al Asistente
     * para la creaci�n de regals de adaptaci�n.
     */
    public Assistant getAssistant() {
        return oAssistant;
    }
    
    /**
     * M�todo llamado cuando el usuario solicita el PopUp Men� sobre
     * un elemento de la plantilla cargada actualmente. Este m�todo
     * es utilizado por el mouseReleased de la clase C�psula
     * @param oComponent El componente en el que ocurre el evento de solicitud de popupmenu
     * @param oCapsula Referencia al elemento sobre el que se desea el PopUpMenu
     * @param iX El origen en X del PopUpMenu
     * @param iY El origen en Y del PopUpMenu
     * @see Capsula#mouseClicked
     */
    public void popUpRequired(java.awt.Component oComponent, Capsula oCapsula, int iX, int iY) {
        
        oJPopupMenu1.show(oComponent, iX, iY);
    }
    
    
    /**
     * M�todo Main de la clase
     * @param args Son los par�metos de la l�nea de comandos. Actualmente
     * son ignorados por la herramienta
     */
    public static void main(String args[]) {
        System.out.println("entro en main ");
        java.beans.Beans.setDesignTime(true); //Indica que nos encontramos en estado de dise�o de plantillas
        //Cargamos el idioma del entorno de acuerdo con la preferencia especificada por el usuario
        //Si no existe dicha preferencia cargamos el idioma local de la JVM
        java.util.prefs.Preferences oPrefs = java.util.prefs.Preferences.userNodeForPackage(MainFrame.class);
        String sLanCode = oPrefs.get("Code", java.util.Locale.getDefault().getLanguage());
        boolean bAnti = oPrefs.getBoolean("Antialiasing", false);
        
        //Antialiasing
        if (bAnti) {
            System.setProperty("swing.aatext", "true");
        } else {
            System.setProperty("swing.aatext", "false");
        }
        java.util.Locale.setDefault(new java.util.Locale(sLanCode));
        
        //Cargamos el LookAndFeel elegido por el usuario
        String sLookFeel = oPrefs.get("LookAndFeel", javax.swing.UIManager.getLookAndFeel().getClass().getCanonicalName());
        if (!sLookFeel.equals(javax.swing.UIManager.getLookAndFeel().getClass().getCanonicalName())) {
            try {
                javax.swing.UIManager.LookAndFeelInfo[] oLooks = javax.swing.UIManager.getInstalledLookAndFeels();
                for (int i = 0; i < oLooks.length; i++) if (oLooks[i].getClassName().equals(sLookFeel)) {
                    javax.swing.UIManager.setLookAndFeel(oLooks[i].getClassName());
                    break;
                }
            } catch (Exception oE) {
                oE.printStackTrace();
            }
            ;
            
        }
        
        try {
            final long lTime = new java.util.Date().getTime();
            javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
                
                public void run() {
                    oInitWindow = new InitWindow(new InitPanel());
                }
            });
            
            javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
                
                public void run() {
                    //SSSS introducir null para la llamada
                    final MainFrame oMainFrame = new MainFrame(null);
                    //NOTA: retardamos la aparicion del entorno. Por motivos de depuracion. Eliminar
                    long lActualTime = new java.util.Date().getTime();
                     System.out.println("aqui en el main");
                    if (lActualTime - lTime < 1500) { //La splashScreen es visible comom m�nimo 5 segundos;
                        try {
                            Thread.currentThread().sleep(1500 - lActualTime + lTime);
                        } catch (Exception oE) {
                            System.out.println("salgo por error");
                          
                        }
                        ;
                    }
                    System.out.println("aqui en el main2");
                    oMainFrame.showEnviroment();
                    
                }
            });
            oInitWindow.dispose();
        } catch (Exception oE) {
            oE.printStackTrace();
        }
        ;
        
    }
    
    public void textFieldPressed(java.awt.event.KeyEvent evt) {
        if (evt.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) {
            evt.getComponent().transferFocus();
        }
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JButton oJButton1;
    private javax.swing.JCheckBox oJCheckBox1;
    private javax.swing.JCheckBoxMenuItem oJCheckBoxMenuItem21;
    private javax.swing.JCheckBoxMenuItem oJCheckBoxMenuItem31;
    private javax.swing.JCheckBoxMenuItem oJCheckBoxMenuItem32;
    private javax.swing.JCheckBoxMenuItem oJCheckBoxMenuItem33;
    private javax.swing.JCheckBoxMenuItem oJCheckBoxMenuItem34;
    private javax.swing.JFormattedTextField oJFormattedTextField1;
    private javax.swing.JFormattedTextField oJFormattedTextField2;
    private javax.swing.JFormattedTextField oJFormattedTextField3;
    private javax.swing.JFormattedTextField oJFormattedTextField4;
    private javax.swing.JLabel oJLabel1;
    private javax.swing.JLabel oJLabel2;
    private javax.swing.JLabel oJLabel3;
    private javax.swing.JLabel oJLabel4;
    private javax.swing.JLabel oJLabel5;
    private javax.swing.JLabel oJLabel6;
    private javax.swing.JLabel oJLabelSpinner;
    private javax.swing.JMenu oJMenu1;
    private javax.swing.JMenu oJMenu2;
    private javax.swing.JMenu oJMenu22;
    private javax.swing.JMenu oJMenu3;
    private javax.swing.JMenu oJMenu4;
    private javax.swing.JMenu oJMenu41;
    private javax.swing.JMenu oJMenu5;
    private javax.swing.JMenuBar oJMenuBar;
    private javax.swing.JMenuItem oJMenuItem11;
    private javax.swing.JMenuItem oJMenuItem12;
    private javax.swing.JMenuItem oJMenuItem13;
    private javax.swing.JMenuItem oJMenuItem14;
    private javax.swing.JMenuItem oJMenuItem21;
    private javax.swing.JMenuItem oJMenuItem22;
    private javax.swing.JMenuItem oJMenuItem23;
    private javax.swing.JMenuItem oJMenuItem24;
    private javax.swing.JMenuItem oJMenuItem41;
    private javax.swing.JMenuItem oJMenuItem42;
    private javax.swing.JMenuItem oJMenuItem43;
    private javax.swing.JMenuItem oJMenuItem51;
    private javax.swing.JMenuItem oJMenuItem52;
    private javax.swing.JMenuItem oJMenuItem53;
    private javax.swing.JMenuItem oJPMenuItem1;
    private javax.swing.JMenuItem oJPMenuItem2;
    private javax.swing.JPanel oJPanel1;
    private javax.swing.JPanel oJPanel2;
    private javax.swing.JPanel oJPanel3;
    private javax.swing.JPopupMenu oJPopupMenu1;
    private javax.swing.JSeparator oJSeparator1;
    private javax.swing.JSeparator oJSeparator2;
    private javax.swing.JSeparator oJSeparator3;
    private javax.swing.JSeparator oJSeparator4;
    private javax.swing.JSeparator oJSeparator6;
    private javax.swing.JSeparator oJSeparator8;
    private javax.swing.JSpinner oJSpinner1;
    // End of variables declaration//GEN-END:variables
}
