Subversion Repositories eFlore/Applications.cel

Rev

Rev 2148 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
195 david 1
package org.tela_botanica.client.vues.image;
2 aperonnet 2
 
3
import org.tela_botanica.client.image.ImageMediateur;
4
import org.tela_botanica.client.interfaces.Rafraichissable;
5
 
6
import com.google.gwt.user.client.ui.ClickListener;
7
import com.google.gwt.user.client.ui.Image;
8
import com.google.gwt.user.client.ui.MouseListenerAdapter;
9
import com.google.gwt.user.client.ui.Widget;
10
import com.gwtext.client.widgets.Panel;
11
 
12
/**
13
 * Une barre de notation avec des étoiles, tout ce qu'il ya de plus classique,
14
 * utilisant Ajax (et pas CSS)
5 aperonnet 15
 *
2 aperonnet 16
 * @author aurelien
5 aperonnet 17
 *
2 aperonnet 18
 */
19
public class BarreNotationVue extends Panel implements Rafraichissable {
20
 
21
	/**
22
	 * Le médiateur associé
23
	 */
24
	@SuppressWarnings("unused")
5 aperonnet 25
	private ImageMediateur iMediateur = null;
2 aperonnet 26
	/**
27
	 * La note actuellement affichée
28
	 */
5 aperonnet 29
	private int noteEnCours = 0;
2 aperonnet 30
	/**
31
	 * La note maximum
32
	 */
5 aperonnet 33
	private int noteMax = 0;
2 aperonnet 34
	/**
35
	 * Booléen indiquant si une note est affectée à la barre en ce moment
36
	 */
5 aperonnet 37
	private boolean estNote = false;
2 aperonnet 38
	/**
39
	 * Tablmeau d'images contenant les étoiles affichées
40
	 */
5 aperonnet 41
	private Image[] etoiles = null;
42
 
2 aperonnet 43
	/**
44
	 * Constructeur sans argument (privé car ne doit pas être utilisé)
45
	 */
46
	@SuppressWarnings("unused")
5 aperonnet 47
	private BarreNotationVue() {
48
		super();
2 aperonnet 49
	}
5 aperonnet 50
 
2 aperonnet 51
	/**
52
	 * Constructeur avec arguments
5 aperonnet 53
	 *
54
	 * @param im
55
	 *            le médiateur à associer à la vue
56
	 * @param noteMax
57
	 *            la note maximale
2 aperonnet 58
	 */
5 aperonnet 59
	public BarreNotationVue(ImageMediateur im, int noteMax) {
60
		iMediateur = im;
61
		setNoteMax(noteMax);
62
		this.setSize(200, 100);
63
		this.setBodyBorder(false);
64
		this.setBorder(false);
65
		this.setCls("x-view-notation");
66
 
67
		ajouterListeners();
68
 
2 aperonnet 69
	}
5 aperonnet 70
 
71
	public void ajouterListeners() {
2 aperonnet 72
		for (int i = 0; i < etoiles.length; i++) {
5 aperonnet 73
 
2 aperonnet 74
			etoiles[i].addMouseListener(new MouseListenerAdapter() {
75
 
76
				// si la souris passe sur la barre
1292 aurelien 77
				@Override
2 aperonnet 78
				public void onMouseEnter(Widget sender) {
5 aperonnet 79
 
80
					Image enCours = (Image) sender;
81
 
82
					// on met en surbrillance toutes les étoiles allant de la
83
					// première jusqu'à
2 aperonnet 84
					// celle sous le curseur
5 aperonnet 85
					for (int i = 0; etoiles[i] != enCours; i++) {
86
						etoiles[i].setUrl("note-hover.gif");
2 aperonnet 87
					}
5 aperonnet 88
					enCours.setUrl("note-hover.gif");
89
 
2 aperonnet 90
				}
91
 
92
				// si la souris sort de la barre
1292 aurelien 93
				@Override
2 aperonnet 94
				public void onMouseLeave(Widget sender) {
5 aperonnet 95
 
2 aperonnet 96
					// on affiche la véritable note
5 aperonnet 97
					afficherNote();
2 aperonnet 98
				}
99
 
5 aperonnet 100
			});
101
 
2 aperonnet 102
			etoiles[i].addClickListener(new ClickListener() {
103
				// si on clique sur une étoiles
1292 aurelien 104
				@Override
2 aperonnet 105
				public void onClick(Widget sender) {
5 aperonnet 106
 
107
					int i = 0;
108
 
109
					// on récupère le numéro de l'étoile sur laquelle on a
110
					// cliqué
111
					while (etoiles[i] != (Image) sender) {
112
						i++;
113
					}
2 aperonnet 114
					// et on affecte la note
5 aperonnet 115
					noter(i);
116
 
2 aperonnet 117
				}
5 aperonnet 118
 
119
			});
2 aperonnet 120
		}
5 aperonnet 121
 
2 aperonnet 122
	}
5 aperonnet 123
 
2 aperonnet 124
	/**
125
	 * Fonction héritée de l'interface rafraichissable
126
	 */
1292 aurelien 127
	@Override
2 aperonnet 128
	public void rafraichir(Object nouvelleDonnees,
129
			boolean repandreRaffraichissement) {
5 aperonnet 130
 
2 aperonnet 131
		// si on recoit un tableau de string
5 aperonnet 132
		if (nouvelleDonnees instanceof String[]) {
2 aperonnet 133
			// on récupère le premier élément (un entier, qui contient la note)
5 aperonnet 134
			String[] note = (String[]) nouvelleDonnees;
2148 aurelien 135
			try {
136
				int noteInt = Integer.parseInt(note[0]);
5 aperonnet 137
 
2148 aurelien 138
				// si l'entier est une note valide
139
				if (noteInt != -1 && noteInt >= 0) {
5 aperonnet 140
 
2148 aurelien 141
					noter(noteInt);
142
				}
143
				// sinon si l'entier vaut -1
144
				else {
145
					// alors on note avec 0
146
					// et on met le booleen de notation a false (qui signifie que
147
					// l'image n'est pas encore notée)
148
					estNote = false;
149
					noteEnCours = 0;
150
					// et demande l'affichage
151
					afficherNote();
152
				}
153
			} catch(NumberFormatException e) {
154
				// rien car pas de note (idem que le cas -1
5 aperonnet 155
				// alors on note avec 0
156
				// et on met le booleen de notation a false (qui signifie que
157
				// l'image n'est pas encore notée)
158
				estNote = false;
159
				noteEnCours = 0;
2 aperonnet 160
				// et demande l'affichage
5 aperonnet 161
				afficherNote();
2 aperonnet 162
			}
163
		}
5 aperonnet 164
 
2 aperonnet 165
	}
5 aperonnet 166
 
2 aperonnet 167
	/**
168
	 * Affecte une note à la barre et rafraichit l'affichage
5 aperonnet 169
	 *
170
	 * @param note
171
	 *            la nouvelle note
2 aperonnet 172
	 */
5 aperonnet 173
	public void noter(int note) {
2 aperonnet 174
		// on affecte la note
5 aperonnet 175
		noteEnCours = note;
2 aperonnet 176
		// on met le boolean de notation à true (l'image est notée)
5 aperonnet 177
		estNote = true;
2 aperonnet 178
		// et on demande l'affichage
5 aperonnet 179
		afficherNote();
2 aperonnet 180
	}
5 aperonnet 181
 
2 aperonnet 182
	/**
183
	 * Setteur pour la note maximale
5 aperonnet 184
	 *
185
	 * @param nMax
186
	 *            la nouvelle note maximale
2 aperonnet 187
	 */
5 aperonnet 188
	public void setNoteMax(int nMax) {
2 aperonnet 189
		// on affecte la note
5 aperonnet 190
		noteMax = nMax;
2 aperonnet 191
		// on prépare le tableau d'image
5 aperonnet 192
		etoiles = new Image[noteMax];
193
 
2 aperonnet 194
		// qu'on remplit par defaut avec des images d'étoiles vides
5 aperonnet 195
		for (int i = 0; i < noteMax; i++) {
638 aurelien 196
			etoiles[i] = new Image("note-off.gif");
5 aperonnet 197
			etoiles[i].setStylePrimaryName("x-view-notation-bar");
198
			this.add(etoiles[i]);
2 aperonnet 199
		}
200
	}
5 aperonnet 201
 
2 aperonnet 202
	/**
203
	 * Affiche la note d'une image sous la forme d'étoiles
204
	 */
5 aperonnet 205
	public void afficherNote() {
2 aperonnet 206
		// si l'image est notée
5 aperonnet 207
		if (estNote) {
2 aperonnet 208
			// on affiche autant d'étoiles que le chiffre de la note
5 aperonnet 209
			for (int i = 0; i <= noteEnCours; i++) {
210
				etoiles[i].setUrl("note-on.gif");
2 aperonnet 211
			}
5 aperonnet 212
			// et si elle est inférieure à la note maximale, on remplit le reste
213
			// par des étoiles vides
214
			for (int j = noteEnCours + 1; j < noteMax; j++) {
215
				etoiles[j].setUrl("note-off.gif");
2 aperonnet 216
			}
217
		}
218
		// sinon
5 aperonnet 219
		else {
2 aperonnet 220
			// on remplit toute la barre avec des étoiles vides
5 aperonnet 221
			for (int i = 0; i < noteMax; i++) {
222
				etoiles[i].setUrl("note-off.gif");
2 aperonnet 223
			}
224
		}
5 aperonnet 225
 
2 aperonnet 226
	}
5 aperonnet 227
 
2 aperonnet 228
	/**
229
	 * Accesseur pour la note en cours sous forme de string
5 aperonnet 230
	 *
7 aperonnet 231
	 * @return la note en cours sous forme d'une chaine de charactères
2 aperonnet 232
	 */
5 aperonnet 233
	public String getNote() {
234
		return "" + noteEnCours;
2 aperonnet 235
	}
236
 
237
}