Subversion Repositories eFlore/Archives.cel-v2

Rev

Rev 47 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package org.tela_botanica.client.vues;

import org.tela_botanica.client.image.ImageMediateur;
import org.tela_botanica.client.interfaces.Rafraichissable;

import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.MouseListenerAdapter;
import com.google.gwt.user.client.ui.Widget;
import com.gwtext.client.widgets.Panel;

/**
 * Une barre de notation avec des étoiles, tout ce qu'il ya de plus classique,
 * utilisant Ajax (et pas CSS)
 * @author aurelien
 *
 */
public class BarreNotationVue extends Panel implements Rafraichissable {

        /**
         * Le médiateur associé
         */
        private ImageMediateur iMediateur = null ;
        /**
         * La note actuellement affichée
         */
        private int noteEnCours = 0 ;
        /**
         * La note maximum
         */
        private int noteMax = 0 ;
        /**
         * La note au dessus de laquelle se trouve le curseur (pour gérer le rollover)
         */
        private int noteCurseur = 0 ;
        /**
         * Booléen indiquant si une note est affectée à la barre en ce moment
         */
        private boolean estNote = false ;
        /**
         * Tablmeau d'images contenant les étoiles affichées
         */
        private Image[] etoiles = null ;
        
        /**
         * Constructeur sans argument (privé car ne doit pas être utilisé)
         */
        private BarreNotationVue()
        {
                super() ;
        }
        
        /**
         * Constructeur avec arguments
         * @param im le médiateur à associer à la vue
         * @param noteMax la note maximale
         */
        public BarreNotationVue(ImageMediateur im, int noteMax)
        {
                iMediateur = im ;
                setNoteMax(noteMax) ;
                this.setSize(200, 100) ;
                this.setBodyBorder(false) ;
                this.setBorder(false) ;
                
                ajouterListeners() ;
                
        }
        
        public void ajouterListeners()
        {
                for (int i = 0; i < etoiles.length; i++) {
                        
                        noteCurseur = i ;
                        
                        etoiles[i].addMouseListener(new MouseListenerAdapter() {


                                // si la souris passe sur la barre
                                public void onMouseEnter(Widget sender) {
                                        
                                        Image enCours = (Image)sender ;
                                        int nEnCours = 0 ;
                                        
                                        // on met en surbrillance toutes les étoiles allant de la première jusqu'à 
                                        // celle sous le curseur
                                        for(int i = 0 ; etoiles[i] != enCours ; i++)
                                        {
                                                etoiles[i].setUrl("etoile_curseur.png") ;
                                                nEnCours = i ;
                                        }
                                                enCours.setUrl("etoile_curseur.png") ;
                                        
                                }

                                // si la souris sort de la barre
                                public void onMouseLeave(Widget sender) {
                                
                                        // on affiche la véritable note
                                        afficherNote() ;
                                }

                                
                        }) ;
                        
                        etoiles[i].addClickListener(new ClickListener() {
                                // si on clique sur une étoiles
                                public void onClick(Widget sender) {
                                        
                                        int i = 0 ;
                                        
                                        // on récupère le numéro de l'étoile sur laquelle on a cliqué
                                        while(etoiles[i] != (Image)sender)
                                        {
                                                i++ ;
                                        }                       
                                        // et on affecte la note
                                        noter(i) ;
                                        
                                }
                                
                                
                        }) ;
                }
                
        }
        
        /**
         * Fonction héritée de l'interface rafraichissable
         */
        public void rafraichir(Object nouvelleDonnees,
                        boolean repandreRaffraichissement) {
                
                // si on recoit un tableau de string
                if(nouvelleDonnees instanceof String[])
                {       
                        // on récupère le premier élément (un entier, qui contient la note)
                        String[] note = (String[])nouvelleDonnees ;
                        int noteInt = Integer.parseInt(note[0]) ;
                        
                        // si l'entier est une note valide
                        if(noteInt != -1 && noteInt >= 0)
                        {
                                
                                noter(noteInt) ;
                        }
                        // sinon si l'entier vaut -1
                        else
                        {
                                // alors on note avec 0 
                                // et on met le booleen de notation a false (qui signifie que l'image n'est pas encore notée)
                                estNote = false ;
                                noteEnCours = 0 ;
                                // et demande l'affichage
                                afficherNote() ;
                        }
                        
                }
                
        }
        
        /**
         * Affecte une note à la barre et rafraichit l'affichage
         * @param note la nouvelle note
         */
        public void noter(int note)
        {
                // on affecte la note
                noteEnCours = note ;
                // on met le boolean de notation à true (l'image est notée)
                estNote = true ;
                // et on demande l'affichage
                afficherNote() ;
        }
        
        /**
         * Setteur pour la note maximale
         * @param nMax la nouvelle note maximale
         */
        public void setNoteMax(int nMax)
        {
                // on affecte la note
                noteMax = nMax ;
                // on prépare le tableau d'image
                etoiles = new Image[noteMax] ;
                
                // qu'on remplit par defaut avec des images d'étoiles vides
                for(int i = 0 ; i < noteMax ; i++)
                {
                        etoiles[i] = new Image("etoile_vide.jpg") ;
                        this.add(etoiles[i]) ;
                }
        }
        
        /**
         * Affiche la note d'une image sous la forme d'étoiles
         */
        public void afficherNote()
        {
                // si l'image est notée
                if(estNote)
                {
                        // on affiche autant d'étoiles que le chiffre de la note
                        for(int i = 0 ; i <= noteEnCours ; i++)
                        {
                                etoiles[i].setUrl("etoile_notee.png") ;
                        }
                        // et si elle est inférieure à la note maximale, on remplit le reste par des étoiles vides
                        for (int j = noteEnCours + 1 ; j < noteMax ; j++) 
                        {                                               
                                etoiles[j].setUrl("etoile_vide.png") ;                                          
                        }
                }
                // sinon
                else
                {
                        // on remplit toute la barre avec des étoiles vides
                        for(int i = 0 ; i < noteMax ; i++)
                        {
                                etoiles[i].setUrl("etoile_vide.png") ;
                        }
                }
                
                
        }
        
        /**
         * Accesseur pour la note en cours sous forme de string
         * @return
         */
        public String getNote()
        {
                return ""+noteEnCours ;
        }

}