Subversion Repositories eFlore/Applications.del

Compare Revisions

Ignore whitespace Rev 2167 → Rev 2171

/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/partageurl/partagerUrl.css
New file
0,0 → 1,39
.zonePartageUrl {
display:inline-block;
}
.zonePartage {
background:none repeat scroll 0 0 white;
border:2px solid #8EB533;
padding:10px 50px 10px 10px;
position:absolute;
}
.titre {
margin-top:0;
}
.partage {
background:none repeat scroll 0 0 #87A4F9;
border:medium none;
border-radius:10px 10px 10px 10px;
color:white;
cursor:pointer;
font-size:14px;
padding:4px 10px;
text-decoration:none;
width:130px;
}
.url {
width:90%;
margin-top:5px;
}
.fermer {
background:url("./img/close.png") no-repeat scroll 39px -2px transparent;
cursor:pointer;
font-size:11px;
margin-left:411px;
margin-top:-99px;
padding-bottom:8px;
padding-right:53px;
padding-top:5px;
position:absolute;
width:16px;
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/partageurl/PartageUrlVue.ui.xml
New file
0,0 → 1,22
<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="res" type="org.tela_botanica.del.client.resources.Ressources" />
<ui:with field="constants" type="org.tela_botanica.del.client.i18n.Vocabulary" />
 
<ui:style src="partagerUrl.css" />
<g:HTMLPanel>
<g:HTMLPanel>
<g:Label ui:field="partage" styleName="{style.partage}">Partager cette page</g:Label>
</g:HTMLPanel>
<g:HTMLPanel styleName="{style.zonePartage} ombre-faible" ui:field="zonePartage">
<g:Label styleName="titre {style.titre}">Partager cette page</g:Label>
<g:Label>Partager le résultat de votre recherche en copiant l'adresse ci-dessous :</g:Label>
<g:TextBox styleName="{style.url}" ui:field="url"></g:TextBox>
<g:Label ui:field="fermer" styleName="{style.fermer}">Fermer</g:Label>
</g:HTMLPanel>
</g:HTMLPanel>
</ui:UiBinder>
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/partageurl/PartageUrlPresenteur.java
New file
0,0 → 1,55
package org.tela_botanica.del.client.composants.partageurl;
 
import org.tela_botanica.del.client.cache.CacheClient;
 
import com.google.gwt.core.shared.GWT;
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.ui.HasWidgets;
import com.google.gwt.user.client.ui.IsWidget;
 
public class PartageUrlPresenteur {
 
public abstract interface Vue extends IsWidget {
public void ajouterVue(HasWidgets composite);
public void masquerFormulaire();
public void afficherFormulaire();
public HasClickHandlers getBoutonPartage();
public HasClickHandlers getFermer();
public void setUrl(String url);
}
 
private Vue vue;
 
public PartageUrlPresenteur(Vue vue) {
this.vue = vue;
vue.masquerFormulaire();
gererEvenements();
}
 
public void gererEvenements() {
vue.getFermer().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
vue.masquerFormulaire();
}
});
vue.getBoutonPartage().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
String url = CacheClient.getInstance().genererUrlCourante();
GWT.log("URL partagée :"+url);
vue.setUrl(url);
vue.afficherFormulaire();
}
});
}
public void go(HasWidgets composite) {
vue.ajouterVue(composite);
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/partageurl/PartageUrlVue.java
New file
0,0 → 1,55
package org.tela_botanica.del.client.composants.partageurl;
 
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.HasWidgets;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
 
public class PartageUrlVue extends Composite implements PartageUrlPresenteur.Vue{
 
@UiField Panel zonePartage;
@UiField Label fermer, partage;
@UiField TextBox url;
interface Binder extends UiBinder<Widget, PartageUrlVue> {}
private static Binder uiBinder = GWT.create(Binder.class);
public PartageUrlVue() {
initWidget(uiBinder.createAndBindUi(this));
}
 
@Override
public void ajouterVue(HasWidgets composite) {
composite.add(this.asWidget());
}
 
@Override
public void masquerFormulaire() {
zonePartage.setVisible(false);
}
 
@Override
public void afficherFormulaire() {
zonePartage.setVisible(true);
}
public HasClickHandlers getFermer() {
return fermer;
}
 
@Override
public HasClickHandlers getBoutonPartage() {
return partage;
}
public void setUrl(String url) {
this.url.setText(url);
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/rss/RssVue.ui.xml
New file
0,0 → 1,11
<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" />
 
<g:HTMLPanel>
<g:HTML ui:field="lien" styleName="lienRss"> LIEN RSS ></g:HTML>
</g:HTMLPanel>
</ui:UiBinder>
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/rss/RssPresenteur.java
New file
0,0 → 1,63
package org.tela_botanica.del.client.composants.rss;
 
import org.tela_botanica.del.client.composants.presenteur.Presenteur;
import org.tela_botanica.del.client.config.Config;
import org.tela_botanica.del.client.modeles.InformationsRecherche;
import org.tela_botanica.del.client.modeles.Observation;
 
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 RssPresenteur extends Presenteur {
 
// Définition de la vue
public abstract interface Vue extends IsWidget {
void setLien(String lien);
void setLabelLien(String label);
}
// Variables
private Vue vue;
private String lien = "";
private Config config = new Config();
//Constructeur
public RssPresenteur(Vue vue) {
this.vue = vue;
}
public RssPresenteur(Vue vue, InformationsRecherche recherche, String label) {
this.vue = vue;
vue.setLabelLien(label);
genererLien(recherche);
}
public RssPresenteur(Vue vue, Observation observation, String label) {
this.vue = vue;
vue.setLabelLien(label);
genererLien(observation);
}
public void genererLien(InformationsRecherche recherche) {
this.lien = config.getUrl("rss") + recherche.versChaineRequete();
gererEvenements();
}
public void genererLien(Observation observation) {
String idObs = observation.getId();
this.lien = config.getUrl("rss") + "&masque.observation=" + idObs;
}
@Override
public void go(HasWidgets composite) {
composite.add(vue.asWidget());
gererEvenements();
}
 
@Override
protected void gererEvenements() {
vue.setLien(this.lien);
}
 
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/rss/RssVue.java
New file
0,0 → 1,41
package org.tela_botanica.del.client.composants.rss;
 
import org.tela_botanica.del.client.composants.rss.RssPresenteur.Vue;
 
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.HTML;
import com.google.gwt.user.client.ui.Widget;
 
public class RssVue extends Composite implements Vue {
 
// Composants
@UiField
HTML lien;
// Variables
String label = "";
// Interface pour l'association au XML
interface Binder extends UiBinder<Widget, RssVue> {
}
 
private static Binder uiBinder = GWT.create(Binder.class);
// Constructeur de la vue
public RssVue() {
initWidget(uiBinder.createAndBindUi(this));
}
public void setLien(String lien) {
String lienHtml = "<a href=\"" + lien + "\" target=\"_blank\">" + label + "</a>";
this.lien.setHTML(lienHtml);
}
public void setLabelLien(String label) {
this.label = label;
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/votefleur/voteFleur.css
New file
0,0 → 1,23
.fleur {
width:28px;
height:27px;
}
 
.ZeroPetales {
background:url(./img/fleurs/fleur0.png);
}
.UnPetale {
background:url(./img/fleurs/fleur1.png);
}
.DeuxPetales {
background:url(./img/fleurs/fleur2.png);
}
.TroisPetales {
background:url(./img/fleurs/fleur3.png);
}
.QuatrePetales {
background:url(./img/fleurs/fleur4.png);
}
.CinqPetales {
background:url(./img/fleurs/fleur5.png);
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/votefleur/VoteFleurVue.ui.xml
New file
0,0 → 1,16
<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='res' type='org.tela_botanica.del.client.resources.Ressources'/>
<ui:with field="constants" type="org.tela_botanica.del.client.i18n.Vocabulary"/>
<ui:style src="voteFleur.css" />
 
<g:HTMLPanel>
<g:HTMLPanel ui:field="fleur0" styleName="{style.fleur} {style.ZeroPetales}"></g:HTMLPanel>
<g:HTMLPanel ui:field="fleur1" styleName="{style.fleur} {style.UnPetale}"></g:HTMLPanel>
<g:HTMLPanel ui:field="fleur2" styleName="{style.fleur} {style.DeuxPetales}"></g:HTMLPanel>
<g:HTMLPanel ui:field="fleur3" styleName="{style.fleur} {style.TroisPetales}"></g:HTMLPanel>
<g:HTMLPanel ui:field="fleur4" styleName="{style.fleur} {style.QuatrePetales}"></g:HTMLPanel>
<g:HTMLPanel ui:field="fleur5" styleName="{style.fleur} {style.CinqPetales}"></g:HTMLPanel>
</g:HTMLPanel>
</ui:UiBinder>
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/votefleur/VoteFleurPresenteur.java
New file
0,0 → 1,33
package org.tela_botanica.del.client.composants.votefleur;
 
import org.tela_botanica.del.client.composants.presenteur.Presenteur;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.IsWidget;
 
public class VoteFleurPresenteur extends Presenteur {
 
public interface Vue extends IsWidget {
public void setNote(int note);
}
 
private Vue vue;
 
public VoteFleurPresenteur(Vue vue) {
this.vue = vue;
}
 
public void go(HasWidgets composite) {
composite.clear();
composite.add(vue.asWidget());
}
public void setNote(int note) {
vue.setNote(note);
}
 
@Override
protected void gererEvenements() {
// TODO Auto-generated method stub
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/votefleur/VoteFleurVue.java
New file
0,0 → 1,56
package org.tela_botanica.del.client.composants.votefleur;
 
 
import org.tela_botanica.del.client.composants.votefleur.VoteFleurPresenteur.Vue;
 
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.HTMLPanel;
import com.google.gwt.user.client.ui.Widget;
 
public class VoteFleurVue extends Composite implements Vue {
 
// Annotation can be used to change the name of the associated xml file
// @UiTemplate("ObservationVue.ui.xml")
interface MyUiBinder extends UiBinder<Widget, VoteFleurVue> {
}
 
private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);
@UiField
protected HTMLPanel fleur0, fleur1, fleur2, fleur3, fleur4, fleur5;
 
public VoteFleurVue() {
// sets listBox
initWidget(uiBinder.createAndBindUi(this));
initialiserVue();
}
public void initialiserVue() {
this.fleur0.setVisible(false);
this.fleur1.setVisible(false);
this.fleur2.setVisible(false);
this.fleur3.setVisible(false);
this.fleur4.setVisible(false);
this.fleur5.setVisible(false);
}
 
public void setNote(int note) {
switch (note) {
case 0 : this.fleur0.setVisible(true);
break;
case 1 : this.fleur1.setVisible(true);
break;
case 2 : this.fleur2.setVisible(true);
break;
case 3 : this.fleur3.setVisible(true);
break;
case 4 : this.fleur4.setVisible(true);
break;
default : this.fleur5.setVisible(true);
break;
}
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/formulairerechercheeflore/FormulaireRechercheEfloreVue.ui.xml
New file
0,0 → 1,18
<!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="formulaireRechercheEflore.css" />
<g:VerticalPanel>
<g:Label text="{constants.comparer}" styleName="sousTitre"/>
<g:Label text="{constants.infoComparer}" styleName="petit"/>
<g:HTML><br /></g:HTML>
<g:HorizontalPanel >
<g:HTMLPanel ui:field="propositionTaxon" styleName="{style.propositionTaxon}" />
<g:Button text="{constants.ok}" ui:field="boutonValidationRechercheObservation" />
</g:HorizontalPanel>
</g:VerticalPanel>
 
</ui:UiBinder>
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/formulairerechercheeflore/FormulaireRechercheEflorePresenteur.java
New file
0,0 → 1,81
package org.tela_botanica.del.client.composants.formulairerechercheeflore;
 
import org.tela_botanica.del.client.cache.CacheClient;
import org.tela_botanica.del.client.composants.formulaires.autocompletion.AutoCompletionComboBoxPresenteur;
import org.tela_botanica.del.client.composants.formulaires.autocompletion.AutoCompletionComboBoxVue;
import org.tela_botanica.del.client.config.Config;
import org.tela_botanica.del.client.i18n.I18n;
import org.tela_botanica.del.client.navigation.evenement.BusEvenementiel;
import org.tela_botanica.del.client.navigation.evenement.comparaisoneflore.EvenementComparaisonEflore;
import org.tela_botanica.del.client.utils.InfosNomPourAutocompletion;
import org.tela_botanica.del.client.utils.UtilitairesAutoCompletionService;
 
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.http.client.Response;
import com.google.gwt.user.client.ui.HasWidgets;
 
public class FormulaireRechercheEflorePresenteur {
 
private FormulaireRechercheEfloreVue formulaireRechercheEfloreVue = new FormulaireRechercheEfloreVue();
 
private AutoCompletionComboBoxPresenteur autoCompletionNomTaxonsPresenteur;
 
public FormulaireRechercheEflorePresenteur() {
creerCompletionTaxons();
}
public void go(HasWidgets composite) {
autoCompletionNomTaxonsPresenteur.go(formulaireRechercheEfloreVue.getPropositionTaxon());
composite.add(formulaireRechercheEfloreVue);
gererEvenements();
}
 
private void gererEvenements() {
formulaireRechercheEfloreVue.getBoutonValidationRechercheObservation().addClickHandler(new ClickHandler() {
 
@Override
public void onClick(ClickEvent event) {
lancerRechercheEflore();
}
});
autoCompletionNomTaxonsPresenteur.getAutoCompletionComboBoxVue().getSuggestBoxHasKeyPressHandlers().addKeyPressHandler(new KeyPressHandler() {
@Override
public void onKeyPress(KeyPressEvent event) {
if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) {
lancerRechercheEflore();
}
}
});
}
 
private void creerCompletionTaxons() {
String url = new Config().getServiceBaseUrl() + "nomstaxons";
autoCompletionNomTaxonsPresenteur = new AutoCompletionComboBoxPresenteur(new AutoCompletionComboBoxVue(), url) {
protected String effectuerPreTraitementChaineRequete(String requete) {
requete = "?masque.nom=" + requete;
return UtilitairesAutoCompletionService.effectuerPreTraitementChaineRequeteGenreEspeceSlash(requete);
}
 
@Override
protected InfosNomPourAutocompletion[] parserResultatRequete(Response response) {
return UtilitairesAutoCompletionService.parserResultatRetourSimple(response);
}
};
}
 
private void lancerRechercheEflore() {
CacheClient.getInstance().setTaxonPourRechercheEflore(autoCompletionNomTaxonsPresenteur.getValeur());
EvenementComparaisonEflore evenementComparaisonEflore = new EvenementComparaisonEflore(autoCompletionNomTaxonsPresenteur.getValeur());
BusEvenementiel.getInstance().fireEvent(evenementComparaisonEflore);
}
 
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/formulairerechercheeflore/FormulaireRechercheEfloreVue.java
New file
0,0 → 1,38
package org.tela_botanica.del.client.composants.formulairerechercheeflore;
 
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.Button;
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.Widget;
 
public class FormulaireRechercheEfloreVue extends Composite {
 
@UiField(provided = true)
public Button boutonValidationRechercheObservation = new Button();
 
@UiField
public Panel propositionTaxon;
 
interface FormulaireRechercheEfloreUIiBinder extends UiBinder<Widget, FormulaireRechercheEfloreVue> {
};
 
FormulaireRechercheEfloreUIiBinder uiBinder = GWT.create(FormulaireRechercheEfloreUIiBinder.class);
 
public FormulaireRechercheEfloreVue() {
initWidget(uiBinder.createAndBindUi(this));
}
 
public Button getBoutonValidationRechercheObservation() {
return boutonValidationRechercheObservation;
}
public Panel getPropositionTaxon() {
return propositionTaxon;
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/formulairerechercheeflore/formulaireRechercheEflore.css
New file
0,0 → 1,4
.propositionTaxon {
width: 150px;
height: 30px;
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/observations/ObservationImagesVue.java
New file
0,0 → 1,101
package org.tela_botanica.del.client.composants.observations;
 
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.shared.HandlerRegistration;
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.Image;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.Widget;
 
public class ObservationImagesVue extends Composite implements ObservationImagesPresenteur.Vue {
 
// Gestion d'UiBinder
interface Binder extends UiBinder<Widget, ObservationImagesVue> {
}
 
private static Binder binder = GWT.create(Binder.class);
 
@UiField
protected Image photoPrincipale;
 
@UiField
protected Panel photos;
protected HTML lienPlateforme = new HTML(">>>");
 
private HandlerRegistration imgPrincipaleClicGestionnaire;
 
public ObservationImagesVue() {
initWidget(binder.createAndBindUi(this));
}
 
public void chargerImagePrincipale(org.tela_botanica.del.client.modeles.Image image) {
setUrlImagePrincipale(image.getUrlFormat("CRS"));
setTitreImagePrincipale(image.getUrlFormat("L"));
setAltTextImagePrincipale(image.getObservation().getAuteur() + " - " + image.getObservation().getNomRetenu());
}
 
@Override
public void ajouterPhoto(org.tela_botanica.del.client.modeles.Image imageCourante, ClickHandler gestionnaireClic) {
Image photo = new Image();
photo.setUrl(imageCourante.getUrlFormat("CRX2S"));
photo.setTitle(imageCourante.getUrlFormat("L"));
photo.setAltText("");
photo.addClickHandler(gestionnaireClic);
getPhotos().add(photo);
}
public void afficherLienPlateformeValidation(){
getPhotos().add(lienPlateforme);
lienPlateforme.setStyleName("suiteImages");
}
 
public void setUrlImagePrincipale(String url) {
photoPrincipale.setUrl(url);
}
 
public void setTitreImagePrincipale(String titre) {
photoPrincipale.setTitle(titre);
}
 
public void setAltTextImagePrincipale(String altText) {
photoPrincipale.setAltText(altText);
}
 
public String getUrlImagePrincipale() {
return photoPrincipale.getUrl();
}
 
public String getTitreImagePrincipale() {
return photoPrincipale.getTitle();
}
 
public String getAltTextImagePrincipale() {
return photoPrincipale.getAltText();
}
 
public Image getPhotoPrincipale() {
return photoPrincipale;
}
 
public Panel getPhotos() {
return photos;
}
 
public HTML getLienPlateforme() {
return lienPlateforme;
}
public HandlerRegistration setImgPrincipaleClicGestionnaire(ClickHandler gestionnaireClic) {
if (imgPrincipaleClicGestionnaire != null) {
imgPrincipaleClicGestionnaire.removeHandler();
}
imgPrincipaleClicGestionnaire = photoPrincipale.addClickHandler(gestionnaireClic);
return imgPrincipaleClicGestionnaire;
}
 
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/observations/observationimages.css
New file
0,0 → 1,21
.zonePhotos {
}
 
.photoPrincipale {
height: 250px;
float: left;
cursor: pointer
}
 
.photos {
float: left
}
 
.photos img {
display: block;
height: 40px;
width: 40px;
padding: 0 5px 5px 5px;
cursor: pointer
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/observations/ObservationImagesVue.ui.xml
New file
0,0 → 1,13
<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='res' type='org.tela_botanica.del.client.resources.Ressources' />
<ui:with field="constants" type="org.tela_botanica.del.client.i18n.Vocabulary" />
<ui:style src="observationimages.css" />
<g:HTMLPanel styleName="{style.zonePhotos}">
<g:Image ui:field="photoPrincipale" styleName="{style.photoPrincipale}"/>
<g:HTMLPanel ui:field="photos" styleName="{style.photos}"></g:HTMLPanel>
</g:HTMLPanel>
</ui:UiBinder>
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/observations/ObservationImagesPresenteur.java
New file
0,0 → 1,151
package org.tela_botanica.del.client.composants.observations;
 
import java.util.List;
 
import org.tela_botanica.del.client.cache.CacheClient;
import org.tela_botanica.del.client.composants.fenetreoverlay.FenetreOverlayDefilantePresenteur;
import org.tela_botanica.del.client.composants.fenetreoverlay.FenetreOverlayDefilanteVue;
import org.tela_botanica.del.client.composants.images.DetailImagePresenteur;
import org.tela_botanica.del.client.composants.images.DetailImageVue;
import org.tela_botanica.del.client.composants.presenteur.Presenteur;
import org.tela_botanica.del.client.config.Config;
import org.tela_botanica.del.client.modeles.Image;
import org.tela_botanica.del.client.modeles.Observation;
import org.tela_botanica.del.client.navigation.evenement.BusEvenementiel;
import org.tela_botanica.del.client.navigation.evenement.changementimagevalidation.EvenementChangementImageValidation;
import org.tela_botanica.del.client.navigation.evenement.changementimagevalidation.GestionnaireEvenementChangementImageValidation;
import org.tela_botanica.del.client.navigation.evenement.validationobservation.EvenementValidation;
 
import com.google.gwt.core.client.GWT;
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.shared.HandlerRegistration;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.IsWidget;
 
public class ObservationImagesPresenteur extends Presenteur {
 
public abstract interface Vue extends IsWidget {
public HasClickHandlers getPhotoPrincipale();
 
public HasWidgets getPhotos();
 
public void chargerImagePrincipale(org.tela_botanica.del.client.modeles.Image image);
 
public void ajouterPhoto(Image image, ClickHandler gestionnaireClic);
 
public void afficherLienPlateformeValidation();
 
public HTML getLienPlateforme();
public HandlerRegistration setImgPrincipaleClicGestionnaire(ClickHandler gestionnaireClic);
}
 
private Vue vue;
 
private Observation observation;
 
private Image imagePrincipale;
 
private List<Image> listeImages;
public ObservationImagesPresenteur(Vue vue, Observation observation, Image imagePrincipale) {
this.observation = observation;
this.vue = vue;
this.imagePrincipale = imagePrincipale;
}
 
public void chargerImagesObservation() {
listeImages = observation.getImages();
if (imagePrincipale != null) {
vue.chargerImagePrincipale(imagePrincipale);
vue.setImgPrincipaleClicGestionnaire(creerGestionnaireClicGalerieImages(0, imagePrincipale));
}
 
String urlCourante = Window.Location.getHref();
Config config = new Config();
String urlAppliObs = config.getUrl("identiplante");
int indexImage = 0;
for (Image imageCourante : listeImages) {
vue.ajouterPhoto(imageCourante, creerGestionnaireClicChangementImagePrincipale(indexImage, imageCourante));
indexImage++;
 
if (urlCourante.contains(urlAppliObs) && indexImage >= 5) {
vue.afficherLienPlateformeValidation();
break;
}
}
}
 
public void go(HasWidgets composite) {
composite.add(vue.asWidget());
chargerImagesObservation();
gererEvenements();
}
 
protected void gererEvenements() {
vue.getLienPlateforme().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent arg0) {
BusEvenementiel.getInstance().fireEvent(new EvenementValidation(observation));
}
});
 
BusEvenementiel.getInstance().addHandler(EvenementChangementImageValidation.TYPE, new GestionnaireEvenementChangementImageValidation() {
@Override
public void onChangementImage(EvenementChangementImageValidation event) {
if (CacheClient.getInstance().getImageCourante().getObservation().getId().equals(observation.getId())) {
GWT.log("Reception event Chgmt img index :"+event.indexImage);
vue.chargerImagePrincipale(CacheClient.getInstance().getImageCourante());
vue.setImgPrincipaleClicGestionnaire(creerGestionnaireClicGalerieImages(event.indexImage, imagePrincipale));
}
}
});
}
 
protected ClickHandler creerGestionnaireClicGalerieImages(final int indexImage, final Image imageCourante) {
ClickHandler gestionnaireClic = new ClickHandler() {
public void onClick(ClickEvent event) {
FenetreOverlayDefilantePresenteur presenteurGalerie = new FenetreOverlayDefilantePresenteur(indexImage, new FenetreOverlayDefilanteVue()) {
 
@Override
public void surClicBoutonSuivant() {
int index = getIndexElementAffiche() + 1;
if (index >= listeImages.size()) {
index = 0;
}
setContenuFenetreModale(index, new DetailImagePresenteur(listeImages.get(index), new DetailImageVue()));
}
 
@Override
public void surClicBoutonPrecedent() {
int index = getIndexElementAffiche() - 1;
if (index < 0) {
index = listeImages.size() - 1;
}
setContenuFenetreModale(index, new DetailImagePresenteur(listeImages.get(index), new DetailImageVue()));
}
};
presenteurGalerie.ouvrirFenetreModaleDefilante(indexImage, new DetailImagePresenteur(listeImages.get(indexImage), new DetailImageVue()));
presenteurGalerie.afficherBoutonsSuivantsPrecedents((listeImages.size() > 1));
}
};
return gestionnaireClic;
}
 
protected ClickHandler creerGestionnaireClicChangementImagePrincipale(final int indexImage, final Image imageCourante) {
ClickHandler gestionnaireClic = new ClickHandler() {
public void onClick(ClickEvent event) {
CacheClient.getInstance().setImageCourante(imageCourante);
EvenementChangementImageValidation chgmtImgEvent = new EvenementChangementImageValidation();
chgmtImgEvent.indexImage = indexImage;
BusEvenementiel.getInstance().fireEvent(chgmtImgEvent);
}
};
return gestionnaireClic;
}
 
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/motsclesimages/propositions/MotClePropositionVue.ui.xml
New file
0,0 → 1,14
<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:generateLocales="default">
<ui:with field="constants" type="org.tela_botanica.del.client.i18n.Vocabulary" />
 
<ui:style src="MotCleProposition.css" />
<g:FocusPanel styleName="{style.lienMotCle} gauche motclesPicto" ui:field="lienMotCle" title="{constants.aideLiaisonMotCle}">
<g:HTMLPanel>
<g:CheckBox ui:field="ajouterMotCle" text="motcle" styleName=" {style.motCle} texteMotClePicto"></g:CheckBox>
<g:Image styleName="{style.logoTag}" ui:field="iconeTag"/>
</g:HTMLPanel>
</g:FocusPanel>
</ui:UiBinder>
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/motsclesimages/propositions/MotClePropositionPresenteur.java
New file
0,0 → 1,81
package org.tela_botanica.del.client.composants.motsclesimages.propositions;
 
import org.tela_botanica.del.client.composants.presenteur.Presenteur;
 
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.ui.HasWidgets;
import com.google.gwt.user.client.ui.IsWidget;
 
public class MotClePropositionPresenteur extends Presenteur{
 
public interface Vue extends IsWidget {
public void setMotCle(String motcle);
public HasClickHandlers getLienMotCle();
public void toggleCb();
public boolean estAAjouter();
public void setEstAAjouter();
public HasClickHandlers getAjouterMotCle();
}
private Vue vue;
private String motcle;
public MotClePropositionPresenteur(Vue vue, String motCle) {
this.vue = vue;
this.motcle = motCle;
vue.setMotCle(motCle);
}
@Override
public void go(HasWidgets composite) {
composite.add(vue.asWidget());
gererEvenements();
}
 
@Override
protected void gererEvenements() {
/* Attention : dans la gestion des évènements, comme la case à cocher est contenu dans
* le lien Mot Cle, lorsque je clique sur la case directement, l'application :
* - change la valeur de la case suite à l'évènement sur la case
* - rechange la valeur de la case suite à l'évènement sur le lien
* Il est donc impossible de changer la valeur de la case !
*
* La solution consiste à ajouter un changement de valeur lorsqu'on clique sur la case :
*/
vue.getAjouterMotCle().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
vue.toggleCb();
event.stopPropagation();
}
});
// Ajout du changement de valeur de la case lors du clic sur la case
vue.getLienMotCle().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
vue.toggleCb();
event.stopPropagation();
}
});
}
 
public boolean estAAjouter() {
return vue.estAAjouter();
}
public void setEstAAjouter() {
vue.setEstAAjouter();
}
public String getTag() {
return this.motcle;
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/motsclesimages/propositions/MotClePropositionVue.java
New file
0,0 → 1,68
package org.tela_botanica.del.client.composants.motsclesimages.propositions;
 
import org.tela_botanica.del.client.config.Config;
 
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.Window;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FocusPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.Widget;
 
public class MotClePropositionVue extends Composite implements MotClePropositionPresenteur.Vue {
@UiField
CheckBox ajouterMotCle;
@UiField
Image iconeTag;
@UiField
FocusPanel lienMotCle;
interface MyUiBinder extends UiBinder<Widget, MotClePropositionVue> {}
private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);
 
public MotClePropositionVue() {
// sets listBox
initWidget(uiBinder.createAndBindUi(this));
}
 
@Override
public void setMotCle(String motcle) {
ajouterMotCle.setText(motcle);
iconeTag.setUrl((new Config()).getUrl("iconeBaseUrl") + motcle + ".png");
}
public HasClickHandlers getLienMotCle() {
return lienMotCle;
}
public void toggleCb() {
boolean val = ajouterMotCle.getValue();
ajouterMotCle.setValue(!ajouterMotCle.getValue());
if(ajouterMotCle.getValue()) {
addStyleName("motClePictoCoche");
} else {
removeStyleName("motClePictoCoche");
}
}
public boolean estAAjouter() {
return ajouterMotCle.getValue();
}
public void setEstAAjouter() {
ajouterMotCle.setValue(true);
addStyleName("motClePictoCoche");
}
public HasClickHandlers getAjouterMotCle() {
return ajouterMotCle;
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/motsclesimages/propositions/MotCleProposition.css
New file
0,0 → 1,21
.logoTag {
width:30px;
height:30px;
margin:0 5px;
float:right;
}
 
.motCle {
width:80px;
margin:5px;
cursor:pointer;
}
 
.lienMotCle {
background: none repeat scroll 0 0 #DDDDDD;
border-radius: 9px 9px 9px 9px;
height: 40px;
margin: 2px;
padding: 3px;
width: 160px;
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/motsclesimages/MotsClesImagePresenteur.java
New file
0,0 → 1,255
package org.tela_botanica.del.client.composants.motsclesimages;
 
import java.util.ArrayList;
import java.util.List;
 
import org.tela_botanica.del.client.cache.CacheClient;
import org.tela_botanica.del.client.composants.motsclesimages.formulairesaisiemotclesimages.FormulaireSaisieMotsClesImagePresenteur;
import org.tela_botanica.del.client.composants.motsclesimages.motcle.MotClePresenteur;
import org.tela_botanica.del.client.composants.motsclesimages.motcle.MotCleVue;
import org.tela_botanica.del.client.composants.motsclesimages.propositions.MotClePropositionPresenteur;
import org.tela_botanica.del.client.composants.motsclesimages.propositions.MotClePropositionVue;
import org.tela_botanica.del.client.composants.presenteur.Presenteur;
import org.tela_botanica.del.client.i18n.I18n;
import org.tela_botanica.del.client.modeles.Image;
import org.tela_botanica.del.client.modeles.MotCle;
import org.tela_botanica.del.client.navigation.evenement.BusEvenementiel;
import org.tela_botanica.del.client.navigation.evenement.ajoutmotcleimage.EvenementAjoutMotCleImage;
import org.tela_botanica.del.client.navigation.evenement.ajoutmotcleimage.GestionnaireEvenementAjoutMotCleImage;
import org.tela_botanica.del.client.navigation.evenement.fermermotcleimage.EvenementFermerMotCleImage;
import org.tela_botanica.del.client.navigation.evenement.supressionmotcleimage.EvenementSuppressionMotCleImage;
import org.tela_botanica.del.client.navigation.evenement.supressionmotcleimage.GestionnaireEvenementSuppressionMotCleImage;
import org.tela_botanica.del.client.services.rest.MotsClesService;
import org.tela_botanica.del.client.services.rest.MotsClesServiceConcret;
import org.tela_botanica.del.client.services.rest.async.AjoutMotsClesImageCallback;
import org.tela_botanica.del.client.services.rest.async.ListeMotsClesImageCallBack;
import org.tela_botanica.del.client.services.rest.async.SuppressionMotCleImageCallback;
import org.tela_botanica.del.client.utils.StringUtils;
 
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.HasWidgets;
import com.google.gwt.user.client.ui.IsWidget;
 
public class MotsClesImagePresenteur extends Presenteur {
 
Image image;
List<MotCle> motsCles;
List<String> motClesProtocoleAFiltrer = new ArrayList<String>();
FormulaireSaisieMotsClesImagePresenteur formulaireSaisieMotsClesPresenteur;
final List<MotClePropositionPresenteur> presenteursMotsCles = new ArrayList<MotClePropositionPresenteur>();
MotsClesService motsClesService;
int nbRetours = 0;
int retourCourant = 0;
int nb = 0;
//Déclaration de la vue
public interface Vue extends IsWidget {
public HasWidgets getZoneMotsCles();
 
HasWidgets getZoneSaisieMotsCles();
 
void viderZoneMotsCles();
 
HasWidgets getZoneMotsClesCel();
 
public void afficherMotsClesProtocole(List<String> motsClesCelImages, List<String> motClesCelAFiltrer);
 
public void setImage(String url);
 
public HasWidgets getZoneIconesMotsCles();
 
public HasClickHandlers getValiderMotCles();
}
 
private Vue vue;
 
// Constructeur de l'application
public MotsClesImagePresenteur(Image image, MotsClesService motsClesService, FormulaireSaisieMotsClesImagePresenteur formulaireSaisieMotsClesPresenteur, Vue vue) {
this.formulaireSaisieMotsClesPresenteur = formulaireSaisieMotsClesPresenteur;
this.vue = vue;
this.motsClesService = motsClesService;
this.image = image;
vue.setImage(image.getUrl());
initialiserMotsClesProtocoleAFiltrer();
afficherMotsClesProtocole();
gererEvenements();
}
 
//Afficher la vue
public void go(HasWidgets composite) {
formulaireSaisieMotsClesPresenteur.go(vue.getZoneSaisieMotsCles());
composite.add(vue.asWidget());
}
 
protected boolean cocherMotClePropositionPresenteur(String motcle) {
boolean motCleCoche = false;
for (MotClePropositionPresenteur presenteurCourant : presenteursMotsCles) {
String tagCourant = presenteurCourant.getTag();
if (tagCourant.equals(motcle)) {
presenteurCourant.setEstAAjouter();
motCleCoche = true;
}
}
return motCleCoche;
}
//Charger les mots clés à l'aide du service
public void chargerMotsCles() {
if (motsCles == null) {
vue.viderZoneMotsCles();
MotsClesService motsClesService = new MotsClesServiceConcret();
motsClesService.getMotsClesImage(image.getIdImage(),
new ListeMotsClesImageCallBack() {
@Override
public void surRetour(List<MotCle> objetRetour) {
motsCles = objetRetour;
afficherMotsCles(objetRetour);
}
});
}
}
 
 
protected void afficherMotsCles(List<MotCle> listeMotsCles) {
this.motsCles = listeMotsCles;
nbRetours = listeMotsCles.size();
Object[] tabMotsCles = motsCles.toArray();
for (int i = 0; i < motsCles.toArray().length; i++) {
MotCle motCleEnCours = (MotCle) tabMotsCles[i];
if (!cocherMotClePropositionPresenteur(motCleEnCours.getMotCle())) {
MotClePresenteur mcP = new MotClePresenteur(new MotCleVue(motCleEnCours.getMotCle()), motCleEnCours.getMotCle(), motCleEnCours.getIdMotCle()) {
public void surSuppression(String idMotCle) {
if (Window.confirm(I18n.getVocabulary().indiceSupprimerMotCle() + " ?")) {
motsClesService.supprimerMotCleImage(idMotCle, new SuppressionMotCleImageCallback() {
@Override
public void surRetour(String objetRetour) {
motsCles = null;
chargerMotsCles();
}
});
}
};
};
mcP.go(vue.getZoneMotsCles());
}
}
}
 
protected void afficherMotsClesProtocole() {
List<String> motsClesCelImages = image.getMotsClefs();
vue.afficherMotsClesProtocole(motsClesCelImages, motClesProtocoleAFiltrer);
}
 
// Mettre le focus sur le champ de saisie, appelé par le module pictoflora
public void focuserChampsSaisie() {
formulaireSaisieMotsClesPresenteur.focuserChampSaisie();
}
 
protected void initialiserMotsClesProtocoleAFiltrer() {
//TODO voir si le cache client est bien approprié plutot que passer les infos
// de protocole dans le constructeur
String chaineMotsClesCelAFiltrer = CacheClient.getInstance().getProtocoleCourant().getMotsClesProtocole();
this.motClesProtocoleAFiltrer = new ArrayList<String>();
String[] tabMotsClesCelAFiltrer = chaineMotsClesCelAFiltrer.split(",");
if(tabMotsClesCelAFiltrer.length > 0 && !tabMotsClesCelAFiltrer[0].trim().isEmpty()) {
for (int i = 0; i < tabMotsClesCelAFiltrer.length; i++) {
String motCle = StringUtils.normaliser(tabMotsClesCelAFiltrer[i]);
this.motClesProtocoleAFiltrer.add(motCle);
// ajouter à la vue
MotClePropositionPresenteur presenteurMotCle = new MotClePropositionPresenteur(new MotClePropositionVue(), motCle);
presenteurMotCle.go(vue.getZoneIconesMotsCles());
presenteursMotsCles.add(presenteurMotCle);
}
}
}
/***
* trouver le mot cle dans les mots clés d'origine
* @param String motcle le mot à chercher
* @return MotCle l'objet trouvé
**/
protected MotCle trouverMotCleDorigine(String motCle) {
MotCle motCleRetour = null;
for (MotCle motCleCourant : motsCles) {
String tagCourant = motCleCourant.getMotCle();
if (tagCourant.equals(motCle)) {
motCleRetour = motCleCourant;
}
}
return motCleRetour;
}
//Gérer les évènements
protected void gererEvenements() {
BusEvenementiel.getInstance().addHandler(EvenementAjoutMotCleImage.TYPE, new GestionnaireEvenementAjoutMotCleImage() {
@Override
public void onAjoutMotCleImage(EvenementAjoutMotCleImage event) {
if (image != null && image.getIdImage() != null && image.getIdImage().equals(event.getIdImage())) {
motsCles = null;
chargerMotsCles();
formulaireSaisieMotsClesPresenteur.viderChampSaisie();
}
}
});
 
BusEvenementiel.getInstance().addHandler(EvenementSuppressionMotCleImage.TYPE, new GestionnaireEvenementSuppressionMotCleImage() {
@Override
public void onSuppressionMotCleImage(
EvenementSuppressionMotCleImage event) {
if (image != null && image.getIdImage() != null && image.getIdImage().equals(event.getIdImage())) {
motsCles = null;
chargerMotsCles();
}
}
});
vue.getValiderMotCles().addClickHandler(new ClickHandler() {
 
@Override
public void onClick(ClickEvent event) {
 
MotsClesService motsClesService = new MotsClesServiceConcret();
// récupérer les valeur de toutes les cases à cocher
for (MotClePropositionPresenteur presenteur : presenteursMotsCles) {
if (presenteur.estAAjouter()) {
String tag = presenteur.getTag();
MotCle motcle = trouverMotCleDorigine(tag);
if (motcle == null) {
motsClesService.ajouterMotCleImage(image.getIdImage(), tag, new AjoutMotsClesImageCallback() {
@Override
public void surRetour(Void objetRetour) {
}
});
}
} else {
// il faut vérifier que le mot clé est à supprimer
String tag = presenteur.getTag();
MotCle motcle = trouverMotCleDorigine(tag);
if (motcle != null) {
motsClesService.supprimerMotCleImage(motcle.getIdMotCle(), new SuppressionMotCleImageCallback() {
@Override
public void surRetour(String objetRetour) {
}
});
}
}
}
if (nb == 0) {
BusEvenementiel.getInstance().fireEvent(new EvenementFermerMotCleImage(image.getIdImage()));
nb++;
}
 
}
});
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/motsclesimages/MotsClesImageVue.java
New file
0,0 → 1,91
package org.tela_botanica.del.client.composants.motsclesimages;
 
import java.util.Iterator;
import java.util.List;
 
import org.tela_botanica.del.client.utils.StringUtils;
 
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.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.InlineHTML;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.Widget;
 
public class MotsClesImageVue extends Composite implements MotsClesImagePresenteur.Vue {
@UiField
Panel motsCles, motsClesCel, saisieMotsCles, zoneIconesMotsCles;
 
@UiField
Image image;
@UiField
Button validerMotsCles;
interface MyUiBinder extends UiBinder<Widget, MotsClesImageVue> {
}
 
private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);
 
public MotsClesImageVue() {
// sets listBox
initWidget(uiBinder.createAndBindUi(this));
}
@Override
public void viderZoneMotsCles() {
motsCles.clear();
}
 
@Override
public HasWidgets getZoneMotsCles() {
return motsCles;
}
@Override
public HasWidgets getZoneMotsClesCel() {
return motsClesCel;
}
@Override
public HasWidgets getZoneSaisieMotsCles() {
return saisieMotsCles;
}
 
@Override
public void afficherMotsClesProtocole(List<String> motsClesCelImages, List<String> motsClesCelAFiltrer) {
for (Iterator<String> iterator = motsClesCelImages.iterator(); iterator
.hasNext();) {
String mot = (String) iterator.next();
String motNormalise = StringUtils.normaliser(mot);
if(!mot.trim().isEmpty() && motsClesCelAFiltrer.contains(StringUtils.normaliser(motNormalise))) {
HTML motCle = new InlineHTML(mot);
motCle.setStyleName("motCleCel");
motsClesCel.add(motCle);
}
}
}
 
@Override
public void setImage(String url) {
image.setUrl(url);
}
@Override
public HasWidgets getZoneIconesMotsCles() {
return zoneIconesMotsCles;
}
public HasClickHandlers getValiderMotCles() {
return validerMotsCles;
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/motsclesimages/formulairesaisiemotclesimages/FormulaireSaisieMotsClesImageVue.java
New file
0,0 → 1,52
package org.tela_botanica.del.client.composants.motsclesimages.formulairesaisiemotclesimages;
 
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.event.dom.client.HasKeyPressHandlers;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HasText;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
 
public class FormulaireSaisieMotsClesImageVue extends Composite implements FormulaireSaisieMotsClesImagePresenteur.Vue {
@UiField
public TextBox saisieMotsCles;
@UiField
public Button valider;
 
interface MyUiBinder extends UiBinder<Widget, FormulaireSaisieMotsClesImageVue> {
}
 
private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);
 
public FormulaireSaisieMotsClesImageVue() {
// sets listBox
initWidget(uiBinder.createAndBindUi(this));
}
 
@Override
public HasClickHandlers getBoutonValider() {
return valider;
}
@Override
public HasText getSaisieMotsCles() {
return saisieMotsCles;
}
@Override
public HasKeyPressHandlers getSaisieMotsClesHasKeyPressHandlers() {
return saisieMotsCles;
}
 
@Override
public void focuserChampSaisie() {
saisieMotsCles.setFocus(true);
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/motsclesimages/formulairesaisiemotclesimages/FormulaireMotsClesImage.css
New file
0,0 → 1,16
.espece {
font-size: 12px;
font-weight: bold;
color: white;
padding-left: 5px;
padding-right: 1px;
}
 
.aideSaisie p {
padding: 0px;
margin: 0px;
overflow: hidden;
text-overflow: ellipsis;
white-space: pre;
min-height: 13px;
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/motsclesimages/formulairesaisiemotclesimages/FormulaireSaisieMotsClesImageVue.ui.xml
New file
0,0 → 1,15
<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='res' type='org.tela_botanica.del.client.resources.Ressources' />
<ui:with field="constants" type="org.tela_botanica.del.client.i18n.Vocabulary" />
 
<ui:style src="FormulaireMotsClesImage.css" />
<g:HTMLPanel>
<g:HTML styleName="petit {style.aideSaisie}" text="{constants.aideSaisieMotCle}"></g:HTML>
<g:TextBox ui:field="saisieMotsCles"></g:TextBox>
<g:Button text="{constants.ok}" ui:field="valider"></g:Button>
</g:HTMLPanel>
</ui:UiBinder>
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/motsclesimages/formulairesaisiemotclesimages/FormulaireSaisieMotsClesImagePresenteur.java
New file
0,0 → 1,81
package org.tela_botanica.del.client.composants.motsclesimages.formulairesaisiemotclesimages;
 
import org.tela_botanica.del.client.navigation.evenement.BusEvenementiel;
import org.tela_botanica.del.client.navigation.evenement.ajoutmotcleimage.EvenementAjoutMotCleImage;
import org.tela_botanica.del.client.services.rest.MotsClesService;
import org.tela_botanica.del.client.services.rest.async.AjoutMotsClesImageCallback;
 
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.HasKeyPressHandlers;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
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 FormulaireSaisieMotsClesImagePresenteur {
private MotsClesService motsClesService;
private String idImage;
 
public interface Vue extends IsWidget {
public HasClickHandlers getBoutonValider();
public HasText getSaisieMotsCles();
public HasKeyPressHandlers getSaisieMotsClesHasKeyPressHandlers();
public void focuserChampSaisie();
}
 
private Vue vue;
public FormulaireSaisieMotsClesImagePresenteur(String idImage, MotsClesService motsClesService, Vue vue) {
this.vue = vue;
this.motsClesService = motsClesService;
this.idImage = idImage;
gererEvenements();
}
public void go(HasWidgets composite) {
composite.add(vue.asWidget());
}
private void gererEvenements() {
vue.getBoutonValider().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
validerSaisie();
}
});
vue.getSaisieMotsClesHasKeyPressHandlers().addKeyPressHandler(new KeyPressHandler() {
public void onKeyPress(KeyPressEvent event) {
if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) {
validerSaisie();
}
}
});
}
private void validerSaisie() {
String texte = vue.getSaisieMotsCles().getText();
if(texte != null && !texte.isEmpty()) {
motsClesService.ajouterMotCleImage(idImage, vue.getSaisieMotsCles().getText(), new AjoutMotsClesImageCallback() {
@Override
public void surRetour(Void objetRetour) {
EvenementAjoutMotCleImage event = new EvenementAjoutMotCleImage(idImage);
BusEvenementiel.getInstance().fireEvent(event);
}
});
}
}
 
public void viderChampSaisie() {
vue.getSaisieMotsCles().setText("");
}
 
public void focuserChampSaisie() {
vue.focuserChampSaisie();
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/motsclesimages/MotsClesImage.css
New file
0,0 → 1,43
.titrePanneau p {
padding: 0px;
margin: 0px;
overflow: hidden;
text-overflow: ellipsis;
white-space: pre;
min-height: 13px;
}
 
.titrePanneau {
font-size: 12px;
font-weight: bold;
color: white;
padding-left: 5px;
padding-right: 1px;
}
 
.panneauSaisieMotsCles {
margin-bottom: 3px;
padding-top:30px;
}
 
.fenetreMotsCles {
z-index:1500;
padding: 5px 10px 10px 30px;
width:860px;
background:white;
margin:0 auto;
margin-top:75px;
}
 
.colonneDroite {
margin-left: 14px;
}
 
.zoneIconesMotsCles {
padding:5px;
width:535px;
}
 
.listeMotsClesExistants {
max-width:350px;
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/motsclesimages/motcle/MotCle.css
New file
0,0 → 1,31
.conteneurMotCle {
display: inline-block;
margin-right: 3px;
}
 
.motCle {
border: 1px solid grey;
background-color: #DDD;
padding: 2px;
line-height: 25px;
border-radius:5px;
}
 
.suppressionMotCle {
display: inline;
border: 1px solid grey;
border-left: none;
background-color: #555;
padding: 2px;
padding-left: 4px;
margin-left: -3px;
line-height: 25px;
cursor: pointer;
color: red;
border-top-right-radius: 5px;
border-bottom-right-radius: 5px;
}
 
.suppressionMotCle:hover {
background-color: #888;
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/motsclesimages/motcle/MotCleVue.ui.xml
New file
0,0 → 1,11
<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='res' type='org.tela_botanica.del.client.resources.Ressources' />
<ui:with field="constants" type="org.tela_botanica.del.client.i18n.Vocabulary" />
 
<ui:style src="MotCle.css" />
<g:FocusPanel styleName="{style.conteneurMotCle}" ui:field="conteneurMotCle"><g:HTMLPanel><g:InlineHTML styleName="{style.motCle}" ui:field="motCle" /><g:FocusPanel styleName="invisible {style.suppressionMotCle}" ui:field="suppressionMotCle" ><g:InlineHTML>X</g:InlineHTML></g:FocusPanel></g:HTMLPanel></g:FocusPanel>
</ui:UiBinder>
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/motsclesimages/motcle/MotClePresenteur.java
New file
0,0 → 1,71
package org.tela_botanica.del.client.composants.motsclesimages.motcle;
 
import com.google.gwt.event.dom.client.BlurEvent;
import com.google.gwt.event.dom.client.BlurHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.FocusEvent;
import com.google.gwt.event.dom.client.FocusHandler;
import com.google.gwt.event.dom.client.HasBlurHandlers;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.event.dom.client.HasFocusHandlers;
import com.google.gwt.event.dom.client.HasMouseOutHandlers;
import com.google.gwt.event.dom.client.HasMouseOverHandlers;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseOutHandler;
import com.google.gwt.event.dom.client.MouseOverEvent;
import com.google.gwt.event.dom.client.MouseOverHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.IsWidget;
 
public abstract class MotClePresenteur {
String motCle;
String idMotCle;
public interface Vue extends IsWidget {
HasClickHandlers getZoneSuppressionMotCle();
void afficherZoneSuppression();
void cacherZoneSuppression();
HasMouseOverHandlers getZoneMotCleMouseHover();
HasMouseOutHandlers getZoneMotCleMouseOut();
}
 
private Vue vue;
public MotClePresenteur(Vue vue, String motCleText, String motCleId) {
this.vue = vue;
this.idMotCle = motCleId;
}
public void go(HasWidgets composite) {
composite.add(vue.asWidget());
gererEvenements();
}
public void gererEvenements() {
vue.getZoneSuppressionMotCle().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
surSuppression(idMotCle);
}
});
vue.getZoneMotCleMouseHover().addMouseOverHandler(new MouseOverHandler() {
@Override
public void onMouseOver(MouseOverEvent event) {
vue.afficherZoneSuppression();
}
});
vue.getZoneMotCleMouseOut().addMouseOutHandler(new MouseOutHandler() {
@Override
public void onMouseOut(MouseOutEvent event) {
vue.cacherZoneSuppression();
}
});
}
 
public abstract void surSuppression(String idMotCle);
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/motsclesimages/motcle/MotCleVue.java
New file
0,0 → 1,69
package org.tela_botanica.del.client.composants.motsclesimages.motcle;
 
import org.tela_botanica.del.client.i18n.I18n;
 
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.HasBlurHandlers;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.event.dom.client.HasFocusHandlers;
import com.google.gwt.event.dom.client.HasMouseOutHandlers;
import com.google.gwt.event.dom.client.HasMouseOverHandlers;
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.FocusPanel;
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.InlineHTML;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.Widget;
 
public class MotCleVue extends Composite implements MotClePresenteur.Vue {
@UiField
public InlineHTML motCle;
@UiField
public FocusPanel suppressionMotCle;
@UiField
public FocusPanel conteneurMotCle;
 
interface MyUiBinder extends UiBinder<Widget, MotCleVue> {
}
 
private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);
 
public MotCleVue(String mot) {
initWidget(uiBinder.createAndBindUi(this));
motCle.setText(mot);
suppressionMotCle.setTitle(I18n.getVocabulary().indiceSupprimerMotCle());
}
@Override
public HasClickHandlers getZoneSuppressionMotCle() {
return suppressionMotCle;
}
 
@Override
public void afficherZoneSuppression() {
suppressionMotCle.removeStyleName("invisible");
}
 
@Override
public void cacherZoneSuppression() {
suppressionMotCle.addStyleName("invisible");
}
 
@Override
public HasMouseOverHandlers getZoneMotCleMouseHover() {
return conteneurMotCle;
}
 
@Override
public HasMouseOutHandlers getZoneMotCleMouseOut() {
return conteneurMotCle;
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/motsclesimages/MotsClesImageVue.ui.xml
New file
0,0 → 1,31
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder' xmlns:g='urn:import:com.google.gwt.user.client.ui'>
<ui:with field='res' type='org.tela_botanica.del.client.resources.Ressources' />
<ui:with field="constants" type="org.tela_botanica.del.client.i18n.Vocabulary" />
 
<ui:style src="MotsClesImage.css" />
<g:HTMLPanel styleName="{style.fenetreMotsCles}">
<g:Label text="Saisir des mots clés" styleName="titre"/>
<g:Image ui:field="image" styleName="gauche" />
<g:HTMLPanel styleName="gauche {style.colonneDroite}">
<g:HTML styleName="{style.titrePanneau}" text="{constants.motsCles}"></g:HTML>
<g:HTMLPanel ui:field="zoneIconesMotsCles" styleName="{style.zoneIconesMotsCles}">
</g:HTMLPanel>
<g:HTMLPanel styleName="nettoyage">
<g:HTMLPanel styleName="{style.panneauSaisieMotsCles}" ui:field="saisieMotsCles"></g:HTMLPanel>
</g:HTMLPanel>
<g:HTMLPanel styleName="{style.listeMotsClesExistants}">
<g:HTMLPanel>
<g:HTMLPanel styleName="gwt-HTML" ui:field="motsClesCel"></g:HTMLPanel>
</g:HTMLPanel>
<g:HTMLPanel>
<g:HTMLPanel styleName="gwt-HTML" ui:field="motsCles"></g:HTMLPanel>
</g:HTMLPanel>
</g:HTMLPanel>
<g:Button ui:field="validerMotsCles">Valider l'ajout des mots clés et fermer la fenetre</g:Button>
</g:HTMLPanel>
<g:HTMLPanel styleName="nettoyage"></g:HTMLPanel>
</g:HTMLPanel>
</ui:UiBinder>
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/moteurrecherche/MoteurRecherche.css
New file
0,0 → 1,117
.recherchePrincipale {
width:550px;
font-size: 18px;
padding: 5px;
border: solid 1px #AAA;
float: left;
}
 
.boutonRecherche {
border: solid 1px #AAA;
padding: 5px;
cursor: pointer;
float: left;
margin: 0 10px 0 10px
}
 
.lienRechercheAvancee {
cursor: pointer;
text-decoration: underline;
color: blue;
float: left;
margin-right: 240px;
margin: 5px
}
 
.rechercheAvancee {
border: solid 1px #333;
padding: 15px;
position: absolute;
width: 750px;
margin-top: 0px;
background: white;
z-index: 2000
}
 
.conteneurDeuxPanneaux {
width: 700px;
}
 
.panneauGauche {
float: left;
width: 300px;
}
 
.panneauDroite {
float: left;
width: 300px;
}
 
.champRecherche {
width: 90%;
padding-bottom: 5px
}
 
.champRecherche input {
width: 90%
}
 
.recherchePrecedente {
color: #555;
padding: 5px 5px 10px;
font-style: italic;
clear: left
}
 
.boutonFermer {
float: right;
background: url("./img/cross.png") no-repeat 0 2px;
border: none;
padding: 0 0 0 16px;
color: blue;
text-decoration: underline;
cursor: pointer;
height: 19px;
}
 
.boutonVider {
float: right;
background: url("./img/cancel.png") no-repeat 0 2px;
border: none;
padding: 0 0 0 16px;
color: blue;
text-decoration: underline;
cursor: pointer;
height: 19px
}
 
.rechercherAvance {
margin-top: 0px;
margin-left:0px;
top: 195px;
position: relative;
left: 25px;
}
 
.casePnInscritsSeulement {
float: left;
}
 
.labelPnInscritsSeulement {
margin-top: 4px;
}
 
.zoneRecherche {
}
.zoneRss {
float:right;
margin-top:5px;
}
.zoneRss a {
border:none;
}
 
.nettoyage {
visibility: hidden;
clear: both;
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/moteurrecherche/MoteurRechercheVue.ui.xml
New file
0,0 → 1,105
<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='res' type='org.tela_botanica.del.client.resources.Ressources' />
<ui:with field="constants" type="org.tela_botanica.del.client.i18n.Vocabulary" />
 
<ui:style src="MoteurRecherche.css" />
<g:HTMLPanel styleName="limiteMin {style.zoneRecherche}">
<g:TextBox styleName="{style.recherchePrincipale} arrondi" ui:field="recherchePrincipale" text="{constants.rechercherObservation}"></g:TextBox>
<g:Button styleName="{style.boutonRecherche} arrondi" ui:field="boutonRecherche" text="{constants.rechercher}">
</g:Button>
<g:Label styleName="{style.lienRechercheAvancee}" ui:field="lienRechercheAvancee" text="{constants.rechercheAvancee}"></g:Label>
<g:HTMLPanel styleName="{style.rechercheAvancee} ombre-forte" ui:field="rechercheAvancee">
<g:Button ui:field="boutonFermer" styleName="{style.boutonFermer}" text="Fermer"></g:Button>
<g:Button ui:field="boutonVider" styleName="{style.boutonVider}" text="Vider"></g:Button>
 
<g:HTMLPanel styleName="{style.conteneurDeuxPanneaux}">
<g:HTMLPanel styleName="{style.panneauGauche}">
<g:HTMLPanel styleName="{style.champRecherche}">
<g:Label text="{constants.contientMots}" styleName="petit"/>
<g:TextBox ui:field="contientMots" />
</g:HTMLPanel>
<g:HTMLPanel styleName="{style.champRecherche}">
<g:Label text="{constants.referentiel}" styleName="petit"/>
<g:ListBox ui:field="referentiel" />
</g:HTMLPanel>
<g:HTMLPanel styleName="{style.champRecherche}">
<g:Label text="{constants.famille}" styleName="petit"/>
<g:TextBox ui:field="famille" />
</g:HTMLPanel>
<g:HTMLPanel styleName="{style.champRecherche}">
<g:Label text="{constants.genre}" styleName="petit"/>
<g:TextBox ui:field="genre" />
</g:HTMLPanel>
<g:HTMLPanel styleName="{style.champRecherche}">
<g:Label text="{constants.taxon}" styleName="petit"/>
<g:HTMLPanel ui:field="taxon" />
</g:HTMLPanel>
<g:HTMLPanel styleName="{style.champRecherche}">
<g:Label text="{constants.date} {constants.formatDate}" styleName="petit"/>
<g:TextBox ui:field="date" />
</g:HTMLPanel>
</g:HTMLPanel>
<g:HTMLPanel styleName="{style.panneauDroite}">
<g:HTMLPanel styleName="{style.champRecherche}">
<g:Label text="{constants.pays}" styleName="petit"/>
<g:ListBox ui:field="pays" />
</g:HTMLPanel>
<g:HTMLPanel styleName="{style.champRecherche}">
<g:Label text="{constants.departement}" styleName="petit"/>
<g:TextBox ui:field="departement" />
</g:HTMLPanel>
<g:HTMLPanel styleName="{style.champRecherche}">
<g:Label text="{constants.commune}" styleName="petit"/>
<g:HTMLPanel ui:field="commune" />
</g:HTMLPanel>
<g:HTMLPanel styleName="{style.champRecherche}">
<g:Label text="{constants.auteur}" styleName="petit"/>
<g:TextBox ui:field="auteur" />
</g:HTMLPanel>
<g:HTMLPanel ui:field="conteneurMotCle" styleName="{style.champRecherche}">
<g:Label text="{constants.tag}" styleName="petit"/>
<g:TextBox ui:field="motCle" />
</g:HTMLPanel>
<g:HTMLPanel ui:field="conteneurMotCleCel" styleName="{style.champRecherche}">
<g:Label text="{constants.tagCel}" styleName="petit"/>
<g:TextBox ui:field="motCleCel" />
</g:HTMLPanel>
<g:HTMLPanel ui:field="conteneurMotCleDel" styleName="{style.champRecherche}">
<g:Label text="{constants.tagDel}" styleName="petit"/>
<g:TextBox ui:field="motCleDel" />
</g:HTMLPanel>
</g:HTMLPanel>
</g:HTMLPanel>
 
<g:Button styleName="{style.boutonRecherche} {style.rechercherAvance}" ui:field="boutonRechercheAvancee" text="{constants.rechercher}"></g:Button>
<g:HTMLPanel styleName="nettoyage" />
 
<g:CheckBox ui:field="casePnInscritsSeulement" styleName="{style.casePnInscritsSeulement}"></g:CheckBox>
<g:Label text="{constants.pnInscritsSeulement}" ui:field="labelPnInscritsSeulement" styleName="{style.labelPnInscritsSeulement}" />
</g:HTMLPanel>
<g:HTMLPanel styleName="droite">
<g:HTMLPanel ui:field="zoneRss" styleName="{style.zoneRss}"></g:HTMLPanel>
</g:HTMLPanel>
<g:Label ui:field="recherchePrecedente" styleName="{style.recherchePrecedente}" />
<g:HTMLPanel ui:field="zonePagination" />
</g:HTMLPanel>
</ui:UiBinder>
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/moteurrecherche/MoteurRecherchePresenteur.java
New file
0,0 → 1,443
package org.tela_botanica.del.client.composants.moteurrecherche;
 
import java.util.Map;
 
import org.tela_botanica.del.client.cache.CacheClient;
import org.tela_botanica.del.client.composants.formulaires.autocompletion.AutoCompletionComboBoxPresenteur;
import org.tela_botanica.del.client.composants.formulaires.autocompletion.AutoCompletionComboBoxVue;
import org.tela_botanica.del.client.composants.presenteur.Presenteur;
import org.tela_botanica.del.client.composants.rss.RssPresenteur;
import org.tela_botanica.del.client.composants.rss.RssVue;
import org.tela_botanica.del.client.config.Config;
import org.tela_botanica.del.client.modeles.InformationsRecherche;
import org.tela_botanica.del.client.modeles.ModeRecherche;
import org.tela_botanica.del.client.services.ReferentielService;
import org.tela_botanica.del.client.services.rest.PaysService;
import org.tela_botanica.del.client.services.rest.PaysServiceConcret;
import org.tela_botanica.del.client.services.rest.async.PaysCallback;
import org.tela_botanica.del.client.utils.InfosNomPourAutocompletion;
import org.tela_botanica.del.client.utils.UtilitairesAutoCompletionService;
 
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.HasKeyPressHandlers;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.http.client.Response;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.IsWidget;
 
public abstract class MoteurRecherchePresenteur extends Presenteur {
 
public abstract interface Vue extends IsWidget {
public void ajouterVue(HasWidgets composite);
 
public HasClickHandlers getLienRechercheAvancee();
 
public void basculerAffichageZoneCache();
 
public HasClickHandlers getBoutonRechercheSimple();
 
public HasClickHandlers getBoutonFermer();
 
public HasClickHandlers getBoutonVider();
 
public HasClickHandlers getBoutonRechercheAvancee();
 
public HasKeyPressHandlers getChampSaisie();
 
public HasClickHandlers getChampSaisieCliquable();
 
public String getValeurRechercheSimple();
 
public String getLabelRecherche();
 
public String getContientMots();
 
public boolean getPnInscritsSeulement();
 
public String getDepartement();
 
public HasWidgets getCommune();
 
public HasWidgets getTaxon();
 
public String getFamille();
 
public String getGenre();
 
public String getMotCle();
 
public String getAuteur();
 
public String getDate();
public String getPays();
 
public void setValeurRechercheSimple(String valeurRecherche);
 
public void setContientMots(String mots);
 
public void setPnInscritsSeulement(boolean valeur);
 
public void setValeurDepartement(String dpt);
 
public void chargerValeursRecherchePrecedente(InformationsRecherche informationsRecherche);
 
public void focusSaisie();
 
public void nettoyer();
 
public HasKeyPressHandlers getChampsFamille();
 
public HasKeyPressHandlers getChampsGenre();
 
public HasKeyPressHandlers getChampsMotCle();
public HasKeyPressHandlers getChampsMotCleDel();
public HasKeyPressHandlers getChampsMotCleCel();
 
public HasKeyPressHandlers getChampsAuteur();
 
public HasKeyPressHandlers getChampsDate();
public HasKeyPressHandlers getChampsDepartement();
public HasKeyPressHandlers getChampsContientMots();
public HasWidgets getZoneRss();
 
public String getReferentiel();
public void setReferentielLectureSeule(boolean lectureSeule);
 
void remplirListeReferentiels(Map<String, String> listeReferentiels);
 
public String getMotCleDel();
 
public String getMotCleCel();
public void cacherChampsTagsImage();
public void cacherChampsTagsObs();
 
void remplirListePays(Map<String, String> listePays);
 
}
 
private Vue vue;
private Config config;
private ModeRecherche modeRecherche;
private RssPresenteur presenteurRss;
public enum TypeMoteur {
SIMPLE, AVANCEE
};
 
private TypeMoteur typeMoteur = TypeMoteur.SIMPLE;
 
private AutoCompletionComboBoxPresenteur completionTaxonsPresenteur = null;
private AutoCompletionComboBoxPresenteur completionCommunesPresenteur = null;
 
public MoteurRecherchePresenteur(Vue vue, ModeRecherche mode) {
initialiser(vue, mode, new Config());
}
 
public MoteurRecherchePresenteur(AutoCompletionComboBoxPresenteur presenteurAutoCompletionTaxon, AutoCompletionComboBoxPresenteur presenteurAutoCompletionCommunes, Vue vue, ModeRecherche mode, Config configuration) {
completionTaxonsPresenteur = presenteurAutoCompletionTaxon;
completionCommunesPresenteur = presenteurAutoCompletionCommunes;
initialiser(vue, mode, configuration);
}
 
private void initialiser(Vue vue, ModeRecherche mode, Config configuration) {
//TODO : fixer le flux avant de le mettre en place
//this.presenteurRss = new RssPresenteur(new RssVue(), CacheClient.getInstance().getInformationsRechercheObservation(), "S'abonner au flux rss des résultats de cette recherche");
//presenteurRss.go(vue.getZoneRss());
this.vue = vue;
setMode(mode);
this.config = configuration;
if (completionTaxonsPresenteur == null)
this.creerCompletionTaxons();
if (completionCommunesPresenteur == null)
this.creerCompletionCommunes();
gererEvenements();
vue.remplirListeReferentiels(ReferentielService.getReferentiels());
if(CacheClient.getInstance().getReferentielNonModifiable()) {
vue.setReferentielLectureSeule(true);
}
if(CacheClient.getInstance().getListePays() != null) {
vue.remplirListePays(CacheClient.getInstance().getListePays());
} else {
PaysService paysService = new PaysServiceConcret();
paysService.getPays(new PaysCallback() {
@Override
public void surRetour(Map<String, String> listePays) {
CacheClient.getInstance().setListePays(listePays);
MoteurRecherchePresenteur.this.vue.remplirListePays(listePays);
}
});
}
if(estPourRechercheImages()) {
vue.cacherChampsTagsObs();
} else {
vue.cacherChampsTagsImage();
}
}
 
public ModeRecherche getMode() {
return modeRecherche;
}
 
private void setMode(ModeRecherche mode) {
modeRecherche = mode;
}
public TypeMoteur getTypeMoteur() {
return this.typeMoteur;
}
public void setTypeMoteur(TypeMoteur typeMoteur) {
this.typeMoteur = typeMoteur;
}
 
public boolean estPourRechercheImages() {
return (modeRecherche == ModeRecherche.MODE_IMAGE);
}
 
public boolean estPourRechercheObservations() {
return (modeRecherche == ModeRecherche.MODE_OBSERVATION);
}
 
private void creerCompletionTaxons() {
String url = this.config.getServiceBaseUrl() + "nomstaxons";
completionTaxonsPresenteur = new AutoCompletionComboBoxPresenteur(new AutoCompletionComboBoxVue(), url) {
protected String effectuerPreTraitementChaineRequete(String requete) {
// si aucun référentiel selectionné, pas de requete
if(vue.getReferentiel() != null && !vue.getReferentiel().equals("")) {
requete = "?masque.nom=" + requete + "&masque.referentiel=" + vue.getReferentiel();
return requete;
} else {
return null;
}
// A décommenter lors de l'utilisation des web services eflore
// return
// RetourAutoCompletionService.effectuerPreTraitementChaineRequeteGenreEspeceEflore(requete);
}
 
@Override
protected InfosNomPourAutocompletion[] parserResultatRequete(Response response) {
return UtilitairesAutoCompletionService.parserResultatRetourSimple(response);
// A décommenter lors de l'utilisation des web services eflore
// return RetourAutoCompletionService.parserRetourOss(response);
}
};
}
 
private void creerCompletionCommunes() {
String url = this.config.getServiceBaseUrl() + "communes";
completionCommunesPresenteur = new AutoCompletionComboBoxPresenteur(new AutoCompletionComboBoxVue(), url) {
protected String effectuerPreTraitementChaineRequete(String requete) {
requete = "?masque.nom=" + requete;
return requete;
}
 
@Override
protected void surSelectionSuggestion(String suggestion) {
setValeur(suggestion);
collecterInfosRecherche();
setValeur(getInformationsRechercheEnCache().getCommune());
vue.setValeurDepartement(getInformationsRechercheEnCache().getDepartement());
}
 
@Override
protected InfosNomPourAutocompletion[] parserResultatRequete(Response response) {
return UtilitairesAutoCompletionService.parserResultatRetourSimple(response);
}
};
}
 
@Override
public void go(HasWidgets composite) {
afficherRequeteEtLancerRecherche();
completionTaxonsPresenteur.go(vue.getTaxon());
completionCommunesPresenteur.go(vue.getCommune());
vue.ajouterVue(composite);
vue.focusSaisie();
}
 
@Override
protected void gererEvenements() {
vue.getLienRechercheAvancee().addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
setTypeMoteur(TypeMoteur.AVANCEE);
vue.setContientMots(vue.getValeurRechercheSimple());
vue.basculerAffichageZoneCache();
}
});
 
vue.getBoutonRechercheSimple().addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
setTypeMoteur(TypeMoteur.SIMPLE);
collecterInfosRecherche();
afficherRequeteEtLancerRecherche();
}
});
 
vue.getBoutonFermer().addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
vue.setValeurRechercheSimple(vue.getContientMots());
vue.basculerAffichageZoneCache();
}
});
 
vue.getBoutonVider().addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
nettoyerChamps();
InformationsRecherche infosRecherche = new InformationsRecherche();
if (estPourRechercheImages()) {
CacheClient.getInstance().setInformationsRechercheImage(infosRecherche);
} else if (estPourRechercheObservations()) {
CacheClient.getInstance().setInformationsRechercheObservation(infosRecherche);
}
}
});
 
vue.getBoutonRechercheAvancee().addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
setTypeMoteur(TypeMoteur.AVANCEE);
collecterInfosRecherche();
vue.basculerAffichageZoneCache();
afficherRequeteEtLancerRecherche();
}
});
 
vue.getChampSaisie().addKeyPressHandler(new KeyPressHandler() {
public void onKeyPress(KeyPressEvent event) {
if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) {
setTypeMoteur(TypeMoteur.SIMPLE);
collecterInfosRecherche();
afficherRequeteEtLancerRecherche();
}
}
});
 
vue.getChampSaisieCliquable().addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
if (vue.getValeurRechercheSimple().equals(vue.getLabelRecherche())) {
vue.setValeurRechercheSimple("");
}
}
});
 
