/branches/v1.12-aluminium/src/org/tela_botanica/del/client/composants/votes/moyennevotes/moyenne.css |
---|
New file |
0,0 → 1,115 |
.moyenne { |
background: none repeat scroll 0 0 #333333; |
display: block; |
margin-left: -5px; |
margin-top: -7px; |
padding: 5px; |
width: 116px; |
} |
.petit { |
font-size: 11px; |
color: #AAA |
} |
.petitgauche, .petitgauchecliquable { |
font-size: 11px; |
color: #AAA; |
float: left; |
} |
.petitgauchecliquable, .fermerPanneauDetails { |
text-decoration: underline; |
cursor: pointer; |
} |
.chiffreDroite { |
float: right; |
margin-right: 10px; |
color: #22ee22; |
} |
.panneauDetailVotes { |
position: absolute; |
top: -205px; |
right: 0; |
width : 200px; |
height: 192px; |
padding: 3px; |
color: #dddddd; |
background-color: #333333; |
border: solid white 1px; |
} |
.fermerPanneauDetails { |
position: absolute; |
bottom: 3px; |
right: 3px; |
font-size: 11px; |
color: #AAA; |
} |
.barreVote { |
padding: 0 5px 0 5px |
} |
.validerVote { |
font-size: 11px; |
margin-left: 5px; |
float:left |
} |
.zoneBoutonsVote { |
position:absolute; |
} |
.annuler { |
background: url("./img/cancel.png") no-repeat; |
border: none; |
padding-left: 16px; |
padding-top: 16px; |
margin-left: 5px; |
cursor: pointer; |
} |
.zoneNoteGlobale { |
background: none repeat scroll 0 0 #333333; |
margin-left: 122px; |
margin-top: -5px; |
position: absolute; |
white-space: nowrap; |
width: 113px; |
height:29px; |
padding:5px; |
} |
.zoneFleur { |
position:absolute; |
top:5px; |
margin-left:86px; |
} |
.protocole { |
width:124px; |
white-space:nowrap; |
text-overflow:ellipsis; |
overflow:hidden; |
} |
.zoneVoter { |
background: #8eb533 none repeat scroll 0 0; |
color: white; |
font-size: 15px; |
height: 40px; |
margin-left: -5px; |
margin-top: -18px; |
position: absolute; |
text-align: center; |
width: 126px; |
display: table; |
} |
.zoneVoter span { |
display: table-cell; |
vertical-align: middle; |
} |
/branches/v1.12-aluminium/src/org/tela_botanica/del/client/composants/votes/moyennevotes/MoyenneVoteVue.ui.xml |
---|
New file |
0,0 → 1,98 |
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder' xmlns:g='urn:import:com.google.gwt.user.client.ui' ui:generateFormat='com.google.gwt.i18n.rebind.format.PropertiesFormat' |
ui:generateKeys="com.google.gwt.i18n.rebind.keygen.MD5KeyGenerator" ui:generateLocales="default"> |
<ui:with field="constants" type="org.tela_botanica.del.client.i18n.Vocabulary"/> |
<ui:style src="moyenne.css" /> |
<g:HTMLPanel styleName="{style.moyenne}"> |
<g:HTMLPanel ui:field="panneauDetailVotes" styleName="{style.panneauDetailVotes}"> |
<g:Label ui:field="lienPanneauFermer" styleName="{style.fermerPanneauDetails}"> |
Fermer X |
</g:Label> |
Moyenne pondérée: <span ui:field="pdvMoyennePonderee" class="chiffreDroite"></span> |
<br/> |
Moyenne arithmétique: <span ui:field="pdvMoyenneArithmetique" class="chiffreDroite"></span> |
<br/> |
Médiane: <span ui:field="pdvMediane" class="chiffreDroite"></span> |
<br/> |
Nombre de points: <span ui:field="pdvNbPoints" class="chiffreDroite"></span> |
<br/> |
<table class="notesVotes"> |
<tr> |
<td class="image"> |
<img src="./img/etoile_5.png" style="width: 16px;"/> |
</td> |
<td class="barre"> |
<div ui:field="barre5" class="avancement"></div> |
</td> |
<td class="votants"> |
<span ui:field="votants5"></span> |
</td> |
</tr> |
<tr> |
<td> |
<img src="./img/etoile_4.png" style="width: 16px;"/> |
</td> |
<td class="barre"> |
<div ui:field="barre4" class="avancement"></div> |
</td> |
<td class="votants"> |
<span ui:field="votants4"></span> |
</td> |
</tr> |
<tr> |
<td> |
<img src="./img/etoile_3.png" style="width: 16px;"/> |
</td> |
<td class="barre"> |
<div ui:field="barre3" class="avancement"></div> |
</td> |
<td class="votants"> |
<span ui:field="votants3"></span> |
</td> |
</tr> |
<tr> |
<td> |
<img src="./img/etoile_2.png" style="width: 16px;"/> |
</td> |
<td class="barre"> |
<div ui:field="barre2" class="avancement"></div> |
</td> |
<td class="votants"> |
<span ui:field="votants2"></span> |
</td> |
</tr> |
<tr> |
<td> |
<img src="./img/etoile_1.png" style="width: 16px;"/> |
</td> |
<td class="barre"> |
<div ui:field="barre1" class="avancement"></div> |
</td> |
<td class="votants"> |
<span ui:field="votants1"></span> |
</td> |
</tr> |
</table> |
</g:HTMLPanel> |
<g:HTMLPanel styleName="{style.zoneNoteGlobale}"> |
<g:Label styleName="petit enligne">Note générale</g:Label><g:Label ui:field="noteGenerale" styleName="petit enligne"/> |
<g:Label ui:field="nbVotes" styleName="{style.petitgauchecliquable}"/> |
<!-- <g:Label ui:field="nbPoints" styleName="{style.petitgauche}"/> --> |
<g:HTMLPanel ui:field="zoneFleur" styleName="{style.zoneFleur}"></g:HTMLPanel> |
</g:HTMLPanel> |
<g:HorizontalPanel> |
<g:Label styleName="{style.petit} {style.protocole}" ui:field="protocole" text="protocole"/> |
</g:HorizontalPanel> |
<g:Label ui:field="zoneVoter" styleName="{style.zoneVoter}" text="Votez !"></g:Label> |
<g:HorizontalPanel ui:field="zoneDeVote"> |
<g:FocusPanel ui:field="voter" styleName="{style.barreVote}"/> |
<g:HTMLPanel ui:field="votePrisEnCompte"><g:Label text="{constants.votePrisEnCompte}"></g:Label></g:HTMLPanel> |
<g:HTMLPanel ui:field="voteModifie"><g:Label text="{constants.voteModifie}"></g:Label></g:HTMLPanel> |
<g:HTMLPanel ui:field="voteSupprime"><g:Label text="{constants.voteSupprime}"></g:Label></g:HTMLPanel> |
<g:HTMLPanel styleName="{style.zoneBoutonsVote}"> |
<g:Button ui:field="boutonAnnuler" title="{constants.supprimerVote}" styleName="{style.annuler}"></g:Button> |
</g:HTMLPanel> |
</g:HorizontalPanel> |
</g:HTMLPanel> |
</ui:UiBinder> |
/branches/v1.12-aluminium/src/org/tela_botanica/del/client/composants/votes/moyennevotes/MoyenneVotePresenteur.java |
---|
New file |
0,0 → 1,414 |
package org.tela_botanica.del.client.composants.votes.moyennevotes; |
import java.util.ArrayList; |
import java.util.Collections; |
import java.util.Comparator; |
import java.util.HashMap; |
import java.util.Iterator; |
import java.util.List; |
import org.tela_botanica.del.client.cache.CacheClient; |
import org.tela_botanica.del.client.composants.votefleur.VoteFleurPresenteur; |
import org.tela_botanica.del.client.composants.votefleur.VoteFleurVue; |
import org.tela_botanica.del.client.modeles.Image; |
import org.tela_botanica.del.client.modeles.Protocole; |
import org.tela_botanica.del.client.modeles.VoteProtocole; |
import org.tela_botanica.del.client.navigation.evenement.BusEvenementiel; |
import org.tela_botanica.del.client.navigation.evenement.changementEtatUtilisateur.EvenementChangementEtatUtilisateur; |
import org.tela_botanica.del.client.navigation.evenement.changementEtatUtilisateur.GestionnaireEvenementChangementEtatUtilisateur; |
import org.tela_botanica.del.client.navigation.evenement.suppressioncommentaire.EvenementSuppressionCommentaire; |
import org.tela_botanica.del.client.navigation.evenement.suppressioncommentaire.GestionnaireEvenementSuppressionCommentaire; |
import org.tela_botanica.del.client.services.rest.VoteProtocoleService; |
import org.tela_botanica.del.client.services.rest.async.AjoutVoteProtocoleCallback; |
import org.tela_botanica.del.client.services.rest.async.VoteProtocoleCallback; |
import com.google.gwt.event.dom.client.ClickEvent; |
import com.google.gwt.event.dom.client.ClickHandler; |
import com.google.gwt.event.dom.client.HasClickHandlers; |
import com.google.gwt.event.dom.client.HasMouseMoveHandlers; |
import com.google.gwt.event.dom.client.MouseMoveEvent; |
import com.google.gwt.event.dom.client.MouseMoveHandler; |
import com.google.gwt.user.client.Window; |
import com.google.gwt.user.client.ui.HasText; |
import com.google.gwt.user.client.ui.HasWidgets; |
import com.google.gwt.user.client.ui.IsWidget; |
import com.google.gwt.user.client.ui.Panel; |
public class MoyenneVotePresenteur { |
public interface Vue extends IsWidget { |
public HasClickHandlers getBoutonAnnuler(); |
public HasClickHandlers getVotes(); |
public int getValeurVote(); |
public void afficherBoutonAnnuler(); |
public void masquerBoutonAnnuler(); |
public void afficherNbVotes(); |
public void masquerNbVotes(); |
//public void afficherNbPoints(); |
//public void masquerNbPoints(); |
public void reinitialiserVotes(); |
public void rafraichir(int moyenneVote, int nbVotes, int nombrePoints, double moyenneArithmetique, double mediane, HashMap<Integer,Integer> occurrencesParNote, double moyennePonderee); |
public void ajouterAuParent(HasWidgets composite); |
public void afficherVotePrisEnCompte(); |
public HasWidgets getZoneFleur(); |
public HasText getZoneProtocole(); |
public HasText getNbVotes(); |
//public HasText getNbPoints(); |
public HasClickHandlers getLienNbVotes(); |
public void setNoteGenerale(int note); |
public void afficherVoteModifie(); |
public HasMouseMoveHandlers getZoneVoter(); |
public void masquerZoneVoter(); |
public void afficherMessageVoteIdentifie(boolean doitEtreIdentifiePourVoter); |
public void setNoteGeneraleToolTip(double valeurVoteTotalPrecise); |
public void desactiverInteractionVote(); |
public void activerInteractionVote(); |
public void afficherVoteSupprime(); |
public Panel getPanneauDetailVotes(); |
public void afficherPanneauDetailVotes(); |
public void masquerPanneauDetailVotes(); |
public HasClickHandlers getLienPanneauFermer(); |
} |
private Vue vue; |
private Protocole protocole; |
private Image image; |
private int valeurVoteDefaut = -1; |
private int valeurVoteUtilisateur = -1; |
private int valeurVoteTotal = 0; |
private double moyenneArithmetique = 0; |
private double mediane = 0; |
private int nombrePoints = 0; |
private double valeurVoteTotalPrecise = 0.0; |
private HashMap<Integer,Integer> occurrencesParNote; |
// TODO: on devrait passer un conteneur qui permet d'accéder à ces services |
private VoteProtocoleService voteProtocoleService; |
public MoyenneVotePresenteur(Image image, Protocole protocole, Vue vue, |
VoteProtocoleService voteProtocoleService) { |
this.vue = vue; |
this.protocole = protocole; |
this.image = image; |
this.voteProtocoleService = voteProtocoleService; |
String nomProtocole = protocole.getNom(); |
nomProtocole = nomProtocole.substring(0, 1).toUpperCase() |
+ nomProtocole.substring(1).toLowerCase(); |
vue.getZoneProtocole().setText(nomProtocole); |
} |
public void go(HasWidgets composite) { |
vue.ajouterAuParent(composite); |
gererEvenements(); |
rafraichirVue(); |
} |
public void gererEvenements() { |
vue.afficherMessageVoteIdentifie(utilisateurPeutVoter()); |
vue.getZoneVoter().addMouseMoveHandler(new MouseMoveHandler() { |
@Override |
public void onMouseMove(MouseMoveEvent event) { |
if(utilisateurPeutVoter()) { |
vue.masquerZoneVoter(); |
} |
} |
}); |
vue.getVotes().addClickHandler(new ClickHandler() { |
@Override |
public void onClick(ClickEvent event) { |
if(utilisateurPeutVoter()) { |
valeurVoteUtilisateur = vue.getValeurVote(); |
enregistrerVote(); |
vue.afficherBoutonAnnuler(); |
} else { |
Window.alert("Voter pour ce protocole nécéssite d'être identifié"); |
} |
} |
}); |
vue.getBoutonAnnuler().addClickHandler(new ClickHandler() { |
@Override |
public void onClick(ClickEvent event) { |
valeurVoteUtilisateur = valeurVoteDefaut; |
vue.masquerBoutonAnnuler(); |
supprimerVote(); |
vue.reinitialiserVotes(); |
} |
}); |
// Affiche un chouette panneau qui montre le détail des votes |
vue.getLienNbVotes().addClickHandler(new ClickHandler() { |
@Override |
public void onClick(ClickEvent event) { |
if (vue.getPanneauDetailVotes().isVisible()) { |
vue.masquerPanneauDetailVotes(); |
} else { |
vue.afficherPanneauDetailVotes(); |
} |
} |
}); |
vue.getLienPanneauFermer().addClickHandler(new ClickHandler() { |
@Override |
public void onClick(ClickEvent event) { |
vue.masquerPanneauDetailVotes(); |
} |
}); |
BusEvenementiel.getInstance().addHandler(EvenementChangementEtatUtilisateur.TYPE, new GestionnaireEvenementChangementEtatUtilisateur() { |
@Override |
public void onModificationEtatUtilisateur(EvenementChangementEtatUtilisateur evenementChangementEtatUtilisateur) { |
rafraichirVue(); |
} |
}); |
} |
public boolean utilisateurPeutVoter() { |
return !protocole.doitEtreIdentifiePourVoter() || CacheClient.getInstance().getUtilisateur().estIdentifie(); |
} |
public void setValeurVoteUtilisateur(int valeurVoteUtilisateur) { |
this.valeurVoteUtilisateur = valeurVoteUtilisateur; |
} |
public void enregistrerVote() { |
vue.desactiverInteractionVote(); |
final VoteProtocole voteProtocole = new VoteProtocole(); |
voteProtocole.setProtocole(this.protocole); |
voteProtocole.setVote(valeurVoteUtilisateur); |
String idContributeur = CacheClient.getInstance().getUtilisateur() |
.getId(); |
voteProtocole.setContributeur(idContributeur); |
//TODO: ceci devrait pouvoir être factorisé |
if (image.utilisateurAVotePourProtocole(this.protocole.getId() + "", |
idContributeur)) { |
voteProtocole.setId(image.getVotesProtocoles(this.protocole.getId()+"").get(idContributeur).getId()); |
VoteProtocoleCallback vpc = new VoteProtocoleCallback() { |
@Override |
public void surRetour(Void objetRetour) { |
image.ajouterVoteProtocole(voteProtocole); |
rafraichirVue(); |
vue.afficherVoteModifie(); |
vue.activerInteractionVote(); |
} |
}; |
voteProtocoleService.modifierVote(image.getIdImage(), |
voteProtocole, vpc); |
} else { |
AjoutVoteProtocoleCallback vpc = new AjoutVoteProtocoleCallback() { |
@Override |
public void surRetour(String idVote) { |
voteProtocole.setId(idVote); |
image.ajouterVoteProtocole(voteProtocole); |
rafraichirVue(); |
vue.afficherVotePrisEnCompte(); |
vue.activerInteractionVote(); |
} |
}; |
voteProtocoleService.ajouterVote(image.getIdImage(), voteProtocole, |
vpc); |
} |
} |
public void supprimerVote() { |
vue.desactiverInteractionVote(); |
final String idContributeur = CacheClient.getInstance().getUtilisateur() |
.getId(); |
final VoteProtocole voteProtocole = image.getVotesProtocoles(protocole.getId()).get(idContributeur); |
VoteProtocoleCallback vpc = new VoteProtocoleCallback() { |
@Override |
public void surRetour(Void objetRetour) { |
// TODO: voir si l'on affiche un message en cas de succès ? |
image.supprimerVoteProtocole(protocole.getId() + "", idContributeur); |
rafraichirVue(); |
vue.afficherVoteSupprime(); |
vue.activerInteractionVote(); |
} |
}; |
voteProtocoleService.supprimerVote(image.getIdImage(), voteProtocole, vpc); |
} |
public int getValeurVoteTotal() { |
return valeurVoteTotal; |
} |
public IsWidget getVue() { |
return vue; |
} |
private void rafraichirVue() { |
valeurVoteTotal = calculerMoyenneVotesArrondie(); |
moyenneArithmetique = calculerMoyenneVotes(); |
mediane = calculerMedianeVotes(); |
valeurVoteTotalPrecise = calculerMoyennePondereeVotes(); |
nombrePoints = calculerNombrePointsEchelleArbitraire(); |
VoteProtocole voteProtocole = image.getVotesProtocoles( |
protocole.getId()).get( |
CacheClient.getInstance().getUtilisateur().getId()); |
int voteUtilisateur = 0; |
if (voteProtocole != null) { |
voteUtilisateur = voteProtocole.getVote(); |
vue.masquerZoneVoter(); |
} |
if(image.utilisateurAVotePourProtocole(protocole.getId()+"", CacheClient.getInstance().getUtilisateur().getId())) { |
vue.afficherBoutonAnnuler(); |
} |
vue.afficherMessageVoteIdentifie(utilisateurPeutVoter()); |
VoteFleurPresenteur presenteurFleur = new VoteFleurPresenteur( |
new VoteFleurVue()); |
presenteurFleur.setNote(valeurVoteTotal); |
vue.setNoteGenerale(valeurVoteTotal); |
vue.setNoteGeneraleToolTip(valeurVoteTotalPrecise); |
presenteurFleur.go(vue.getZoneFleur()); |
vue.rafraichir(voteUtilisateur, image.getVotesProtocoles(protocole.getId()).size(), nombrePoints, |
moyenneArithmetique, mediane, occurrencesParNote, valeurVoteTotalPrecise); |
} |
public double calculerMedianeVotes() { |
double med = 0; |
// comparateur de votes (le bulldozer Java™ pour écraser une mouche) |
class Comparatisateur3000 implements Comparator<VoteProtocole> { |
@Override |
public int compare(VoteProtocole v1, VoteProtocole v2) { |
if (v1.getVote() > v2.getVote()) { |
return 1; |
} else if (v1.getVote() > v2.getVote()) { |
return -1; |
} else { |
return 0; |
} |
} |
} |
// conversion en liste triable |
List<VoteProtocole> liste = new ArrayList<VoteProtocole>(image.getVotesProtocoles(protocole.getId()).values()); |
Collections.sort(liste, new Comparatisateur3000()); |
int longueur = liste.size(); |
if (longueur > 0) { |
if (longueur % 2 == 0) { |
// moyenne des éléments centraux |
med = (liste.get(longueur / 2 - 1).getVote() + liste.get(longueur / 2).getVote()) / 2; |
} else { |
// élément central |
med = liste.get((int) (longueur / 2)).getVote(); |
} |
} |
return med; |
} |
// calcule la moyenne arithmétique |
public double calculerMoyenneVotes() { |
double valeurVote = 0; |
double nbVote = 0; |
for (Iterator<String> iterator = image |
.getVotesProtocoles(protocole.getId()).keySet().iterator(); iterator |
.hasNext();) { |
VoteProtocole imageCelValidationData = image.getVotesProtocoles( |
protocole.getId()).get(iterator.next()); |
valeurVote += (double) imageCelValidationData.getVote() / 5; |
nbVote++; |
} |
if (nbVote > 0) { |
valeurVote /= nbVote; |
valeurVote *= 5; |
} |
return valeurVote; |
} |
// Calcule une moyenne, où chaque note est pondérée par son nombre d'occurrences au carré. |
// voir http://www.tela-botanica.org/wikini/DevInformatiques/wakka.php?wiki=AppliDelCalculVotes |
public double calculerMoyennePondereeVotes() { |
double score = 0; |
double diviseur = 0; |
int nbOccurrences; |
// mise à jour des occurrences par note, utile pour le panneau de détails |
occurrencesParNote = new HashMap<Integer,Integer>(); |
// rangement par note => occurrences |
for (String clef : image.getVotesProtocoles(protocole.getId()).keySet()) { |
VoteProtocole imageCelValidationData = image.getVotesProtocoles(protocole.getId()).get(clef); |
nbOccurrences = 1; |
if (occurrencesParNote.containsKey(imageCelValidationData.getVote())) { |
nbOccurrences = occurrencesParNote.get(imageCelValidationData.getVote()) + 1; |
} |
occurrencesParNote.put(imageCelValidationData.getVote(), nbOccurrences); |
} |
// calcul pondéré |
for (Integer clef : occurrencesParNote.keySet()) { |
score += clef * occurrencesParNote.get(clef) * occurrencesParNote.get(clef); |
diviseur += occurrencesParNote.get(clef) * occurrencesParNote.get(clef); |
} |
if (diviseur > 0) { |
score /= diviseur; |
} |
return score; |
} |
// remplace chaque note par un nombre de points noté dans "echelle" afin de favoriser |
// les note fortes (5 et 4), pour le défi photo notamment |
public int calculerNombrePointsEchelleArbitraire() { |
int points = 0; |
//int[] echelle = {-1,0,1,4,20}; |
int[] echelle = {1,10,100,1000,10000}; |
for (String clef : image.getVotesProtocoles(protocole.getId()).keySet()) { |
VoteProtocole imageCelValidationData = image.getVotesProtocoles(protocole.getId()).get(clef); |
if (imageCelValidationData.getVote() > 0) { |
points += echelle[imageCelValidationData.getVote() - 1]; |
} |
} |
return points; |
} |
public int calculerMoyenneVotesArrondie() { |
//double valeurVote = calculerMoyenneVotes(); |
double valeurVote = calculerMoyennePondereeVotes(); |
return (int) Math.round(valeurVote); |
} |
} |
/branches/v1.12-aluminium/src/org/tela_botanica/del/client/composants/votes/moyennevotes/MoyenneVoteVue.java |
---|
New file |
0,0 → 1,289 |
package org.tela_botanica.del.client.composants.votes.moyennevotes; |
import java.util.HashMap; |
import org.cobogw.gwt.user.client.ui.Rating; |
import org.tela_botanica.del.client.composants.votes.barrerepartition.InfoBulleAnim; |
import org.tela_botanica.del.client.i18n.I18n; |
import com.google.gwt.core.client.GWT; |
import com.google.gwt.dom.client.DivElement; |
import com.google.gwt.dom.client.SpanElement; |
import com.google.gwt.event.dom.client.HasClickHandlers; |
import com.google.gwt.event.dom.client.HasMouseMoveHandlers; |
import com.google.gwt.i18n.client.NumberFormat; |
import com.google.gwt.uibinder.client.UiBinder; |
import com.google.gwt.uibinder.client.UiField; |
import com.google.gwt.user.client.Window; |
import com.google.gwt.user.client.ui.Button; |
import com.google.gwt.user.client.ui.Composite; |
import com.google.gwt.user.client.ui.FocusPanel; |
import com.google.gwt.user.client.ui.HasText; |
import com.google.gwt.user.client.ui.HasWidgets; |
import com.google.gwt.user.client.ui.Label; |
import com.google.gwt.user.client.ui.Panel; |
import com.google.gwt.user.client.ui.Widget; |
public class MoyenneVoteVue extends Composite implements MoyenneVotePresenteur.Vue { |
// Annotation can be used to change the name of the associated xml file |
// @UiTemplate("MoyenneVoteVue.ui.xml") |
interface MyUiBinder extends UiBinder<Widget, MoyenneVoteVue> { |
} |
private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); |
private Rating votes; |
private int valeurOrigine; |
private InfoBulleAnim animerVotePrisEnCompte; |
private InfoBulleAnim animerVoteModifie; |
private InfoBulleAnim animerVoteSupprime; |
@UiField |
FocusPanel voter; |
@UiField |
Panel votePrisEnCompte, voteModifie, voteSupprime, zoneFleur, panneauDetailVotes; |
@UiField |
Label nbVotes, protocole, noteGenerale/*, nbPoints*/, zoneVoter, lienPanneauFermer; |
@UiField |
Button boutonAnnuler; |
@UiField |
// pour le panneau de détail des votes |
SpanElement pdvMoyenneArithmetique, pdvMoyennePonderee, pdvMediane, pdvNbPoints, |
votants5, votants4, votants3, votants2, votants1; |
@UiField |
DivElement barre5, barre4, barre3, barre2, barre1; |
public static final double TAILLE_MAX_BARRE = 135; // si "int", peut faire foirer les divisions |
public MoyenneVoteVue() { |
initWidget(uiBinder.createAndBindUi(this)); |
votes = new Rating(0, 5); |
votes.setReadOnly(false); |
voter.add(votes); |
masquerBoutonAnnuler(); |
masquerPanneauDetailVotes(); |
votePrisEnCompte.setVisible(false); |
animerVotePrisEnCompte = new InfoBulleAnim(votePrisEnCompte); |
animerVoteModifie = new InfoBulleAnim(voteModifie); |
animerVoteSupprime = new InfoBulleAnim(voteSupprime); |
} |
public HasClickHandlers getBoutonAnnuler() { |
return boutonAnnuler; |
} |
public HasText getNbVotes() { |
return nbVotes; |
} |
public HasClickHandlers getLienNbVotes() { |
return nbVotes; |
} |
/*public HasText getNbPoints() { |
return nbPoints; |
}*/ |
public HasClickHandlers getVotes() { |
return votes; |
} |
public int getValeurVote() { |
return votes.getValue(); |
} |
public void afficherBoutonAnnuler() { |
boutonAnnuler.setVisible(true); |
} |
public void masquerBoutonAnnuler() { |
boutonAnnuler.setVisible(false); |
} |
public void afficherNbVotes() { |
nbVotes.setVisible(true); |
} |
public void masquerNbVotes() { |
nbVotes.setVisible(false); |
} |
/*public void afficherNbPoints() { |
nbPoints.setVisible(true); |
}*/ |
/*public void masquerNbPoints() { |
nbPoints.setVisible(false); |
}*/ |
public void afficherPanneauDetailVotes() { |
panneauDetailVotes.setVisible(true); |
} |
public void masquerPanneauDetailVotes() { |
panneauDetailVotes.setVisible(false); |
} |
public Panel getPanneauDetailVotes() { |
return panneauDetailVotes; |
} |
public HasClickHandlers getLienPanneauFermer() { |
return lienPanneauFermer; |
} |
public void reinitialiserVotes() { |
votes.setValue(valeurOrigine); |
} |
public void rafraichir(int voteUtilisateur, int nombreVotes, int nombrePoints, double moyenneArithmetique, double mediane, HashMap<Integer,Integer> occurrencesParNote, double moyennePonderee) { |
valeurOrigine = voteUtilisateur; |
String valeurVote = nombreVotes+" "+I18n.getVocabulary().nbVotes(); |
if (nombreVotes > 1) { |
valeurVote += "s"; |
} |
/*String valeurPoints = ", "+Math.max(0, nombrePoints)+" "+I18n.getVocabulary().nbPoints(); |
if (nombrePoints > 1) { |
valeurPoints += "s"; |
}*/ |
nbVotes.setText(valeurVote); |
//nbPoints.setText(valeurPoints); |
pdvNbPoints.setInnerHTML("" + nombrePoints); |
votes.setValue(voteUtilisateur); |
rafraichirPanneauDetail(moyennePonderee, moyenneArithmetique, mediane, occurrencesParNote, nombreVotes); |
} |
// si la chose est nulle, on retourne 0 |
private int nullCestZero(Integer chose) { |
if (chose == null) { |
return 0; |
} else { |
return chose; |
} |
} |
// try { |
// codeConcisEtEfficace(); |
// } catch (ShitLanguageException e) { |
// codeCracra(); |
// } |
private void rafraichirPanneauDetail(double moyennePonderee, double moyenneArithmetique, double mediane, HashMap<Integer,Integer> occurrencesParNote, int nombreVotes) { |
// stats |
NumberFormat df = NumberFormat.getFormat("0.###"); |
this.pdvMoyennePonderee.setInnerHTML("" + df.format(moyennePonderee)); |
this.pdvMoyenneArithmetique.setInnerHTML("" + df.format(moyenneArithmetique)); |
this.pdvMediane.setInnerHTML("" + df.format(mediane)); |
// détail des votes |
double tailleBarre1 = 0, |
tailleBarre2 = 0, |
tailleBarre3 = 0, |
tailleBarre4 = 0, |
tailleBarre5 = 0; |
// on peut pas mettre des attributs dans une variable ? Quelle idée aussi de faire |
// du Web avec un langage statique... du coup codre cracra, ça vous fera les pieds |
if (nombreVotes > 0) { |
if (occurrencesParNote.get(1) != null) { |
tailleBarre1 = (int) (occurrencesParNote.get(1) * TAILLE_MAX_BARRE / nombreVotes); |
} |
if (occurrencesParNote.get(2) != null) { |
tailleBarre2 = (int) (occurrencesParNote.get(2) * TAILLE_MAX_BARRE / nombreVotes); |
} |
if (occurrencesParNote.get(3) != null) { |
tailleBarre3 = (int) (occurrencesParNote.get(3) * TAILLE_MAX_BARRE / nombreVotes); |
} |
if (occurrencesParNote.get(4) != null) { |
tailleBarre4 = (int) (occurrencesParNote.get(4) * TAILLE_MAX_BARRE / nombreVotes); |
} |
if (occurrencesParNote.get(5) != null) { |
tailleBarre5 = (int) (occurrencesParNote.get(5) * TAILLE_MAX_BARRE / nombreVotes); |
} |
} |
this.barre1.setAttribute("style", "width: " + tailleBarre1 + "px;"); |
this.barre2.setAttribute("style", "width: " + tailleBarre2 + "px;"); |
this.barre3.setAttribute("style", "width: " + tailleBarre3 + "px;"); |
this.barre4.setAttribute("style", "width: " + tailleBarre4 + "px;"); |
this.barre5.setAttribute("style", "width: " + tailleBarre5 + "px;"); |
this.votants1.setInnerHTML("" + nullCestZero(occurrencesParNote.get(1))); |
this.votants2.setInnerHTML("" + nullCestZero(occurrencesParNote.get(2))); |
this.votants3.setInnerHTML("" + nullCestZero(occurrencesParNote.get(3))); |
this.votants4.setInnerHTML("" + nullCestZero(occurrencesParNote.get(4))); |
this.votants5.setInnerHTML("" + nullCestZero(occurrencesParNote.get(5))); |
} |
@Override |
public void ajouterAuParent(HasWidgets composite) { |
composite.add(this); |
} |
@Override |
public void afficherVotePrisEnCompte() { |
votePrisEnCompte.setStyleName("votePrisEnCompteOui"); |
animerVotePrisEnCompte.run(2000); |
} |
public HasWidgets getZoneFleur() { |
return zoneFleur; |
} |
public HasText getZoneProtocole() { |
return protocole; |
} |
public void setNoteGenerale(int note) { |
noteGenerale.setText(" : " + note); |
} |
@Override |
public void setNoteGeneraleToolTip(double valeurVoteTotalPrecise) { |
double valeurArrondie = (double)Math.round(valeurVoteTotalPrecise * 1000) / 1000; |
zoneFleur.setTitle(I18n.getVocabulary().votesMoyennePrecise()+valeurArrondie); |
} |
public void afficherVoteModifie() { |
voteModifie.setStyleName("votePrisEnCompteOui"); |
animerVoteModifie.run(2000); |
} |
@Override |
public void afficherVoteSupprime() { |
voteSupprime.setStyleName("voteSupprime"); |
animerVoteSupprime.run(2000); |
} |
public HasMouseMoveHandlers getZoneVoter() { |
return zoneVoter; |
} |
public void masquerZoneVoter() { |
zoneVoter.setVisible(false); |
} |
@Override |
public void desactiverInteractionVote() { |
votes.setReadOnly(true); |
boutonAnnuler.setEnabled(false); |
boutonAnnuler.addStyleName("elementMasque"); |
votes.addStyleName("elementMasque"); |
} |
@Override |
public void activerInteractionVote() { |
votes.setReadOnly(false); |
boutonAnnuler.setEnabled(true); |
boutonAnnuler.removeStyleName("elementMasque"); |
votes.removeStyleName("elementMasque"); |
} |
@Override |
public void afficherMessageVoteIdentifie(boolean peutVoter) { |
String message = I18n.getVocabulary().votez(); |
if(!peutVoter) { |
message = I18n.getVocabulary().identifiezVousPourVoter(); |
} |
zoneVoter.getElement().setInnerHTML("<span>"+message+" !</span>"); |
} |
} |
/branches/v1.12-aluminium/src/org/tela_botanica/del/client/composants/votes/barrerepartition/barreRepartition.css |
---|
New file |
0,0 → 1,93 |
.conteneurBarre { |
width:130px; |
display: inline; |
} |
.conteneurBarreOuiNon { |
display: inline; |
float: right; |
} |
.labelTaxon { |
float: left; |
margin-right: 5px; |
overflow: hidden; |
text-overflow: ellipsis; |
white-space: nowrap; |
width: 190px; |
margin-bottom: 5px; |
text-align:left; |
} |
.barre { |
width:50px; |
height:15px; |
background:#BBB; |
float:left; |
margin-right:2px; |
margin-left:2px; |
display: inline; |
float:left; |
} |
.pourcentage { |
position:absolute; |
font-size:10px; |
width:48px; |
text-align:center; |
} |
.barreOui { |
background:#8EB533; |
padding-bottom:15px; |
} |
.barreNon { |
background:#f06a6a; |
padding-bottom:15px; |
} |
.boutonOui, .boutonNon { |
text-align:center; |
color:white; |
line-height:1em; |
font-size:15px; |
font-weight:bold; |
cursor:pointer; |
float:left; |
background:#AAA; |
} |
.boutonOui { |
width:9%; |
height:15px; |
width:30px; |
border-radius:0 2px 2px 0; |
background-image: url("img/pouce_haut.png"); |
} |
.boutonOui:hover { |
background-image: url("img/pouce_haut_hover.png"); |
} |
.boutonNon:hover { |
background-image: url("img/pouce_bas_hover.png"); |
} |
.boutonNon { |
width:9%; |
height:15px; |
width:30px; |
border-radius:2px 0 0 2px; |
background-image: url("img/pouce_bas.png"); |
margin-right:5px; |
} |
.score { |
font-size:13px; |
color:#333; |
font-weight:bold; |
margin-right:10px; |
width:28px; |
} |
/branches/v1.12-aluminium/src/org/tela_botanica/del/client/composants/votes/barrerepartition/InfoBulleAnim.java |
---|
New file |
0,0 → 1,30 |
package org.tela_botanica.del.client.composants.votes.barrerepartition; |
import com.google.gwt.animation.client.Animation; |
import com.google.gwt.user.client.ui.Widget; |
public class InfoBulleAnim extends Animation{ |
private Widget widget; |
public InfoBulleAnim(Widget widget) { |
this.widget = widget; |
widget.setVisible(false); |
} |
@Override |
protected void onStart() { |
super.onStart(); |
widget.setVisible(true); |
} |
@Override |
protected void onUpdate(double progress) { |
} |
@Override |
protected void onComplete() { |
super.onComplete(); |
widget.setVisible(false); |
} |
} |
/branches/v1.12-aluminium/src/org/tela_botanica/del/client/composants/votes/barrerepartition/BarreRepartitionVoteVue.ui.xml |
---|
New file |
0,0 → 1,16 |
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> |
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" |
xmlns:g="urn:import:com.google.gwt.user.client.ui"> |
<ui:with field="constants" type="org.tela_botanica.del.client.i18n.Vocabulary" /> |
<ui:style src="barreRepartition.css" /> |
<g:HTMLPanel styleName="{style.conteneurBarre}"> |
<g:Label styleName="gauche {style.score}" ui:field="score">--</g:Label> |
<g:Label ui:field="nomTaxon" styleName="{style.labelTaxon} labelTaxon" /> |
<g:HTMLPanel styleName="{style.conteneurBarreOuiNon}"> |
<g:PushButton ui:field="boutonNon" text=" " styleName="{style.boutonNon}"/> |
<g:PushButton ui:field="boutonOui" text=" " styleName="{style.boutonOui}"/> |
<g:HTMLPanel ui:field="votePrisEnCompte"><g:Label text="{constants.votePrisEnCompte}"></g:Label></g:HTMLPanel> |
<g:HTMLPanel ui:field="voteModifie"><g:Label text="{constants.voteModifie}"></g:Label></g:HTMLPanel> |
</g:HTMLPanel> |
</g:HTMLPanel> |
</ui:UiBinder> |
/branches/v1.12-aluminium/src/org/tela_botanica/del/client/composants/votes/barrerepartition/BarreRepartitionVotePresenteur.java |
---|
New file |
0,0 → 1,171 |
package org.tela_botanica.del.client.composants.votes.barrerepartition; |
import java.util.Date; |
import org.tela_botanica.del.client.cache.CacheClient; |
import org.tela_botanica.del.client.modeles.MoyenneVote; |
import org.tela_botanica.del.client.modeles.PropositionDetermination; |
import org.tela_botanica.del.client.modeles.VoteDetermination; |
import org.tela_botanica.del.client.navigation.evenement.BusEvenementiel; |
import org.tela_botanica.del.client.navigation.evenement.voteDetermination.EvenementVoteDetermination; |
import org.tela_botanica.del.client.services.CalculVoteDeterminationService; |
import org.tela_botanica.del.client.services.rest.VoteDeterminationService; |
import org.tela_botanica.del.client.services.rest.async.AjoutVoteDeterminationCallback; |
import com.google.gwt.event.dom.client.ClickEvent; |
import com.google.gwt.event.dom.client.ClickHandler; |
import com.google.gwt.event.dom.client.HasClickHandlers; |
import com.google.gwt.user.client.Window; |
import com.google.gwt.user.client.ui.HasText; |
import com.google.gwt.user.client.ui.HasWidgets; |
import com.google.gwt.user.client.ui.IsWidget; |
public class BarreRepartitionVotePresenteur { |
public interface Vue extends IsWidget { |
public void afficherVotes(int pourcentage, String NomTaxon, String auteur, boolean estPropositionInitiale); |
public HasClickHandlers getBoutonOui(); |
public HasClickHandlers getBoutonNon(); |
public void desactiverBoutons(); |
public void activerBoutons(); |
public void setVoteOuiEffectue(); |
public void setVoteNonEffectue(); |
public void afficherVotePrisEnCompte(boolean b); |
public void afficherVoteModifie(boolean b); |
public void toggleNomEspece(); |
public HasText getScore(); |
} |
private Vue vue; |
private MoyenneVote moyenneVote; |
// TODO: classe conteneur qui est passé en paramètre au constructeur |
private VoteDeterminationService voteDeterminationService; |
public BarreRepartitionVotePresenteur(Vue vue, VoteDeterminationService voteDeterminationService) { |
this.vue = vue; |
this.voteDeterminationService = voteDeterminationService; |
gererEvenements(); |
} |
public void go(HasWidgets container) { |
container.add(vue.asWidget()); |
} |
public void afficherVotes(MoyenneVote moyenneVote) { |
this.moyenneVote = moyenneVote; |
int score = moyenneVote.getScore(); |
String intitule = moyenneVote.getIntituleAssocie(); |
PropositionDetermination proposition = moyenneVote.getPropositionAssociee(); |
boolean estPropositionInitiale = false; |
if (proposition != null) { |
estPropositionInitiale = moyenneVote.getPropositionAssociee().estPropositionInitiale(); |
} |
vue.afficherVotes(score, intitule, moyenneVote.getPropositionAssociee().getAuteur(), estPropositionInitiale); |
afficherValeurVoteUtilisateur(); |
} |
public void afficherValeurVoteUtilisateur() { |
String idUtilisateur = CacheClient.getInstance().getUtilisateur().getId(); |
if(moyenneVote.getPropositionAssociee().utilisateurAVotePourDetermination(idUtilisateur)) { |
boolean valeurVote = (moyenneVote.getPropositionAssociee().getVotesDeterminations().get(idUtilisateur).getVote() == 1) ? true : false; |
if(valeurVote) { |
vue.setVoteOuiEffectue(); |
} else { |
vue.setVoteNonEffectue(); |
} |
} |
} |
public Vue getBarreRepartitionVoteVue() { |
return vue; |
} |
public MoyenneVote getMoyenneVote() { |
return moyenneVote; |
} |
public void gererEvenements() { |
vue.getBoutonOui().addClickHandler(new ClickHandler() { |
@Override |
public void onClick(ClickEvent event) { |
voter(true); |
} |
}); |
vue.getBoutonNon().addClickHandler(new ClickHandler() { |
@Override |
public void onClick(ClickEvent event) { |
voter(false); |
} |
}); |
} |
private void surVoteDetermination(final VoteDetermination vd) { |
if (vd.getPropositionDetermination().equals(moyenneVote.getPropositionAssociee())) { |
AjoutVoteDeterminationCallback vdc = new AjoutVoteDeterminationCallback() { |
@Override |
public void surErreur(String messageErreur) { |
Window.alert(messageErreur); |
vue.activerBoutons(); |
} |
@Override |
public void surRetour(Void objetRetour) { |
moyenneVote.getPropositionAssociee().ajouterVoteDetermination(vd); |
moyenneVote = CalculVoteDeterminationService.calculerVoteDetermination(moyenneVote.getPropositionAssociee()); |
afficherVotes(moyenneVote); |
vue.activerBoutons(); |
boolean valeurVote = (vd.getVote() == 1) ? true : false; |
if(valeurVote) { |
vue.setVoteOuiEffectue(); |
} else { |
vue.setVoteNonEffectue(); |
} |
// l'évènement n'est lancé que si le vote est validé |
BusEvenementiel.getInstance().fireEvent(new EvenementVoteDetermination(vd)); |
} |
}; |
if (moyenneVote.getPropositionAssociee().utilisateurAVotePourDetermination(vd.getContributeur())) { |
voteDeterminationService.modifierVote(vd, vdc); |
vue.afficherVoteModifie(vd.getVote()==1); |
} else { |
voteDeterminationService.ajouterVote(vd, vdc); |
vue.afficherVotePrisEnCompte(vd.getVote()==1); |
} |
} |
} |
public void toggleNomEspece() { |
vue.toggleNomEspece(); |
} |
public void voter(boolean oui) { |
VoteDetermination vd = new VoteDetermination(); |
vd.setPropositionDetermination(moyenneVote.getPropositionAssociee()); |
vd.setContributeur(CacheClient.getInstance().getUtilisateur().getId()); |
vd.setDate(new Date()); |
int valeurVote = oui ? 1 : 0; |
vd.setVote(valeurVote); |
vd.setId(CacheClient.getInstance().getUtilisateur().getId()); |
if (oui) { |
vue.setVoteOuiEffectue(); |
} else { |
vue.setVoteNonEffectue(); |
} |
vue.desactiverBoutons(); |
surVoteDetermination(vd); |
} |
} |
/branches/v1.12-aluminium/src/org/tela_botanica/del/client/composants/votes/barrerepartition/BarreRepartitionVoteVue.java |
---|
New file |
0,0 → 1,126 |
package org.tela_botanica.del.client.composants.votes.barrerepartition; |
import org.tela_botanica.del.client.i18n.I18n; |
import com.google.gwt.core.client.GWT; |
import com.google.gwt.event.dom.client.HasClickHandlers; |
import com.google.gwt.uibinder.client.UiBinder; |
import com.google.gwt.uibinder.client.UiField; |
import com.google.gwt.user.client.ui.Composite; |
import com.google.gwt.user.client.ui.HasText; |
import com.google.gwt.user.client.ui.Label; |
import com.google.gwt.user.client.ui.Panel; |
import com.google.gwt.user.client.ui.PushButton; |
import com.google.gwt.user.client.ui.Widget; |
public class BarreRepartitionVoteVue extends Composite implements BarreRepartitionVotePresenteur.Vue { |
interface MyUiBinder extends UiBinder<Widget, BarreRepartitionVoteVue> { |
} |
private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); |
private InfoBulleAnim animerVotePrisEnCompte; |
private InfoBulleAnim animerVoteModifie; |
@UiField |
Label nomTaxon, score; |
@UiField |
Panel votePrisEnCompte, voteModifie; |
@UiField |
PushButton boutonOui, boutonNon; |
public BarreRepartitionVoteVue() { |
initWidget(uiBinder.createAndBindUi(this)); |
votePrisEnCompte.setVisible(false); |
voteModifie.setVisible(false); |
animerVotePrisEnCompte = new InfoBulleAnim(votePrisEnCompte); |
animerVoteModifie = new InfoBulleAnim(voteModifie); |
boutonOui.setTitle(I18n.getVocabulary().JeSuisDaccord()); |
boutonNon.setTitle(I18n.getVocabulary().JeNeSuisPasDaccord()); |
} |
@Override |
public void afficherVotes(int pourcentage, String nomTaxon, String auteur, boolean estPropositionInitiale) { |
this.nomTaxon.setText(nomTaxon); |
this.nomTaxon.setTitle(nomTaxon + " - " + auteur); |
score.setText(String.valueOf(pourcentage)); |
if (estPropositionInitiale) { |
this.nomTaxon.addStyleName("propositionInitiale"); |
} |
} |
@Override |
public HasClickHandlers getBoutonOui() { |
return boutonOui; |
} |
@Override |
public HasClickHandlers getBoutonNon() { |
return boutonNon; |
} |
@Override |
public void setVoteOuiEffectue() { |
boutonOui.setEnabled(false); |
boutonOui.addStyleName("boutonVoteOuiDesactive"); |
boutonNon.setEnabled(true); |
boutonNon.removeStyleName("boutonVoteNonDesactive"); |
boutonOui.setTitle(""); |
boutonNon.setTitle(I18n.getVocabulary().JeNeSuisPasDaccord()); |
} |
@Override |
public void setVoteNonEffectue() { |
boutonOui.setEnabled(true); |
boutonOui.removeStyleName("boutonVoteOuiDesactive"); |
boutonNon.setEnabled(false); |
boutonNon.addStyleName("boutonVoteNonDesactive"); |
boutonOui.setTitle(I18n.getVocabulary().JeSuisDaccord()); |
boutonNon.setTitle(""); |
} |
@Override |
public void afficherVotePrisEnCompte(boolean voteOui) { |
if (voteOui) { |
votePrisEnCompte.removeStyleName("votePrisEnCompteNon"); |
votePrisEnCompte.setStyleName("votePrisEnCompteOui"); |
} else { |
votePrisEnCompte.removeStyleName("votePrisEnCompteOui"); |
votePrisEnCompte.setStyleName("votePrisEnCompteNon"); |
} |
animerVotePrisEnCompte.run(2000); |
} |
public void afficherVoteModifie(boolean voteOui) { |
if (voteOui) { |
voteModifie.removeStyleName("votePrisEnCompteNon"); |
voteModifie.setStyleName("votePrisEnCompteOui"); |
} else { |
voteModifie.removeStyleName("votePrisEnCompteOui"); |
voteModifie.setStyleName("votePrisEnCompteNon"); |
} |
animerVoteModifie.run(2000); |
} |
@Override |
public void desactiverBoutons() { |
boutonNon.setEnabled(false); |
boutonOui.setEnabled(false); |
} |
@Override |
public void activerBoutons() { |
boutonNon.setEnabled(true); |
boutonOui.setEnabled(true); |
} |
@Override |
public void toggleNomEspece() { |
nomTaxon.setVisible(!nomTaxon.isVisible()); |
} |
@Override |
public HasText getScore() { |
return score; |
} |
} |
/branches/v1.12-aluminium/src/org/tela_botanica/del/client/composants/votes/details/ligneVote.css |
---|
New file |
0,0 → 1,9 |
.auteur { |
padding-right:10px; |
width:150px; |
} |
.colonne2:before { |
content:(' - '); |
} |
/branches/v1.12-aluminium/src/org/tela_botanica/del/client/composants/votes/details/DetailListeVotesDeterminationPresenteur.java |
---|
New file |
0,0 → 1,70 |
package org.tela_botanica.del.client.composants.votes.details; |
import java.util.HashMap; |
import org.tela_botanica.del.client.composants.presenteur.Presenteur; |
import org.tela_botanica.del.client.modeles.PropositionDetermination; |
import org.tela_botanica.del.client.modeles.VoteDetermination; |
import org.tela_botanica.del.client.services.rest.VoteDeterminationServiceConcret; |
import org.tela_botanica.del.client.services.rest.async.ListeVotesDeterminationCallback; |
import com.google.gwt.user.client.Window; |
import com.google.gwt.user.client.ui.HasWidgets; |
import com.google.gwt.user.client.ui.IsWidget; |
public class DetailListeVotesDeterminationPresenteur extends Presenteur { |
public interface Vue extends IsWidget { |
public void afficherVotes(PropositionDetermination propositionDetermination); |
void stopChargement(); |
void startChargement(); |
public void afficherAucuneDonnees(); |
} |
private Vue vue; |
public DetailListeVotesDeterminationPresenteur(Vue vue) { |
this.vue = vue; |
} |
public void go(HasWidgets container) { |
container.add(vue.asWidget()); |
} |
public void afficherVotes(final PropositionDetermination propositionDetermination) { |
vue.startChargement(); |
VoteDeterminationServiceConcret voteService = new VoteDeterminationServiceConcret(); |
voteService.consulterVotesPourPropositionDetermination(propositionDetermination, new ListeVotesDeterminationCallback() { |
@Override |
public void surErreur(String messageErreur) { |
Window.alert(messageErreur); |
vue.stopChargement(); |
} |
@Override |
public void surRetour(HashMap<String, VoteDetermination> votesComplets) { |
if (votesComplets != null && votesComplets.size() > 0) { |
for (VoteDetermination voteDetermination : votesComplets.values()) { |
voteDetermination.setPropositionDetermination(propositionDetermination); |
} |
propositionDetermination.setVotesDeterminations(votesComplets); |
vue.afficherVotes(propositionDetermination); |
vue.stopChargement(); |
} else { |
vue.afficherAucuneDonnees(); |
vue.stopChargement(); |
} |
} |
}); |
} |
@Override |
protected void gererEvenements() { |
// TODO Auto-generated method stub |
} |
} |
/branches/v1.12-aluminium/src/org/tela_botanica/del/client/composants/votes/details/DetailListeVotesDeterminationVue.java |
---|
New file |
0,0 → 1,144 |
package org.tela_botanica.del.client.composants.votes.details; |
import java.util.Date; |
import java.util.Iterator; |
import java.util.List; |
import java.util.Map; |
import org.tela_botanica.del.client.i18n.I18n; |
import org.tela_botanica.del.client.modeles.PropositionDetermination; |
import org.tela_botanica.del.client.modeles.VoteDetermination; |
import org.tela_botanica.del.client.utils.StringUtils; |
import com.google.gwt.core.client.GWT; |
import com.google.gwt.i18n.client.DateTimeFormat; |
import com.google.gwt.uibinder.client.UiBinder; |
import com.google.gwt.uibinder.client.UiField; |
import com.google.gwt.user.client.ui.Composite; |
import com.google.gwt.user.client.ui.HTML; |
import com.google.gwt.user.client.ui.HTMLPanel; |
import com.google.gwt.user.client.ui.HasWidgets; |
import com.google.gwt.user.client.ui.Label; |
import com.google.gwt.user.client.ui.Panel; |
import com.google.gwt.user.client.ui.Widget; |
public class DetailListeVotesDeterminationVue extends Composite implements DetailListeVotesDeterminationPresenteur.Vue { |
private static DetailListeVotesDeterminationVueUIiBinder uiBinder = GWT.create(DetailListeVotesDeterminationVueUIiBinder.class); |
interface DetailListeVotesDeterminationVueUIiBinder extends UiBinder<Widget, DetailListeVotesDeterminationVue> { |
}; |
@UiField |
HTMLPanel titre, auteur, aucuneDonnees, detailVotePour, detailVoteContre; |
@UiField |
Label scorePour, scoreContre, date; |
@UiField |
Panel panneauChargement; |
public DetailListeVotesDeterminationVue() { |
initWidget(uiBinder.createAndBindUi(this)); |
} |
public String formaterDate(String dateNonFormatee) { |
try { |
DateTimeFormat parseur = DateTimeFormat.getFormat("yyyy-dd-MM HH:mm:ss"); |
Date date = parseur.parse(dateNonFormatee); |
DateTimeFormat formateur = DateTimeFormat.getFormat("dd/MM/yyyy"); |
return formateur.format(date); |
} catch (IllegalArgumentException e) { |
return ""; |
} |
} |
public String formaterDateQuiEstVraimentUneDateEtPasUnString(Date dateNonFormatee) { |
String retour = ""; |
try { |
DateTimeFormat formateur = DateTimeFormat.getFormat("dd/MM/yyyy"); |
retour = formateur.format(dateNonFormatee); |
} catch (IllegalArgumentException e) { |
} |
return retour; |
} |
@Override |
public void afficherVotes(PropositionDetermination propositionDetermination) { |
HTML htmlTitre = new HTML(propositionDetermination.getEspece()); |
titre.add(htmlTitre); |
HTML htmlAuteur = new HTML(I18n.getVocabulary().proposePar()+propositionDetermination.getAuteur()); |
auteur.add(htmlAuteur); |
Date datePropDet = propositionDetermination.getDate(); |
String date = formaterDateQuiEstVraimentUneDateEtPasUnString(datePropDet); |
this.date.setText(date); |
Map<String, VoteDetermination> listeVotes = propositionDetermination.getVotesDeterminations(); |
int votesAnonymesPour = 0; |
int votesAnonymesContre = 0; |
float votesPour = 0; |
float totalVotes = listeVotes.size(); |
for (Iterator<String> iterator = listeVotes.keySet().iterator(); iterator.hasNext();) { |
VoteDetermination voteDetermination = listeVotes.get(iterator.next()); |
if (voteDetermination.getVote() == 1) { |
//Votes pour |
if (voteDetermination.getAuteur() != null) { |
ajouterVote(voteDetermination, detailVotePour); |
} else { |
votesAnonymesPour++; |
} |
votesPour++; |
} else { |
//Votes contre |
if (voteDetermination.getAuteur() != null) { |
ajouterVote(voteDetermination, detailVoteContre); |
} else { |
votesAnonymesContre++; |
} |
} |
} |
float moyennePour = (votesPour/totalVotes*100); |
scorePour.setText(StringUtils.formaterNombre(moyennePour, 2)+"%"); |
scoreContre.setText(StringUtils.formaterNombre(100 - moyennePour, 2)+"%"); |
if (votesAnonymesPour > 0) { |
LigneVotePresenteur presenteurVote= new LigneVotePresenteur(new LigneVoteVue(), votesAnonymesPour); |
presenteurVote.go(detailVotePour); |
} |
if (votesAnonymesContre > 0) { |
LigneVotePresenteur presenteurVote= new LigneVotePresenteur(new LigneVoteVue(), votesAnonymesContre); |
presenteurVote.go(detailVoteContre); |
} |
} |
public void ajouterVote(VoteDetermination vote, HasWidgets panel) { |
LigneVotePresenteur presenteurVote = new LigneVotePresenteur(new LigneVoteVue(), vote); |
presenteurVote.go(panel); |
} |
@Override |
public void startChargement() { |
panneauChargement.setHeight((this.getOffsetHeight()/2)+"px"); |
panneauChargement.setWidth((this.getOffsetWidth()/2)+"px"); |
panneauChargement.setVisible(true); |
} |
@Override |
public void stopChargement() { |
panneauChargement.setVisible(false); |
} |
@Override |
public void afficherAucuneDonnees() { |
aucuneDonnees.setVisible(true); |
} |
} |
/branches/v1.12-aluminium/src/org/tela_botanica/del/client/composants/votes/details/LigneVoteVue.ui.xml |
---|
New file |
0,0 → 1,12 |
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> |
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder' |
xmlns:g='urn:import:com.google.gwt.user.client.ui' |
xmlns:vues="urn:import:org.tela_botanica.del.client.composants.forum"> |
<ui:with field="constants" type="org.tela_botanica.del.client.i18n.Vocabulary" /> |
<ui:style src="ligneVote.css" /> |
<g:HTMLPanel styleName="nettoyage"> |
<g:Label ui:field="auteur" styleName="{style.auteur}"></g:Label> |
<g:Label ui:field="dateOuNb" styleName="{style.colonne2}"></g:Label> |
</g:HTMLPanel> |
</ui:UiBinder> |
/branches/v1.12-aluminium/src/org/tela_botanica/del/client/composants/votes/details/LigneVotePresenteur.java |
---|
New file |
0,0 → 1,59 |
package org.tela_botanica.del.client.composants.votes.details; |
import org.tela_botanica.del.client.composants.presenteur.Presenteur; |
import org.tela_botanica.del.client.i18n.I18n; |
import org.tela_botanica.del.client.modeles.VoteDetermination; |
import com.google.gwt.i18n.client.DateTimeFormat; |
import com.google.gwt.user.client.ui.HasWidgets; |
import com.google.gwt.user.client.ui.IsWidget; |
public class LigneVotePresenteur extends Presenteur { |
public interface Vue extends IsWidget { |
public void setAuteur(String auteur); |
public void setColonneDateEtNb(String date); |
} |
private Vue vue; |
private VoteDetermination vote; |
public LigneVotePresenteur(Vue vue, VoteDetermination vote) { |
this.vue = vue; |
this.vote = vote; |
afficherProposition(); |
} |
//Pour les votes anonymes |
public LigneVotePresenteur(Vue vue, int nbVotes) { |
this.vue = vue; |
vue.setAuteur(I18n.getMessages().etVotesAnonymes(String.valueOf(nbVotes))); |
} |
public void afficherProposition() { |
String nomAuteur = vote.getAuteur().getNomComplet(); |
if (nomAuteur == null || nomAuteur.equals("")) { |
nomAuteur = I18n.getVocabulary().utilisateurAnonyme(); |
} |
vue.setAuteur(nomAuteur); |
vue.setColonneDateEtNb(DateTimeFormat.getFormat("dd/MM/yyyy").format(vote.getDate())); |
} |
/** |
* Declenchement du présenteur |
*/ |
public void go(HasWidgets container) { |
container.add(vue.asWidget()); |
gererEvenements(); |
} |
protected void gererEvenements() { |
} |
} |
/branches/v1.12-aluminium/src/org/tela_botanica/del/client/composants/votes/details/LigneVoteVue.java |
---|
New file |
0,0 → 1,32 |
package org.tela_botanica.del.client.composants.votes.details; |
import com.google.gwt.core.client.GWT; |
import com.google.gwt.uibinder.client.UiBinder; |
import com.google.gwt.uibinder.client.UiField; |
import com.google.gwt.user.client.ui.Composite; |
import com.google.gwt.user.client.ui.Label; |
import com.google.gwt.user.client.ui.Widget; |
public class LigneVoteVue extends Composite implements LigneVotePresenteur.Vue { |
interface LigneVoteVueUiBinder extends UiBinder<Widget, LigneVoteVue> {}; |
private static LigneVoteVueUiBinder uiBinder = GWT.create(LigneVoteVueUiBinder.class); |
//Composants |
@UiField |
Label auteur, dateOuNb; |
public LigneVoteVue() { |
initWidget(uiBinder.createAndBindUi(this)); |
} |
@Override |
public void setAuteur(String auteur) { |
this.auteur.setText(auteur); |
} |
@Override |
public void setColonneDateEtNb(String date) { |
this.dateOuNb.setText(date); |
} |
} |
/branches/v1.12-aluminium/src/org/tela_botanica/del/client/composants/votes/details/detailListeVotesDeterminationVue.css |
---|
New file |
0,0 → 1,93 |
.conteneurTableauVotes { |
z-index: 1500; |
padding: 30px; |
padding-right: 21px; |
padding-top: 20px; |
background: white; |
width: 600px; |
margin: 0 auto; |
margin-top: 75px; |
padding-bottom:25px; |
} |
.chargement { |
padding-left: 165px; |
} |
.auteur { |
color: #6C6865; |
font-family: arial; |
font-size: 13px; |
letter-spacing: 0; |
line-height: 18px; |
text-transform: none; |
} |
.date { |
color: #6C6865; |
font-family: arial; |
font-size: 13px; |
letter-spacing: 0; |
line-height: 18px; |
text-transform: none; |
margin-left:3px |
} |
.dateLabel { |
color: #6C6865; |
font-family: arial; |
font-size: 13px; |
letter-spacing: 0; |
line-height: 18px; |
text-transform: none; |
margin-left:3px; |
text-transform:lowercase |
} |
.detailVotePour { |
width:250px; |
float:left; |
margin-bottom:15px |
} |
.detailVoteContre { |
width:250px; |
float:left; |
} |
.titreVotes div { |
font-size:16px; |
color:#8EB533; |
margin-bottom:5px; |
margin-right:15px; |
float:left; |
font-weight:bold; |
} |
.titreVotesContre div { |
color:#f06a6a; |
} |
.detailVotes { |
clear:left; |
} |
.detailVotes div { |
float:left; |
font-size:12px; |
margin-bottom:1px; |
} |
.espece { |
font-size: 15px; |
font-weight: bold; |
margin-right:3px; |
margin-bottom:10px; |
} |
.lignePonderation { |
margin-top:4px; |
margin-left:20px; |
} |
/branches/v1.12-aluminium/src/org/tela_botanica/del/client/composants/votes/details/DetailListeVotesDeterminationVue.ui.xml |
---|
New file |
0,0 → 1,46 |
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> |
<ui:UiBinder |
xmlns:ui='urn:ui:com.google.gwt.uibinder' |
xmlns:g='urn:import:com.google.gwt.user.client.ui' |
xmlns:vues="urn:import:org.tela_botanica.del.client.composants.forum"> |
<ui:with field="constants" type="org.tela_botanica.del.client.i18n.Vocabulary" /> |
<ui:style src="detailListeVotesDeterminationVue.css" /> |
<g:HTMLPanel styleName="{style.conteneurTableauVotes}"> |
<g:HorizontalPanel> <g:HTMLPanel ui:field='titre' styleName="{style.espece}" /> |
<g:HTMLPanel ui:field='auteur' styleName="{style.auteur}" /> |
<g:Label text="{constants.dateReleve}" styleName="{style.dateLabel}"></g:Label> |
<g:Label ui:field='date' styleName="{style.date}"></g:Label> |
</g:HorizontalPanel> |
<g:HTML><hr /></g:HTML> |
<g:HTMLPanel styleName="{style.detailVotePour}"> |
<g:HTMLPanel styleName="{style.titreVotes}"> |
<g:Label>Votes Pour</g:Label> |
<g:Label ui:field="scorePour">%</g:Label> |
</g:HTMLPanel> |
<g:HTMLPanel ui:field="detailVotePour" styleName="{style.detailVotes}"> |
</g:HTMLPanel> |
</g:HTMLPanel> |
<g:HTMLPanel styleName="{style.detailVoteContre}"> |
<g:HorizontalPanel styleName="{style.titreVotes} {style.titreVotesContre}"> |
<g:Label>Votes Contre</g:Label> |
<g:Label ui:field="scoreContre">%</g:Label> |
</g:HorizontalPanel> |
<g:HTMLPanel ui:field="detailVoteContre" styleName="{style.detailVotes}"> |
</g:HTMLPanel> |
</g:HTMLPanel> |
<g:HTML><hr class="nettoyage"/></g:HTML> |
<g:HTMLPanel ui:field="panneauChargement" styleName="{style.chargement}"> |
<g:Image url="./img/wait.gif"></g:Image> |
</g:HTMLPanel> |
<g:HTMLPanel ui:field="aucuneDonnees" visible="false"><g:Label text="{constants.aucunVoteEffectue}"></g:Label></g:HTMLPanel> |
<g:HTML> |
<br class="nettoyage" /> |
</g:HTML> |
<g:HTML styleName="petit aide">Ces votes permettent de confirmer ou non une détermination proposée par un membre du réseau. <br /> |
Vous pouvez changer à tout moment votre vote à l'aide de <img src="./img/pouce_bas.png" /> ou <img src="./img/pouce_haut.png" />. <br /> |
</g:HTML> |
<g:HTML styleName="{style.lignePonderation} petit">Une pondération s'opère pour le calcul des votes : vote en tant que membre identifié (3 points) / non identifié (1 point).</g:HTML> |
</g:HTMLPanel> |
</ui:UiBinder> |