Rev 799 | 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 java.util.Set;import org.tela_botanica.client.Mediateur;import org.tela_botanica.client.RegistreId;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.PublicationListe;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 com.extjs.gxt.ui.client.Registry;import com.extjs.gxt.ui.client.Style.HorizontalAlignment;import com.extjs.gxt.ui.client.event.BaseEvent;import com.extjs.gxt.ui.client.event.ButtonEvent;import com.extjs.gxt.ui.client.event.ComponentEvent;import com.extjs.gxt.ui.client.event.Events;import com.extjs.gxt.ui.client.event.KeyListener;import com.extjs.gxt.ui.client.event.Listener;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.DateField;import com.extjs.gxt.ui.client.widget.form.FieldSet;import com.extjs.gxt.ui.client.widget.form.FormPanel;import com.extjs.gxt.ui.client.widget.form.Radio;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.grid.ColumnConfig;import com.extjs.gxt.ui.client.widget.grid.ColumnData;import com.extjs.gxt.ui.client.widget.grid.Grid;import com.extjs.gxt.ui.client.widget.grid.GridCellRenderer;import com.extjs.gxt.ui.client.widget.layout.FitLayout;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;import com.google.gwt.user.client.Window;import com.google.gwt.user.client.ui.HTML;import com.google.gwt.user.client.ui.Label;public class PublicationForm extends Formulaire implements Rafraichissable {private Publication publication;private PublicationAPersonneListe publicationAPersonneListe = null;private FieldSet auteursFieldset = null;private ArrayList<ComboBox<Personne>> auteurComboboxListe = null;private PersonneListe listePersonneAuteur = null;private LayoutContainer conteneurChamps;private ListStore<Personne> auteursStorePartage = null;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 = "";protected boolean listePersonneAuteurInitialisee = false;protected boolean listeAuteurPublicationInitialisee = false;private boolean formValide = false;private boolean validationPublication = false;private boolean validationAuteurs = false;private Rafraichissable vueExterneARafraichirApresValidation = null;public PublicationForm(Mediateur mediateurCourrant, String publicationId) {initialiserPublicationForm(mediateurCourrant, publicationId);}public PublicationForm(Mediateur mediateurCourrant, String publicationId, Rafraichissable vueARafraichirApresValidation) {initialiserPublicationForm(mediateurCourrant, publicationId);vueExterneARafraichirApresValidation = vueARafraichirApresValidation;}private void initialiserPublicationForm(Mediateur mediateurCourrant, String publicationId) {String modeDeCreation = Formulaire.MODE_AJOUTER;publication = new Publication();if (publicationId != null) {modeDeCreation = Formulaire.MODE_MODIFIER;}initialiserFormulaire(mediateurCourrant, modeDeCreation, MenuApplicationId.PUBLICATION);panneauFormulaire.setLayout(new FlowLayout());String titre = (modeDeCreation.equals(Formulaire.MODE_AJOUTER) ? "Ajout d'une publication" : "Modification d'une publication");panneauFormulaire.setHeading(titre);creerZoneAuteurs();panneauFormulaire.add(auteursFieldset);creerZoneGeneralites();panneauFormulaire.add(generalitesFieldset);creerZoneEdition();panneauFormulaire.add(editionFieldset);mediateurCourrant.selectionnerPublication(this, publicationId);mediateurCourrant.selectionnerAuteurAPublication(this, publicationId);}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);genererChampsAuteur(false);}private void genererChampsAuteur(boolean vider) {auteursFieldset.removeAll();conteneurChamps = new LayoutContainer();Button ajoutAuteurBtn = new Button("Ajouter un auteur");ajoutAuteurBtn.addSelectionListener(new SelectionListener<ButtonEvent>() {@Overridepublic void componentSelected(ButtonEvent be) {creerTextFieldEtBouton(null);int nbAuteurs = 0;for (Iterator<ComboBox<Personne>> it = auteurComboboxListe.iterator(); it.hasNext();) {if (auteurComboboxListe.size() > 1) {it.next().setFieldLabel("Auteur "+nbAuteurs);nbAuteurs++;}}auteursFieldset.layout(true);}});auteursFieldset.add(conteneurChamps);auteursFieldset.add(ajoutAuteurBtn);auteursFieldset.layout(true);if (!vider) {creerTextFieldEtBouton(null);}}public void creerTextFieldEtBouton(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);LayoutContainer lc = new LayoutContainer();lc.setLayout(new FormLayout());lc.add(auteursSaisisComboBox, new FormData(300, 0));Button supp = new Button("-");supp.addSelectionListener(new SelectionListener<ButtonEvent>() {@Overridepublic void componentSelected(ButtonEvent be) {int nbAuteurs = 0;if (auteurComboboxListe.size() != 1) {for (Iterator<ComboBox<Personne>> it = auteurComboboxListe.iterator(); it.hasNext();) {it.next().setFieldLabel("Auteur "+nbAuteurs);nbAuteurs++;}}auteurComboboxListe.remove(auteursSaisisComboBox);conteneurChamps.remove(panneauHorizontal);auteursFieldset.layout(true);}});panneauHorizontal.add(lc);panneauHorizontal.add(supp);conteneurChamps.add(panneauHorizontal);auteursFieldset.layout(true);}private ComboBox<Personne> creerComboBoxAuteursSaisis() {ComboBox<Personne> comboBox = new ComboBox<Personne>();comboBox.setEmptyText(i18nC.chercherAuteurSaisi());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'intérogation '?' 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 (etreValide()) {reinitialiserValidation();repandreRafraichissement();controlerFermetureApresRafraichissement();}}private void rafraichirPublication(Publication publi) {publication = publi;genererChampsAuteur(true);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 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;if (listePersonneAuteurInitialisee) {Iterator<String> itap = publicationAPersonneListe.keySet().iterator();while (itap.hasNext()) {creerTextFieldEtBouton(publicationAPersonneListe.get(itap.next()).getPersonne());}int nbAuteurs = 0;for (Iterator<ComboBox<Personne>> it = auteurComboboxListe.iterator(); it.hasNext();) {if (auteurComboboxListe.size() > 1) {it.next().setFieldLabel("Auteur "+nbAuteurs);nbAuteurs++;}}listeAuteurPublicationInitialisee = true;}}private void rafraichirInformation(Information info) {if (info.getType().equals("liste_personne")) {listePersonneAuteurInitialisee = true;listePersonneAuteur = (PersonneListe) info.getDonnee(0);List<Personne> liste = listePersonneAuteur.toList();auteursStorePartage.removeAll();auteursStorePartage.add(liste);} else if (info.getType().equals("publication_valide")) {validationPublication = true;publication.setId((String) info.getDonnee(0));if (mode.equals(Formulaire.MODE_AJOUTER)) {mediateur.ajouterAuteurPublication(this, idAuteurs, PublicationAPersonne.ROLE_AUTEUR, publication.getId());} else if (mode.equals(Formulaire.MODE_MODIFIER)) {mediateur.modifierAuteurPublication(this, idAuteurs, publication.getId());}} else if (info.getType().equals("auteur_valide")) {validationAuteurs = true;}}private Boolean etreValide() {Boolean valide = false;if (formValide && validationPublication && validationAuteurs) {valide = true;}return valide;}private void reinitialiserValidation() {formValide = false;validationPublication = false;validationAuteurs = 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() {formValide = verifierFormulaire();if (formValide) {Publication publicationCollectee = collecterPublication();if (publicationCollectee != null) {if (mode.equals(Formulaire.MODE_AJOUTER)) {mediateur.ajouterPublication(this, publicationCollectee);} else if (mode.equals(Formulaire.MODE_MODIFIER)) {mediateur.modifierPublication(this, publicationCollectee);}}}return formValide;}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 Publication collecterPublication() {Publication publicationARetourner = null;Publication publicationCollectee = (Publication) publication.cloner(new Publication());String auteur = "";for (int i = 0; i < auteurComboboxListe.size(); i++) {if (auteurComboboxListe.get(i).getValue() != null) {idAuteurs += auteurComboboxListe.get(i).getValue().getId();auteur += auteurComboboxListe.get(i).getValue().getNom()+ " "+auteurComboboxListe.get(i).getValue().getPrenom();if (i != auteurComboboxListe.size() -1) {auteur += ", ";idAuteurs += ",";}}}publicationCollectee.setAuteur(auteur);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;}}