/*
 * ImageView.java
 * Esta clase esta basada en un ejemplo del tutorial de Java de Sun.
 *
 */

package com.uvigo.tMaestro.SCOCreator.tool;

/**
 * Esta clase se utiliza para previsualizar las imagenes en los file chooser
 * que la utilicen, tipicamente los JFileChoosers que permitan elegir imagenes
 * @author raul
 * @version 0.1
 */
public class ImageView extends javax.swing.JPanel implements java.beans.PropertyChangeListener {
    javax.swing.ImageIcon oThumbnail = null; //Referencia al objeto dedicado al dibujado de la imagen
    java.io.File oFile = null;
    javax.swing.JLabel oLabel=null; //La etiqueta en la que posicionaremos la imagen
    
    /**
     * Constructor de la clase. Fija el tamano de este componente, es decir
     * el tamano del panel en el que se previsualizara la imagen. Se registra en el file chooser
     * para ser notificado cuando se produzca un cambio en una de sus propieadades.
     * @param oFC El JFileChooser que utilizara este ImageView
     */
    public ImageView(javax.swing.JFileChooser oFC) {
        setPreferredSize(new java.awt.Dimension(150, 150));
        setLayout(new java.awt.BorderLayout());
        this.setBorder(new javax.swing.border.TitledBorder(MainFrame.oMainFrame.getMessage("Border1")));
        oLabel = new javax.swing.JLabel();
        oLabel.setSize(140, 140);
        oLabel.setHorizontalAlignment(javax.swing.JLabel.CENTER);
        add(oLabel,java.awt.BorderLayout.CENTER);
        oFC.addPropertyChangeListener(this); //Nos registramos en el FileChooser
    }
    
    /**
     * M�todo que carga la imagen en el oThumbnail.
     */
    public void loadImage() {
        if (oFile == null) { //Si no fichero seleccionado no cargamos nada
            oThumbnail = null;
            return;
        }
        
        //Intentamos cargar la imagen.
        javax.swing.ImageIcon oTmpIcon = new javax.swing.ImageIcon(oFile.getPath());
        if (oTmpIcon != null) { //Si la carga ha tenido exito
            if (oTmpIcon.getIconWidth() > 130) { //Si el tamano de la imagen es mayor que el area de visualizaci�n la escalamos utilizando un algortimo que priorice la carga de la imagen
                oThumbnail = new javax.swing.ImageIcon(oTmpIcon.getImage().getScaledInstance(130, -1,java.awt.Image.SCALE_FAST));
            } else { //no hay necesidad de escalar la imagen
                oThumbnail = oTmpIcon;
            }
        }
    }
    
    /**
     * Este metodo es llamado cuando se produce algun cambio en 
     * alguna de las propiedades del JFileChooser al que nos hemos
     * registrado. Hemos de detectar si la llamada ha sido debida
     * a un cambio de fichero, y si es asi, cargar la imagen y previsualizarla
     */
    public void propertyChange(java.beans.PropertyChangeEvent oE) {
        boolean bUpdate = false;
        String sProperty = oE.getPropertyName();
        
        //Si se ha cambiado el directorio no hay que previsualizar nada (descargamos la imagen)
        if (javax.swing.JFileChooser.DIRECTORY_CHANGED_PROPERTY.equals(sProperty)) {
            oFile = null;
            bUpdate = true;
            
            //Si ha cambiado el fichero
        } else if (javax.swing.JFileChooser.SELECTED_FILE_CHANGED_PROPERTY.equals(sProperty)) {
            oFile = (java.io.File) oE.getNewValue();
            bUpdate = true;
        }
        
        //Actualizamos la previsualizacion si se da el caso.
        if (bUpdate) { //Si no se da niguno de los casos de arriba no hacemos nada
            oThumbnail = null;
            if (isShowing()) {
                loadImage(); //Cargamos la imagen
                oLabel.setIcon(oThumbnail);//La dibujamos
            }
        }
    }
}
