Subversion Repositories eFlore/Applications.cel

Rev

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

package org.tela_botanica.client.vues.image;

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é
         */
        @SuppressWarnings("unused")
        private ImageMediateur iMediateur = null;
        /**
         * La note actuellement affichée
         */
        private int noteEnCours = 0;
        /**
         * La note maximum
         */
        private int noteMax = 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é)
         */
        @SuppressWarnings("unused")
        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);
                this.setCls("x-view-notation");

                ajouterListeners();

        }

        public void ajouterListeners() {
                for (int i = 0; i < etoiles.length; i++) {

                        etoiles[i].addMouseListener(new MouseListenerAdapter() {

                                // si la souris passe sur la barre
                                @Override
                                public void onMouseEnter(Widget sender) {

                                        Image enCours = (Image) sender;

                                        // 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("note-hover.gif");
                                        }
                                        enCours.setUrl("note-hover.gif");

                                }

                                // si la souris sort de la barre
                                @Override
                                public void onMouseLeave(Widget sender) {

                                        // on affiche la véritable note
                                        afficherNote();
                                }

                        });

                        etoiles[i].addClickListener(new ClickListener() {
                                // si on clique sur une étoiles
                                @Override
                                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
         */
        @Override
        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;
                        try {
                                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();
                                }
                        } catch(NumberFormatException e) {
                                // rien car pas de note (idem que le cas -1
                                // 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("note-off.gif");
                        etoiles[i].setStylePrimaryName("x-view-notation-bar");
                        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("note-on.gif");
                        }
                        // 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("note-off.gif");
                        }
                }
                // sinon
                else {
                        // on remplit toute la barre avec des étoiles vides
                        for (int i = 0; i < noteMax; i++) {
                                etoiles[i].setUrl("note-off.gif");
                        }
                }

        }

        /**
         * Accesseur pour la note en cours sous forme de string
         * 
         * @return la note en cours sous forme d'une chaine de charactères
         */
        public String getNote() {
                return "" + noteEnCours;
        }

}