vue.getChampsAuteur().addKeyPressHandler(creerGestionnaireEvenementToucheEntree());
vue.getChampsDate().addKeyPressHandler(creerGestionnaireEvenementToucheEntree());
vue.getChampsFamille().addKeyPressHandler(creerGestionnaireEvenementToucheEntree());
vue.getChampsGenre().addKeyPressHandler(creerGestionnaireEvenementToucheEntree());
vue.getChampsMotCle().addKeyPressHandler(creerGestionnaireEvenementToucheEntree());
vue.getChampsMotCleCel().addKeyPressHandler(creerGestionnaireEvenementToucheEntree());
vue.getChampsMotCleDel().addKeyPressHandler(creerGestionnaireEvenementToucheEntree());
vue.getChampsDepartement().addKeyPressHandler(creerGestionnaireEvenementToucheEntree());
vue.getChampsContientMots().addKeyPressHandler(creerGestionnaireEvenementToucheEntree());
 
}
 
public KeyPressHandler creerGestionnaireEvenementToucheEntree() {
return new KeyPressHandler() {
public void onKeyPress(KeyPressEvent event) {
if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) {
vue.basculerAffichageZoneCache();
collecterInfosRecherche();
afficherRequeteEtLancerRecherche();
}
}
};
}
 
private void nettoyerChamps() {
completionCommunesPresenteur.nettoyer();
completionTaxonsPresenteur.nettoyer();
vue.nettoyer();
}
 
