/*
 * ProgressBar.java
 *
 */

package com.uvigo.tMaestro.SCOCreator.tool;

import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Dialogo para mostrar el progreso de una tarea.
 * @author  raul
 * @version 0.1
 */
public class ProgressBar extends javax.swing.JDialog {
    
    /**
     * El c�digo a ejecutar que sera monitorizado por esta barra de progreso
     */
    private Code oCode;
    
    /**
     * El hilo en el que se lanzara el codigo
     */
    private Thread oThread;
    
    
    
    /**
     * Constructor de la clase
     * @param oParent Frame padre del dialogo
     * @param iMin Manimo valor de la progress bar
     * @param iMax Maximo valor de la progress bar
     * @param sTitle Titulo del dialogo
     * @param bIndeterminate Indica que la barra de progreso se pondra en modo indeterminado
     * @param oCode El codigo a ejecutar por la progress bar
     * @param lTime Tiempo de ejecucion de oCode, a partir del cual la barra se hara visible
     */
    public ProgressBar(javax.swing.JFrame oMainFrame,int iMin,int iMax,String sTitle,boolean bIndeterminate,Code oCode,long lTime) {
        super(oMainFrame,true);
        initComponents();
      System.out.println("llamo a progressbar");
        if (!bIndeterminate) {
            jProgressBar1.setMinimum(iMin);
            jProgressBar1.setMaximum(iMax);
            jProgressBar1.setValue(iMin);
            jProgressBar1.setStringPainted(true);
        } else jProgressBar1.setIndeterminate(true);
        setTitle(sTitle);
        setSize(300,150);
        setAlwaysOnTop(true);
        if (oMainFrame==null) {
            java.awt.Dimension oScreenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
            setLocation((oScreenSize.width-getWidth())/2, (oScreenSize.height-getHeight())/4);
        } else setLocation(oMainFrame.getX()+(oMainFrame.getWidth()-getWidth())/2, oMainFrame.getY()+(oMainFrame.getHeight()-getHeight())/2);
        this.oCode = oCode;
        runCode();
        
        setVisible(true); //M:
    }
    
    /** 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;

        jProgressBar1 = new javax.swing.JProgressBar();
        jLabel1 = new javax.swing.JLabel();

        getContentPane().setLayout(new java.awt.GridBagLayout());

        setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
        setResizable(false);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.weightx = 0.1;
        gridBagConstraints.insets = new java.awt.Insets(0, 6, 0, 5);
        getContentPane().add(jProgressBar1, gridBagConstraints);

        jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.weightx = 0.1;
        gridBagConstraints.insets = new java.awt.Insets(0, 6, 0, 5);
        getContentPane().add(jLabel1, gridBagConstraints);

        setSize(new java.awt.Dimension(400, 300));
    }
    // </editor-fold>//GEN-END:initComponents
    
    
    /**
     * Establece el texto indicado en la Etiqueta
     * @param sText El texto para poner en la etiqueta
     */
    public void setLabelText(String sText) {
        jLabel1.setText(sText);
    }
    
    
    /**
     * Incrementa en una unidad el valor de la progress bar
     * Este metodo solo debe ser usado cuando la barra se usa en modo "determinado"
     */
    public void addValue() {
        //try{Thread.currentThread().sleep(500);
        //System.out.println(jProgressBar1.getValue());
        //} catch(Exception oE){};
        int iValue = jProgressBar1.getValue();
        iValue++;
        jProgressBar1.setValue(iValue);
        if (iValue==jProgressBar1.getMaximum()) {
            try{Thread.currentThread().sleep(200);} catch(Exception oE){};
            dispose();
        }
    }
    
    /**
     * Esta funcion lanza un nuevo hilo que ejecute el Codigo declarado en oCode.run()
     */
    private void runCode() {
        final ProgressBar oBar = this;
        oThread=new Thread(new Runnable() {
            public void run() {
                System.out.println("llamo a runcode");
                oCode.run(oBar);
                //dispose(); //Este dispose va incluido en oCode si procede (ProgressBar indeterminada), si no se invoca en addValue
            }
        });
        oThread.start();
    }
    
    
    /**
     * Hace que la progress bar se poga en modo "determinado"
     * @param iMin El manimo valor de la bar
     * @param iMax El maximo valor a alcanzar
     * @param iValue El valor actual.
     */
    public void setDeterminate(int iMin,int iMax, int iValue) {
        if (jProgressBar1.isIndeterminate()) {
            jProgressBar1.setIndeterminate(false);
            jProgressBar1.setMinimum(iMin);
            jProgressBar1.setMaximum(iMax);
            jProgressBar1.setValue(iValue);
            jProgressBar1.setStringPainted(true);
        }
    }
   
    public void termina(){
      
        dispose();
        
         MainFrame.oMainFrame.finHiloCreaSCO();
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel jLabel1;
    private javax.swing.JProgressBar jProgressBar1;
    // End of variables declaration//GEN-END:variables
    
}
