Rev 884 | Blame | Last modification | View Log | RSS feed
package org.tela_botanica.client.vues;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import org.tela_botanica.client.Mediateur;import org.tela_botanica.client.images.Images;import org.tela_botanica.client.interfaces.Rafraichissable;import org.tela_botanica.client.modeles.Information;import org.tela_botanica.client.modeles.MenuApplicationId;import org.tela_botanica.client.modeles.Personne;import org.tela_botanica.client.modeles.PersonneListe;import org.tela_botanica.client.modeles.Publication;import org.tela_botanica.client.modeles.PublicationAPersonne;import org.tela_botanica.client.modeles.PublicationAPersonneListe;import org.tela_botanica.client.modeles.Structure;import org.tela_botanica.client.modeles.StructureListe;import org.tela_botanica.client.util.Pattern;import org.tela_botanica.client.util.UtilArray;import org.tela_botanica.client.util.UtilString;import com.extjs.gxt.ui.client.event.ButtonEvent;import com.extjs.gxt.ui.client.event.SelectionListener;import com.extjs.gxt.ui.client.store.ListStore;import com.extjs.gxt.ui.client.widget.HorizontalPanel;import com.extjs.gxt.ui.client.widget.LayoutContainer;import com.extjs.gxt.ui.client.widget.MessageBox;import com.extjs.gxt.ui.client.widget.button.Button;import com.extjs.gxt.ui.client.widget.form.ComboBox;import com.extjs.gxt.ui.client.widget.form.FieldSet;import com.extjs.gxt.ui.client.widget.form.TextField;import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;import com.extjs.gxt.ui.client.widget.layout.FlowLayout;import com.extjs.gxt.ui.client.widget.layout.FormData;import com.extjs.gxt.ui.client.widget.layout.FormLayout;import com.google.gwt.core.client.GWT;public class PublicationForm extends Formulaire implements Rafraichissable {private Publication publication;private PublicationAPersonneListe publicationAPersonneListe = null;private boolean publicationAPersonneListeChargementOk = false;private FieldSet auteursFieldset = null;private ArrayList<ComboBox<Personne>> auteurComboboxListe = null;private LayoutContainer conteneurChamps;private ListStore<Personne> auteursStorePartage = null;private boolean auteurStorePartageChargementOk = false;private FieldSet generalitesFieldset = null;private TextField<String> titreChp = null;private TextField<String> collectionChp = null;private TextField<String> uriChp = null;private FieldSet editionFieldset = null;private ComboBox<Structure> editeurCombobox = null;private TextField<String> datePublicationChp = null;private TextField<String> tomeChp = null;private TextField<String> fasciculeChp = null;private TextField<String> pagesChp = null;private String idStructureEdition = "";private String idAuteurs = "";private boolean formulaireValideOk = false;private boolean publicationValideOk = false;private boolean auteursValideOk = false;public PublicationForm(Mediateur mediateurCourrant, String publicationId) {initialiserPublicationForm(mediateurCourrant, publicationId);}public PublicationForm(Mediateur mediateurCourrant, String publicationId, Rafraichissable vueARafraichirApresValidation) {vueExterneARafraichirApresValidation = vueARafraichirApresValidation;initialiserPublicationForm(mediateurCourrant, publicationId);}private void initialiserPublicationForm(Mediateur mediateurCourrant, String publicationId) {publication = new Publication();publication.setId(publicationId);String modeDeCreation = (UtilString.isEmpty(publication.getId()) ? Formulaire.MODE_AJOUTER : Formulaire.MODE_MODIFIER);initialiserFormulaire(mediateurCourrant, modeDeCreation, MenuApplicationId.PUBLICATION);panneauFormulaire.setLayout(new FlowLayout());String titre = genererTitreFormulaire();panneauFormulaire.setHeading(titre);creerZoneAuteurs();panneauFormulaire.add(auteursFieldset);creerZoneGeneralites();panneauFormulaire.add(generalitesFieldset);creerZoneEdition();panneauFormulaire.add(editionFieldset);if (modeDeCreation.equals(Formulaire.MODE_MODIFIER)) {mediateurCourrant.selectionnerPublication(this, publicationId);mediateurCourrant.selectionnerPublicationAPersonne(this, publicationId, null, PublicationAPersonne.ROLE_AUTEUR);}}private String genererTitreFormulaire() {String titre = "Ajout d'une publication";if (mode.equals(Formulaire.MODE_MODIFIER)) {titre = "Modification d'une publication - "+i18nC.id()+": "+publication.getId();}return titre;}private void creerZoneAuteurs() {FormLayout layout = new FormLayout();layout.setLabelWidth(200);// Fieldset AuteurauteursFieldset = new FieldSet();auteursFieldset.setHeading("Auteur(s)");auteursFieldset.setCollapsible(true);auteursFieldset.setLayout(layout);auteurComboboxListe = new ArrayList<ComboBox<Personne>>(0);auteursStorePartage = new ListStore<Personne>();mediateur.clicObtenirListeAuteurs(this);creerChampsAuteur();}private void creerChampsAuteur() {auteursFieldset.removeAll();conteneurChamps = new LayoutContainer();Button ajouterAuteurBouton = new Button("Ajouter un auteur");ajouterAuteurBouton.setIcon(Images.ICONES.ajouter());ajouterAuteurBouton.addSelectionListener(new SelectionListener<ButtonEvent>() {@Overridepublic void componentSelected(ButtonEvent be) {creerChampAuteurEtBoutonSupprimer(null);}});auteursFieldset.add(conteneurChamps);auteursFieldset.add(ajouterAuteurBouton);auteursFieldset.layout(true);if (mode.equals(Formulaire.MODE_AJOUTER)) {creerChampAuteurEtBoutonSupprimer(null);}}public void creerChampAuteurEtBoutonSupprimer(Personne auteur) {final HorizontalPanel panneauHorizontal = new HorizontalPanel();panneauHorizontal.setLayout(new FormLayout());final ComboBox<Personne> auteursSaisisComboBox = creerComboBoxAuteursSaisis();if (auteur != null) {GWT.log(auteur.getId(), null);auteursSaisisComboBox.setValue(auteursStorePartage.findModel("id_personne", auteur.getId()));}auteurComboboxListe.add(auteursSaisisComboBox);auteursSaisisComboBox.setFieldLabel("Auteur "+auteurComboboxListe.size());LayoutContainer panneauChampTxtEtBouton = new LayoutContainer();panneauChampTxtEtBouton.setLayout(new FormLayout());panneauChampTxtEtBouton.add(auteursSaisisComboBox, new FormData(300, 0));panneauHorizontal.add(panneauChampTxtEtBouton);Button supprimerAuteurBouton = new Button();supprimerAuteurBouton.setIcon(Images.ICONES.supprimer());supprimerAuteurBouton.setToolTip(i18nC.supprimer());supprimerAuteurBouton.addSelectionListener(new SelectionListener<ButtonEvent>() {@Overridepublic void componentSelected(ButtonEvent be) {auteurComboboxListe.remove(auteursSaisisComboBox);conteneurChamps.remove(panneauHorizontal);int numeroAuteurs = 1;for (Iterator<ComboBox<Personne>> it = auteurComboboxListe.iterator(); it.hasNext();) {it.next().setFieldLabel("Auteur "+numeroAuteurs);numeroAuteurs++;}auteursFieldset.layout(true);}});panneauHorizontal.add(supprimerAuteurBouton);conteneurChamps.add(panneauHorizontal);auteursFieldset.layout(true);}private ComboBox<Personne> creerComboBoxAuteursSaisis() {ComboBox<Personne> comboBox = new ComboBox<Personne>();comboBox.setEmptyText(i18nC.chercherPersonneSaisi());comboBox.setEditable(true);comboBox.setForceSelection(true);comboBox.setDisplayField("fmt_nom_complet");comboBox.setTriggerAction(TriggerAction.ALL);comboBox.setStore(auteursStorePartage);return comboBox;}private void creerZoneGeneralites() {FormLayout layout = new FormLayout();layout.setLabelWidth(200);// Fieldset Infos GénéralesgeneralitesFieldset = new FieldSet();generalitesFieldset.setHeading("Informations générales");generalitesFieldset.setCollapsible(true);generalitesFieldset.setLayout(layout);titreChp = new TextField<String>();titreChp.setName("cpu");titreChp.setFieldLabel("Titre de l'article ou de l'ouvrage");generalitesFieldset.add(titreChp, new FormData(450, 0));collectionChp = new TextField<String>();collectionChp.setFieldLabel("Intitulé de la revue ou de la collection");generalitesFieldset.add(collectionChp, new FormData(450, 0));uriChp = new TextField<String>();uriChp.setFieldLabel("URL de la publication");generalitesFieldset.add(uriChp, new FormData(450, 0));}private void creerZoneEdition() {FormLayout layout = new FormLayout();layout.setLabelWidth(200);// Fieldset EditioneditionFieldset = new FieldSet();editionFieldset.setHeading("Édition");editionFieldset.setCollapsible(true);editionFieldset.setLayout(layout);ListStore<Structure> editeurStore = new ListStore<Structure>();editeurCombobox = new ComboBox<Structure>();editeurCombobox.setEmptyText("Sélectionner un éditeur...");editeurCombobox.setFieldLabel("Éditeur de la publication");editeurCombobox.setDisplayField("nom");editeurCombobox.setStore(editeurStore);editeurCombobox.setEditable(true);editeurCombobox.setTriggerAction(TriggerAction.ALL);editionFieldset.add(editeurCombobox, new FormData(450, 0));mediateur.clicObtenirListeEditeurs(this);datePublicationChp = new TextField<String>();datePublicationChp.setMaxLength(4);datePublicationChp.setMinLength(4);datePublicationChp.setFieldLabel("Année de publication");editionFieldset.add(datePublicationChp, new FormData(40, 0));tomeChp = new TextField<String>();tomeChp.setFieldLabel("Série de la revue ou tome");editionFieldset.add(tomeChp, new FormData(75, 0));fasciculeChp = new TextField<String>();fasciculeChp.setFieldLabel("Fascicule de la revue");editionFieldset.add(fasciculeChp, new FormData(75, 0));pagesChp = new TextField<String>();pagesChp.setFieldLabel("Pages");pagesChp.setToolTip("Fomat : NBRE ou NBRE-NBRE. ('NBRE' correspond à une suite de chiffres arabes ou romains ou à un point d'interrogation '?' dans le cas d'une donnée inconnue)");editionFieldset.add(pagesChp, new FormData(100, 0));}public void rafraichir(Object nouvellesDonnees) {if (nouvellesDonnees instanceof Publication) {// Si on a reçu les details d'une publicationrafraichirPublication((Publication) nouvellesDonnees);} else if (nouvellesDonnees instanceof StructureListe) {// Si on a reçu une liste des editeursrafraichirListeEditeurs((StructureListe) nouvellesDonnees);} else if (nouvellesDonnees instanceof PublicationAPersonneListe) {rafraichirListeAuteurs((PublicationAPersonneListe) nouvellesDonnees);} else if (nouvellesDonnees instanceof Information) {rafraichirInformation((Information) nouvellesDonnees);} else {GWT.log(Mediateur.i18nM.erreurRafraichir(nouvellesDonnees.getClass(), this.getClass()), null);}if (etrePretAAfficherAuteurs()) {afficherAuteurs();}if (etreValide()) {initialiserValidation();repandreRafraichissement();controlerFermetureApresRafraichissement();}}private void rafraichirPublication(Publication publi) {publication = publi;peuplerFormulaire();}private void rafraichirListeEditeurs(StructureListe editeurs) {editeurCombobox.getStore().removeAll();editeurCombobox.getStore().add((List<Structure>) editeurs.toList());if (mode.equals(Formulaire.MODE_MODIFIER)) {editeurCombobox.setValue((Structure) editeurs.get(idStructureEdition));}editeurCombobox.expand();}private void rafraichirListeAuteurs(PublicationAPersonneListe auteurs) {publicationAPersonneListe = auteurs;publicationAPersonneListeChargementOk = true;}private void rafraichirInformation(Information info) {if (info.getType().equals("liste_personne")) {PersonneListe listePersonneAuteur = (PersonneListe) info.getDonnee(0);List<Personne> liste = listePersonneAuteur.toList();auteursStorePartage.removeAll();auteursStorePartage.add(liste);auteurStorePartageChargementOk = true;} else if (info.getType().equals("publication_valide")) {publicationValideOk = true;publication.setId((String) info.getDonnee(0));if (mode.equals(Formulaire.MODE_AJOUTER)) {mediateur.ajouterPublicationAPersonne(this, publication.getId(), idAuteurs, PublicationAPersonne.ROLE_AUTEUR);} else if (mode.equals(Formulaire.MODE_MODIFIER)) {mediateur.modifierPublicationAPersonne(this, publication.getId(), idAuteurs, PublicationAPersonne.ROLE_AUTEUR);}} else if (info.getType().equals("auteur_valide")) {auteursValideOk = true;}}private void afficherAuteurs() {Iterator<String> itap = publicationAPersonneListe.keySet().iterator();while (itap.hasNext()) {creerChampAuteurEtBoutonSupprimer(publicationAPersonneListe.get(itap.next()).getPersonne());}initialiserAffichageAuteurs();}private void initialiserAffichageAuteurs() {auteurStorePartageChargementOk = false;publicationAPersonneListeChargementOk = false;}private boolean etrePretAAfficherAuteurs() {boolean ok = false;if (auteurStorePartageChargementOk && publicationAPersonneListeChargementOk) {ok = true;}return ok;}private Boolean etreValide() {Boolean valide = false;GWT.log("formulaire"+formulaireValideOk+" - Publication :"+publicationValideOk+" - Auteurs :"+auteursValideOk, null);if (formulaireValideOk && publicationValideOk && auteursValideOk) {valide = true;}return valide;}private void initialiserValidation() {formulaireValideOk = false;publicationValideOk = false;auteursValideOk = false;}private void repandreRafraichissement() {if (vueExterneARafraichirApresValidation != null) {String type = "publication_modifiee";if (mode.equals(Formulaire.MODE_AJOUTER)) {type = "publication_ajoutee";}Information info = new Information(type);info.setDonnee(0, publication);vueExterneARafraichirApresValidation.rafraichir(info);}}public boolean soumettreFormulaire() {formulaireValideOk = verifierFormulaire();GWT.log("Form?"+formulaireValideOk, null);if (formulaireValideOk) {Publication publicationCollectee = collecterPublication();if (publicationCollectee != null) {GWT.log("Info collectée ? ok", null);if (mode.equals(Formulaire.MODE_AJOUTER)) {mediateur.ajouterPublication(this, publicationCollectee);} else if (mode.equals(Formulaire.MODE_MODIFIER)) {mediateur.modifierPublication(this, publicationCollectee);}}}return formulaireValideOk;}protected boolean verifierFormulaire() {boolean valide = true;ArrayList<String> messages = new ArrayList<String>();boolean auteurErreur = true;for (int i = 0; i < auteurComboboxListe.size(); i++) {if (auteurComboboxListe.get(i).getValue() != null) {auteurErreur = false;break;}}if (auteurErreur) {messages.add("Veuillez saisir au moins un auteur !");}String titre = titreChp.getValue();if (titre == null || titre.equals("")) {messages.add("Veuillez saisir le titre de la publication !");}String uri = uriChp.getValue();if (uri != null && ! uri.isEmpty() && ! uri.matches(Pattern.url)) {messages.add("L'URL saisie n'est pas valide !");}String datePublication = datePublicationChp.getRawValue();if (datePublication == null || datePublication.equals("")) {messages.add("Veuillez saisir une année de parution !");} else {if (!etreDateValide(datePublication)) {messages.add("Le format de l'année saisie est incorrect !");}}String pages = pagesChp.getValue();String valeurPage = "(?:[0-9]+|[IVXLCDM]+|\\?)";if (pages != null && ! pages.matches("^(?:"+valeurPage+"|"+valeurPage+"-"+valeurPage+")$")) {messages.add("Le format des pages est incorrect !");}if (messages.size() != 0) {String[] tableauDeMessages = {};tableauDeMessages = messages.toArray(tableauDeMessages);MessageBox.alert("Erreurs de saisies", UtilArray.implode(tableauDeMessages, "<br />"), null);valide = false;}return valide;}private void peuplerFormulaire() {creerChampsAuteur();titreChp.setValue(publication.getTitre());collectionChp.setValue(publication.getCollection());uriChp.setValue(publication.getURI());datePublicationChp.setRawValue(reduireDateParAnnee(publication.getDateParution()));tomeChp.setValue(publication.getIndicationNvt());fasciculeChp.setValue(publication.getFascicule());pagesChp.setValue(publication.getPages());if (publication.getEditeur().matches("^[0-9]+$")) {editeurCombobox.setValue(editeurCombobox.getStore().findModel("id_structure", publication.getEditeur()));idStructureEdition = publication.getEditeur();} else {editeurCombobox.setRawValue(publication.getEditeur());}}private Publication collecterPublication() {Publication publicationARetourner = null;Publication publicationCollectee = (Publication) publication.cloner(new Publication());String auteurIntituleFormate = "";int auteursNombre = auteurComboboxListe.size();for (int i = 0; i < auteursNombre; i++) {if (auteurComboboxListe.get(i).getValue() != null) {Personne auteur = auteurComboboxListe.get(i).getValue();idAuteurs += auteur.getId();auteurIntituleFormate += auteur.getNom()+ " "+auteur.getPrenom();if (i != (auteursNombre - 1)) {auteurIntituleFormate += ", ";idAuteurs += ",";}}}GWT.log("Auteurs formaté :"+auteurIntituleFormate, null);GWT.log("Auteurs ids :"+idAuteurs, null);publicationCollectee.setAuteur(auteurIntituleFormate);String titre = titreChp.getValue();publicationCollectee.setTitre(titre);String collection = collectionChp.getValue();publicationCollectee.setCollection(collection);String nomComplet = titreChp.getValue()+" "+collectionChp.getValue();publicationCollectee.setNomComplet(nomComplet);String uri = uriChp.getValue();publicationCollectee.setUri(uri);String editeur = "";if (editeurCombobox.getValue() != null) {editeur = editeurCombobox.getValue().getId();publicationCollectee.setStructureEditeur(editeurCombobox.getValue());} else if (editeurCombobox.getRawValue() != "") {editeur = editeurCombobox.getRawValue();}publicationCollectee.setEditeur(editeur);String anneePublication = datePublicationChp.getRawValue();String datePublication = anneePublication+"-00-00";publicationCollectee.setDateParution(datePublication);String tome = tomeChp.getValue();publicationCollectee.setIndicationNvt(tome);String fascicule = fasciculeChp.getValue();publicationCollectee.setFascicule(fascicule);String pages = pagesChp.getValue();publicationCollectee.setPages(pages);if (!publicationCollectee.comparer(publication)) {publicationARetourner = publication = publicationCollectee;}return publicationARetourner;}protected void reinitialiserFormulaire() {if (mode.equals(Formulaire.MODE_MODIFIER)) {mediateur.afficherFormPublication(publication.getId());} else {mediateur.afficherFormPublication(null);}}private boolean etreDateValide(String anneePublication) {boolean valide = true;if (!anneePublication.matches("^[0-2][0-9]{3}$")) {valide = false;}return valide;}private String reduireDateParAnnee(String datePar) {if (datePar.matches("^[0-2][0-9]{3}(-[0-9]{2}){2}$")) {return datePar.split("-")[0];} else {return "";}}@Overrideprotected SelectionListener<ButtonEvent> creerEcouteurValidation() {SelectionListener<ButtonEvent> ecouteur = new SelectionListener<ButtonEvent>() {@Overridepublic void componentSelected(ButtonEvent ce) {String code = ((Button) ce.getComponent()).getData("code");if (code.equals(FormulaireBarreValidation.CODE_BOUTON_VALIDER)) {soumettreFormulaire();clicBoutonvalidation = true;} else if (code.equals(FormulaireBarreValidation.CODE_BOUTON_APPLIQUER)) {soumettreFormulaire();} else if (code.equals(FormulaireBarreValidation.CODE_BOUTON_ANNULER)) {mediateur.clicMenu(menuIdCourant);} else if (code.equals(FormulaireBarreValidation.CODE_BOUTON_REINITIALISER)) {reinitialiserFormulaire();}}};return ecouteur;}}