public void collecterInfosRecherche() {
InformationsRecherche informationRecherche = new InformationsRecherche();
informationRecherche.setRechercheLibre(this.getRechercheLibre());
if (this.typeMoteur == TypeMoteur.AVANCEE) {
informationRecherche.setTaxon(completionTaxonsPresenteur.getValeur());
informationRecherche.setDepartement(vue.getDepartement());
informationRecherche.setCommune(completionCommunesPresenteur.getValeur());
informationRecherche.setFamille(vue.getFamille());
informationRecherche.setGenre(vue.getGenre());
if(estPourRechercheObservations()) {
informationRecherche.setMotClef(vue.getMotCle());
} else {
informationRecherche.setMotClefDel(vue.getMotCleDel());
informationRecherche.setMotClefCel(vue.getMotCleCel());
}
informationRecherche.setTag(vue.getMotCle());
informationRecherche.setAuteur(vue.getAuteur());
informationRecherche.setDate(vue.getDate());
informationRecherche.setReferentiel(vue.getReferentiel());
informationRecherche.setPays(vue.getPays());
informationRecherche.setPnInscritsSeulement(vue.getPnInscritsSeulement());
}
if(CacheClient.getInstance().getReferentielNonModifiable()) {
informationRecherche.setReferentiel(CacheClient.getInstance().getReferentielCourant());
}
 
if (estPourRechercheImages()) {
CacheClient.getInstance().setPageCouranteRechercheImages(1);
CacheClient.getInstance().setInformationsRechercheImage(informationRecherche);
} else if (estPourRechercheObservations()) {
CacheClient.getInstance().setPageCouranteRechercheObservations(1);
CacheClient.getInstance().setInformationsRechercheObservation(informationRecherche);
}
}
 
private String getRechercheLibre() {
String rechercheLibre = "";
switch (this.typeMoteur) {
case SIMPLE:
rechercheLibre = vue.getValeurRechercheSimple();
break;
case AVANCEE:
rechercheLibre = vue.getContientMots();
break;
default:
// TODO : voir comment gérer les exceptions proprement
// throw new
// Exception("Le type de moteur de recherche indiqué n'est pas disponible");
}
return rechercheLibre;
}
 
private InformationsRecherche getInformationsRechercheEnCache() {
if (estPourRechercheImages()) {
return CacheClient.getInstance().getInformationsRechercheImage();
} else if (estPourRechercheObservations()) {
return CacheClient.getInstance().getInformationsRechercheObservation();
}
return null;
}
 
public void afficherRequeteEtLancerRecherche() {
InformationsRecherche informationsRecherche = getInformationsRechercheEnCache();
if (informationsRecherche != null) {
completionTaxonsPresenteur.setValeur(informationsRecherche.getTaxon());
completionCommunesPresenteur.setValeur(informationsRecherche.getCommune());
vue.chargerValeursRecherchePrecedente(informationsRecherche);
}
lancerRecherche();
//presenteurRss.genererLien(informationsRecherche);
}
 
public abstract void lancerRecherche();
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/moteurrecherche/MoteurRechercheVue.java
New file
0,0 → 1,383
package org.tela_botanica.del.client.composants.moteurrecherche;
 
import java.util.Iterator;
import java.util.Map;
 
import org.tela_botanica.del.client.i18n.I18n;
import org.tela_botanica.del.client.modeles.InformationsRecherche;
 
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.event.dom.client.HasKeyPressHandlers;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
 
public class MoteurRechercheVue extends Composite implements MoteurRecherchePresenteur.Vue {
 
interface Binder extends UiBinder<Widget, MoteurRechercheVue> {
}
 
private static Binder uiBinder = GWT.create(Binder.class);
private String labelRecherche = "";
private Map<String,String> listePays;
private InformationsRecherche informationRecherche;
// Si l'on charge une recherche précédente et que la liste des pays n'est
// pas encore arrivée, on stocke le pays pour l'afficher quand la liste arrive
private String paysEnAttente;
 
@UiField
Panel rechercheAvancee, taxon, commune, zoneRss, conteneurMotCle, conteneurMotCleCel, conteneurMotCleDel ;
@UiField
Label lienRechercheAvancee, recherchePrecedente, labelPnInscritsSeulement;
@UiField
Button boutonRecherche, boutonRechercheAvancee, boutonFermer, boutonVider;
@UiField
TextBox recherchePrincipale, contientMots, departement, famille, genre, motCle, motCleCel, motCleDel, auteur, date;
@UiField
ListBox referentiel, pays;
@UiField
CheckBox casePnInscritsSeulement;
 
public MoteurRechercheVue(String labelRecherche) {
initWidget(uiBinder.createAndBindUi(this));
this.labelRecherche = labelRecherche;
recherchePrincipale.setText(labelRecherche);
rechercheAvancee.setVisible(false);
}
@Override
public void remplirListeReferentiels(Map<String, String> listeReferentiels) {
for (Iterator<String> iterator = listeReferentiels.keySet().iterator(); iterator.hasNext();) {
String codeRef = iterator.next();
referentiel.addItem(listeReferentiels.get(codeRef), codeRef);
}
referentiel.setItemSelected(1, true);
}
@Override
public void remplirListePays(Map<String, String> listePays) {
this.listePays = listePays;
pays.clear();
// Pour pouvoir annuler la selection de pays, on ajoute un item vide
pays.addItem("", "");
int index = 1;
for (Iterator<String> iterator = listePays.keySet().iterator(); iterator.hasNext();) {
String codePays = iterator.next();
pays.addItem(listePays.get(codePays), codePays);
if(paysEnAttente != null && codePays.equals(paysEnAttente)) {
pays.setItemSelected(index, true);
}
index++;
}
if(paysEnAttente != null) {
afficherLigneInfoRecherche(informationRecherche);
}
paysEnAttente = null;
}
 
public String getLabelRecherche() {
return labelRecherche;
}
 
public HasClickHandlers getLienRechercheAvancee() {
return lienRechercheAvancee;
}
 
public HasClickHandlers getBoutonRechercheSimple() {
return boutonRecherche;
}
 
public HasClickHandlers getBoutonFermer() {
return boutonFermer;
}
 
public HasClickHandlers getBoutonVider() {
return boutonVider;
}
 
public HasClickHandlers getBoutonRechercheAvancee() {
return boutonRechercheAvancee;
}
 
public HasKeyPressHandlers getChampSaisie() {
return recherchePrincipale;
}
 
public String getValeurRechercheSimple() {
return recherchePrincipale.getText();
}
 
public void setValeurRechercheSimple(String valeurRecherche) {
recherchePrincipale.setText(valeurRecherche);
}
 
public HasClickHandlers getChampSaisieCliquable() {
return recherchePrincipale;
}
 
public String getContientMots() {
return contientMots.getText();
}
 
public void setContientMots(String mots) {
contientMots.setText(mots);
}
 
public boolean getPnInscritsSeulement() {
return casePnInscritsSeulement.getValue();
}
 
public void setPnInscritsSeulement(boolean valeur) {
casePnInscritsSeulement.setValue(valeur);
}
public String getPays() {
return pays.getValue(pays.getSelectedIndex());
}
 
public String getDepartement() {
return departement.getText();
}
 
public void setValeurDepartement(String dpt) {
departement.setValue(dpt);
}
 
public HasWidgets getCommune() {
return commune;
}
 
public HasWidgets getTaxon() {
return taxon;
}
 
public String getFamille() {
return famille.getText();
}
 
public String getGenre() {
return genre.getText();
}
 
public String getMotCle() {
return motCle.getText();
}
 
public String getAuteur() {
return auteur.getText();
}
 
public String getDate() {
return date.getText();
}
public String getReferentiel() {
return referentiel.getValue(referentiel.getSelectedIndex());
}
 
public void focusSaisie() {
this.recherchePrincipale.setFocus(true);
}
 
public void ajouterVue(HasWidgets composite) {
composite.add(this.asWidget());
}
 
public void basculerAffichageZoneCache() {
rechercheAvancee.setVisible(!rechercheAvancee.isVisible());
recherchePrincipale.setVisible(!recherchePrincipale.isVisible());
boutonRecherche.setVisible(!boutonRecherche.isVisible());
}
 
public void nettoyer() {
pays.setSelectedIndex(0);
chargerValeursRecherchePrecedente(new InformationsRecherche());
}
 
public void chargerValeursRecherchePrecedente(InformationsRecherche informationsRecherche) {
recherchePrincipale.setText(informationsRecherche.getRechercheLibre());
contientMots.setText(informationsRecherche.getRechercheLibre());
departement.setText(informationsRecherche.getDepartement());
famille.setText(informationsRecherche.getFamille());
genre.setText(informationsRecherche.getGenre());
motCle.setText(informationsRecherche.getMotClef());
motCleCel.setText(informationsRecherche.getMotClefCel());
motCleDel.setText(informationsRecherche.getMotClefDel());
auteur.setText(informationsRecherche.getAuteur());
date.setText(informationsRecherche.getDate());
casePnInscritsSeulement.setValue(informationsRecherche.getPnInscritsSeulement());
for(int i = 0; i < referentiel.getItemCount(); i++) {
if(referentiel.getValue(i).equals(informationsRecherche.getReferentiel())) {
referentiel.setSelectedIndex(i);
}
}
// la liste des pays du champs de recherche est asynchrone
// donc elle peut ne pas avoir encore été chargée
if(listePays != null) {
for(int i = 0; i < pays.getItemCount(); i++) {
if(pays.getValue(i).equals(paysEnAttente)) {
pays.setSelectedIndex(i);
}
}
} else {
paysEnAttente = informationsRecherche.getPays();
}
 
afficherLigneInfoRecherche(informationsRecherche);
}
 
/**
* Affiche la ligne d'en tête montrant les elements de la requête à
* l'utilisateur
*
* @param informationRecherche
*/
private void afficherLigneInfoRecherche(InformationsRecherche informationRecherche) {
this.informationRecherche = informationRecherche;
// tax dep com fam gen ta mo au date
StringBuffer texteRecherchePrecedente = new StringBuffer();
 
if (informationRecherche.getRechercheLibre() != null && !informationRecherche.getRechercheLibre().equals("")) {
texteRecherchePrecedente.append(I18n.getVocabulary().rechercheLibre() + ":" + informationRecherche.getRechercheLibre() + " ");
}
if (informationRecherche.getTaxon() != null && !informationRecherche.getTaxon().equals("")) {
texteRecherchePrecedente.append(I18n.getVocabulary().taxon() + ":" + informationRecherche.getTaxon() + " ");
}
if (informationRecherche.getDepartement() != null && !informationRecherche.getDepartement().equals("")) {
texteRecherchePrecedente.append(I18n.getVocabulary().departement() + ":" + informationRecherche.getDepartement() + " ");
}
if (listePays != null && informationRecherche.getPays() != null && !informationRecherche.getPays().equals("")) {
texteRecherchePrecedente.append(I18n.getVocabulary().pays() + ":" + listePays.get(informationRecherche.getPays()) + " ");
}
if (informationRecherche.getCommune() != null && !informationRecherche.getCommune().equals("")) {
texteRecherchePrecedente.append(I18n.getVocabulary().commune() + ":" + informationRecherche.getCommune() + " ");
}
if (informationRecherche.getFamille() != null && !informationRecherche.getFamille().equals("")) {
texteRecherchePrecedente.append(I18n.getVocabulary().famille() + ":" + informationRecherche.getFamille() + " ");
}
if (informationRecherche.getGenre() != null && !informationRecherche.getGenre().equals("")) {
texteRecherchePrecedente.append(I18n.getVocabulary().genre() + ":" + informationRecherche.getGenre() + " ");
}
if (informationRecherche.getTag() != null && !informationRecherche.getTag().equals("")) {
texteRecherchePrecedente.append(I18n.getVocabulary().tag() + ":" + informationRecherche.getTag() + " ");
}
if (informationRecherche.getMotClef() != null && !informationRecherche.getMotClef().equals("")) {
texteRecherchePrecedente.append(I18n.getVocabulary().mot_clef() + ":" + informationRecherche.getMotClef() + " ");
}
if (informationRecherche.getMotClefCel() != null && !informationRecherche.getMotClefCel().equals("")) {
texteRecherchePrecedente.append(I18n.getVocabulary().tagCel() + ":" + informationRecherche.getMotClefCel() + " ");
}
if (informationRecherche.getMotClefDel() != null && !informationRecherche.getMotClefDel().equals("")) {
texteRecherchePrecedente.append(I18n.getVocabulary().tagDel() + ":" + informationRecherche.getMotClefDel() + " ");
}
if (informationRecherche.getAuteur() != null && !informationRecherche.getAuteur().equals("")) {
texteRecherchePrecedente.append(I18n.getVocabulary().auteur() + ":" + informationRecherche.getAuteur() + " ");
}
if (informationRecherche.getDate() != null && !informationRecherche.getDate().equals("")) {
texteRecherchePrecedente.append(I18n.getVocabulary().date() + ":" + informationRecherche.getDate() + " ");
}
if (informationRecherche.getReferentiel() != null && !informationRecherche.getReferentiel().equals("")) {
texteRecherchePrecedente.append(I18n.getVocabulary().referentiel() + ":" + informationRecherche.getReferentiel() + " ");
}
if (informationRecherche.getPnInscritsSeulement()) {
texteRecherchePrecedente.append(I18n.getVocabulary().pnISCourt() + ":non");
}
recherchePrecedente.setText(texteRecherchePrecedente.toString());
}
 
@Override
public HasKeyPressHandlers getChampsFamille() {
return famille;
}
 
@Override
public HasKeyPressHandlers getChampsGenre() {
return genre;
}
 
@Override
public HasKeyPressHandlers getChampsMotCle() {
return motCle;
}
 
@Override
public HasKeyPressHandlers getChampsAuteur() {
return auteur;
}
 
@Override
public HasKeyPressHandlers getChampsDate() {
return date;
}
 
@Override
public HasKeyPressHandlers getChampsDepartement() {
return departement;
}
 
@Override
public HasKeyPressHandlers getChampsContientMots() {
return contientMots;
}
public HasWidgets getZoneRss() {
return zoneRss;
}
 
@Override
public void setReferentielLectureSeule(boolean lectureSeule) {
// la listbox ne possède aucun méthode directe pour être désactivée
DOM.setElementProperty(referentiel.getElement(), "disabled", "disabled");
}
 
@Override
public HasKeyPressHandlers getChampsMotCleDel() {
return motCleDel;
}
 
@Override
public HasKeyPressHandlers getChampsMotCleCel() {
return motCleCel;
}
 
@Override
public String getMotCleDel() {
return motCleDel.getText();
}
 
@Override
public String getMotCleCel() {
return motCleCel.getText();
}
 
@Override
public void cacherChampsTagsImage() {
conteneurMotCleCel.setVisible(false);
conteneurMotCleDel.setVisible(false);
}
 
@Override
public void cacherChampsTagsObs() {
conteneurMotCle.setVisible(false);
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/commentaires/ligneCommentaire.css
New file
0,0 → 1,25
.commentaire {
font-size: 11px;
background: #DDD;
padding: 3px;
margin-bottom:5px;
}
 
.auteur {
padding-left:3px;
float: left;
font-size:11px;
color:#AAA;
font-style:italic;
}
 
.date {
float: left;
font-size:11px;
color:#DDD;
font-style:italic;
}
 
.date:before {
content:", ";
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/commentaires/LigneCommentaireVue.ui.xml
New file
0,0 → 1,17
<!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="ligneCommentaire.css" />
<g:HTMLPanel>
<g:HorizontalPanel ui:field="zoneAuteur">
<g:Label ui:field="auteur" styleName="{style.auteur}"/>
<g:Label ui:field="date" styleName="{style.date}"/>
</g:HorizontalPanel>
<g:HTMLPanel>
<g:Label ui:field="commentaire" styleName="commentaire {style.commentaire}"/>
</g:HTMLPanel>
</g:HTMLPanel>
</ui:UiBinder>
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/commentaires/detailCommentaireVue.css
New file
0,0 → 1,41
.conteneurTableauVotes {
z-index: 1500;
padding: 30px;
padding-right: 21px;
padding-top: 20px;
background: white;
width: 370px;
margin: 0 auto;
margin-top: 75px;
padding-bottom:50px;
}
 
.table {
border:solid 1px #DDD;
width: 100%;
}
 
.chargement {
padding-left: 165px;
}
 
.auteur {
color: #6C6865;
font-family: arial;
font-size: 13px;
font-style: italic;
font-weight: bold;
letter-spacing: 0;
line-height: 18px;
text-transform: none;
margin-top: -10px;
}
 
.boutonAjouterCommentaire {
margin:30px 0;
}
 
.zoneCommentaires {
max-height: 400px;
overflow:auto;
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/commentaires/LigneCommentairePresenteur.java
New file
0,0 → 1,70
package org.tela_botanica.del.client.composants.commentaires;
 
import org.tela_botanica.del.client.composants.presenteur.Presenteur;
import org.tela_botanica.del.client.modeles.Commentaire;
import org.tela_botanica.del.client.modeles.PropositionDetermination;
 
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 LigneCommentairePresenteur extends Presenteur {
 
public interface Vue extends IsWidget {
public void setCommentaire(String commentaire);
public void setAuteur(String auteur);
public void setDate(String date);
}
 
private Vue vue;
private PropositionDetermination proposition;
private Commentaire commentaire;
public LigneCommentairePresenteur(Vue vue, PropositionDetermination proposition) {
this.vue = vue;
this.proposition = proposition;
afficherCommentaire();
}
public LigneCommentairePresenteur(Vue vue, Commentaire commentaire) {
this.vue = vue;
this.commentaire = commentaire;
afficherCommentaire();
}
 
public void afficherCommentaire() {
if (proposition != null) {
String commentaire = proposition.getCommentaire();
vue.setCommentaire(commentaire);
String date = DateTimeFormat.getFormat("dd/MM/yyyy").format(proposition.getDate());
vue.setDate(date);
String auteur = proposition.getAuteur();
vue.setAuteur(auteur);
} else if (commentaire != null) {
String commentaire = this.commentaire.getCommentaire();
vue.setCommentaire(commentaire);
String date = DateTimeFormat.getFormat("dd/MM/yyyy").format(this.commentaire.getDate());
vue.setDate(date);
String auteur = this.commentaire.getAuteur();
vue.setAuteur(auteur);
}
}
/**
* Declenchement du présenteur
*/
public void go(HasWidgets container) {
container.add(vue.asWidget());
gererEvenements();
}
 
protected void gererEvenements() {
}
 
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/commentaires/DetailCommentaireVue.ui.xml
New file
0,0 → 1,19
<!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="detailCommentaireVue.css" />
<g:HTMLPanel styleName="{style.conteneurTableauVotes}">
<g:HTMLPanel ui:field='titre' styleName="titre" />
<g:HTMLPanel ui:field='auteur' styleName="{style.auteur}" />
<g:HTMLPanel ui:field="ligneCommentaire" styleName="{style.zoneCommentaires}"></g:HTMLPanel>
<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.aucunCommentaireEffectue}"></g:Label></g:HTMLPanel>
<g:Button ui:field="boutonAjoutCommentaire" styleName="bouton {style.boutonAjouterCommentaire}"
text="{constants.ajouterCommentaire}" />
</g:HTMLPanel>
</ui:UiBinder>
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/commentaires/LigneCommentaireVue.java
New file
0,0 → 1,38
package org.tela_botanica.del.client.composants.commentaires;
 
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 LigneCommentaireVue extends Composite implements LigneCommentairePresenteur.Vue {
 
interface LigneCommentaireVueUiBinder extends UiBinder<Widget, LigneCommentaireVue> {};
private static LigneCommentaireVueUiBinder uiBinder = GWT.create(LigneCommentaireVueUiBinder.class);
//Composants
@UiField
Label commentaire, auteur, date;
public LigneCommentaireVue() {
initWidget(uiBinder.createAndBindUi(this));
}
@Override
public void setCommentaire(String commentaire) {
this.commentaire.setText(commentaire);
}
@Override
public void setAuteur(String auteur) {
this.auteur.setText(auteur);
}
@Override
public void setDate(String date) {
this.date.setText(date);
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/commentaires/DetailCommentairePresenteur.java
New file
0,0 → 1,170
package org.tela_botanica.del.client.composants.commentaires;
 
import java.util.List;
 
import org.tela_botanica.del.client.cache.CacheClient;
import org.tela_botanica.del.client.composants.fenetreoverlay.FenetreOverlayDefilanteVue;
import org.tela_botanica.del.client.composants.fenetreoverlay.FenetreOverlaySimplePresenteur;
import org.tela_botanica.del.client.composants.formulaires.formulairecommentaire.FormulaireCommentairePresenteur;
import org.tela_botanica.del.client.composants.formulaires.formulairecommentaire.FormulaireCommentaireVue;
import org.tela_botanica.del.client.composants.presenteur.Presenteur;
import org.tela_botanica.del.client.modeles.Commentaire;
import org.tela_botanica.del.client.modeles.InterventionForum;
import org.tela_botanica.del.client.modeles.PropositionDetermination;
import org.tela_botanica.del.client.navigation.evenement.BusEvenementiel;
import org.tela_botanica.del.client.navigation.evenement.ajoutcommentaire.EvenementAjoutCommentaire;
import org.tela_botanica.del.client.navigation.evenement.ajoutcommentaire.GestionnaireEvenementAjoutCommentaire;
import org.tela_botanica.del.client.services.rest.CommentaireService;
import org.tela_botanica.del.client.services.rest.CommentaireServiceConcret;
import org.tela_botanica.del.client.services.rest.async.ListeCommentairesCallback;
 
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.HasWidgets;
import com.google.gwt.user.client.ui.IsWidget;
 
/**
* Cette classe permet d'afficher une popup avec la liste des commentaires
* associées à une proposition de determination
*
* @author LIENS
*
*/
public class DetailCommentairePresenteur extends Presenteur {
 
/**
* Interface de la vue correspondante
*
* @author LIENS
*
*/
public interface Vue extends IsWidget {
public void afficherCommentairesProposition(PropositionDetermination propositionDetermination);
 
public void afficherAucuneDonnees();
 
public void stopChargement();
 
public void startChargement();
public HasClickHandlers getBoutonAjoutCommentaire();
}
 
// La vue correspondante
private Vue vue;
 
// La proposition de determination
private PropositionDetermination propositionDetermination;
//le servcie de recuperation des commentaires
private CommentaireService commentaireService;
 
/**
* Constructeur
*
* @param vue
* @param propositionDetermination
*/
public DetailCommentairePresenteur(Vue vue, CommentaireService commentaireService, PropositionDetermination propositionDetermination) {
this.vue = vue;
this.propositionDetermination = propositionDetermination;
this.commentaireService = commentaireService;
}
 
/**
* Declenchement du présenteur
*/
public void go(HasWidgets container) {
container.add(vue.asWidget());
gererEvenements();
}
 
/**
* Affichage des commentaires
*/
public void afficherCommentaires() {
 
// affichage de l'icone de chargement
vue.startChargement();
// si l'id de la propostion est égal est nulle alors celle ci est une proposition
// crée par l'interface à partir de l'obs et n'a donc pas de commentaires
if(propositionDetermination.getId() != null) {
 
// Appel du service
commentaireService.chargerCommentaires(propositionDetermination, new ListeCommentairesCallback() {
 
@Override
public void surRetour(List<Commentaire> commentaires) {
 
propositionDetermination.setListeCommentaires(commentaires);
// s'il existe des commentaires ils sont affichés
if (propositionDetermination.getTotalCommentaires() > 0) {
 
// affichage des commentaires associés à la proposition dans
// la vue
vue.afficherCommentairesProposition(propositionDetermination);
 
// supression de l'icone de chargement
vue.stopChargement();
} else {
 
// affichage d'un message precisant qu'il n'y a pas de
// commentaires
vue.afficherAucuneDonnees();
 
// supression de l'icone de chargement
vue.stopChargement();
}
 
}
 
@Override
public void surErreur(String messageErreur) {
Window.alert(messageErreur);
vue.stopChargement();
}
});
} else {
// affichage d'un message precisant qu'il n'y a pas de
// commentaires
vue.afficherAucuneDonnees();
 
// supression de l'icone de chargement
vue.stopChargement();
}
}
 
/**
* Gestion des evenements du presenteur
*/
@Override
protected void gererEvenements() {
final FenetreOverlaySimplePresenteur fenetreOverlaySimplePresenteur = new FenetreOverlaySimplePresenteur(new FenetreOverlayDefilanteVue());
 
vue.getBoutonAjoutCommentaire().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
// TODO : > mettre proprement l'intervention
// TODO : >actualiser les affichages
CacheClient.getInstance().setObservationCourante(propositionDetermination.getObservation());
FormulaireCommentairePresenteur commentairePresenteur = new FormulaireCommentairePresenteur(propositionDetermination.getObservation().getInterventionsForum().get(propositionDetermination.getObservation().getInterventionsForum().size()-1), new CommentaireServiceConcret(), new FormulaireCommentaireVue());
fenetreOverlaySimplePresenteur.ouvrirFenetreModale(commentairePresenteur);
}
});
BusEvenementiel.getInstance().addHandler(EvenementAjoutCommentaire.TYPE, new GestionnaireEvenementAjoutCommentaire() {
 
@Override
public void onAjoutCommentaire(EvenementAjoutCommentaire event) {
if (fenetreOverlaySimplePresenteur != null && fenetreOverlaySimplePresenteur.fenetreModaleEstOuverte()) {
fenetreOverlaySimplePresenteur.fermerFenetreModale();
}
}
});
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/commentaires/DetailCommentaireVue.java
New file
0,0 → 1,118
package org.tela_botanica.del.client.composants.commentaires;
 
import java.util.List;
 
import org.tela_botanica.del.client.i18n.I18n;
import org.tela_botanica.del.client.modeles.Commentaire;
import org.tela_botanica.del.client.modeles.PropositionDetermination;
 
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.Button;
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.Panel;
import com.google.gwt.user.client.ui.Widget;
 
/**
* Cette classe permet d'afficher une popup avec la liste des commentaires
* associées à une proposition de determination
*
* @author LIENS
*
*/
public class DetailCommentaireVue extends Composite implements DetailCommentairePresenteur.Vue {
 
private static DetailListeVotesDeterminationVueUIiBinder uiBinder = GWT.create(DetailListeVotesDeterminationVueUIiBinder.class);
 
interface DetailListeVotesDeterminationVueUIiBinder extends UiBinder<Widget, DetailCommentaireVue> {
};
 
@UiField
HTMLPanel titre, auteur, aucuneDonnees;
 
@UiField
Panel panneauChargement, ligneCommentaire;
 
@UiField
Button boutonAjoutCommentaire;
@Override
public Button getBoutonAjoutCommentaire() {
return boutonAjoutCommentaire;
}
 
public DetailCommentaireVue() {
initWidget(uiBinder.createAndBindUi(this));
}
 
/**
* Affiche les commentaires associées à une proposition de determination
*/
@Override
public void afficherCommentairesProposition(PropositionDetermination propositionDetermination) {
HTML htmlTitre = new HTML(propositionDetermination.getEspece());
titre.add(htmlTitre);
HTML htmlAuteur = new HTML(I18n.getVocabulary().proposePar()+propositionDetermination.getAuteur());
auteur.add(htmlAuteur);
 
LigneCommentairePresenteur presenteurCommentaire = new LigneCommentairePresenteur(new LigneCommentaireVue(), propositionDetermination);
presenteurCommentaire.go(ligneCommentaire);
 
creerListeCommentaireRecursive(propositionDetermination.getListeCommentaires());
}
 
/**
* Affiche une liste de commentaires recursivement
* @param commentaires
*/
private void creerListeCommentaireRecursive(List<Commentaire> commentaires) {
 
for (Commentaire commentaire : commentaires) {
chargerCommentaire(commentaire);
if (commentaire.getListeCommentaires().size() > 0) {
creerListeCommentaireRecursive(commentaire.getListeCommentaires());
}
}
}
 
/**
* Affiche un commentaire
* @param commentaire
*/
private void chargerCommentaire(Commentaire commentaire) {
LigneCommentairePresenteur presenteurCommentaire = new LigneCommentairePresenteur(new LigneCommentaireVue(), commentaire);
presenteurCommentaire.go(ligneCommentaire);
}
 
/**
* Affiche un icone de début de chargement
*/
@Override
public void startChargement() {
panneauChargement.setHeight((this.getOffsetHeight() / 2) + "px");
panneauChargement.setWidth((this.getOffsetWidth() / 2) + "px");
panneauChargement.setVisible(true);
}
 
/**
* Cache l'icone de début de chargement
*/
@Override
public void stopChargement() {
panneauChargement.setVisible(false);
}
 
/**
* Affiche un message indiquant qu'il n'y a aucun commentaire à présenter
*/
@Override
public void afficherAucuneDonnees() {
aucuneDonnees.setVisible(true);
}
 
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/formulaires/formulairecommentaire/FormulaireCommentaireVue.ui.xml
New file
0,0 → 1,36
<!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="formulaireCommentaire.css" />
<g:VerticalPanel styleName="{style.formulaireProposition}">
<g:Label text="{constants.ajouterCommentaire}" styleName="titre"/>
<g:Label text="{constants.infoProposerCommentaire}" styleName="petit"/>
<g:HTML><br /></g:HTML>
<g:HTMLPanel>
<g:HTMLPanel styleName="{style.colonneGauche}">
<g:Label text="{constants.vous}" styleName="sousTitre"/>
<g:Label text="{constants.infoVous}" styleName="petit" />
<g:HTMLPanel styleName="{style.zoneNom}">
<g:Label text="{constants.nom}" styleName="petit" />
<g:TextBox ui:field="nom"/>
</g:HTMLPanel>
<g:HTMLPanel styleName="{style.zonePrenom}">
<g:Label text="{constants.prenom}" styleName="petit" />
<g:TextBox ui:field="prenom"/>
</g:HTMLPanel>
<g:HTMLPanel styleName="{style.zoneEmail}">
<g:Label text="Votre adresse email : " styleName="petit" />
<g:TextBox ui:field="courriel" />
</g:HTMLPanel>
<g:HTML><br /></g:HTML>
<g:Label text="{constants.commentaire}" styleName="sousTitre"/>
<g:TextArea ui:field="commentaire" styleName="{style.commentaire}" />
</g:HTMLPanel>
</g:HTMLPanel>
<g:Button text="{constants.boutonProposer}" ui:field="boutonValidationCommentaire" styleName="{style.boutonProposer} arrondi"/>
</g:VerticalPanel>
</ui:UiBinder>
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/formulaires/formulairecommentaire/FormulaireCommentairePresenteur.java
New file
0,0 → 1,210
package org.tela_botanica.del.client.composants.formulaires.formulairecommentaire;
 
import java.util.Date;
 
import org.tela_botanica.del.client.cache.CacheClient;
import org.tela_botanica.del.client.composants.presenteur.Presenteur;
import org.tela_botanica.del.client.composants.validation.ValidateurChampTexteNonNul;
import org.tela_botanica.del.client.modeles.Commentaire;
import org.tela_botanica.del.client.modeles.Contributeur;
import org.tela_botanica.del.client.modeles.InterventionForum;
import org.tela_botanica.del.client.modeles.Observation;
import org.tela_botanica.del.client.modeles.Utilisateur;
import org.tela_botanica.del.client.navigation.evenement.BusEvenementiel;
import org.tela_botanica.del.client.navigation.evenement.ajoutcommentaire.EvenementAjoutCommentaire;
import org.tela_botanica.del.client.services.rest.CommentaireService;
import org.tela_botanica.del.client.services.rest.async.AjoutCommentaireCallback;
 
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 FormulaireCommentairePresenteur extends Presenteur {
 
// le meme presenteur gere les commentaires pour les observations et pour
// les possesseurs de commentaires, mais la logique est differente, d'ou la
// necessité de separer les deux objets metiers
private Observation observation;
 
private InterventionForum possesseurDeCommentaires;
 
public interface Vue extends IsWidget {
 
public HasText getNomObjet();
 
public HasText getPrenomObjet();
 
public String getNom();
 
public String getPrenom();
 
public String getCourriel();
 
public abstract HasText getCommentaire();
 
public abstract HasClickHandlers getBoutonValidationCommentaire();
 
public void afficherStyleErreurNom(String styleErreur);
 
public void supprimerStyleErreurNom(String styleErreur);
 
public void afficherStyleErreurPrenom(String styleErreur);
 
public void supprimerStyleErreurPrenom(String styleErreur);
public void afficherStyleErreurCourriel(String styleErreur);
 
public void supprimerStyleErreurCourriel(String styleErreur);
 
public void afficherStyleErreurCommentaire(String styleErreur);
 
public void supprimerStyleErreurCommentaire(String styleErreur);
 
void afficherNomPrenomEtDesactiver(String nom, String prenom, String courriel);
 
public HasText getCourrielObjet();
}
 
private Vue vue;
private CommentaireService commentaireService;
 
public FormulaireCommentairePresenteur(Observation observation, CommentaireService commentaireService, Vue vue) {
this.observation = observation;
this.vue = vue;
this.commentaireService = commentaireService;
}
 
public FormulaireCommentairePresenteur(InterventionForum possesseurDeCommentaires, CommentaireService commentaireService, Vue vue) {
this.possesseurDeCommentaires = possesseurDeCommentaires;
this.commentaireService = commentaireService;
this.vue = vue;
}
 
public void go(HasWidgets composite) {
remplirAvecInfosUtilisateur();
composite.add(vue.asWidget());
gererEvenements();
}
 
private void remplirAvecInfosUtilisateur() {
Utilisateur utilisateur = CacheClient.getInstance().getUtilisateur();
if (utilisateur.estIdentifie()) {
vue.afficherNomPrenomEtDesactiver(utilisateur.getNom(), utilisateur.getPrenom(), utilisateur.getCourriel());
}
}
 
protected void gererEvenements() {
vue.getBoutonValidationCommentaire().addClickHandler(new ClickHandler() {
 
@Override
public void onClick(ClickEvent event) {
if (!validerSaisie()) {
return;
}
 
surValidationCommentaire();
}
});
}
 
public void surValidationCommentaire() {
String texteCommentaire = vue.getCommentaire().getText();
String idUtilisateur = null;
if (CacheClient.getInstance().getUtilisateur().estIdentifie()) {
idUtilisateur = CacheClient.getInstance().getUtilisateur().getId();
}
 
Contributeur contributeur = new Contributeur(idUtilisateur, vue.getNom(), vue.getPrenom(), vue.getCourriel());
final Commentaire commentaire = new Commentaire(contributeur, new Date(), texteCommentaire);
 
if (observation != null) {
commentaire.setObservation(observation);
commentaire.setParent(null);
} else if (possesseurDeCommentaires != null) {
commentaire.setObservation(CacheClient.getInstance().getObservationCourante());
commentaire.setParent(possesseurDeCommentaires);
}
commentaireService.ajouterCommentaire(commentaire, new AjoutCommentaireCallback() {
 
@Override
public void surRetour(String idNouveauCommentaire) {
commentaire.setId(idNouveauCommentaire);
if (observation != null) {
observation.getInterventionsForum().add(commentaire);
} else if (possesseurDeCommentaires != null) {
possesseurDeCommentaires.getListeCommentaires().add(commentaire);
}
BusEvenementiel.getInstance().fireEvent(new EvenementAjoutCommentaire(commentaire));
}
 
@Override
public void surErreur(String messageErreur) {
Window.alert(messageErreur);
}
});
}
 
private boolean validerSaisie() {
 
ValidateurChampTexteNonNul validateurNom = new ValidateurChampTexteNonNul(vue.getNomObjet()) {
@Override
public void afficherStyleErreur(String styleErreur) {
vue.afficherStyleErreurNom(styleErreur);
}
 
@Override
public void supprimerStyleErreur(String styleErreur) {
vue.supprimerStyleErreurNom(styleErreur);
}
};
ValidateurChampTexteNonNul validateurPrenom = new ValidateurChampTexteNonNul(vue.getPrenomObjet()) {
@Override
public void afficherStyleErreur(String styleErreur) {
vue.afficherStyleErreurPrenom(styleErreur);
}
 
@Override
public void supprimerStyleErreur(String styleErreur) {
vue.supprimerStyleErreurPrenom(styleErreur);
}
};
ValidateurChampTexteNonNul validateurCourriel = new ValidateurChampTexteNonNul(vue.getCourrielObjet()) {
@Override
public void afficherStyleErreur(String styleErreur) {
vue.afficherStyleErreurCourriel(styleErreur);
}
 
@Override
public void supprimerStyleErreur(String styleErreur) {
vue.supprimerStyleErreurCourriel(styleErreur);
}
};
 
ValidateurChampTexteNonNul validateurCommentaire = new ValidateurChampTexteNonNul(vue.getCommentaire()) {
@Override
public void afficherStyleErreur(String styleErreur) {
vue.afficherStyleErreurCommentaire(styleErreur);
}
 
@Override
public void supprimerStyleErreur(String styleErreur) {
vue.supprimerStyleErreurCommentaire(styleErreur);
}
};
boolean nomSaisi = validateurNom.valider();
boolean prenomSaisi = validateurPrenom.valider();
boolean courrielSaisi = validateurCourriel.valider();
boolean commentaireSaisi = validateurCommentaire.valider();
 
return nomSaisi && prenomSaisi && courrielSaisi && commentaireSaisi;
}
 
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/formulaires/formulairecommentaire/FormulaireCommentaireVue.java
New file
0,0 → 1,126
package org.tela_botanica.del.client.composants.formulaires.formulairecommentaire;
 
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.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HasText;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
 
public class FormulaireCommentaireVue extends Composite implements FormulaireCommentairePresenteur.Vue {
@UiField
public TextBox nom, prenom, courriel;
 
@UiField
public TextArea commentaire;
 
@UiField
public Button boutonValidationCommentaire;
 
interface FormulairePropositionUIiBinder extends UiBinder<Widget, FormulaireCommentaireVue> {
};
 
FormulairePropositionUIiBinder uiBinder = GWT.create(FormulairePropositionUIiBinder.class);
 
public FormulaireCommentaireVue() {
initWidget(uiBinder.createAndBindUi(this));
}
 
@Override
public String getNom() {
return nom.getText();
}
@Override
public String getPrenom() {
return prenom.getText();
}
 
@Override
public TextArea getCommentaire() {
return commentaire;
}
 
@Override
public Button getBoutonValidationCommentaire() {
return boutonValidationCommentaire;
}
@Override
public void afficherStyleErreurCommentaire(String styleErreur) {
commentaire.addStyleName(styleErreur);
}
 
@Override
public void supprimerStyleErreurCommentaire(String styleErreur) {
commentaire.removeStyleName(styleErreur);
}
@Override
public void afficherStyleErreurNom(String styleErreur) {
nom.addStyleName(styleErreur);
}
 
@Override
public void supprimerStyleErreurNom(String styleErreur) {
nom.removeStyleName(styleErreur);
}
@Override
public void afficherStyleErreurPrenom(String styleErreur) {
prenom.addStyleName(styleErreur);
}
 
@Override
public void supprimerStyleErreurPrenom(String styleErreur) {
prenom.removeStyleName(styleErreur);
}
@Override
public void afficherNomPrenomEtDesactiver(String nom, String prenom, String courriel) {
this.nom.setText(nom);
this.nom.setEnabled(false);
this.prenom.setText(prenom);
this.prenom.setEnabled(false);
this.courriel.setText(courriel);
this.courriel.setEnabled(false);
}
 
@Override
public HasText getNomObjet() {
return nom;
}
@Override
public HasText getPrenomObjet() {
return prenom;
}
 
@Override
public String getCourriel() {
return courriel.getText();
}
 
@Override
public void afficherStyleErreurCourriel(String styleErreur) {
courriel.addStyleName(styleErreur);
}
 
@Override
public void supprimerStyleErreurCourriel(String styleErreur) {
courriel.removeStyleName(styleErreur);
}
 
@Override
public HasText getCourrielObjet() {
return courriel;
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/formulaires/formulairecommentaire/formulaireCommentaire.css
New file
0,0 → 1,69
.formulaireProposition {
z-index: 1500;
padding: 50px;
background: white;
width: 300px;
margin: 0 auto;
margin-top: 75px;
}
 
.boutonProposer:hover {
background-color: #AAA
}
 
.colonneGauche,.colonneDroite {
width: 250px;
}
 
.colonneGauche {
padding-right: 30px
}
 
.colonneGauche select {
width: 100%
}
 
.colonneGauche input {
width: 95%
}
 
.commentaire {
width: 250px;
height: 100px
}
 
.propositionTaxon {
width: 100%;
height: 30px;
}
 
.boutonProposer {
border: solid 1px #AAA;
cursor: pointer;
float: left;
margin-top: 10px;
margin-bottom: 5px;
margin-right: 30px;
float: right;
background: url(./img/add.png) no-repeat 5px 7px #DDD;
padding: 5px;
padding-left: 25px;
cursor: pointer
}
 
 
.zoneNom {
width:30%;
float:left;
margin-right:5px;
}
 
.zonePrenom {
width:30%;
float:left;
}
 
.zoneEmail {
clear:left;
padding-top:5px;
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/formulaires/identification/FormulaireIdentificationVue.ui.xml
New file
0,0 → 1,34
<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:generateLocales="default">
<ui:with field='res' type='org.tela_botanica.del.client.resources.Ressources' />
<ui:with field="constants" type="org.tela_botanica.del.client.i18n.Vocabulary" />
<ui:style src="identification.css" />
<g:HTMLPanel styleName="{style.zoneIdentification} {style.zoneFormulaire}">
<g:Label ui:field="titreSeConnecter" styleName="{style.connecter}" text="{constants.titreSeConnecter}" />
<g:Label ui:field="titreEstIdentifie" styleName="{style.connecter}" text="{constants.titreEstIdentifie}" />
<g:HTMLPanel ui:field="zoneUtilisateur">
<g:HTMLPanel styleName="{style.infoConnexion}">
<g:Label ui:field="email" styleName="{style.email}">Email</g:Label>
<g:Label ui:field="preferences" styleName="{style.preferences}" text="{constants.preferences}"></g:Label>
<g:Label ui:field="deconnecter" styleName="{style.deconnecter}" text="{constants.seDeconnecter}" />
</g:HTMLPanel>
</g:HTMLPanel>
<g:HTMLPanel ui:field="zoneFormulaire">
<g:HTMLPanel styleName="{style.colonneGauche}">
<g:Label text="{constants.login}" />
<g:TextBox ui:field="login" styleName="{style.login}" />
<g:Label text="{constants.motdepasse}" />
<g:PasswordTextBox ui:field="motdepasse" styleName="{style.motdepasse}"></g:PasswordTextBox>
<g:Button ui:field="boutonOK" styleName="{style.boutonOK}">OK</g:Button>
<g:Label ui:field="erreurIdentification" styleName="{style.erreur}"></g:Label>
</g:HTMLPanel>
<g:HTMLPanel styleName="{style.colonneDroite}">
<ui:msg key="texteConnexion">Texte de connexion</ui:msg>
</g:HTMLPanel>
</g:HTMLPanel>
</g:HTMLPanel>
</ui:UiBinder>
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/formulaires/identification/FormulaireIdentificationPresenteur.java
New file
0,0 → 1,198
package org.tela_botanica.del.client.composants.formulaires.identification;
 
import org.tela_botanica.del.client.cache.CacheClient;
import org.tela_botanica.del.client.composants.fenetreoverlay.FenetreOverlayDefilanteVue;
import org.tela_botanica.del.client.composants.fenetreoverlay.FenetreOverlaySimplePresenteur;
import org.tela_botanica.del.client.composants.preferences.PreferencesPresenteur;
import org.tela_botanica.del.client.composants.preferences.PreferencesVue;
import org.tela_botanica.del.client.modeles.Utilisateur;
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.changementPreferences.EvenementChangementPreferences;
import org.tela_botanica.del.client.navigation.evenement.changementPreferences.GestionnaireEvenementChangementPreferences;
import org.tela_botanica.del.client.services.rest.PreferencesServiceConcret;
import org.tela_botanica.del.client.services.rest.UtilisateurService;
import org.tela_botanica.del.client.services.rest.async.UtilisateurCallback;
 
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.HasKeyPressHandlers;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
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 FormulaireIdentificationPresenteur {
FenetreOverlaySimplePresenteur fenetreModalePresenteur = null;
 
public abstract interface Vue extends IsWidget {
public void ajouterVue(HasWidgets composite);
 
public HasClickHandlers getSeConnecter();
 
public HasClickHandlers getSeDeconnecter();
 
public void basculerAffichageFormulaire(boolean estConnecte);
 
public void basculerModeConnecte(Utilisateur utilisateur);
 
public HasClickHandlers getBoutonOK();
 
public HasText getLogin();
 
public HasText getMotdepasse();
 
public void afficherErreur();
 
public void masquerErreur();
 
public void viderFormulaire();
 
public void setErreur(String idTexte);
 
public String getErreur();
 
public HasKeyPressHandlers getLoginHasKeyPressHandler();
 
public HasKeyPressHandlers getMotdepasseHasKeyPressHandler();
 
HasClickHandlers getZonePreferencesClickHandler();
}
 
private Vue vue;
private Utilisateur utilisateur;
private UtilisateurService utilisateurService;
 
public FormulaireIdentificationPresenteur(Vue vue, UtilisateurService utilisateurService) {
this.vue = vue;
this.utilisateurService = utilisateurService;
utilisateurService.obtenirUtilisateur(new UtilisateurCallback() {
@Override
public void surRetour(Utilisateur objetRetour) {
utilisateur = objetRetour;
CacheClient.getInstance().setUtilisateur(utilisateur);
rafraichir();
}
});
gererEvenements();
}
 
public void rafraichir() {
utilisateur = CacheClient.getInstance().getUtilisateur();
vue.basculerModeConnecte(this.utilisateur);
BusEvenementiel.getInstance().fireEvent(new EvenementChangementEtatUtilisateur(utilisateur));
}
 
public void gererEvenements() {
vue.getBoutonOK().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
surTentativeLogin();
}
});
 
vue.getSeDeconnecter().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
deconnecterUtilisateur();
}
});
 
vue.getLoginHasKeyPressHandler().addKeyPressHandler(creerGestionnaireEvenementToucheEntree());
vue.getMotdepasseHasKeyPressHandler().addKeyPressHandler(creerGestionnaireEvenementToucheEntree());
vue.getZonePreferencesClickHandler().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
if(utilisateur.estIdentifie()) {
PreferencesPresenteur preferencesPresenteur = new PreferencesPresenteur(new PreferencesVue(), new PreferencesServiceConcret());
fenetreModalePresenteur = new FenetreOverlaySimplePresenteur(new FenetreOverlayDefilanteVue());
fenetreModalePresenteur.ouvrirFenetreModale(preferencesPresenteur);
}
}
});
BusEvenementiel.getInstance().addHandler(EvenementChangementPreferences.TYPE, new GestionnaireEvenementChangementPreferences() {
@Override
public void onChangementPreferences(EvenementChangementPreferences event) {
if(fenetreModalePresenteur != null && fenetreModalePresenteur.fenetreModaleEstOuverte()) {
fenetreModalePresenteur.fermerFenetreModale();
}
}
});
}
 
private void surTentativeLogin() {
String login = vue.getLogin().getText();
String motdepasse = vue.getMotdepasse().getText();
 
if (login.equals("") || motdepasse.equals("")) {
gererErreur("saisirLogin");
} else {
connecterUtilisateur(login, motdepasse);
}
}
 
public KeyPressHandler creerGestionnaireEvenementToucheEntree() {
return new KeyPressHandler() {
public void onKeyPress(KeyPressEvent event) {
if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) {
surTentativeLogin();
}
}
};
}
 
public void gererErreur(String erreur) {
vue.setErreur(erreur);
vue.afficherErreur();
}
 
public void connecterUtilisateur(String login, final String motdepasse) {
 
utilisateurService.connecterUtilisateur(login, motdepasse, new UtilisateurCallback() {
 
public void surErreur(String message) {
vue.setErreur("identificationRefus");
vue.afficherErreur();
}
 
@Override
public void surRetour(Utilisateur objetRetour) {
utilisateur = objetRetour;
CacheClient.getInstance().setUtilisateur(utilisateur);
if (utilisateur.estIdentifie()) {
vue.masquerErreur();
rafraichir();
vue.viderFormulaire();
}
}
});
}
 
public void deconnecterUtilisateur() {
utilisateurService.deconnecterUtilisateur(new UtilisateurCallback() {
 
public void surErreur(String message) {
vue.setErreur("identificationRefus");
vue.afficherErreur();
}
 
@Override
public void surRetour(Utilisateur objetRetour) {
utilisateur = objetRetour;
CacheClient.getInstance().setUtilisateur(utilisateur);
rafraichir();
}
});
}
 
public void go(HasWidgets composite) {
vue.ajouterVue(composite);
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/formulaires/identification/FormulaireIdentificationVue.java
New file
0,0 → 1,147
package org.tela_botanica.del.client.composants.formulaires.identification;
 
import org.tela_botanica.del.client.i18n.I18n;
import org.tela_botanica.del.client.modeles.Utilisateur;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.event.dom.client.HasKeyPressHandlers;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
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.TextBox;
import com.google.gwt.user.client.ui.Widget;
 
public class FormulaireIdentificationVue extends Composite implements FormulaireIdentificationPresenteur.Vue {
interface Binder extends UiBinder<Widget, FormulaireIdentificationVue> {
}
private static Binder uiBinder = GWT.create(Binder.class);
@UiField
Label titreSeConnecter, titreEstIdentifie, deconnecter, email, erreurIdentification, preferences;
@UiField Panel zoneFormulaire;
@UiField Button boutonOK;
@UiField TextBox login, motdepasse;
public FormulaireIdentificationVue() {
initWidget(uiBinder.createAndBindUi(this));
titreSeConnecter.setVisible(false);
erreurIdentification.setVisible(false);
}
@Override
public void ajouterVue(HasWidgets composite) {
composite.add(this.asWidget());
}
 
@Override
public HasClickHandlers getSeConnecter() {
return titreSeConnecter;
}
 
@Override
public void basculerAffichageFormulaire(boolean estConnecte) {
zoneFormulaire.setVisible(!estConnecte);
}
 
@Override
public void basculerModeConnecte(Utilisateur utilisateur) {
//Dans le mode non-connecté, on veut :
// - un bandeau vert avec ecrit Identifiez-vous
// - le formulaire courriel/password/texte et btn ok
// dans le mode connecté on veut :
// - un bandeau vert avec écrit Bienvenue
// - l'email de l'utilisateur
// - un btn déconnecter
// - un btn préférences
boolean estConnecte = utilisateur.estIdentifie();
// mode non-connecté
titreSeConnecter.setVisible(!estConnecte);
titreEstIdentifie.setVisible(estConnecte);
deconnecter.setVisible(estConnecte);
preferences.setVisible(estConnecte);
email.setText(utilisateur.getNomPrenomFormate());
email.setVisible(estConnecte);
basculerAffichageFormulaire(estConnecte);
}
 
@Override
public HasClickHandlers getBoutonOK() {
return boutonOK;
}
 
@Override
public TextBox getLogin() {
return login;
}
 
@Override
public TextBox getMotdepasse() {
return motdepasse;
}
 
@Override
public HasClickHandlers getSeDeconnecter() {
return deconnecter;
}
@Override
public void afficherErreur() {
erreurIdentification.setVisible(true);
}
@Override
public void masquerErreur() {
erreurIdentification.setVisible(false);
}
@Override
public void viderFormulaire() {
login.setText("");
motdepasse.setText("");
}
@Override
public void setErreur(String idTexte) {
String texte = "";
if (idTexte.equals("saisirLogin")) {
texte = I18n.getMessages().saisirLogin();
} else {
texte = I18n.getMessages().identificationRefus();
}
erreurIdentification.setText(texte);
}
public String getErreur() {
return erreurIdentification.getText();
}
 
@Override
public HasKeyPressHandlers getLoginHasKeyPressHandler() {
return login;
}
 
@Override
public HasKeyPressHandlers getMotdepasseHasKeyPressHandler() {
return motdepasse;
}
@Override
public HasClickHandlers getZonePreferencesClickHandler() {
return preferences;
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/formulaires/identification/identification.css
New file
0,0 → 1,86
.zoneIdentification {
font-size:11px;
padding:30px 15px 22px 15px;
height:70px;
background: none repeat scroll 0 0 white;
border: 1px solid #99C242;
border-radius: 0 10px 10px 10px;
text-align: left;
text-decoration: none;
width: 350px;
}
 
.connecter {
background-color: #99C242;
border-radius: 0 10px 0 0;
color: white;
font-size: 12px;
padding: 5px 5px 5px 9px;
text-align: left;
text-transform: uppercase;
width: 347px;
position:absolute;
margin-left:-15px;
margin-top:-30px;
padding-right:25px
}
 
.deconnecter, .preferences {
text-decoration: underline;
color: blue;
cursor: pointer
}
 
.email, .preferences {
padding-right: 10px
}
 
.zoneFormulaire {
}
 
.login {
width:150px;
font-size:11px;
}
 
.motdepasse {
width:150px;
font-size:11px;
}
 
.erreur {
color: red;
position:absolute;
margin-top:7px;
}
 
.boutonOK {
font-size:11px;
}
 
.colonneGauche {
float:left;
padding-bottom:15px;
margin-right:5px;
width:210px;
}
 
.colonneDroite {
float:left;
margin-right:5px;
padding-bottom:15px;
}
 
.zoneUtilisateur {
text-align:center;
}
 
.infoConnexion {
text-align:center;
font-size:15px;
}
 
.infoConnexion>div:first-child {
margin-top:10px;
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/formulaires/identification/FormulaireIdentificationVueBinderImplGenMessages.properties
New file
0,0 → 1,3
texteConnexion=<a href="http://www.tela-botanica.org/page:inscription">S''inscrire... </a> \
<p class="connect gris">Devenez telabotaniste et partagez votre passion pour le végétal !</p> \
<p> <a href="https://www.tela-botanica.org/wp-login.php?action=lostpassword" id="lien_inscription">Mot de passe perdu ? </a></p>
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/formulaires/formulaireproposition/FormulairePropositionVue.ui.xml
New file
0,0 → 1,42
<!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="formulaireProposition.css" />
<g:HTMLPanel styleName="{style.formulaireProposition}">
<g:Label text="{constants.proposerSaDetermination}" styleName="titre"/>
<g:HTML><br /></g:HTML>
<g:HTMLPanel styleName="{style.colonneGauche}">
<g:Label ui:field="labelnomPrenom" text="{constants.vous}" styleName="sousTitre"/>
<g:HTMLPanel styleName="{style.zoneNom}">
<g:Label text="{constants.nom}" styleName="petit" />
<g:TextBox ui:field="nom"/>
</g:HTMLPanel>
<g:HTMLPanel styleName="{style.zonePrenom}">
<g:Label text="{constants.prenom}" styleName="petit" />
<g:TextBox ui:field="prenom"/>
</g:HTMLPanel>
<g:HTMLPanel styleName="{style.zoneEmail}">
<g:Label text="Votre adresse email : " styleName="petit" />
<g:TextBox ui:field="courriel" />
</g:HTMLPanel>
<g:HTML><br /></g:HTML>
<g:Label text="{constants.choisirUnTaxon}" styleName="sousTitre"/>
<g:Label text="{constants.referentiel}" styleName="petit"/>
<g:ListBox ui:field="referentiel" />
<g:HTML HTML="{constants.infoTaxon}" styleName="petit"/>
<g:LayoutPanel ui:field="propositionTaxon" styleName="{style.propositionTaxon}" />
<g:HTML><br /></g:HTML>
<g:Label text="{constants.commentaire}" styleName="sousTitre"/>
<g:TextArea ui:field="commentaires" styleName="{style.commentaire}" />
<g:Button text="{constants.boutonProposer}" ui:field="boutonValidationProposition" styleName="{style.boutonProposer} arrondi"/>
</g:HTMLPanel>
</g:HTMLPanel>
 
</ui:UiBinder>
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/formulaires/formulaireproposition/FormulairePropositionPresenteur.java
New file
0,0 → 1,293
package org.tela_botanica.del.client.composants.formulaires.formulaireproposition;
 
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
 
import org.tela_botanica.del.client.cache.CacheClient;
import org.tela_botanica.del.client.composants.formulaires.autocompletion.AutoCompletionComboBoxPresenteur;
import org.tela_botanica.del.client.composants.formulaires.autocompletion.AutoCompletionComboBoxVue;
import org.tela_botanica.del.client.composants.presenteur.Presenteur;
import org.tela_botanica.del.client.composants.validation.ValidateurChampTexteNonNul;
import org.tela_botanica.del.client.config.Config;
import org.tela_botanica.del.client.i18n.I18n;
import org.tela_botanica.del.client.modeles.Contributeur;
import org.tela_botanica.del.client.modeles.InterventionForum;
import org.tela_botanica.del.client.modeles.PropositionDetermination;
import org.tela_botanica.del.client.modeles.Utilisateur;
import org.tela_botanica.del.client.navigation.evenement.BusEvenementiel;
import org.tela_botanica.del.client.navigation.evenement.ajoutdetermination.EvenementAjoutDetermination;
import org.tela_botanica.del.client.services.ReferentielService;
import org.tela_botanica.del.client.services.rest.PropositionDeterminationService;
import org.tela_botanica.del.client.services.rest.async.PropositionDeterminationCallBack;
import org.tela_botanica.del.client.utils.InfosNomPourAutocompletion;
import org.tela_botanica.del.client.utils.UtilitairesAutoCompletionService;
 
import com.google.gwt.core.client.GWT;
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.http.client.Response;
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 FormulairePropositionPresenteur extends Presenteur {
 
public interface Vue extends IsWidget {
public HasText getObjetNom();
 
public HasText getObjetPrenom();
 
public HasWidgets getPropositionTaxon();
 
public HasText getCommentaires();
 
public HasClickHandlers getBoutonValidationProposition();
 
public void afficherNomPrenomEtDesactiver(String nom, String prenom);
 
public String getCourriel();
 
public void afficherEmailEtDesactiver(String courriel);
 
public String getNom();
 
public String getPrenom();
 
public void afficherStyleErreurNom(String styleErreur);
 
public void supprimerStyleErreurNom(String styleErreur);
 
public void afficherStyleErreurPrenom(String styleErreur);
 
public void supprimerStyleErreurPrenom(String styleErreur);
public void afficherPropositionDejaEffectuée(String taxon);
 
public HasText getObjetCourriel();
public void setReferentiel(String referentiel);
public String getReferentiel();
 
public void afficherStyleErreurCourriel(String styleErreur);
 
void supprimerStyleErreurCourriel(String styleErreur);
 
void remplirListeReferentiels(Map<String, String> listeReferentiels);
}
 
private Vue vue;
private Config config;
private AutoCompletionComboBoxPresenteur autoCompletionNomTaxonsPresenteur;
private PropositionDeterminationService propositionDeterminationService;
private Map<String, InfosNomPourAutocompletion> cacheTaxons = new HashMap<String, InfosNomPourAutocompletion>();
 
public FormulairePropositionPresenteur(Vue vue, PropositionDeterminationService propositionDeterminationService) {
this.vue = vue;
this.propositionDeterminationService=propositionDeterminationService;
config = new Config();
creerCompletionTaxons();
remplirAvecInfosUtilisateur();
}
 
private void remplirAvecInfosUtilisateur() {
Utilisateur utilisateur = CacheClient.getInstance().getUtilisateur();
if (utilisateur.estIdentifie()) {
vue.afficherNomPrenomEtDesactiver(utilisateur.getNom(), utilisateur.getPrenom());
vue.afficherEmailEtDesactiver(utilisateur.getCourriel());
}
}
 
private void creerCompletionTaxons() {
String url = this.config.getServiceBaseUrl() + "nomstaxons";
vue.remplirListeReferentiels(ReferentielService.getReferentiels());
final String referentiel = CacheClient.getInstance().getObservationCourante().getReferentiel();
 
// découpage pseudo-intelligent du nom de référentiel
String referentielPredefini;
int positionDeuxPoints = referentiel.indexOf(':');
if (positionDeuxPoints == -1) {
referentielPredefini = referentiel;
} else {
referentielPredefini = referentiel.substring(0, positionDeuxPoints);
}
if (referentielPredefini.equals("autre") || referentielPredefini.equals("")) {
referentielPredefini = "bdtfx"; // évite de saisir des noms latins en dur et de perdre le nn
}
vue.setReferentiel(referentielPredefini);
autoCompletionNomTaxonsPresenteur = new AutoCompletionComboBoxPresenteur(new AutoCompletionComboBoxVue(), url) {
protected String effectuerPreTraitementChaineRequete(String requete) {
// si aucun référentiel selectionné, pas de requete
if(vue.getReferentiel() != null && !vue.getReferentiel().equals("") && !vue.getReferentiel().equals("tous")) {
// découpage pseudo-intelligent du nom de référentiel
String refFmt;
int positionDeuxPoints = vue.getReferentiel().indexOf(':');
if (positionDeuxPoints == -1) {
refFmt = vue.getReferentiel();
} else {
refFmt = vue.getReferentiel().substring(0, positionDeuxPoints);
}
requete = "?masque.nom=" + requete + "&masque.referentiel=" + refFmt;
return requete;
} else {
return null;
}
}
 
@Override
protected InfosNomPourAutocompletion[] parserResultatRequete(Response response) {
cacheTaxons = UtilitairesAutoCompletionService.extraireTaxonsNumNomsResultatRetourSimple(response);
return UtilitairesAutoCompletionService.parserResultatRetourSimple(response);
}
};
}
 
public void go(HasWidgets composite) {
autoCompletionNomTaxonsPresenteur.go(vue.getPropositionTaxon());
composite.add(vue.asWidget());
gererEvenements();
}
 
protected void gererEvenements() {
vue.getBoutonValidationProposition().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
 
if (!validerSaisieProposition()) {
return;
} else {
final PropositionDetermination propositionAjoutee = collecterValeursSaisieProposition();
if(verifierPropositionDejaAjoutee(propositionAjoutee)){
BusEvenementiel.getInstance().fireEvent(new EvenementAjoutDetermination(propositionAjoutee));
vue.afficherPropositionDejaEffectuée(propositionAjoutee.getEspece());
return;
}
 
propositionDeterminationService.ajouterProposition(propositionAjoutee, new PropositionDeterminationCallBack() {
 
@Override
public void surRetour(String idNouvelleProposition) {
propositionAjoutee.setId(idNouvelleProposition);
CacheClient.getInstance().getObservationCourante().ajouterPropositionDetermination(propositionAjoutee);
EvenementAjoutDetermination evenementAjoutDetermination = new EvenementAjoutDetermination(propositionAjoutee);
BusEvenementiel.getInstance().fireEvent(evenementAjoutDetermination);
}
 
});
}
}
});
}
 
private boolean verifierPropositionDejaAjoutee(PropositionDetermination propositionDetermination){
for(InterventionForum interventionForum: CacheClient.getInstance().getObservationCourante().getInterventionsForum()){
if(interventionForum instanceof PropositionDetermination){
if(((PropositionDetermination)interventionForum).getEspece().trim().equals(propositionDetermination.getEspece().trim())){
return true;
}
}
}
return false;
}
private boolean validerSaisieProposition() {
 
ValidateurChampTexteNonNul validateurNom = new ValidateurChampTexteNonNul(vue.getObjetNom()) {
@Override
public void afficherStyleErreur(String styleErreur) {
vue.afficherStyleErreurNom(styleErreur);
}
 
@Override
public void supprimerStyleErreur(String styleErreur) {
vue.supprimerStyleErreurNom(styleErreur);
}
};
 
ValidateurChampTexteNonNul validateurPrenom = new ValidateurChampTexteNonNul(vue.getObjetPrenom()) {
@Override
public void afficherStyleErreur(String styleErreur) {
vue.afficherStyleErreurPrenom(styleErreur);
}
 
@Override
public void supprimerStyleErreur(String styleErreur) {
vue.supprimerStyleErreurPrenom(styleErreur);
}
};
ValidateurChampTexteNonNul validateurCourriel = new ValidateurChampTexteNonNul(vue.getObjetCourriel()) {
@Override
public void afficherStyleErreur(String styleErreur) {
vue.afficherStyleErreurCourriel(styleErreur);
}
 
@Override
public void supprimerStyleErreur(String styleErreur) {
vue.supprimerStyleErreurCourriel(styleErreur);
}
};
 
ValidateurChampTexteNonNul validateurTaxon = new ValidateurChampTexteNonNul(autoCompletionNomTaxonsPresenteur.getAutoCompletionComboBoxVue().getSuggestBox()) {
@Override
public void afficherStyleErreur(String styleErreur) {
autoCompletionNomTaxonsPresenteur.afficherStyleErreur(styleErreur);
}
 
@Override
public void supprimerStyleErreur(String styleErreur) {
autoCompletionNomTaxonsPresenteur.supprimerStyleErreur(styleErreur);
}
};
 
boolean nomSaisi = validateurNom.valider();
boolean prenomSaisi = validateurPrenom.valider();
boolean courrielSaisi = validateurCourriel.valider();
boolean taxonSaisi = validateurTaxon.valider();
String taxonSaisiStr = autoCompletionNomTaxonsPresenteur.getValeur();
boolean utilisateurConfirme = true;
// Si le nom est vide une erreur a déjà été déclenchée plus haut (donc pas la peine de tester cacheTaxons)
if(!taxonSaisiStr.trim().isEmpty() && !cacheTaxons.containsKey(taxonSaisiStr.trim())) {
utilisateurConfirme = Window.confirm(I18n.getVocabulary().attentionPropositionTaxon());
}
 
return nomSaisi && prenomSaisi && courrielSaisi && taxonSaisi && utilisateurConfirme;
}
 
private PropositionDetermination collecterValeursSaisieProposition() {
PropositionDetermination propositionAjoutee = new PropositionDetermination(CacheClient.getInstance().getObservationCourante());
propositionAjoutee.setId(CacheClient.getInstance().getObservationCourante().getId());
 
String idUtilisateur = null;
if (CacheClient.getInstance().getUtilisateur().estIdentifie()) {
idUtilisateur = CacheClient.getInstance().getUtilisateur().getId();
}
 
Contributeur contributeur = new Contributeur(idUtilisateur, vue.getNom(), vue.getPrenom(), vue.getCourriel());
propositionAjoutee.setContributeur(contributeur);
propositionAjoutee.setDate(new Date());
String nomTaxon = autoCompletionNomTaxonsPresenteur.getValeur();
propositionAjoutee.setEspece(nomTaxon);
if(cacheTaxons.containsKey(nomTaxon.trim())) {
propositionAjoutee.setNumNomenclatural("" + cacheTaxons.get(nomTaxon.trim()).getNn());
}
if(vue.getReferentiel() != "tous") {
propositionAjoutee.setReferentiel(vue.getReferentiel());
}
if (vue.getCommentaires().getText() != "") {
String contenuCommentaire = vue.getCommentaires().getText();
propositionAjoutee.setCommentaire(contenuCommentaire);
}
 
return propositionAjoutee;
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/formulaires/formulaireproposition/FormulairePropositionVue.java
New file
0,0 → 1,168
package org.tela_botanica.del.client.composants.formulaires.formulaireproposition;
 
import java.util.Iterator;
import java.util.Map;
 
import org.tela_botanica.del.client.i18n.I18n;
 
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.Window;
import com.google.gwt.user.client.ui.Button;
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.LayoutPanel;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
 
public class FormulairePropositionVue extends Composite implements FormulairePropositionPresenteur.Vue {
 
@UiField
public TextBox nom, prenom, courriel;
 
@UiField
public LayoutPanel propositionTaxon;
 
@UiField
public TextArea commentaires;
 
@UiField
public Button boutonValidationProposition;
@UiField
public Label labelnomPrenom;
@UiField
ListBox referentiel;
 
interface FormulairePropositionUIiBinder extends UiBinder<Widget, FormulairePropositionVue> {
};
 
FormulairePropositionUIiBinder uiBinder = GWT.create(FormulairePropositionUIiBinder.class);
 
public FormulairePropositionVue() {
initWidget(uiBinder.createAndBindUi(this));
}
 
 
@Override
public LayoutPanel getPropositionTaxon() {
return propositionTaxon;
}
 
@Override
public TextArea getCommentaires() {
return commentaires;
}
 
@Override
public Button getBoutonValidationProposition() {
return boutonValidationProposition;
}
 
@Override
public void afficherStyleErreurNom(String styleErreur) {
nom.addStyleName(styleErreur);
}
 
@Override
public void supprimerStyleErreurNom(String styleErreur) {
nom.removeStyleName(styleErreur);
}
@Override
public void afficherStyleErreurPrenom(String styleErreur) {
prenom.addStyleName(styleErreur);
}
 
@Override
public void supprimerStyleErreurPrenom(String styleErreur) {
prenom.removeStyleName(styleErreur);
}
@Override
public void afficherNomPrenomEtDesactiver(String nom, String prenom) {
this.nom.setText(nom);
this.prenom.setText(prenom);
this.nom.setEnabled(false);
this.prenom.setEnabled(false);
}
@Override
public void afficherEmailEtDesactiver(String courriel) {
this.courriel.setText(courriel);
this.courriel.setEnabled(false);
}
public void afficherPropositionDejaEffectuée(String taxon)
{
Window.alert(I18n.getMessages().propositionDejaEffectuee(taxon));
}
 
@Override
public String getCourriel() {
return courriel.getText();
}
 
@Override
public String getNom() {
return nom.getText();
}
 
@Override
public String getPrenom() {
return prenom.getText();
}
 
 
@Override
public HasText getObjetNom() {
return this.nom;
}
@Override
public HasText getObjetPrenom() {
return this.prenom;
}
 
 
@Override
public HasText getObjetCourriel() {
return this.courriel;
}
 
@Override
public void afficherStyleErreurCourriel(String styleErreur) {
courriel.setStyleName(styleErreur);
}
@Override
public void supprimerStyleErreurCourriel(String styleErreur) {
courriel.removeStyleName(styleErreur);
}
 
@Override
public void remplirListeReferentiels(Map<String, String> listeReferentiels) {
for (Iterator<String> iterator = listeReferentiels.keySet().iterator(); iterator.hasNext();) {
String codeRef = iterator.next();
referentiel.addItem(listeReferentiels.get(codeRef), codeRef);
}
}
@Override
public void setReferentiel(String codeReferentiel) {
for(int i = 0; i < referentiel.getItemCount(); i++) {
if(referentiel.getValue(i).equals(codeReferentiel)) {
referentiel.setSelectedIndex(i);
}
}
}
 
@Override
public String getReferentiel() {
return referentiel.getValue(referentiel.getSelectedIndex());
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/formulaires/formulaireproposition/formulaireProposition.css
New file
0,0 → 1,71
.formulaireProposition {
z-index: 1500;
padding: 30px;
padding-right: 21px;
padding-top: 20px;
background: white;
width: 370px;
margin: 0 auto;
margin-top: 75px;
padding-bottom:50px;
}
 
.boutonProposer:hover {
background-color: #AAA
}
 
.colonneGauche,.colonneDroite {
width: 300px;
}
 
.colonneGauche {
padding-right: 30px
}
 
.colonneGauche select {
width: 100%
}
 
.colonneGauche input {
width: 95%
}
 
.commentaire {
width: 260px;
height: 100px;
}
 
.propositionTaxon {
width: 100%;
height: 30px;
}
 
.boutonProposer {
border: solid 1px #AAA;
cursor: pointer;
float: left;
margin-top: 10px;
margin-bottom: 5px;
margin-right: 5px;
float: right;
background: url(./img/add.png) no-repeat 5px 7px #DDD;
padding: 5px;
padding-left: 25px;
cursor: pointer
}
 
.zoneNom {
width:30%;
float:left;
margin-right:5px;
}
 
.zonePrenom {
width:30%;
float:left;
}
 
.zoneEmail {
clear:left;
padding-top:5px;
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/formulaires/autocompletion/AutoCompletionComboBoxPresenteur.java
New file
0,0 → 1,208
package org.tela_botanica.del.client.composants.formulaires.autocompletion;
 
import org.tela_botanica.del.client.utils.InfosNomPourAutocompletion;
 
import com.google.gwt.core.client.Callback;
import com.google.gwt.event.dom.client.HasKeyPressHandlers;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.event.logical.shared.HasSelectionHandlers;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.RequestException;
import com.google.gwt.http.client.Response;
import com.google.gwt.http.client.URL;
import com.google.gwt.user.client.Timer;
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.SuggestOracle;
import com.google.gwt.user.client.ui.SuggestOracle.Suggestion;
 
public abstract class AutoCompletionComboBoxPresenteur {
public interface Vue extends IsWidget {
public void ajouterVue(HasWidgets composite);
public HasKeyPressHandlers getSuggestBoxHasKeyPressHandlers();
public String getValeur();
public void remplirListe(InfosNomPourAutocompletion[] suggestions);
public void afficherSuggestions(SuggestOracle.Request request,SuggestOracle.Callback response);
public void afficherListeDeroulante();
public void nettoyer();
public void setValeur(String valeur);
public HasSelectionHandlers<Suggestion> getSuggestBoxHasSelectionChangeHandlers();
public HasText getSuggestBox();
public void afficherStyleErreur(String styleErreur);
public void supprimerStyleErreur(String styleErreur);
public void setHandlerCopierColler(Callback<String, String> cb);
}
private Vue autoCompletionComboBoxVue;
SuggestOracle.Request requeteOracle;
SuggestOracle.Callback callBackOracle;
Timer suggestionTimer = null;
int tempsAvantRequete = 500;
String urlRequete = "";
public AutoCompletionComboBoxPresenteur(Vue vue, String urlRequete) {
this.autoCompletionComboBoxVue = vue;
this.urlRequete = urlRequete;
gererEvenements();
}
public void go(HasWidgets composite) {
autoCompletionComboBoxVue.ajouterVue(composite);
}
public void gererEvenements() {
autoCompletionComboBoxVue.getSuggestBoxHasKeyPressHandlers().addKeyPressHandler(new KeyPressHandler() {
public void onKeyPress(KeyPressEvent event) {
if(event.getUnicodeCharCode() != 0) {
gererTimer();
}
}
});
requeteOracle = new SuggestOracle.Request();
callBackOracle = new SuggestOracle.Callback() {
 
public void onSuggestionsReady(SuggestOracle.Request request, SuggestOracle.Response response) {
autoCompletionComboBoxVue.afficherListeDeroulante();
}
};
autoCompletionComboBoxVue.getSuggestBoxHasSelectionChangeHandlers().addSelectionHandler(new SelectionHandler<SuggestOracle.Suggestion>(){
@Override
public void onSelection(SelectionEvent<Suggestion> event) {
surSelectionSuggestion(event.getSelectedItem().getReplacementString());
}
});
autoCompletionComboBoxVue.setHandlerCopierColler(new Callback<String, String>() {
@Override
public void onSuccess(String result) {
gererTimer();
}
@Override
public void onFailure(String reason) {
// rien à faire ça n'échoue jamais
}
});
}
public void gererTimer() {
if(suggestionTimer == null) {
suggestionTimer = new Timer() {
public void run() {
requeteSuggestions();
}
};
suggestionTimer.schedule(tempsAvantRequete);
} else {
suggestionTimer.schedule(tempsAvantRequete);
}
}
public void setTempsAvantRequete(int temps) {
tempsAvantRequete = temps;
}
public int getTempsAvantRequete(int temps) {
return tempsAvantRequete;
}
public String getValeur() {
return autoCompletionComboBoxVue.getValeur();
}
public void setValeur(String taxon) {
autoCompletionComboBoxVue.setValeur(taxon);
}
public void nettoyer() {
autoCompletionComboBoxVue.nettoyer();
}
public void requeteSuggestions() {
// Suppression des espaces et caractères inutiles
String valeur = autoCompletionComboBoxVue.getValeur().trim();
final String requete = URL.encodeQueryString(valeur);
String requeteAjax = effectuerPreTraitementChaineRequete(requete);
// ceci permet au composant qui utilise l'autocomplétion
// d'annuler une requete
if(requeteAjax == null) {
return;
}
String urlProxy = urlRequete+requeteAjax;
RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, urlProxy) ;
try {
rb.sendRequest(null, new RequestCallback() {
public void onError(final Request request, final Throwable exception) {
// TODO Auto-generated method stub
}
 
public void onResponseReceived(final Request request,
final Response response) {
surReponseRequete(requete, response);
}
}) ;
 
} catch (RequestException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void surReponseRequete(String requete, Response response) {
InfosNomPourAutocompletion[] valeurs = parserResultatRequete(response);
autoCompletionComboBoxVue.remplirListe(valeurs);
requeteOracle.setQuery(requete);
autoCompletionComboBoxVue.afficherSuggestions(requeteOracle, callBackOracle);
}
protected void surSelectionSuggestion(String suggestion) {
return;
}
/**
* Permet d'intervenir sur la chaine tapée par l'utilisateur avant que celle-ci ne soit passée
* à la requête asynchrone pour pouvoir la formater (pour mettre en minuscule, séparer des termes)
* par défaut renvoie la chaine telle quelle, à surcharger au besoin
* @param String requete chaine de recherche contenant ce que l'utilisateur à tapé
* @return String une chaine transformée
*/
protected String effectuerPreTraitementChaineRequete(String requete) {
return requete;
}
/**
* Parse les résultats de la requete afin de pouvoir les utiliser à implémenter par le
* composants qui crée la combobox selon le contexte et le web service appelé.
* @param Response la réponse à la requête asynchrone
* @return String[] le tableau des suggestions qui sera affiché dans la combobox
*/
protected abstract InfosNomPourAutocompletion[] parserResultatRequete(Response response);
 
public Vue getAutoCompletionComboBoxVue() {
return autoCompletionComboBoxVue;
}
public void afficherStyleErreur(String styleErreur) {
autoCompletionComboBoxVue.afficherStyleErreur(styleErreur);
}
public void supprimerStyleErreur(String styleErreur) {
autoCompletionComboBoxVue.supprimerStyleErreur(styleErreur);
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/formulaires/autocompletion/AutoCompletionComboBoxVue.java
New file
0,0 → 1,105
package org.tela_botanica.del.client.composants.formulaires.autocompletion;
 
import org.tela_botanica.del.client.utils.InfosNomPourAutocompletion;
import org.tela_botanica.del.client.utils.TBSuggestOracle;
 
import com.google.gwt.core.client.Callback;
import com.google.gwt.event.dom.client.HasKeyPressHandlers;
import com.google.gwt.event.logical.shared.HasSelectionHandlers;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.SuggestOracle;
import com.google.gwt.user.client.ui.SuggestOracle.Suggestion;
 
public class AutoCompletionComboBoxVue extends LayoutPanel implements AutoCompletionComboBoxPresenteur.Vue {
 
TBSuggestOracle msu = new TBSuggestOracle();
SuggestBox suggestions = new SuggestBox(msu);
Callback<String, String> surCopierColler = null;
 
public AutoCompletionComboBoxVue() {
add(suggestions);
setHeight("25px");
setWidth("100%");
sinkEvents(Event.ONPASTE);
}
@Override
public SuggestBox getSuggestBox() {
return suggestions;
}
public void remplirListe(InfosNomPourAutocompletion[] listePropositions) {
msu.clear();
for (int i = 0; i < listePropositions.length; i++) {
msu.add(listePropositions[i]);
}
}
@Override
public void afficherSuggestions(SuggestOracle.Request requeteOracle, SuggestOracle.Callback callBackOracle) {
msu.requestSuggestions(requeteOracle, callBackOracle);
}
@Override
public void afficherListeDeroulante() {
suggestions.showSuggestionList();
}
public void nettoyer() {
suggestions.setText("");
}
public void setValeur(String taxon) {
suggestions.setValue(taxon);
}
 
@Override
public HasKeyPressHandlers getSuggestBoxHasKeyPressHandlers() {
return suggestions;
}
@Override
public HasSelectionHandlers<Suggestion> getSuggestBoxHasSelectionChangeHandlers() {
return suggestions;
}
 
@Override
public String getValeur() {
return suggestions.getText();
}
 
@Override
public void ajouterVue(HasWidgets composite) {
composite.add(this.asWidget());
}
 
@Override
public void afficherStyleErreur(String styleErreur) {
suggestions.addStyleName(styleErreur);
}
 
@Override
public void supprimerStyleErreur(String styleErreur) {
suggestions.removeStyleName(styleErreur);
}
public void onBrowserEvent(Event event) {
super.onBrowserEvent(event);
switch (event.getTypeInt()) {
case Event.ONPASTE: {
if(surCopierColler != null) {
surCopierColler.onSuccess(suggestions.getValueBox().getValue());
}
}
}
}
 
@Override
public void setHandlerCopierColler(Callback<String, String> cb) {
surCopierColler = cb;
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/forum/ArbreCommentairePresenteur.java
New file
0,0 → 1,40
package org.tela_botanica.del.client.composants.forum;
 
import org.tela_botanica.del.client.modeles.InterventionForum;
 
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.IsWidget;
 
public class ArbreCommentairePresenteur {
private InterventionForum possesseurDeCommentaires;
public interface Vue extends IsWidget {
public void creerArbreCommentaire(InterventionForum possesseurDeCommentaires);
}
private Vue vue;
public ArbreCommentairePresenteur(Vue vue, InterventionForum possesseurDeCommentaires) {
this.vue = vue;
this.possesseurDeCommentaires = possesseurDeCommentaires;
vue.creerArbreCommentaire(this.possesseurDeCommentaires);
}
public void go(HasWidgets composite) {
composite.add(vue.asWidget());
}
public IsWidget getArbreCommentaireVue() {
return vue;
}
public InterventionForum getPossesseurDeCommentaires() {
return possesseurDeCommentaires;
}
public void gererEvenements() {
}
 
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/forum/ArbreCommentaireVue.java
New file
0,0 → 1,50
package org.tela_botanica.del.client.composants.forum;
 
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
 
import org.tela_botanica.del.client.modeles.Commentaire;
import org.tela_botanica.del.client.modeles.InterventionForum;
 
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Tree;
import com.google.gwt.user.client.ui.TreeItem;
 
public class ArbreCommentaireVue extends Tree implements ArbreCommentairePresenteur.Vue {
 
public ArbreCommentaireVue() {
super();
}
 
public void creerArbreCommentaire(InterventionForum possesseurDeCommentaires) {
TreeItem racineArbreCommentaires = new TreeItem();
addItem(racineArbreCommentaires);
 
if (possesseurDeCommentaires instanceof Commentaire) {
List<Commentaire> commentaires = new ArrayList<Commentaire>();
commentaires.add((Commentaire) possesseurDeCommentaires);
creerListeCommentaireRecursive(racineArbreCommentaires, commentaires);
} else {
creerListeCommentaireRecursive(racineArbreCommentaires, possesseurDeCommentaires.getListeCommentaires());
}
}
 
private void creerListeCommentaireRecursive(TreeItem parentTreeItem, List<Commentaire> commentaires) {
 
for (Commentaire commentaire : commentaires) {
String commentaireHTML = commentaire.getCommentaire();
HTML commentaireWidget = new HTML(commentaireHTML);
parentTreeItem.setWidget(commentaireWidget);
if (commentaire.getListeCommentaires().size() != 0) {
TreeItem childTreeItem = new TreeItem();
parentTreeItem.addItem(childTreeItem);
creerListeCommentaireRecursive(childTreeItem, commentaire.getListeCommentaires());
}
}
parentTreeItem.setState(true);
 
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/forum/forum.css
New file
0,0 → 1,0
.table {}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/forum/ForumVue.ui.xml
New file
0,0 → 1,11
<!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="forum.css" />
<g:HTMLPanel>
<g:HTMLPanel ui:field='panneauInterventions' styleName="{style.table}" />
</g:HTMLPanel>
</ui:UiBinder>
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/forum/ForumPresenteur.java
New file
0,0 → 1,125
package org.tela_botanica.del.client.composants.forum;
 
import java.util.Collections;
import java.util.List;
 
import org.tela_botanica.del.client.cache.CacheClient;
import org.tela_botanica.del.client.composants.forum.interventions.ForumInterventionPresenteur;
import org.tela_botanica.del.client.composants.forum.interventions.ForumInterventionVue;
import org.tela_botanica.del.client.modeles.Commentaire;
import org.tela_botanica.del.client.modeles.InterventionForum;
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.ajoutcommentaire.EvenementAjoutCommentaire;
import org.tela_botanica.del.client.navigation.evenement.ajoutcommentaire.GestionnaireEvenementAjoutCommentaire;
import org.tela_botanica.del.client.navigation.evenement.ajoutdetermination.EvenementAjoutDetermination;
import org.tela_botanica.del.client.navigation.evenement.ajoutdetermination.GestionnaireEvenementAjoutDetermination;
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.navigation.evenement.suppressiondetermination.EvenementSuppressionDetermination;
import org.tela_botanica.del.client.navigation.evenement.suppressiondetermination.GestionnaireEvenementSuppressionDetermination;
import org.tela_botanica.del.client.navigation.evenement.voteDetermination.EvenementVoteDetermination;
import org.tela_botanica.del.client.navigation.evenement.voteDetermination.GestionnaireEvenementVoteDetermination;
import org.tela_botanica.del.client.services.rest.CommentaireServiceConcret;
import org.tela_botanica.del.client.services.rest.PropositionDeterminationServiceConcret;
import org.tela_botanica.del.client.utils.ComparateurPropositionDetermination;
 
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.IsWidget;
 
public class ForumPresenteur {
 
public interface Vue extends IsWidget {
 
public abstract HasWidgets getPanneauInterventions();
 
public abstract void vider();
}
 
private Vue vue;
 
public ForumPresenteur(Vue vue) {
this.vue = vue;
}
 
public void go(HasWidgets composite) {
chargerDeterminations();
composite.add(vue.asWidget());
 
gererEvenements();
}
 
private void chargerDeterminations() {
 
vue.vider();
List<PropositionDetermination> interventions = CacheClient.getInstance().getObservationCourante().getPropositionDeterminations();
Collections.sort(interventions, new ComparateurPropositionDetermination());
for (InterventionForum interventionCourante : interventions) {
ForumInterventionPresenteur presenteur = new ForumInterventionPresenteur(new ForumInterventionVue(), interventionCourante, new CommentaireServiceConcret(), new PropositionDeterminationServiceConcret());
presenteur.go(vue.getPanneauInterventions());
ajouterCommentairesRecursivement(interventionCourante, presenteur);
}
List<Commentaire> commentaires = CacheClient.getInstance().getObservationCourante().getCommentairesForum();
for (InterventionForum interventionCourante : commentaires) {
ForumInterventionPresenteur presenteur = new ForumInterventionPresenteur(new ForumInterventionVue(), interventionCourante, new CommentaireServiceConcret(), new PropositionDeterminationServiceConcret());
presenteur.go(vue.getPanneauInterventions());
ajouterCommentairesRecursivement(interventionCourante, presenteur);
}
}
 
private void ajouterCommentairesRecursivement(InterventionForum interventionCourante, ForumInterventionPresenteur presenteur) {
List<Commentaire> fils = interventionCourante.getListeCommentaires();
for (InterventionForum interventionFils : fils) {
ForumInterventionPresenteur presenteurFils = new ForumInterventionPresenteur(new ForumInterventionVue(), interventionFils, new CommentaireServiceConcret(), new PropositionDeterminationServiceConcret());
ajouterCommentairesRecursivement(interventionFils, presenteurFils);
presenteur.ajouterEnfant(presenteurFils);
}
}
 
private void gererEvenements() {
BusEvenementiel.getInstance().addHandler(EvenementAjoutDetermination.TYPE, new GestionnaireEvenementAjoutDetermination() {
 
@Override
public void onAjoutDetermination(EvenementAjoutDetermination event) {
chargerDeterminations();
}
});
 
BusEvenementiel.getInstance().addHandler(EvenementAjoutCommentaire.TYPE, new GestionnaireEvenementAjoutCommentaire() {
 
@Override
public void onAjoutCommentaire(EvenementAjoutCommentaire event) {
chargerDeterminations();
}
});
 
BusEvenementiel.getInstance().addHandler(EvenementSuppressionDetermination.TYPE, new GestionnaireEvenementSuppressionDetermination() {
 
@Override
public void onSuppressionDetermination(EvenementSuppressionDetermination event) {
chargerDeterminations();
}
});
 
BusEvenementiel.getInstance().addHandler(EvenementSuppressionCommentaire.TYPE, new GestionnaireEvenementSuppressionCommentaire() {
 
@Override
public void onSuppressionCommentaire(EvenementSuppressionCommentaire event) {
chargerDeterminations();
}
});
BusEvenementiel.getInstance().addHandler(EvenementVoteDetermination.TYPE, new GestionnaireEvenementVoteDetermination() {
@Override
public void onVoteDetermination(VoteDetermination event) {
// ceci permet d'avoir un classement à jour des déterminations à chaque vote
// à voir si ça ne fait pas trop ramer les petites machines
chargerDeterminations();
}
});
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/forum/interventions/ForumInterventionVue.java
New file
0,0 → 1,203
package org.tela_botanica.del.client.composants.forum.interventions;
 
import org.tela_botanica.del.client.composants.forum.interventions.ForumInterventionPresenteur.Vue;
import org.tela_botanica.del.client.i18n.I18n;
import org.tela_botanica.del.client.modeles.Commentaire;
import org.tela_botanica.del.client.modeles.PropositionDetermination;
 
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.event.dom.client.HasMouseOutHandlers;
import com.google.gwt.event.dom.client.HasMouseOverHandlers;
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.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.HTML;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.Hyperlink;
import com.google.gwt.user.client.ui.IsWidget;
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 ForumInterventionVue extends Composite implements Vue {
 
private static ForumUIiBinder uiBinder = GWT.create(ForumUIiBinder.class);
 
interface ForumUIiBinder extends UiBinder<Widget, ForumInterventionVue> {
};
 
@UiField
FocusPanel proposition;
 
@UiField
Label nom, nomTaxon, date, commentaire, repondre, labelDeterminationProposee;
@UiField
HTMLPanel conteneurIntermediaireProposition, voter, zoneVoter, zoneDetermination, zoneEnfants;
@UiField
Button boutonValidationTaxon;
@UiField
FocusPanel conteneurLienSuppression;
@UiField
HTML supprimer, nbVotesHtml;
@UiField
FocusPanel conteneurPanneauVotes;
public ForumInterventionVue() {
initWidget(uiBinder.createAndBindUi(this));
}
@Override
public HasClickHandlers getLienSuppression() {
return conteneurLienSuppression;
}
@Override
public void afficherLienSuppression() {
conteneurLienSuppression.removeStyleName("invisible");
}
@Override
public void cacherLienSuppression() {
conteneurLienSuppression.addStyleName("invisible");
}
 
@Override
public void ajouterInterventionDetermination(PropositionDetermination determination, IsWidget barreRepartition, IsWidget arbreCommentaires) {
 
nom.setText(determination.getAuteur());
nomTaxon.setText(determination.getEspece());
voter.add(barreRepartition);
date.setText(DateTimeFormat.getFormat("dd/MM/yyyy").format(determination.getDate()));
commentaire.setText(determination.getCommentaire());
if (determination.estFils()) {
proposition.setStyleName("enfant");
}
if(determination.estPropositionInitiale()) {
labelDeterminationProposee.setText(I18n.getVocabulary().determinationOriginalePar());
labelDeterminationProposee.addStyleName("indicationPropositionInitiale");
} else {
labelDeterminationProposee.setText(I18n.getVocabulary().determinationProposeePar());
}
if(determination.estPropositionRetenue()) {
proposition.setTitle(I18n.getVocabulary().indicationPropositionValidee());
proposition.setStyleName("propositionRetenue");
}
 
boutonValidationTaxon.setTitle(I18n.getVocabulary().indicationValiderProposition());
conteneurIntermediaireProposition.addStyleName("propositionValidable");
}
 
@Override
public void ajouterInterventionCommentaire(Commentaire nouveauCommentaire, IsWidget arbreCommentaires) {
 
zoneVoter.setVisible(false);
zoneDetermination.setVisible(false);
nom.setText(nouveauCommentaire.getAuteur());
date.setText(DateTimeFormat.getFormat("dd/MM/yyyy").format(nouveauCommentaire.getDate()));
commentaire.setText(nouveauCommentaire.getCommentaire());
if (nouveauCommentaire.estFils()) {
proposition.setStyleName("enfant");
}
 
boutonValidationTaxon.setVisible(false);
}
@Override
public HasClickHandlers getRepondre() {
return repondre;
}
 
@Override
public HasWidgets getEnfants() {
return zoneEnfants;
}
 
@Override
public HasMouseOverHandlers getConteneurInterventionMouseOver() {
return proposition;
}
 
@Override
public HasMouseOutHandlers getConteneurInterventionMouseOut() {
return proposition;
}
public HasClickHandlers getEspece() {
return nomTaxon;
}
public void ajouterLienEspece() {
nomTaxon.addStyleName("labelLien");
}
public HasClickHandlers getAuteur() {
return nom;
}
public void ajouterLienAuteur() {
nom.addStyleName("lien");
nom.setTitle("Voir le profil");
}
public void cacherDeterminationProposee() {
labelDeterminationProposee.setVisible(false);
}
 
@Override
public void ajouterLienVotes() {
conteneurPanneauVotes.addStyleName("nombreVotes");
}
public void masquerLienVotes() {
conteneurPanneauVotes.removeStyleName("nombreVotes");
nbVotesHtml.setVisible(false);
}
 
@Override
public void setNbVotes(int votes) {
nbVotesHtml.setText(String.valueOf(votes));
}
@Override
public HasClickHandlers getZoneNbVotes() {
return this.conteneurPanneauVotes;
}
@Override
public HasClickHandlers getBoutonValidationTaxon() {
return this.boutonValidationTaxon;
}
@Override
public void cacherBoutonValidationTaxon() {
boutonValidationTaxon.setVisible(false);
}
@Override
public void afficherBoutonValidationTaxon() {
boutonValidationTaxon.setVisible(true);
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/forum/interventions/forumIntervention.css
New file
0,0 → 1,82
.nombreVotes {
width:15px;
height:16px;
padding-left: 10px;
float:right;
margin-left:10px;
}
 
.infobulle {
background: none repeat scroll 0 0 #1A5AC3;
color: white;
font-size: 11px;
height: 11px;
line-height: 0.9;
margin-left: 2px;
margin-top: 8px;
min-width: 7px;
padding: 1px;
position: absolute;
}
 
.proposition {
width:550px;
padding:10px;
background:#EEE;
margin-bottom:5px;
}
.nom {
margin-right:4px;
margin-top:1px;
}
.le {
margin-top:1px;
}
.date {
margin-left:3px;
margin-top:1px;
}
.determination {
clear:left;
float:left;
margin-top:1px;
margin-right:3px;
}
.nomtaxon {
float:left;
font-size:15px;
}
.voter div{
font-size:18px;
color:#333;
text-align:right;
margin-bottom:-3px;
}
.commentaire {
clear:left
}
.daccord {
clear:left;
margin-right:5px;
}
.repondre {
margin-top:3px;
float:left;
cursor:pointer;
margin-bottom:5px;
font-size:10px;
}
 
.suppression {
width:15px;
height:16px;
background:url('./img/cancel.png') no-repeat;
cursor: pointer;
margin-top:-15px;
margin-left:99%;
position:relative;
}
 
.labelVoter {
padding-left:9px;
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/forum/interventions/ForumInterventionVue.ui.xml
New file
0,0 → 1,39
<!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="forumIntervention.css" />
<g:FocusPanel ui:field="proposition" styleName="{style.proposition}">
<g:HTMLPanel>
<g:Button ui:field="boutonValidationTaxon" text="&#x2714;" styleName="bouton boutonValiderTaxon" />
<g:HTMLPanel ui:field="conteneurIntermediaireProposition" styleName="conteneurIntermediaireProposition" >
<g:FocusPanel ui:field="conteneurLienSuppression" styleName="{style.suppression}">
<g:HTML ui:field="supprimer" />
</g:FocusPanel>
<g:HTMLPanel styleName="gauche nettoyage" ui:field="zoneDetermination">
<g:Label ui:field="nomTaxon" styleName="{style.nomtaxon} nomTaxonProposition" />
</g:HTMLPanel>
<g:HTMLPanel styleName="droite" ui:field="zoneVoter">
<g:HorizontalPanel>
<g:Label text="Score " styleName="petit" />
<g:Label text="Voter" styleName="{style.labelVoter} petit" />
</g:HorizontalPanel>
<g:HTMLPanel ui:field="voter" styleName="{style.voter} gauche" />
<g:FocusPanel ui:field="conteneurPanneauVotes" styleName="{style.nombreVotes}">
<g:HTML ui:field="nbVotesHtml" styleName="{style.infobulle}"/>
</g:FocusPanel>
</g:HTMLPanel>
<g:Label text="Détermination proposée par " ui:field="labelDeterminationProposee" styleName="{style.determination} petit" />
<g:Label ui:field="nom" styleName="{style.nom} petit gauche" />
<g:Label text="le" styleName="{style.le} gauche petit"/>
<g:Label ui:field="date" styleName="{style.date} gauche petit"/>
<g:Label ui:field="commentaire" styleName="{style.commentaire}"/>
<g:Label text="Répondre" styleName="{style.repondre} labelLien" ui:field="repondre"/>
<g:HTML><br /></g:HTML>
<g:HTMLPanel ui:field="zoneEnfants"></g:HTMLPanel>
</g:HTMLPanel>
</g:HTMLPanel>
</g:FocusPanel>
</ui:UiBinder>
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/forum/interventions/ForumInterventionPresenteur.java
New file
0,0 → 1,362
package org.tela_botanica.del.client.composants.forum.interventions;
 
 
import org.tela_botanica.del.client.cache.CacheClient;
import org.tela_botanica.del.client.composants.fenetreoverlay.FenetreOverlayDefilanteVue;
import org.tela_botanica.del.client.composants.fenetreoverlay.FenetreOverlaySimplePresenteur;
import org.tela_botanica.del.client.composants.formulaires.formulairecommentaire.FormulaireCommentairePresenteur;
import org.tela_botanica.del.client.composants.formulaires.formulairecommentaire.FormulaireCommentaireVue;
import org.tela_botanica.del.client.composants.forum.ArbreCommentairePresenteur;
import org.tela_botanica.del.client.composants.forum.ArbreCommentaireVue;
import org.tela_botanica.del.client.composants.votes.barrerepartition.BarreRepartitionVotePresenteur;
import org.tela_botanica.del.client.composants.votes.barrerepartition.BarreRepartitionVoteVue;
import org.tela_botanica.del.client.composants.votes.details.DetailListeVotesDeterminationPresenteur;
import org.tela_botanica.del.client.composants.votes.details.DetailListeVotesDeterminationVue;
import org.tela_botanica.del.client.config.Config;
import org.tela_botanica.del.client.i18n.I18n;
import org.tela_botanica.del.client.modeles.Commentaire;
import org.tela_botanica.del.client.modeles.InterventionForum;
import org.tela_botanica.del.client.modeles.MoyenneVote;
import org.tela_botanica.del.client.modeles.PropositionDetermination;
import org.tela_botanica.del.client.modeles.Utilisateur;
import org.tela_botanica.del.client.navigation.evenement.BusEvenementiel;
import org.tela_botanica.del.client.navigation.evenement.ajoutcommentaire.EvenementAjoutCommentaire;
import org.tela_botanica.del.client.navigation.evenement.ajoutcommentaire.GestionnaireEvenementAjoutCommentaire;
import org.tela_botanica.del.client.navigation.evenement.ajoutdetermination.EvenementAjoutDetermination;
import org.tela_botanica.del.client.navigation.evenement.ajoutdetermination.GestionnaireEvenementAjoutDetermination;
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.suppressiondetermination.EvenementSuppressionDetermination;
import org.tela_botanica.del.client.navigation.evenement.validationPropositionDetermination.EvenementValidationPropositionDetermination;
import org.tela_botanica.del.client.services.CalculVoteDeterminationService;
import org.tela_botanica.del.client.services.rest.CommentaireService;
import org.tela_botanica.del.client.services.rest.CommentaireServiceConcret;
import org.tela_botanica.del.client.services.rest.PropositionDeterminationService;
import org.tela_botanica.del.client.services.rest.PropositionDeterminationServiceConcret;
import org.tela_botanica.del.client.services.rest.VoteDeterminationServiceConcret;
import org.tela_botanica.del.client.services.rest.async.SuppressionCommentaireCallback;
import org.tela_botanica.del.client.services.rest.async.SuppressionPropositionDeterminationCallback;
import org.tela_botanica.del.client.services.rest.async.ValidationPropositionCallback;
import org.tela_botanica.del.client.utils.ModerationUtils;
 
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.HasMouseOutHandlers;
import com.google.gwt.event.dom.client.HasMouseOverHandlers;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseOutHandler;
import com.google.gwt.event.dom.client.MouseOverEvent;
import com.google.gwt.event.dom.client.MouseOverHandler;
import com.google.gwt.event.shared.HandlerRegistration;
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 ForumInterventionPresenteur {
 
public interface Vue extends IsWidget {
void ajouterInterventionDetermination(PropositionDetermination determination, IsWidget barreRepartition, IsWidget arbreCommentaires);
void ajouterInterventionCommentaire(Commentaire commentaire, IsWidget arbreCommentaires);
HasClickHandlers getRepondre();
HasWidgets getEnfants();
HasClickHandlers getLienSuppression();
void afficherLienSuppression();
void cacherLienSuppression();
HasMouseOverHandlers getConteneurInterventionMouseOver();
HasMouseOutHandlers getConteneurInterventionMouseOut();
HasClickHandlers getEspece();
void ajouterLienEspece();
HasClickHandlers getAuteur();
void ajouterLienAuteur();
void cacherDeterminationProposee();
void ajouterLienVotes();
void masquerLienVotes();
void setNbVotes(int votes);
public HasClickHandlers getZoneNbVotes();
public HasClickHandlers getBoutonValidationTaxon();
void cacherBoutonValidationTaxon();
void afficherBoutonValidationTaxon();
}
 
private Vue vue;
 
private InterventionForum interventionForum;
private CommentaireService commentaireService;
private PropositionDeterminationService propositionDeterminationService;
private FenetreOverlaySimplePresenteur overlay;
 
private int nbVotes;
private HandlerRegistration validationTaxonHandler;
public ForumInterventionPresenteur(Vue vue, InterventionForum interventionForum, CommentaireService commentaireService, PropositionDeterminationService propositionDeterminationService) {
this.vue = vue;
this.interventionForum = interventionForum;
this.commentaireService = commentaireService;
this.propositionDeterminationService = propositionDeterminationService;
}
 
public void go(HasWidgets composite) {
chargerIntervention();
composite.add(vue.asWidget());
gererEvenements();
}
public void ajouterEnfant(ForumInterventionPresenteur presenteur) {
presenteur.go(vue.getEnfants());
}
 
private void chargerIntervention() {
if (interventionForum instanceof PropositionDetermination) {
ajouterPropositionDetermination((PropositionDetermination) interventionForum);
} else if (interventionForum instanceof Commentaire) {
ajouterCommentaire((Commentaire) interventionForum);
vue.cacherDeterminationProposee();
}
}
 
private void ajouterPropositionDetermination(PropositionDetermination propositionDetermination) {
final PropositionDetermination cetteProposition = propositionDetermination;
this.nbVotes = propositionDetermination.getVotesDeterminations().size();
BarreRepartitionVotePresenteur barreRepartitionVotePresenteur = new BarreRepartitionVotePresenteur(new BarreRepartitionVoteVue(), new VoteDeterminationServiceConcret());
barreRepartitionVotePresenteur.toggleNomEspece();
calculerEtAfficherVoteDetermination(barreRepartitionVotePresenteur, propositionDetermination);
ArbreCommentairePresenteur arbreCommentairePresenteur = new ArbreCommentairePresenteur(new ArbreCommentaireVue(), propositionDetermination);
vue.ajouterInterventionDetermination(propositionDetermination, barreRepartitionVotePresenteur.getBarreRepartitionVoteVue(), arbreCommentairePresenteur.getArbreCommentaireVue());
final String nn = propositionDetermination.getNumNomenclatural();
final String referentiel = propositionDetermination.getReferentiel();
// @TODO harmoniser les valeurs qui veulent dire "y en n'a pas" plutôt que !equals("kedal") :-/
if (nn != null && !nn.isEmpty() && !nn.equals(0) && !nn.equals("0") && referentiel != null && !referentiel.isEmpty()) {
vue.ajouterLienEspece();
vue.getEspece().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Config config = new Config();
String efloreUrlFicheTpl = config.getUrl("efloreTaxon");
// découpage pseudo-intelligent du nom de référentiel
String refFmt;
int positionDeuxPoints = referentiel.indexOf(':');
if (positionDeuxPoints == -1) {
refFmt = referentiel;
} else {
refFmt = referentiel.substring(0, positionDeuxPoints);
}
String efloreUrlFiche = efloreUrlFicheTpl.replaceAll("referentiel-nn-num_nom", refFmt+"-nn-"+nn);
Window.open(efloreUrlFiche, "Fiche eflore", config.getInfo("popupOptions"));
}
});
}
gererAffichageBoutonValidationTaxon(cetteProposition);
final String idContributeur = propositionDetermination.getContributeur().getId();
if (idContributeur != null && !idContributeur.equals("0")) {
vue.ajouterLienAuteur();
vue.getAuteur().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Config config = new Config();
Window.open(config.getUrl("profil") + idContributeur, "Consultation de l'annuaire", config.getInfo("popupOptions"));
}
});
}
}
 
private void gererAffichageBoutonValidationTaxon(final PropositionDetermination cetteProposition) {
if (doitAfficherBoutonValidation(cetteProposition)) {
vue.afficherBoutonValidationTaxon();
if(validationTaxonHandler != null) {
validationTaxonHandler.removeHandler();
}
validationTaxonHandler = vue.getBoutonValidationTaxon().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
if (Window.confirm(I18n.getVocabulary().confirmationValidationDetermination())) {
validerProposition(cetteProposition);
}
}
});
} else {
vue.cacherBoutonValidationTaxon();
}
}
 
private void ajouterCommentaire(Commentaire proposition) {
ArbreCommentairePresenteur arbreCommentairePresenteur = new ArbreCommentairePresenteur(new ArbreCommentaireVue(), proposition);
vue.ajouterInterventionCommentaire(proposition, arbreCommentairePresenteur.getArbreCommentaireVue());
}
 
private void calculerEtAfficherVoteDetermination(BarreRepartitionVotePresenteur barreRepartitionVotePresenteur, PropositionDetermination propositionDetermination) {
MoyenneVote votes = CalculVoteDeterminationService.calculerVoteDetermination(propositionDetermination);
barreRepartitionVotePresenteur.afficherVotes(votes);
}
private void gererEvenements() {
if (this.nbVotes > 0) {
vue.setNbVotes(this.nbVotes);
vue.ajouterLienVotes();
vue.getZoneNbVotes().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
if (nbVotes > 0) {
FenetreOverlaySimplePresenteur fenetreOverlaySimplePresenteur = new FenetreOverlaySimplePresenteur(
new FenetreOverlayDefilanteVue());
DetailListeVotesDeterminationPresenteur detailListeVotesDeterminationPresenteur = new DetailListeVotesDeterminationPresenteur(
new DetailListeVotesDeterminationVue());
fenetreOverlaySimplePresenteur
.ouvrirFenetreModale(detailListeVotesDeterminationPresenteur);
detailListeVotesDeterminationPresenteur
.afficherVotes((PropositionDetermination) interventionForum);
}
}
});
} else {
vue.masquerLienVotes();
}
vue.getRepondre().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
FormulaireCommentairePresenteur commentairePresenteur = new FormulaireCommentairePresenteur(interventionForum, new CommentaireServiceConcret(), new FormulaireCommentaireVue());
overlay = new FenetreOverlaySimplePresenteur(new FenetreOverlayDefilanteVue());
overlay.ouvrirFenetreModale(commentairePresenteur);
}
});
vue.getConteneurInterventionMouseOver().addMouseOverHandler(new MouseOverHandler() {
@Override
public void onMouseOver(MouseOverEvent event) {
if(peutSupprimerIntervention()) {
vue.afficherLienSuppression();
}
}
});
vue.getConteneurInterventionMouseOut().addMouseOutHandler(new MouseOutHandler() {
@Override
public void onMouseOut(MouseOutEvent event) {
if(peutSupprimerIntervention()) {
vue.cacherLienSuppression();
}
}
});
 
vue.getLienSuppression().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
String message = "";
if (interventionForum instanceof PropositionDetermination) {
message = I18n.getVocabulary().confirmationSuppressionDetermination();
} else if (interventionForum instanceof Commentaire) {
message = I18n.getVocabulary().confirmationSuppressionCommentaire();
}
if(Window.confirm(message)) {
supprimerIntervention();
}
}
});
vue.cacherLienSuppression();
BusEvenementiel.getInstance().addHandler(EvenementAjoutDetermination.TYPE, new GestionnaireEvenementAjoutDetermination() {
@Override
public void onAjoutDetermination(EvenementAjoutDetermination event) {
if(overlay != null && overlay.fenetreModaleEstOuverte()) {
overlay.fermerFenetreModale();
}
}
});
 
BusEvenementiel.getInstance().addHandler(EvenementAjoutCommentaire.TYPE, new GestionnaireEvenementAjoutCommentaire() {
@Override
public void onAjoutCommentaire(EvenementAjoutCommentaire event) {
if(overlay != null && overlay.fenetreModaleEstOuverte()) {
overlay.fermerFenetreModale();
}
}
});
BusEvenementiel.getInstance().addHandler(EvenementChangementEtatUtilisateur.TYPE, new GestionnaireEvenementChangementEtatUtilisateur() {
@Override
public void onModificationEtatUtilisateur(EvenementChangementEtatUtilisateur evenementChangementEtatUtilisateur) {
if (interventionForum instanceof PropositionDetermination) {
gererAffichageBoutonValidationTaxon((PropositionDetermination)interventionForum);
}
}
});
}
private boolean peutSupprimerIntervention() {
boolean estPropositionInitiale = false;
boolean estPropositionRetenue = false;
if(interventionForum instanceof PropositionDetermination) {
estPropositionInitiale = ((PropositionDetermination)interventionForum).estPropositionInitiale();
estPropositionRetenue = ((PropositionDetermination)interventionForum).estPropositionRetenue();
}
return (!interventionForum.aDesCommentaires() &&
interventionForum.getContributeur() != null &&
interventionForum.getContributeur().getId().equals(CacheClient.getInstance().getUtilisateur().getId())
&& !estPropositionInitiale
&& !estPropositionRetenue);
}
private void supprimerIntervention() {
if(interventionForum instanceof PropositionDetermination) {
propositionDeterminationService.supprimerProposition((PropositionDetermination)interventionForum, new SuppressionPropositionDeterminationCallback() {
@Override
public void surRetour(String objetRetour) {
CacheClient.getInstance().getObservationCourante().supprimerIntervention(interventionForum);
BusEvenementiel.getInstance().fireEvent(new EvenementSuppressionDetermination((PropositionDetermination)interventionForum));
}
});
}
if(interventionForum instanceof Commentaire) {
commentaireService.supprimerCommentaire((Commentaire)interventionForum, new SuppressionCommentaireCallback() {
@Override
public void surRetour(String objetRetour) {
CacheClient.getInstance().getObservationCourante().supprimerIntervention(interventionForum);
BusEvenementiel.getInstance().fireEvent(new EvenementSuppressionCommentaire((Commentaire)interventionForum));
}
});
}
}
private boolean doitAfficherBoutonValidation(PropositionDetermination propositionDetermination) {
boolean estPropositionRetenue = propositionDetermination.estPropositionRetenue();
String numNomProp = propositionDetermination.getNumNomenclatural();
String referentielProp = propositionDetermination.getReferentiel();
boolean aUnNumNom = (numNomProp != null && !numNomProp.trim().equals("") && !numNomProp.trim().equals("0"));
boolean aUnReferentiel = (referentielProp != null && !referentielProp.trim().equals("") && !referentielProp.trim().equals("0"));
Utilisateur utilisateur = CacheClient.getInstance().getUtilisateur();
boolean estAuteurObservation = false;
if(utilisateur != null) {
estAuteurObservation = utilisateur.estIdentifie() && utilisateur.getId().equals(CacheClient.getInstance().getObservationCourante().getIdAuteur());
}
boolean peutValiderObservation = ModerationUtils.utilisateurPeutValiderObservation(CacheClient.getInstance().getUtilisateur(), CacheClient.getInstance().getObservationCourante());
return (peutValiderObservation || estAuteurObservation) && aUnReferentiel && aUnNumNom && !estPropositionRetenue;
}
private void validerProposition(PropositionDetermination propositionDetermination) {
final PropositionDetermination cetteProposition = propositionDetermination;
PropositionDeterminationServiceConcret propositionService = new PropositionDeterminationServiceConcret();
propositionDetermination.setValideePar(CacheClient.getInstance().getUtilisateur().getId());
propositionService.validerProposition(propositionDetermination, new ValidationPropositionCallback() {
@Override
public void surRetour(String objetRetour) {
BusEvenementiel.getInstance().fireEvent(new EvenementValidationPropositionDetermination(cetteProposition));
}
});
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/forum/ForumVue.java
New file
0,0 → 1,36
package org.tela_botanica.del.client.composants.forum;
 
 
import org.tela_botanica.del.client.composants.forum.ForumPresenteur.Vue;
 
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.HTMLPanel;
import com.google.gwt.user.client.ui.Widget;
 
public class ForumVue extends Composite implements Vue {
 
private static ForumUIiBinder uiBinder = GWT.create(ForumUIiBinder.class);
 
interface ForumUIiBinder extends UiBinder<Widget, ForumVue> {
};
 
@UiField
HTMLPanel panneauInterventions;
 
public ForumVue() {
initWidget(uiBinder.createAndBindUi(this));
}
 
@Override
public HTMLPanel getPanneauInterventions() {
return panneauInterventions;
}
 
@Override
public void vider() {
panneauInterventions.clear();
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/pagination/PaginationPresenteur.java
New file
0,0 → 1,308
package org.tela_botanica.del.client.composants.pagination;
 
import org.tela_botanica.del.client.navigation.evenement.BusEvenementiel;
import org.tela_botanica.del.client.navigation.evenement.pagination.EvenementChangementPage;
import org.tela_botanica.del.client.navigation.evenement.pagination.EvenementChangementPas;
import org.tela_botanica.del.client.navigation.evenement.pagination.GestionnaireEvenementChangementPage;
import org.tela_botanica.del.client.navigation.evenement.pagination.GestionnaireEvenementChangementPas;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.HasChangeHandlers;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.IsWidget;
 
/**
* @author gregoire Pagination GENERIQUE qui permet d'afficher un nombre donné
* d'éléments (pas) La méthode changerPage est abstraite et doit être
* définie lors de l'instanciation de la classe pagination pour
* permettre d'afficher la suite des éléments La méthode
* actualiserPasCache est abstraite car le pas est différent en fonction
* de la page où l'on se trouve
* */
public abstract class PaginationPresenteur {
 
public interface Vue extends IsWidget {
public HasClickHandlers getBoutonSuivant();
public HasClickHandlers getBoutonPrecedent();
public HasClickHandlers getBoutonPremierePage();
public HasClickHandlers getBoutonDernierePage();
public void masquerBoutonPrecedent();
public void afficherBoutonPrecedent();
public void masquerBoutonSuivant();
public void afficherBoutonSuivant();
public boolean boutonPrecedentEstAffiche();
public boolean boutonSuivantEstAffiche();
public HasChangeHandlers getSelecteurPas();
public int getPasSelectionne();
public void afficherPas(int pas);
public void mettreNbTotalPages(int nbPages);
public void mettreNbTotalResultats(int nbResultats);
public HasChangeHandlers getSaisiePageCourante();
public int getPageSaisie();
public void setPageCourante(int pageCourante);
}
 
private Vue vue;
private int nbPage = 1;
//private int nbPage = 1;
private int pageCourante = 1;
private int nbElementsTotal = 0;
private int pas = 10;
 
private String groupePagination = null;
 
/**
* Constructeur de l'application
*
* @param nbElementsTotal
* : le nombre total des éléments à paginer
* @param pas
* : le nombre d'éléments à afficher par page
* */
public PaginationPresenteur(Vue vue, int nbElementsTotal, int pas, int pageCourante) {
this.nbElementsTotal = nbElementsTotal;
this.vue = vue;
this.pas = pas;
this.pageCourante = pageCourante;
vue.setPageCourante(pageCourante);
this.nbPage = calculerNbPage();
}
 
/**
* Methode go du modèle MVP
*
* @param container
* : la vue ou éxécuter l'affichage
*/
public void go(HasWidgets container) {
container.add(vue.asWidget());
gererEvenements();
actualiserPas();
actualiserAffichageBoutons();
vue.mettreNbTotalPages(nbPage);
vue.mettreNbTotalResultats(nbElementsTotal);
}
 
/**
* Gérer les évènements sur les boutons statiques (précédent, suivant et
* selecteur pas)
* */
protected void gererEvenements() {
vue.getSaisiePageCourante().addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
int pageSaisie;
try {
pageSaisie = vue.getPageSaisie();
if (pageSaisie < 0) {
pageSaisie = 1;
} else if (pageSaisie > nbPage){
pageSaisie = nbPage;
}
} catch (NumberFormatException e) {
pageSaisie = pageCourante;
}
pageCourante = pageSaisie;
chargerElements(pas * (pageCourante - 1), pas * (pageCourante));
vue.setPageCourante(pageCourante);
actualiserAffichageBoutons();
}
});
vue.getSelecteurPas().addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
int pasSelectionne;
try {
pasSelectionne = vue.getPasSelectionne();
if (pasSelectionne < 0) {
pasSelectionne = 1;
} else if (pasSelectionne > 100){
pasSelectionne = 100;
}
} catch (NumberFormatException e) {
pasSelectionne = pas;
}
changerPas(pasSelectionne);
}
});
 
vue.getBoutonPrecedent().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
allerALaPagePrecedente();
}
});
 
vue.getBoutonSuivant().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
allerALapageSuivante();
}
});
 
vue.getBoutonPremierePage().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
allerALaPremierePage();
}
});
 
vue.getBoutonDernierePage().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
allerAlaDernierePage();
}
});
 
BusEvenementiel.getInstance().addHandler(EvenementChangementPage.TYPE, new GestionnaireEvenementChangementPage() {
 
@Override
public void onChangementPage(EvenementChangementPage event) {
if (event.getGroupePagination() == groupePagination) {
pageCourante = event.getPageAAfficher();
vue.setPageCourante(pageCourante);
actualiserAffichageBoutons();
vue.mettreNbTotalPages(nbPage);
vue.mettreNbTotalResultats(nbElementsTotal);
}
}
});
 
BusEvenementiel.getInstance().addHandler(EvenementChangementPas.TYPE, new GestionnaireEvenementChangementPas() {
 
@Override
public void onChangementPas(EvenementChangementPas event) {
if (event.getGroupePagination() == groupePagination) {
// modifie le pas et les liens en fonction
pas = event.getPas();
actualiserPas();
}
}
});
}
 
private void gererDecalagePageCourante(int ancienPas, int nouveauPas) {
if (ancienPas != nouveauPas) {
double rapportPas = (double) ancienPas / (double) nouveauPas;
pageCourante = (int) (Math.ceil((double) pageCourante * (double) rapportPas));
}
}
 
public void actualiserPas() {
actualiserPasCache(pas);
vue.afficherPas(pas);
}
 
public int getPageCourante() {
return this.pageCourante;
}
 
public int getPas() {
return this.pas;
}
 
public void setPageCourante(int pageCourante) {
this.pageCourante = pageCourante;
}
 
public void changerPas(int nouveauPas) {
 
// TODO corriger bug qui ne charge pas la bonne page ds certains cas
// gererDecalagePageCourante(pas, nouveauPas);
// pas = nouveauPas;
// chargerElements((pageCourante - 1)*pas, pageCourante*pas);
pas = nouveauPas;
this.nbPage = calculerNbPage();
chargerElements(0, pas);
BusEvenementiel.getInstance().fireEvent(new EvenementChangementPas(nouveauPas, groupePagination));
BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(1, groupePagination));
}
 
public void allerALaPagePrecedente() {
if (pageCourante > 1) {
int pageAAfficher = pageCourante - 1;
pageCourante = pageAAfficher;
chargerElements(pas * (pageAAfficher - 1), pas * (pageAAfficher));
BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher, groupePagination));
}
 
}
 
public void allerALapageSuivante() {
if (pageCourante < nbPage) {
int pageAAfficher = pageCourante + 1;
pageCourante = pageAAfficher;
chargerElements(pas * (pageAAfficher - 1), pas * (pageAAfficher));
BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher, groupePagination));
}
}
 
public void allerALaPremierePage() {
int pageAAfficher = 1;
pageCourante = pageAAfficher;
chargerElements(0, pas);
BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher, groupePagination));
}
 
public void allerAlaDernierePage() {
int pageAAfficher = nbPage;
pageCourante = pageAAfficher;
chargerElements(pas * (pageAAfficher - 1), pas * (pageAAfficher));
BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher, groupePagination));
}
 
/** calcule le nombre de page en fonction du pas */
private int calculerNbPage() {
Double nombrePages = Math.ceil((double) nbElementsTotal / (double) pas);
return nombrePages.intValue();
}
 
public void setNbPages(int nbPages) {
this.nbPage = nbPages;
}
 
public int getNbPages() {
return nbPage;
}
 
public Vue getVue() {
return vue;
}
 
public abstract void chargerElements(int debut, int fin);
 
public abstract void actualiserPasCache(int pas);
 
public void setPas(int pas) {
this.pas = pas;
}
 
public void setGroupePagination(String groupePagination) {
this.groupePagination = groupePagination;
}
 
public String getGroupePagination() {
return groupePagination;
}
 
public void actualiserAffichageBoutons() {
if (nbPage == 1) {
vue.masquerBoutonPrecedent();
vue.masquerBoutonSuivant();
} else if (pageCourante == 1) {
vue.masquerBoutonPrecedent();
vue.afficherBoutonSuivant();
} else {
vue.afficherBoutonPrecedent();
if (pageCourante == nbPage) {
vue.masquerBoutonSuivant();
}
}
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/pagination/PaginationVue.java
New file
0,0 → 1,137
package org.tela_botanica.del.client.composants.pagination;
 
import org.tela_botanica.del.client.i18n.I18n;
 
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.HasChangeHandlers;
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.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HasText;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
 
public class PaginationVue extends Composite implements PaginationPresenteur.Vue {
 
@UiField
TextBox saisiePageCourante;
 
@UiField
TextBox selecteurPas;
 
@UiField
Button boutonPrecedent, boutonSuivant, boutonPremierePage, boutonDernierePage;
 
@UiField
Label nbTotalPages, nbTotalResultats;
 
interface MyUiBinder extends UiBinder<Widget, PaginationVue> {
}
 
private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);
 
public PaginationVue() {
initWidget(uiBinder.createAndBindUi(this));
}
 
public void afficherPas(int pas) {
selecteurPas.setText(String.valueOf(pas));
}
 
public void mettreNbTotalPages(int nbPages) {
nbTotalPages.setText((I18n.getMessages().parmi_nb_pages(nbPages)));
}
 
public void mettreNbTotalResultats(int nbResultats) {
nbTotalResultats.setText("" + nbResultats);
}
 
public void masquerBoutonPrecedent() {
boutonPremierePage.setVisible(false);
boutonPrecedent.setVisible(false);
}
 
public void afficherBoutonPrecedent() {
boutonPremierePage.setVisible(true);
boutonPrecedent.setVisible(true);
}
 
public void masquerBoutonSuivant() {
boutonDernierePage.setVisible(false);
boutonSuivant.setVisible(false);
}
 
public void afficherBoutonSuivant() {
boutonDernierePage.setVisible(true);
boutonSuivant.setVisible(true);
}
 
public TextBox getSelecteurPas() {
return selecteurPas;
}
 
@Override
public HasChangeHandlers getSaisiePageCourante() {
return saisiePageCourante;
}
 
@Override
public HasClickHandlers getBoutonSuivant() {
return boutonSuivant;
}
 
@Override
public HasClickHandlers getBoutonPrecedent() {
return boutonPrecedent;
}
 
@Override
public HasClickHandlers getBoutonPremierePage() {
return boutonPremierePage;
}
 
@Override
public HasClickHandlers getBoutonDernierePage() {
return boutonDernierePage;
}
 
@Override
public int getPasSelectionne() throws NumberFormatException {
return Integer.parseInt(selecteurPas.getText());
}
 
@Override
public boolean boutonPrecedentEstAffiche() {
return boutonPrecedent.isVisible() && boutonPremierePage.isVisible();
}
 
@Override
public boolean boutonSuivantEstAffiche() {
return boutonSuivant.isVisible() && boutonDernierePage.isVisible();
}
 
public Label getNbTotalPages() {
return nbTotalPages;
}
 
public Label getNbTotalResultats() {
return nbTotalResultats;
}
 
@Override
public int getPageSaisie() throws NumberFormatException {
return Integer.parseInt(saisiePageCourante.getText());
}
@Override
public void setPageCourante(int pageCourante) {
saisiePageCourante.setText(String.valueOf(pageCourante));
}
 
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/pagination/pagination.css
New file
0,0 → 1,30
.pagination {width:100%;}
.selecteurElements {float:right; width:2em}
.pageCourante {width:2.6em}
.pagination button {border:none; border-right:solid 1px #DDD; cursor:pointer; width:30px}
.zoneLiens {}
.zoneLiens button:hover {background:#8EB533}
select {background:white}
 
.boutonPrecedent {border:solid 1px #8EB533; width:20px; height:20px; background:url(./img/prev.png) no-repeat}
.boutonSuivant {border:solid 1px #8EB533; width:20px; height:20px; background:url(./img/next.png) no-repeat}
.boutonPremierePage {width:20px; height:20px; background:url(./img/first.png) no-repeat}
.boutonDernierePage {width:20px; height:20px; background:url(./img/last.png) no-repeat}
 
.labelResultats {
margin-left:5px;
margin-right:5px;
}
.nombreResultats {
font-weight: bold;
margin-left:5px;
}
.labelPage {
padding-left:5px;
margin-right:5px;
border-left: solid 1px grey;
}
 
.nombreTotal {margin-left:5px;}
.labelSelecteurPas{margin-left:5px;margin-right:5px; margin-top: 3px;}
.labelSelecteurPasAfficher{margin-left:10px;;margin-right:5px; margin-top: 3px;}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/pagination/PaginationVue.ui.xml
New file
0,0 → 1,19
<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='res' type='org.tela_botanica.del.client.resources.Ressources'/>
<ui:with field="constants" type="org.tela_botanica.del.client.i18n.Vocabulary"/>
<ui:style src="pagination.css" />
<g:HorizontalPanel styleName="{style.pagination}">
<g:Label styleName="{style.nombreResultats} petit" ui:field="nbTotalResultats" />
<g:Label styleName="{style.labelResultats} petit" text="{constants.resultats}" />
<g:Label styleName="{style.labelPage} petit" text="{constants.page}" />
<g:Button ui:field="boutonPremierePage" styleName="{style.boutonPremierePage}" text=" " />
<g:Button ui:field="boutonPrecedent" styleName="{style.boutonPrecedent}" text=" " />
<g:TextBox styleName="{style.pageCourante} petit" ui:field="saisiePageCourante"/>
<g:Label styleName="{style.nombreTotal} petit" ui:field="nbTotalPages" />
<g:Button ui:field="boutonSuivant" styleName="{style.boutonSuivant}" text=" "/>
<g:Button ui:field="boutonDernierePage" styleName="{style.boutonDernierePage}" text=" " />
<g:Label styleName="{style.labelSelecteurPasAfficher} petit" text="{constants.afficher}" />
<g:TextBox ui:field="selecteurPas" styleName="{style.selecteurElements} petit" text="10"/>
<g:Label styleName="{style.labelSelecteurPas} petit" text="{constants.elements_par_page}" />
</g:HorizontalPanel>
</ui:UiBinder>
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/fenetreoverlay/FenetreOverlayDefilanteVue.ui.xml
New file
0,0 → 1,16
<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" />
<g:VerticalPanel styleName="fenetreDefilante" ui:field="conteneurGlobal">
<g:FocusPanel ui:field="overlay" />
<g:HorizontalPanel ui:field="conteneurOverlayContenu" styleName="">
<g:Button ui:field="boutonPrecedent" text="" />
<g:FocusPanel ui:field="overlayContenu" />
<g:Button ui:field="boutonSuivant" text="" />
<g:Button ui:field="boutonFermer" />
</g:HorizontalPanel>
</g:VerticalPanel>
</ui:UiBinder>
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/fenetreoverlay/FenetreOverlaySimplePresenteur.java
New file
0,0 → 1,27
package org.tela_botanica.del.client.composants.fenetreoverlay;
 
import org.tela_botanica.del.client.composants.presenteur.Presenteur;
 
/**
* Simple implémentation de la fenetre overlay defilante avec masquage direct des boutons
* suivant et précédent et simplification de la méthode
* @author aurelien
*
*/
public class FenetreOverlaySimplePresenteur extends FenetreOverlayDefilantePresenteur {
 
public FenetreOverlaySimplePresenteur(Vue vue) {
super(0, vue);
afficherBoutonsSuivantsPrecedents(false);
}
public void ouvrirFenetreModale(Presenteur presenteur) {
super.ouvrirFenetreModaleDefilante(0, presenteur);
}
 
@Override
public void surClicBoutonSuivant() {}
 
@Override
public void surClicBoutonPrecedent() {}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/fenetreoverlay/FenetreOverlayDefilantePresenteur.java
New file
0,0 → 1,148
package org.tela_botanica.del.client.composants.fenetreoverlay;
 
import org.tela_botanica.del.client.composants.presenteur.Presenteur;
 
import com.google.gwt.core.shared.GWT;
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.HasKeyDownHandlers;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyDownEvent;
import com.google.gwt.event.dom.client.KeyDownHandler;
import com.google.gwt.user.client.ui.HasVisibility;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.RootPanel;
 
public abstract class FenetreOverlayDefilantePresenteur {
 
public interface Vue extends IsWidget {
public HasKeyDownHandlers getConteneurGlobal();
public IsWidget getOverlay();
public void afficherBoutonsSuivantsPrecedents(boolean afficher);
public HasClickHandlers getOverlayHasClickHandlers();
public HasVisibility getOverlayVisibility();
public IsWidget getOverlayContenu();
public HasVisibility getOverlayContenuVisibility();
public HasWidgets getOverlayContenuHasWidgets();
public HasClickHandlers getBoutonFermer();
public HasClickHandlers getBoutonSuivant();
public HasClickHandlers getBoutonPrecedent();
public void setStyleOverlay(String style);
public void setStyleOverlayContenu(String style);
public void setOverlayContenu(IsWidget w);
public void viderOverlay();
public void viderOverlayContenu();
public void surOuvertureFenetre();
public void surFermetureFenetre();
public void surSetContenuFenetre();
public boolean testerFermetureClicExterieur(ClickEvent event);
}
private Vue vue;
private boolean fenetreModaleOuverte = false;
private int indexElementAffiche = 0;
 
// Constructeur
public FenetreOverlayDefilantePresenteur(int indexElementAffiche, Vue vue) {
this.indexElementAffiche = indexElementAffiche;
this.vue = vue;
gererEvenements();
}
// Afficheur
public void go() {
go(null);
}
 
public void go(HasWidgets composite) {
}
 
// Gestion des évènements
protected void gererEvenements() {
vue.getBoutonFermer().addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
fermerFenetreModale();
}
});
vue.getBoutonPrecedent().addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
surClicBoutonPrecedent();
}
});
vue.getBoutonSuivant().addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
surClicBoutonSuivant();
}
});
vue.getConteneurGlobal().addKeyDownHandler(new KeyDownHandler() {
@Override
public void onKeyDown(KeyDownEvent event) {
if(event.getNativeKeyCode() == KeyCodes.KEY_LEFT) {
surClicBoutonPrecedent();
}
if(event.getNativeKeyCode() == KeyCodes.KEY_RIGHT) {
surClicBoutonSuivant();
}
}
});
vue.getOverlayHasClickHandlers().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
if(vue.testerFermetureClicExterieur(event)) {
fermerFenetreModale();
}
}
});
}
 
public void ouvrirFenetreModaleDefilante(int indexElementAffiche, Presenteur presenteurModal) {
vue.setStyleOverlay("overlay");
vue.setStyleOverlayContenu("overlayContenu");
vue.getOverlayContenuVisibility().setVisible(true);
vue.getOverlayVisibility().setVisible(true);
RootPanel.get().add(vue.asWidget());
fenetreModaleOuverte = true;
GWT.log("Index elemt à afficher :"+indexElementAffiche);
setContenuFenetreModale(indexElementAffiche, presenteurModal);
vue.surOuvertureFenetre();
}
public void setContenuFenetreModale(int indexElementAffiche, Presenteur presenteurModal) {
this.indexElementAffiche = indexElementAffiche;
vue.viderOverlayContenu();
presenteurModal.go(vue.getOverlayContenuHasWidgets());
vue.surSetContenuFenetre();
}
public abstract void surClicBoutonSuivant();
public abstract void surClicBoutonPrecedent();
public boolean fenetreModaleEstOuverte() {
return fenetreModaleOuverte;
}
 
public void fermerFenetreModale() {
vue.viderOverlay();
vue.viderOverlayContenu();
RootPanel.get().remove(vue.asWidget());
fenetreModaleOuverte = false;
vue.surFermetureFenetre();
}
public int getIndexElementAffiche() {
return indexElementAffiche;
}
 
public void afficherBoutonsSuivantsPrecedents(boolean afficher) {
vue.afficherBoutonsSuivantsPrecedents(afficher);
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/fenetreoverlay/FenetreOverlayDefilanteVue.java
New file
0,0 → 1,232
package org.tela_botanica.del.client.composants.fenetreoverlay;
 
import org.tela_botanica.del.client.composants.fenetreoverlay.FenetreOverlayDefilantePresenteur.Vue;
 
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Element;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.event.dom.client.HasKeyDownHandlers;
import com.google.gwt.event.logical.shared.ResizeEvent;
import com.google.gwt.event.logical.shared.ResizeHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.Timer;
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.HasVisibility;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.UIObject;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
 
public class FenetreOverlayDefilanteVue extends Composite implements Vue {
 
interface MyUiBinder extends UiBinder<Widget, FenetreOverlayDefilanteVue> {}
@UiField
VerticalPanel conteneurGlobal;
 
@UiField
FocusPanel overlay;
@UiField
FocusPanel overlayContenu;
 
@UiField
Button boutonFermer, boutonSuivant, boutonPrecedent;
@UiField
HorizontalPanel conteneurOverlayContenu;
private int hauteurContenu = 0;
private int largeurContenu = 0;
// contiennent les coordonnées actuelles du scroll
// pour le rétablir une fois la fenêtre fermée
private int topFenetre = 0;
private int gaucheFenetre = 0;
private Timer timerPlacement = null;
public FocusPanel getOverlay() {
return overlay;
}
 
public FocusPanel getOverlayContenu() {
return overlayContenu;
}
@Override
public HasClickHandlers getOverlayHasClickHandlers() {
return overlayContenu;
}
 
public Button getBoutonFermer() {
return boutonFermer;
}
 
public Button getBoutonSuivant() {
return boutonSuivant;
}
 
public Button getBoutonPrecedent() {
return boutonPrecedent;
}
 
private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);
 
public FenetreOverlayDefilanteVue() {
initWidget(uiBinder.createAndBindUi(this));
boutonFermer.setStyleName("fermerOverlay");
boutonPrecedent.setStyleName("precedentOverlay");
boutonSuivant.setStyleName("suivantOverlay");
Window.addResizeHandler(new ResizeHandler() {
@Override
public void onResize(ResizeEvent event) {
gererDimensionsEtPositionnerBoutons();
}
});
}
@Override
public HasKeyDownHandlers getConteneurGlobal() {
return overlayContenu;
}
 
@Override
public HasVisibility getOverlayVisibility() {
return overlay;
}
 
@Override
public HasVisibility getOverlayContenuVisibility() {
return overlayContenu;
}
 
@Override
public HasWidgets getOverlayContenuHasWidgets() {
return overlayContenu;
}
 
@Override
public void setStyleOverlay(String style) {
overlay.setStyleName(style);
}
 
@Override
public void setStyleOverlayContenu(String style) {
overlayContenu.setStyleName(style);
}
 
@Override
public void setOverlayContenu(IsWidget w) {
overlayContenu.clear();
overlayContenu.add(w);
}
 
@Override
public void viderOverlay() {
overlay.clear();
}
 
@Override
public void viderOverlayContenu() {
overlayContenu.clear();
}
private void gererDimensionsEtPositionnerBoutons() {
UIObject overlayContenuUi = overlayContenu.getWidget();
if (overlayContenuUi == null) {
return;
}
int topBoutonFermer = 65;
int topBoutonsSuivantsPrecedent = (topBoutonFermer + overlayContenuUi.getOffsetHeight())/2 + 20;
int left = overlayContenuUi.getAbsoluteLeft() - 20;
int right = overlayContenuUi.getAbsoluteLeft() + overlayContenuUi.getOffsetWidth() - 12;
DOM.setStyleAttribute(boutonPrecedent.getElement(), "left",left+"px");
DOM.setStyleAttribute(boutonPrecedent.getElement(), "top", topBoutonsSuivantsPrecedent+"px");
DOM.setStyleAttribute(boutonSuivant.getElement(), "left",right+"px");
DOM.setStyleAttribute(boutonSuivant.getElement(), "top", topBoutonsSuivantsPrecedent+"px");
DOM.setStyleAttribute(boutonFermer.getElement(), "left",(right - 10)+"px");
DOM.setStyleAttribute(boutonFermer.getElement(), "top", topBoutonFermer+"px");
setDimensionsContenu(overlayContenuUi.getOffsetHeight(), overlayContenuUi.getOffsetWidth());
}
private void setDimensionsContenu(int hauteur, int largeur) {
largeurContenu = largeur;
hauteurContenu = hauteur;
}
 
@Override
public void surOuvertureFenetre() {
// enregistrement des coordonnées des scrool
topFenetre = Window.getScrollTop();
gaucheFenetre = Window.getScrollLeft();
// scroll désactivé pour ne pas fausser le positionnement des boutons
Window.enableScrolling(false);
// Pas trouvé mieux que le timer pour bien redimensionner
// à voir s il existe une meilleure solution qui n'oblige pas
// par avance à connaitre le type d'objet contenu dans l'overlayContenu
// ou bien la taille de la fenetre
timerPlacement = new Timer() {
@Override
public void run() {
if(tailleDuContenuEstModifiee()) {
// On repositionne les boutons
gererDimensionsEtPositionnerBoutons();
}
}
};
timerPlacement.scheduleRepeating(30);
}
private boolean tailleDuContenuEstModifiee() {
UIObject overlayContenuUi = overlayContenu.getWidget();
return overlayContenuUi != null
&& (overlayContenuUi.getOffsetHeight() != hauteurContenu
|| overlayContenuUi.getOffsetWidth() != largeurContenu);
}
 
@Override
public void surFermetureFenetre() {
Window.enableScrolling(true);
// replacement de la fenêtre à la position de scroll d'origine
Window.scrollTo(gaucheFenetre, topFenetre);
timerPlacement.cancel();
}
@Override
public void surSetContenuFenetre() {
// nécessaire pour le défilement avec les touches du clavier
overlayContenu.setFocus(true);
}
 
@Override
public void afficherBoutonsSuivantsPrecedents(boolean afficher) {
boutonPrecedent.setVisible(afficher);
boutonSuivant.setVisible(afficher);
}
 
@Override
public boolean testerFermetureClicExterieur(ClickEvent event) {
Element e = DOM.eventGetTarget(Event.as(event.getNativeEvent()));
return event.getRelativeElement() != null && (e == overlayContenu.getElement());
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/validation/ValidateurFormulaireAbstrait.java
New file
0,0 → 1,9
package org.tela_botanica.del.client.composants.validation;
 
public abstract class ValidateurFormulaireAbstrait {
 
public abstract boolean valider();
public abstract void afficherStyleErreur(String styleErreur);
public abstract void supprimerStyleErreur(String styleErreur);
 
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/validation/ValidateurChampDouble.java
New file
0,0 → 1,28
package org.tela_botanica.del.client.composants.validation;
 
import org.tela_botanica.del.client.i18n.I18n;
 
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasText;
import com.google.gwt.user.client.ui.TextBox;
 
 
public class ValidateurChampDouble extends ValidateurChampTexteAbstrait {
 
public ValidateurChampDouble(HasText textBox) {
super(textBox);
}
 
@Override
public boolean valider() {
try {
Double.parseDouble(getTextBox().getText());
supprimerStyleErreur(getStyleErreur());
return true;
} catch (Exception e) {
afficherStyleErreur(getStyleErreur());
return false;
}
}
 
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/validation/ValidateurChampNCaracteres.java
New file
0,0 → 1,32
package org.tela_botanica.del.client.composants.validation;
 
import org.tela_botanica.del.client.i18n.I18n;
 
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.TextBox;
 
public class ValidateurChampNCaracteres extends ValidateurChampTexteAbstrait {
 
private int nbCaracteres = 0;
public ValidateurChampNCaracteres(TextBox textBox) {
super(textBox);
// TODO Auto-generated constructor stub
}
public void setNbCaracteres(int nbCaracteresMax) {
nbCaracteres = nbCaracteresMax;
}
 
@Override
public boolean valider() {
if(getTextBox().getText().length()>=nbCaracteres){
supprimerStyleErreur(getStyleErreur());
return true;
} else {
afficherStyleErreur(getStyleErreur());
return false;
}
}
 
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/validation/ValidateurChampNumerique.java
New file
0,0 → 1,29
package org.tela_botanica.del.client.composants.validation;
 
import org.tela_botanica.del.client.i18n.I18n;
 
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasText;
import com.google.gwt.user.client.ui.TextBox;
 
public class ValidateurChampNumerique extends ValidateurChampTexteAbstrait {
 
public ValidateurChampNumerique(HasText textBox) {
super(textBox);
}
 
@Override
public boolean valider() {
try{
Integer.parseInt(getTextBox().getText());
supprimerStyleErreur(getStyleErreur());
return true;
} catch (Exception e) {
supprimerStyleErreur(getStyleErreur());
return false;
}
}
 
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/validation/ValidateurChampFlottant.java
New file
0,0 → 1,26
package org.tela_botanica.del.client.composants.validation;
 
import org.tela_botanica.del.client.i18n.I18n;
 
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.TextBox;
 
public class ValidateurChampFlottant extends ValidateurChampTexteAbstrait {
 
public ValidateurChampFlottant(TextBox textBox) {
super(textBox);
}
 
@Override
public boolean valider() {
try {
Float.parseFloat(getTextBox().getText());
supprimerStyleErreur(getStyleErreur());
return true;
} catch (Exception e) {
afficherStyleErreur(getStyleErreur());
return false;
}
}
 
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/validation/ValidateurChampTexteAbstrait.java
New file
0,0 → 1,40
package org.tela_botanica.del.client.composants.validation;
 
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasText;
import com.google.gwt.user.client.ui.TextBox;
 
public abstract class ValidateurChampTexteAbstrait extends ValidateurFormulaireAbstrait {
 
private HasText textBox;
protected String styleErreur = "erreurFormTexte";
 
public ValidateurChampTexteAbstrait(HasText textBox) {
this.textBox = textBox;
}
public ValidateurChampTexteAbstrait(TextBox textBox, String styleErreur) {
this.textBox = textBox;
this.styleErreur = styleErreur;
}
 
public HasText getTextBox() {
return textBox;
}
 
public void setTextBox(TextBox textBox) {
this.textBox = textBox;
}
public String getStyleErreur() {
return styleErreur;
}
 
public void setStyleErreur(String styleErreur) {
this.styleErreur = styleErreur;
}
public void afficherStyleErreur(String styleErreur) {};
public void supprimerStyleErreur(String styleErreur) {};
 
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/validation/ValidateurChampTexteNonNul.java
New file
0,0 → 1,26
package org.tela_botanica.del.client.composants.validation;
 
import org.tela_botanica.del.client.i18n.I18n;
 
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasText;
import com.google.gwt.user.client.ui.TextBox;
 
public class ValidateurChampTexteNonNul extends ValidateurChampTexteAbstrait {
public ValidateurChampTexteNonNul(HasText textBox) {
super(textBox);
}
 
@Override
public boolean valider() {
if (getTextBox().getText().length() >= 0 && !getTextBox().getText().equals("")) {
supprimerStyleErreur(getStyleErreur());
return true;
} else {
afficherStyleErreur(getStyleErreur());
return false;
}
}
 
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/presenteur/Presenteur.java
New file
0,0 → 1,73
package org.tela_botanica.del.client.composants.presenteur;
 
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.RootPanel;
 
public abstract class Presenteur {
 
private Panel overlay;
private Panel overlayContenu;
private PresenteurVue presenteurVue;
private boolean fenetreModaleOuverte = false;
 
// Constructeur
public Presenteur() {
}
 
// Afficheur
public void go() {
go(null);
}
 
public abstract void go(HasWidgets composite);
 
// Gestion des évènements
protected abstract void gererEvenements();
 
public void ouvrirFenetreModale(Presenteur presenteurModal) {
presenteurVue = new PresenteurVue();
overlay = presenteurVue.overlay;
overlay.setStyleName("overlay");
overlay.setVisible(false);
RootPanel.get().add(overlay);
 
overlayContenu = presenteurVue.overlayContenu;
overlayContenu.setStyleName("overlayContenu");
 
Button boutonFermer = presenteurVue.boutonFermer;
boutonFermer.setStyleName("fermerOverlay");
boutonFermer.addClickHandler(new ClickHandler() {
 
public void onClick(ClickEvent event) {
fermerFenetreModale();
}
});
 
presenteurModal.go(overlayContenu);
 
RootPanel.get().add(overlayContenu);
overlayContenu.setVisible(true);
 
overlayContenu.add(boutonFermer);
overlay.setVisible(true);
fenetreModaleOuverte = true;
}
public boolean fenetreModaleEstOuverte() {
return fenetreModaleOuverte;
}
 
public void fermerFenetreModale() {
overlay.clear();
overlayContenu.clear();
RootPanel.get().remove(overlay);
RootPanel.get().remove(overlayContenu);
fenetreModaleOuverte = false;
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/presenteur/PresenteurVue.java
New file
0,0 → 1,29
package org.tela_botanica.del.client.composants.presenteur;
 
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.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.Widget;
 
public class PresenteurVue extends Composite {
 
// Annotation can be used to change the name of the associated xml file
// @UiTemplate("ObservationRechercheVue.ui.xml")
interface MyUiBinder extends UiBinder<Widget, PresenteurVue> {
}
 
@UiField
HTMLPanel overlay, overlayContenu;
 
@UiField
Button boutonFermer;
 
private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);
 
protected PresenteurVue() {
initWidget(uiBinder.createAndBindUi(this));
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/presenteur/PresenteurVue.ui.xml
New file
0,0 → 1,13
<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" />
<g:VerticalPanel>
<g:Button ui:field="boutonFermer" text="{constants.fermer}" />
<g:HTMLPanel ui:field="overlay" />
<g:HTMLPanel ui:field="overlayContenu" />
</g:VerticalPanel>
</ui:UiBinder>
/branches/v1.11-magnesium/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.11-magnesium/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.11-magnesium/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>
/branches/v1.11-magnesium/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.11-magnesium/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.11-magnesium/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.11-magnesium/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.11-magnesium/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.11-magnesium/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.11-magnesium/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.11-magnesium/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.11-magnesium/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.11-magnesium/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.11-magnesium/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.11-magnesium/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.11-magnesium/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.11-magnesium/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.11-magnesium/src/org/tela_botanica/del/client/composants/preferences/PreferencesVue.ui.xml
New file
0,0 → 1,30
<!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="preferences.css" />
<g:HTMLPanel styleName="{style.conteneurPreferences}">
<g:Label text="{constants.preferences}" styleName="titre"/>
<g:Label styleName="petit {style.messageTemporaire}" text="{constants.messageTemporaireMails}" />
<g:HTML><br /></g:HTML>
<g:VerticalPanel ui:field="panneauChargement">
<g:Image url="./img/wait.gif"></g:Image>
</g:VerticalPanel>
<g:HTMLPanel styleName="{style.colonneGauche}" ui:field="conteneurChamps">
<g:HTMLPanel styleName="{style.zoneMailsMesObs}">
<g:Label text="{constants.recevoirMailComProp}" styleName="petit" />
<g:CheckBox ui:field="recevoirMailsMesObs" styleName="gauche pointeur"/><g:Label text="{constants.comEtPropSurObs}" styleName="petit" />
<g:CheckBox ui:field="recevoirMailsMesCom" styleName="gauche pointeur"/><g:Label text="{constants.comSurComEtProp}" styleName="petit" />
</g:HTMLPanel>
<g:HTMLPanel styleName="{style.zoneMailsToutesObs}">
<g:CheckBox ui:field="recevoirMailsToutesObs" styleName="gauche pointeur" />
<g:Label text="{constants.recevoirMailsToutesObs}" styleName="petit" />
</g:HTMLPanel>
<g:Button text="{constants.sauvegarder}" ui:field="boutonSauvegarderPreferences" styleName="{style.boutonSauvegarder} arrondi"/>
</g:HTMLPanel>
</g:HTMLPanel>
 
</ui:UiBinder>
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/preferences/PreferencesPresenteur.java
New file
0,0 → 1,93
package org.tela_botanica.del.client.composants.preferences;
 
import java.util.HashMap;
 
import org.tela_botanica.del.client.cache.CacheClient;
import org.tela_botanica.del.client.composants.presenteur.Presenteur;
import org.tela_botanica.del.client.navigation.evenement.BusEvenementiel;
import org.tela_botanica.del.client.navigation.evenement.changementPreferences.EvenementChangementPreferences;
import org.tela_botanica.del.client.services.rest.PreferencesService;
import org.tela_botanica.del.client.services.rest.async.ListePreferencesCallback;
import org.tela_botanica.del.client.services.rest.async.ModificationPreferencesCallback;
 
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.HasWidgets;
import com.google.gwt.user.client.ui.IsWidget;
 
public class PreferencesPresenteur extends Presenteur {
private Vue vue;
private PreferencesService preferencesService;
private HashMap<String, String> preferences = null;
public interface Vue extends IsWidget {
public void afficherMessageChargement();
public void cacherMessageChargement();
public String getValeurRecevoirMailsMesObs();
public String getValeurRecevoirMailsMesCom();
public String getValeurRecevoirMailsToutesObs();
public void setValeurRecevoirMailsMesObs(boolean valeur);
public void setValeurRecevoirMailsMesCom(boolean valeur);
public void setValeurRecevoirMailsToutesObs(boolean valeur);
public HasClickHandlers getBoutonSauvegarder();
}
public PreferencesPresenteur(Vue vue, PreferencesService preferencesService) {
this.vue = vue;
this.preferencesService = preferencesService;
gererEvenements();
}
 
@Override
public void go(HasWidgets composite) {
preferences = CacheClient.getInstance().getUtilisateur().getPreferences();
if (preferences == null) {
preferencesService.chargerPreferences(CacheClient.getInstance().getUtilisateur(), new ListePreferencesCallback() {
@Override
public void surRetour(java.util.HashMap<String, String> objetRetour) {
preferences = objetRetour;
CacheClient.getInstance().getUtilisateur().setPreferences(objetRetour);
affecterValeursChamps(preferences);
vue.cacherMessageChargement();
}
});
} else {
vue.cacherMessageChargement();
affecterValeursChamps(preferences);
}
composite.add(vue.asWidget());
}
private void affecterValeursChamps(HashMap<String, String> preferences) {
vue.setValeurRecevoirMailsMesObs(getPreferenceBool(preferences.get("mail_notification_mes_obs")));
vue.setValeurRecevoirMailsMesCom(getPreferenceBool(preferences.get("mail_notification_mes_com")));
vue.setValeurRecevoirMailsToutesObs(getPreferenceBool(preferences.get("mail_notification_toutes_obs")));
}
private boolean getPreferenceBool(String valeur) {
return (valeur.equals("1")) ? true : false;
}
 
@Override
protected void gererEvenements() {
vue.getBoutonSauvegarder().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
vue.afficherMessageChargement();
preferences.put("mail_notification_mes_obs", vue.getValeurRecevoirMailsMesObs());
preferences.put("mail_notification_mes_com", vue.getValeurRecevoirMailsMesCom());
preferences.put("mail_notification_toutes_obs", vue.getValeurRecevoirMailsToutesObs());
preferencesService.modifierPreferences(CacheClient.getInstance().getUtilisateur(), preferences, new ModificationPreferencesCallback() {
@Override
public void surRetour(String objetRetour) {
vue.cacherMessageChargement();
BusEvenementiel.getInstance().fireEvent(new EvenementChangementPreferences());
}
});
}
});
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/preferences/PreferencesVue.java
New file
0,0 → 1,86
package org.tela_botanica.del.client.composants.preferences;
 
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.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.Widget;
 
public class PreferencesVue extends Composite implements PreferencesPresenteur.Vue {
@UiField
Panel panneauChargement, conteneurChamps;
@UiField
public CheckBox recevoirMailsMesObs;
@UiField
public CheckBox recevoirMailsMesCom;
@UiField
public CheckBox recevoirMailsToutesObs;
@UiField
public Button boutonSauvegarderPreferences;
 
interface PreferencesVueUIiBinder extends UiBinder<Widget, PreferencesVue> {
};
 
PreferencesVueUIiBinder uiBinder = GWT.create(PreferencesVueUIiBinder.class);
 
public PreferencesVue() {
initWidget(uiBinder.createAndBindUi(this));
}
@Override
public void afficherMessageChargement() {
panneauChargement.setHeight(this.getOffsetHeight()+"px");
panneauChargement.setVisible(true);
conteneurChamps.setVisible(false);
}
 
@Override
public void cacherMessageChargement() {
panneauChargement.setVisible(false);
conteneurChamps.setVisible(true);
}
@Override
public void setValeurRecevoirMailsMesObs(boolean valeur) {
recevoirMailsMesObs.setValue(valeur);
}
@Override
public void setValeurRecevoirMailsMesCom(boolean valeur) {
recevoirMailsMesCom.setValue(valeur);
}
@Override
public void setValeurRecevoirMailsToutesObs(boolean valeur) {
recevoirMailsToutesObs.setValue(valeur);
}
@Override
public String getValeurRecevoirMailsMesObs() {
return (recevoirMailsMesObs.getValue()) ? "1" : "0";
}
@Override
public String getValeurRecevoirMailsMesCom() {
return (recevoirMailsMesCom.getValue()) ? "1" : "0";
}
@Override
public String getValeurRecevoirMailsToutesObs() {
return (recevoirMailsToutesObs.getValue()) ? "1" : "0";
}
 
@Override
public HasClickHandlers getBoutonSauvegarder() {
return boutonSauvegarderPreferences;
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/preferences/preferences.css
New file
0,0 → 1,58
.conteneurPreferences {
z-index: 1500;
padding: 30px;
padding-right: 21px;
padding-top: 20px;
background: white;
width: 370px;
margin: 0 auto;
margin-top: 75px;
padding-bottom:50px;
}
 
.messageTemporaire {
font-style: italic;
}
 
.boutonSauvegarder:hover {
background-color: #AAA
}
 
.colonneGauche,.colonneDroite {
width: 300px;
}
 
.colonneGauche {
padding-right: 30px
}
 
.colonneGauche select {
width: 100%
}
 
.colonneGauche input {
width: 95%
}
 
.boutonSauvegarder {
border: solid 1px #AAA;
cursor: pointer;
float: left;
margin-top: 10px;
margin-bottom: 5px;
margin-right: 5px;
float: right;
background: url(./img/add.png) no-repeat 5px 7px #DDD;
padding: 5px;
padding-left: 25px;
cursor: pointer
}
 
.zoneMailsMesObs {
margin-bottom: 10px;
}
 
.zoneMailsToutesObs {
margin-bottom: 10px;
margin-top: 20px;
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/metadonnees/metadonnees.css
New file
0,0 → 1,83
.metadonnees {
width:100%;
overflow:hidden;
}
.metadonnees .donnee {
display: inline-block;
}
.labelNomRetenu {
display: none
}
.nomRetenu {
display: none;
font-size: 15px;
color: #598000;
width: 170px;
overflow: auto;
white-space: nowrap;
text-overflow: ellipsis;
}
.lieuDuReleve {
display: block;
}
.paysDuReleve {
display: inline;
}
.zoneFamille {
display: none;
margin-top: 1em;
}
.zoneReferentiel {
margin-top: 1em;
}
.labelReferentiel {
display: inline;
}
.zoneFamille div {
display: inline;
}
.zoneLocalite {
margin-top:5px;
}
.zonePays {
}
.zoneLocalite div {
}
.zoneLieuDit {
display: inline;
}
.zoneStation {
display: inline;
}
.zoneMilieu {
display: inline;
}
.zoneMilieu div {
display: inline
}
.zoneCommentaire {
margin-top:5px;
}
.zoneCommentaire div {
}
.commentaire {
display: block;
height: 94px;
overflow: auto;
text-overflow: ellipsis
}
.zoneDateReleve {
}
 
.zoneAuteur {
}
.zoneAuteur div {
display: inline
}
.zoneDate {
display: inline;
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/metadonnees/metadonneesEnLigne.css
New file
0,0 → 1,59
.metadonnees {
width:100%;
}
.metadonnees div {
float:left;
padding:0 3px 0 0;
}
.zoneReferentiel {
margin-top:1em;
}
.famille {
display:none;
}
.nomCommun {
}
.nomCommun:before {
content:"(";
}
.nomCommun:after {
content:")";
}
.metaPart1 {
line-height:20px;
clear:both;
font-size:15px;
}
.metaPart2 {
line-height:20px;
clear:both;
color:#777;
max-width:850px;
}
.metaPart3 {
line-height:20px;
display:none;
max-width:850px;
}
.lieuDit {
}
.zoneLieu {
}
.zoneStation {
padding-left: 5px;
}
.zoneMilieu {
padding-left: 5px;
}
.labelGeo {
font-weight:bold;
}
.espece {
color:#454341;
font-size:18px;
margin-top:-2px;
}
.label {
font-size:12px;
margin-top:3px;
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/metadonnees/MetadonneesVue.ui.xml
New file
0,0 → 1,99
<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='res'
type='org.tela_botanica.del.client.resources.Ressources' />
<ui:with field="constants" type="org.tela_botanica.del.client.i18n.Vocabulary" />
 
<ui:style src="metadonnees.css" />
<g:HTMLPanel styleName="{style.metadonnees}">
<!-- Date du relevé -->
<g:HTMLPanel ui:field="zoneDateReleve" styleName="{style.zoneDateReleve}">
<g:InlineLabel styleName="petit gris" text="{constants.observeLe}" />
<g:InlineLabel ui:field="dateReleve" styleName="{style.donnee}"/>
</g:HTMLPanel>
<!-- Nom retenu -->
<g:HTMLPanel ui:field="zoneNomRetenu">
<g:Label styleName="petit gris {style.labelNomRetenu}" text="{constants.nomRetenu}" />
<g:Label ui:field="nomRetenu" styleName="{style.nomRetenu} gras" />
</g:HTMLPanel>
 
<!-- Nom commun -->
<g:HTMLPanel ui:field="zoneNomCommun">
<g:Label styleName="petit gris" text="{constants.nomCommun}" />
<g:Label ui:field="nomCommun" />
</g:HTMLPanel>
<!-- Référentiel -->
<g:HTMLPanel ui:field="zoneReferentiel" styleName="{style.zoneReferentiel}">
<g:Label styleName="petit gris {style.labelReferentiel}" text="{constants.referentiel}" />
<g:Label ui:field="referentiel" styleName="{style.donnee}"/>
</g:HTMLPanel>
 
<!-- Famille -->
<g:HTMLPanel ui:field="zoneFamille" styleName="{style.zoneFamille}">
<g:Label styleName="petit gris" text="{constants.metadonneeFamille}" />
<g:Label ui:field="famille" styleName="{style.donnee}"/>
</g:HTMLPanel>
 
<!-- Pays -->
<g:HTMLPanel ui:field="zonePays" styleName="{style.zonePays}">
<g:Label styleName="petit gris {style.paysDuReleve}" text="{constants.pays}" />
<g:Label ui:field="pays" styleName="{style.donnee}"/>
</g:HTMLPanel>
<!-- Lieu -->
<g:HTMLPanel ui:field="zoneLocalite" styleName="{style.zoneLocalite}">
<g:Label styleName="petit gris {style.lieuDuReleve}" text="{constants.lieuDuReleve}" />
<g:Label ui:field="localite" styleName="{style.donnee}"/>
</g:HTMLPanel>
 
<!-- Lieu-dit -->
<g:HTMLPanel ui:field="zoneLieuDit" styleName="{style.zoneLieuDit}">
<g:HTML ui:field="lieuDit"/>
</g:HTMLPanel>
<!-- Station -->
<g:HTMLPanel ui:field="zoneStation" styleName="{style.zoneStation}">
<g:Label ui:field="station"/>
</g:HTMLPanel>
 
<!-- Milieu -->
<g:HTMLPanel ui:field="zoneMilieu" styleName="{style.zoneMilieu}">
<g:Label ui:field="milieu"/>
</g:HTMLPanel>
 
<!-- Commentaire -->
<g:HTMLPanel ui:field="zoneCommentaire" styleName="{style.zoneCommentaire}">
<g:Label styleName="petit gris" text="{constants.commentaire}" />
<g:Label ui:field="commentaire" styleName="{style.commentaire}"/>
</g:HTMLPanel>
 
<!-- Publié par -->
<g:HTMLPanel ui:field="zoneAuteur" styleName="{style.zoneAuteur}">
<g:Label styleName="petit gris" text="{constants.par}" />
<g:Label ui:field="auteur" styleName="{style.donnee}" title="Voir le profil" />
<g:Anchor ui:field="courrielAuteur" styleName="{style.donnee}"/>
</g:HTMLPanel>
 
<!-- Date de transmission -->
<g:HTMLPanel ui:field="zoneDate" styleName="{style.zoneDate}">
<g:InlineLabel styleName="petit gris" text="{constants.publiee}" />
<g:InlineLabel ui:field="dateTransmission" styleName="{style.donnee}"/>
</g:HTMLPanel>
 
<!-- Mots-clés/Tag -->
<g:HTMLPanel ui:field="zoneMotsClefs">
<g:Label styleName="petit gris" text="{constants.motsClefs}" />
<g:Label ui:field="motsClefs" styleName="{style.donnee}"/>
</g:HTMLPanel>
 
<g:Label ui:field="numNomenclatural" />
<g:Anchor ui:field="lienIdentiplante" text="{constants.signalerIdentification}" styleName="labelLien"/>
</g:HTMLPanel>
</ui:UiBinder>
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/metadonnees/MetadonneesEnLigneVue.ui.xml
New file
0,0 → 1,79
<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='res'
type='org.tela_botanica.del.client.resources.Ressources' />
<ui:with field="constants" type="org.tela_botanica.del.client.i18n.Vocabulary" />
 
<ui:style src="metadonneesEnLigne.css" />
 
<g:HTMLPanel styleName="{style.metadonnees}">
 
<g:HTMLPanel styleName="{style.metaPart1}">
<g:HTMLPanel styleName="{style.espece}">
<g:Label ui:field="nomRetenu" title="Voir la fiche eFlore" />
</g:HTMLPanel>
<g:HTMLPanel styleName="{style.nomCommun}">
<g:Label ui:field="nomCommun" />
</g:HTMLPanel>
<g:HTMLPanel>
<g:Label text="référentiel" styleName="{style.label}" />
<g:Label ui:field="referentiel" />
</g:HTMLPanel>
<g:HTMLPanel>
<g:Label text="{constants.pays}" styleName="{style.label}" />
<g:Label ui:field="pays" />
</g:HTMLPanel>
<g:HTMLPanel>
<g:Label text="observée à" styleName="{style.label}" />
<g:Label ui:field="localite" />
</g:HTMLPanel>
<g:HTMLPanel>
<g:Label text="le" styleName="{style.label}" />
<g:InlineLabel ui:field="dateReleve" />
</g:HTMLPanel>
<br/>
<g:HTMLPanel>
<g:Label text="par" styleName="{style.label}" />
<g:Label ui:field="auteur" title="Voir le profil" />
</g:HTMLPanel>
<g:HTMLPanel>
(<g:Anchor ui:field="courrielAuteur" />)
</g:HTMLPanel>
</g:HTMLPanel>
<g:HTMLPanel styleName="{style.metaPart2}">
<g:HTMLPanel styleName="{style.zoneLieu}">
<g:Label text="Lieu :" styleName="{style.labelGeo}"/>
<g:HTML ui:field="lieuDit" styleName="{style.lieuDit}" title="{constants.lieuDit}" />
</g:HTMLPanel>
<g:HTMLPanel styleName="{style.zoneStation}">
<g:Label text="Station :" styleName="{style.labelGeo}"/>
<g:Label ui:field="station" title="{constants.station}" />
</g:HTMLPanel>
<g:HTMLPanel styleName="{style.zoneMilieu}">
<g:Label text="Milieu :" styleName="{style.labelGeo}"/>
<g:Label ui:field="milieu" />
</g:HTMLPanel>
</g:HTMLPanel>
<g:HTMLPanel styleName="{style.metaPart3}">
<g:HTMLPanel styleName="{style.famille}">
<g:Label ui:field="famille" />
</g:HTMLPanel>
<g:HTMLPanel>
<g:Label ui:field="motsClefs" />
</g:HTMLPanel>
<g:HTMLPanel>
<g:Label ui:field="numNomenclatural" />
</g:HTMLPanel>
<g:HTMLPanel>
<g:Label ui:field="commentaire" />
</g:HTMLPanel>
<g:HTMLPanel>
<g:Label text="Publié le" styleName="{style.label}" />
<g:InlineLabel ui:field="dateTransmission" />
</g:HTMLPanel>
</g:HTMLPanel>
 
</g:HTMLPanel>
</ui:UiBinder>
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/metadonnees/MetadonneesPresenteur.java
New file
0,0 → 1,355
package org.tela_botanica.del.client.composants.metadonnees;
 
import org.tela_botanica.del.client.cache.CacheClient;
import org.tela_botanica.del.client.composants.presenteur.Presenteur;
import org.tela_botanica.del.client.config.Config;
import org.tela_botanica.del.client.modeles.InformationsRecherche;
import org.tela_botanica.del.client.modeles.ModeRecherche;
import org.tela_botanica.del.client.modeles.Observation;
import org.tela_botanica.del.client.modeles.Utilisateur;
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.detailsimage.EvenementRechercheImage;
import org.tela_botanica.del.client.navigation.evenement.rechercheobservation.EvenementRechercheObservation;
import org.tela_botanica.del.client.utils.UtilitairesServiceResultat;
 
import com.google.gwt.core.shared.GWT;
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.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.History;
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 MetadonneesPresenteur extends Presenteur {
 
public abstract interface Vue extends IsWidget {
public HasText getNomRetenu();
 
public HasClickHandlers getLienNomRetenu();
 
public HasText getNomCommun();
 
public HasText getFamille();
 
public HasText getLocalite();
 
public HasText getLieuDit();
 
public HasText getMilieu();
 
public HasText getCommentaire();
 
public HasText getAuteur();
public HasText getCourrielAuteur();
public void setCourrielAuteurHref(String courriel);
public HasText getDateTransmission();
 
public HasText getMotsClefs();
 
public HasText getNumNomenclatural();
 
public HasText getDateReleve();
public HasText getPays();
 
public HasClickHandlers getLienFamille();
 
public HasClickHandlers getLienAuteur();
public HasClickHandlers getLienCourrielAuteur();
 
public HasClickHandlers getLienDateTransmission();
 
public HasClickHandlers getLienDateReleve();
public HasClickHandlers getLienPays();
public HasClickHandlers getLienLocalite();
 
public HasClickHandlers getLienMotsClefs();
 
public HasClickHandlers getLienNumNomenclatural();
 
public HasClickHandlers getLienNomCommun();
 
public HasClickHandlers getLienMilieu();
 
public HasClickHandlers getLienCommentaire();
public void setStation(String station) ;
public void masquerChampsVides();
public void activerLiens();
public void activerLienAuteur();
public void activerLienNomRetenu();
public void setLienIdentiplante(String id);
 
void desactiverLienAuteur();
 
public HasText getReferentiel();
public void afficherCourrielAuteur();
public void cacherCourrielAuteur();
}
 
private Vue vue;
private Observation observation;
private ModeRecherche modeRecherche;
private boolean avecLiens;
public MetadonneesPresenteur(Vue vue, Observation observation, ModeRecherche modeRecherche, boolean avecLiens) {
this.vue = vue;
this.modeRecherche = modeRecherche;
setObservation(observation);
this.avecLiens = avecLiens;
}
 
public void setObservation(Observation observation) {
this.observation = observation;
}
 
public void chargerMetaDonnees() {
vue.getNomRetenu().setText(observation.getNomRetenu());
vue.getNomCommun().setText(observation.getNomCommun());
vue.getReferentiel().setText(observation.getReferentiel());
vue.getFamille().setText(observation.getFamille());
if(CacheClient.getInstance().getListePays() != null) {
vue.getPays().setText(CacheClient.getInstance().getListePays().get(observation.getPays()));
} else {
vue.getPays().setText(observation.getPays());
}
 
vue.getLocalite().setText(observation.getLocaliteAvecIdFormatee());
vue.getLieuDit().setText(observation.getLieuDit());
vue.setStation(observation.getStation());
vue.getMilieu().setText(observation.getMilieu());
vue.getCommentaire().setText(observation.getCommentaire());
vue.getAuteur().setText(observation.getAuteur());
vue.getDateTransmission().setText(formaterDate(observation.getDateTransmission()));
vue.getDateReleve().setText(formaterDate(observation.getDateReleve()));
gererAffichageCourrielAuteur();
// ATTENTION : Masquer champs vide doit se faire en dernier !
vue.masquerChampsVides();
}
 
public String formaterDate(String dateNonFormatee) {
try {
String dateFormatee = DateTimeFormat.getFormat("dd/MM/yyyy").format(UtilitairesServiceResultat.parserDateObservation(dateNonFormatee));
dateFormatee = (dateFormatee == "01/01/1970") ? "???" : dateFormatee ;
return dateFormatee;
} catch (IllegalArgumentException e) {
return "";
}
}
@Override
public void go(HasWidgets composite) {
composite.add(vue.asWidget());
chargerMetaDonnees();
gererEvenements();
}
 
@Override
protected void gererEvenements() {
if (this.avecLiens) {
if (!observation.getIdAuteur().equals("0")) {
vue.getLienAuteur().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent arg0) {
InformationsRecherche informationsRecherche = new InformationsRecherche();
informationsRecherche.setAuteur(vue.getAuteur().getText());
setInfosRechercheEnCacheEtLancerEvenement(informationsRecherche);
History.fireCurrentHistoryState();
}
});
}
vue.getLienDateReleve().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent arg0) {
InformationsRecherche informationsRecherche = new InformationsRecherche();
informationsRecherche.setDate(vue.getDateReleve().getText());
setInfosRechercheEnCacheEtLancerEvenement(informationsRecherche);
History.fireCurrentHistoryState();
}
});
vue.getLienDateTransmission().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent arg0) {
InformationsRecherche informationsRecherche = new InformationsRecherche();
informationsRecherche.setDate(vue.getDateReleve().getText());
setInfosRechercheEnCacheEtLancerEvenement(informationsRecherche);
History.fireCurrentHistoryState();
}
});
vue.getLienFamille().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent arg0) {
InformationsRecherche informationsRecherche = new InformationsRecherche();
informationsRecherche.setFamille(vue.getFamille().getText());
setInfosRechercheEnCacheEtLancerEvenement(informationsRecherche);
History.fireCurrentHistoryState();
}
});
vue.getLienLocalite().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent arg0) {
InformationsRecherche informationsRecherche = new InformationsRecherche();
informationsRecherche.setCommune(vue.getLocalite().getText());
setInfosRechercheEnCacheEtLancerEvenement(informationsRecherche);
History.fireCurrentHistoryState();
}
});
vue.getLienPays().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent arg0) {
InformationsRecherche informationsRecherche = new InformationsRecherche();
if(CacheClient.getInstance().getListePaysInversee() != null) {
informationsRecherche.setPays(CacheClient.getInstance().getListePaysInversee().get(vue.getPays().getText()));
} else {
informationsRecherche.setPays(vue.getPays().getText());
}
setInfosRechercheEnCacheEtLancerEvenement(informationsRecherche);
History.fireCurrentHistoryState();
}
});
vue.getLienMotsClefs().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent arg0) {
InformationsRecherche informationsRecherche = new InformationsRecherche();
informationsRecherche.setMotClef(vue.getMotsClefs().getText());
setInfosRechercheEnCacheEtLancerEvenement(informationsRecherche);
History.fireCurrentHistoryState();
}
});
vue.getLienNomCommun().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent arg0) {
InformationsRecherche informationsRecherche = new InformationsRecherche();
informationsRecherche.setRechercheLibre(vue.getNomCommun().getText());
setInfosRechercheEnCacheEtLancerEvenement(informationsRecherche);
History.fireCurrentHistoryState();
}
});
vue.getLienNomRetenu().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent arg0) {
InformationsRecherche informationsRecherche = new InformationsRecherche();
informationsRecherche.setRechercheLibre(vue.getNomRetenu().getText());
setInfosRechercheEnCacheEtLancerEvenement(informationsRecherche);
History.fireCurrentHistoryState();
}
});
vue.getLienMilieu().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent arg0) {
InformationsRecherche informationsRecherche = new InformationsRecherche();
informationsRecherche.setRechercheLibre(vue.getMilieu().getText());
setInfosRechercheEnCacheEtLancerEvenement(informationsRecherche);
History.fireCurrentHistoryState();
}
});
vue.getLienCommentaire().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent arg0) {
InformationsRecherche informationsRecherche = new InformationsRecherche();
informationsRecherche.setRechercheLibre(vue.getCommentaire().getText());
setInfosRechercheEnCacheEtLancerEvenement(informationsRecherche);
History.fireCurrentHistoryState();
}
});
 
vue.setLienIdentiplante(this.observation.getId());
vue.activerLiens();
if (observation.getIdAuteur().equals("0")) {
vue.desactiverLienAuteur();
}
} else {
if (! observation.getIdAuteur().equals("0")) {
vue.getLienAuteur().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Config config = new Config();
Window.open(config.getUrl("profil") + observation.getIdAuteur(), "Consultation de l'annuaire", config.getInfo("popupOptions"));
}
});
vue.activerLienAuteur();
}
 
if (observation.getNumNomenclatural() != null && ! observation.getNumNomenclatural().equals("0") && ! observation.getNumNomenclatural().equals("")) {
vue.activerLienNomRetenu();
vue.getLienNomRetenu().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent arg0) {
Config config = new Config();
String efloreUrlFicheTpl = config.getUrl("efloreTaxon");
String efloreUrlFiche = efloreUrlFicheTpl.replaceAll("referentiel-nn-num_nom", observation.getReferentiel()+"-nn-"+observation.getNumNomenclatural());
Window.open(efloreUrlFiche, "Fiche eflore", config.getInfo("popupOptions"));
}
});
}
}
BusEvenementiel.getInstance().addHandler(EvenementChangementEtatUtilisateur.TYPE, new GestionnaireEvenementChangementEtatUtilisateur() {
@Override
public void onModificationEtatUtilisateur(EvenementChangementEtatUtilisateur evenementChangementEtatUtilisateur) {
gererAffichageCourrielAuteur();
}
});
}
public void gererAffichageCourrielAuteur() {
GWT.log("Auteur courrriel :"+observation.getCourrielAuteur());
Utilisateur utilisateur = CacheClient.getInstance().getUtilisateur();
if (utilisateur.etreAdmin()) {
vue.getCourrielAuteur().setText(observation.getCourrielAuteur());
vue.setCourrielAuteurHref(observation.getCourrielAuteur());
vue.afficherCourrielAuteur();
} else {
vue.getCourrielAuteur().setText("");
vue.setCourrielAuteurHref("");
vue.cacherCourrielAuteur();
}
}
 
public void setInfosRechercheEnCacheEtLancerEvenement(InformationsRecherche informationsRecherche) {
switch (modeRecherche) {
case MODE_IMAGE:
CacheClient.getInstance().setPageCouranteRechercheImages(1);
CacheClient.getInstance().setInformationsRechercheImage(informationsRecherche);
BusEvenementiel.getInstance().fireEvent(new EvenementRechercheImage());
break;
case MODE_OBSERVATION:
CacheClient.getInstance().setPageCouranteRechercheObservations(1);
CacheClient.getInstance().setInformationsRechercheObservation(informationsRecherche);
BusEvenementiel.getInstance().fireEvent(new EvenementRechercheObservation());
default:
break;
}
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/metadonnees/MetadonneesVue.java
New file
0,0 → 1,236
package org.tela_botanica.del.client.composants.metadonnees;
 
import org.tela_botanica.del.client.cache.CacheClient;
import org.tela_botanica.del.client.config.Config;
import org.tela_botanica.del.client.gestionhistorique.ConstantesNavigation;
 
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.Window;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasText;
import com.google.gwt.user.client.ui.Hyperlink;
import com.google.gwt.user.client.ui.InlineLabel;
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 MetadonneesVue extends Composite implements MetadonneesPresenteur.Vue {
// Gestion d'UiBinder
interface Binder extends UiBinder<Widget, MetadonneesVue> {
}
 
private static Binder binder = GWT.create(Binder.class);
 
@UiField
Label nomRetenu, famille, auteur, pays, localite, motsClefs, numNomenclatural, nomCommun, commentaire, milieu, station, referentiel;
@UiField
Anchor courrielAuteur;
@UiField
HTML lieuDit;
 
@UiField
Panel zoneStation;
@UiField
InlineLabel dateReleve, dateTransmission;
 
@UiField
Anchor lienIdentiplante;
public MetadonneesVue() {
initWidget(binder.createAndBindUi(this));
// Le lien ne doit être affiché que sur pictoflora
String urlCourante = Window.Location.getHref();
Config config = new Config();
String urlAppliImg = config.getUrl("pictoflora");
if (!urlCourante.contains(urlAppliImg)) {
lienIdentiplante.setVisible(false);
}
}
 
public HasText getNomRetenu() {
return this.nomRetenu;
}
 
public HasText getFamille() {
return this.famille;
}
 
public HasText getAuteur() {
return this.auteur;
}
 
public HasText getCourrielAuteur() {
return this.courrielAuteur;
}
public void setCourrielAuteurHref(String courriel) {
this.courrielAuteur.setHref("mailto:"+courriel);
}
public HasText getDateTransmission() {
return this.dateTransmission;
}
 
public HasText getDateReleve() {
return this.dateReleve;
}
 
public HasText getLocalite() {
return this.localite;
}
 
public HasText getMotsClefs() {
return this.motsClefs;
}
 
public HasText getNumNomenclatural() {
return this.numNomenclatural;
}
 
public HasText getNomCommun() {
return nomCommun;
}
 
public HasText getLieuDit() {
return lieuDit;
}
 
public HasText getMilieu() {
return milieu;
}
 
public HasText getCommentaire() {
return commentaire;
}
public HasText getPays() {
return this.pays;
}
 
@Override
public HasClickHandlers getLienNomRetenu() {
return nomRetenu;
}
public HasClickHandlers getLienPays() {
return this.pays;
}
 
public HasClickHandlers getLienFamille() {
return this.famille;
}
 
public HasClickHandlers getLienAuteur() {
return this.auteur;
}
public HasClickHandlers getLienCourrielAuteur() {
return this.courrielAuteur;
}
 
public HasClickHandlers getLienDateTransmission() {
return this.dateTransmission;
}
 
public HasClickHandlers getLienDateReleve() {
return this.dateReleve;
}
 
public HasClickHandlers getLienLocalite() {
return this.localite;
}
 
public HasClickHandlers getLienMotsClefs() {
return this.motsClefs;
}
 
public HasClickHandlers getLienNumNomenclatural() {
return this.numNomenclatural;
}
 
public HasClickHandlers getLienNomCommun() {
return nomCommun;
}
 
public HasClickHandlers getLienMilieu() {
return milieu;
}
 
public HasClickHandlers getLienCommentaire() {
return commentaire;
}
 
@Override
public void masquerChampsVides() {
HasText[] champs = {nomRetenu, nomCommun, famille, localite, auteur, motsClefs, commentaire, milieu, lieuDit, dateReleve, dateTransmission};
for (int i = 0; i < champs.length; i ++) {
HasText champ = champs[i];
if (champ.getText() == null || champ.getText().isEmpty()) {
Widget widget = (Widget) champ;
widget.getParent().setVisible(false);
}
}
}
 
@Override
public void setStation(String station) {
if (station.equals("")) {
this.zoneStation.setVisible(false);
} else {
this.station.setText(station);
}
}
public void activerLiens() {
dateReleve.addStyleName("labelLien");
nomRetenu.addStyleName("labelLien");
famille.addStyleName("labelLien");
auteur.addStyleName("labelLien");
localite.addStyleName("labelLien");
motsClefs.addStyleName("labelLien");
nomCommun.addStyleName("labelLien");
commentaire.addStyleName("labelLien");
milieu.addStyleName("labelLien");
pays.addStyleName("labelLien");
}
 
@Override
public void activerLienAuteur() {
auteur.addStyleName("labelLien");
}
@Override
public void desactiverLienAuteur() {
auteur.removeStyleName("labelLien");
}
 
public void setLienIdentiplante(String id) {
lienIdentiplante.setHref(CacheClient.getInstance().getUrlPageSignalerMauvaiseId(id));
lienIdentiplante.setTarget("_blank");
}
 
@Override
public HasText getReferentiel() {
return referentiel;
}
 
@Override
public void activerLienNomRetenu() {
// TODO Auto-generated method stub
}
public void afficherCourrielAuteur() {
courrielAuteur.setVisible(true);
}
public void cacherCourrielAuteur() {
courrielAuteur.setVisible(false);
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/metadonnees/MetadonneesEnLigneVue.java
New file
0,0 → 1,210
package org.tela_botanica.del.client.composants.metadonnees;
 
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.Anchor;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasText;
import com.google.gwt.user.client.ui.Hyperlink;
import com.google.gwt.user.client.ui.InlineLabel;
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 MetadonneesEnLigneVue extends Composite implements MetadonneesPresenteur.Vue {
// Gestion d'UiBinder
interface Binder extends UiBinder<Widget, MetadonneesEnLigneVue> {
}
 
private static Binder binder = GWT.create(Binder.class);
 
@UiField
Label nomRetenu, famille, auteur, pays, localite, motsClefs, numNomenclatural, nomCommun, commentaire, milieu, station, referentiel;
@UiField
Anchor courrielAuteur;
@UiField
HTML lieuDit;
@UiField
InlineLabel dateReleve, dateTransmission;
 
 
public MetadonneesEnLigneVue() {
initWidget(binder.createAndBindUi(this));
}
 
public HasText getNomRetenu() {
return this.nomRetenu;
}
 
public HasText getFamille() {
return this.famille;
}
 
public HasText getAuteur() {
return this.auteur;
}
public HasText getCourrielAuteur() {
return courrielAuteur;
}
 
public void setCourrielAuteurHref(String courriel) {
this.courrielAuteur.setHref("mailto:"+courriel);
}
 
public HasText getDateTransmission() {
return this.dateTransmission;
}
 
public HasText getDateReleve() {
return this.dateReleve;
}
 
public HasText getLocalite() {
return this.localite;
}
 
public HasText getMotsClefs() {
return this.motsClefs;
}
 
public HasText getNumNomenclatural() {
return this.numNomenclatural;
}
 
public HasText getNomCommun() {
return nomCommun;
}
 
public HasText getLieuDit() {
return lieuDit;
}
 
public HasText getMilieu() {
return milieu;
}
 
public HasText getCommentaire() {
return commentaire;
}
public HasText getPays() {
return pays;
}
 
@Override
public HasClickHandlers getLienNomRetenu() {
return nomRetenu;
}
public HasClickHandlers getLienPays() {
return this.pays;
}
 
public HasClickHandlers getLienFamille() {
return this.famille;
}
 
public HasClickHandlers getLienAuteur() {
return this.auteur;
}
public HasClickHandlers getLienCourrielAuteur() {
return this.courrielAuteur;
}
 
public HasClickHandlers getLienDateTransmission() {
return this.dateTransmission;
}
 
public HasClickHandlers getLienDateReleve() {
return this.dateReleve;
}
 
public HasClickHandlers getLienLocalite() {
return this.localite;
}
 
public HasClickHandlers getLienMotsClefs() {
return this.motsClefs;
}
 
public HasClickHandlers getLienNumNomenclatural() {
return this.numNomenclatural;
}
 
public HasClickHandlers getLienNomCommun() {
return nomCommun;
}
 
public HasClickHandlers getLienMilieu() {
return milieu;
}
 
public HasClickHandlers getLienCommentaire() {
return commentaire;
}
 
@Override
public void masquerChampsVides() {
HasText[] champs = {nomRetenu, referentiel, nomCommun, famille, localite, auteur, courrielAuteur, motsClefs, commentaire, lieuDit, station, milieu, dateReleve, dateTransmission};
for (int i = 0; i < champs.length; i ++) {
HasText champ = champs[i];
if ("".equals(champ.getText().trim())) {
Widget widget = (Widget) champ;
widget.getParent().setVisible(false);
}
}
}
 
@Override
public void setStation(String station) {
if (station.equals("")) {
this.station.setVisible(false);
} else {
this.station.setText(station);
}
}
@Override
public void activerLiens() {
}
 
@Override
public void activerLienAuteur() {
auteur.addStyleName("labelLien");
}
 
@Override
public void activerLienNomRetenu() {
nomRetenu.addStyleName("labelLien");
}
 
@Override
public void desactiverLienAuteur() {
auteur.removeStyleName("labelLien");
}
 
public void setLienIdentiplante(String id) {}
 
@Override
public HasText getReferentiel() {
return referentiel;
}
public void afficherCourrielAuteur() {
courrielAuteur.getParent().setVisible(true);
courrielAuteur.setVisible(true);
}
public void cacherCourrielAuteur() {
courrielAuteur.getParent().setVisible(false);
courrielAuteur.setVisible(false);
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/images/DetailImageVue.java
New file
0,0 → 1,127
package org.tela_botanica.del.client.composants.images;
 
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.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.LoadEvent;
import com.google.gwt.event.dom.client.LoadHandler;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseOutHandler;
import com.google.gwt.event.dom.client.MouseOverEvent;
import com.google.gwt.event.dom.client.MouseOverHandler;
import com.google.gwt.event.logical.shared.ResizeEvent;
import com.google.gwt.event.logical.shared.ResizeHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Widget;
 
public class DetailImageVue extends Composite implements DetailImagePresenteur.Vue {
 
// Gestion d'UiBinder
interface Binder extends UiBinder<Widget, DetailImageVue> {
}
 
private static Binder binder = GWT.create(Binder.class);
 
@UiField
protected Image photoPrincipale;
 
@UiField
protected HTML superpositionImage;
 
@UiField
protected HTML texteAlternatif;
 
public DetailImageVue() {
initWidget(binder.createAndBindUi(this));
photoPrincipale.addLoadHandler(new LoadHandler() {
@Override
public void onLoad(LoadEvent event) {
setTailleOptimale();
}
});
Window.addResizeHandler(new ResizeHandler() {
Timer resizeTimer = new Timer() {
@Override
public void run() {
setTailleOptimale();
}
};
@Override
public void onResize(ResizeEvent event) {
resizeTimer.cancel();
resizeTimer.schedule(250);
}
});
}
 
public void chargerImage(org.tela_botanica.del.client.modeles.Image imageCourante) {
setUrlImage(imageCourante.getUrlFormat("L"));
setAltImage(imageCourante.getObservation().getAuteur() + " - " + imageCourante.getObservation().getNomRetenu());
setTitle("Cliquer pour ouvrir l'image originale dans un nouvel onglet");
setTexteAlternatif("<strong> "+I18n.getVocabulary().imageNumero()+""+ imageCourante.getIdImage() +" - "+ imageCourante.getObservation().getNomRetenuFormateReferentiel() + " " + I18n.getVocabulary().par() + " " + imageCourante.getObservation().getAuteur() + "</strong><br />"
+ I18n.getVocabulary().publiee() + " "+ imageCourante.getObservation().getDateReleve() + " - " + imageCourante.getObservation().getLocaliteAvecIdFormatee());
final String urlImageOriginale = imageCourante.getUrlFormat("O");
 
// ouvre l'image originale dans un nouvel onglet, en attendant un futur outil de zoom
superpositionImage.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Window.open(urlImageOriginale, "_blank", "");
}
});
}
 
public void setUrlImage(String urlImage) {
photoPrincipale.setUrl(urlImage);
}
 
// définit le "alt" sur l'image (ajouté pour l'intégration aux réseaux sociaux)
public void setAltImage(String altImage) {
photoPrincipale.setAltText(altImage);
}
 
public void setTexteAlternatif(String texteAlternatif) {
this.texteAlternatif.setHTML(texteAlternatif);
}
public void setTailleOptimale() {
double fenetreH = Window.getClientHeight();
double fenetreW = Window.getClientWidth();
double photoH = photoPrincipale.getHeight();
double photoW = photoPrincipale.getWidth();
double rapport = 0;
double reduction = 150;
if(photoH > (fenetreH - reduction) || photoW > (fenetreW - reduction)) {
if(photoH >= (fenetreH - reduction)) {
rapport = photoW/photoH;
photoH = fenetreH-reduction;
photoW = photoH*rapport;
}
if(photoW >= (fenetreW - reduction)) {
rapport = photoH/photoW;
photoW = fenetreW-reduction;
photoH = photoW*rapport;
}
}
setWidth(photoW+"px");
setHeight(photoH+"px");
}
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/images/detailImage.css
New file
0,0 → 1,23
.detailImage {
z-index:1500;
padding: 5px 5px 50px;
width:600px;
background:white;
margin:0 auto;
margin-top:75px;
}
 
.detailImage > *{
width: inherit;
height: inherit;
}
 
.superpositionImage {
position: absolute;
}
 
.superpositionImage:hover {
background-image: url("img/plein_ecran.png");
background-position: bottom 10px left 10px;
background-repeat: no-repeat;
}
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/images/DetailImageVue.ui.xml
New file
0,0 → 1,13
<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='res' type='org.tela_botanica.del.client.resources.Ressources'/>
<ui:with field="constants" type="org.tela_botanica.del.client.i18n.Vocabulary"/>
 
<ui:style src="detailImage.css" />
<g:HTMLPanel styleName="{style.detailImage}">
<g:HTML ui:field="superpositionImage" styleName="{style.superpositionImage}">
</g:HTML>
<g:Image ui:field="photoPrincipale" />
<g:HTML ui:field="texteAlternatif"/>
</g:HTMLPanel>
</ui:UiBinder>
/branches/v1.11-magnesium/src/org/tela_botanica/del/client/composants/images/DetailImagePresenteur.java
New file
0,0 → 1,31
package org.tela_botanica.del.client.composants.images;
 
import org.tela_botanica.del.client.composants.presenteur.Presenteur;
import org.tela_botanica.del.client.modeles.Image;
 
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.IsWidget;
 
public class DetailImagePresenteur extends Presenteur {
 
public abstract interface Vue extends IsWidget {
public abstract void chargerImage(Image image);
}
public Vue vue;
public DetailImagePresenteur(Image image, Vue vue) {
this.vue = vue;
this.vue.chargerImage(image);
}
 
@Override
public void go(HasWidgets composite) {
composite.add(vue.asWidget());
}
 
@Override
protected void gererEvenements() {
// TODO Auto-generated method stub
}
 
}