Rev 1489 | Blame | Compare with Previous | Last modification | View Log | RSS feed
package org.tela_botanica.client.vues.publication;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import org.tela_botanica.client.ComposantClass;import org.tela_botanica.client.Mediateur;import org.tela_botanica.client.composants.ChampComboBoxRechercheTempsReelPaginable;import org.tela_botanica.client.composants.GrillePaginable;import org.tela_botanica.client.composants.InfoLogger;import org.tela_botanica.client.composants.pagination.ProxyPersonnes;import org.tela_botanica.client.composants.pagination.ProxyPersonnesAPublication;import org.tela_botanica.client.composants.pagination.ProxyProjets;import org.tela_botanica.client.composants.pagination.ProxyPublicationsAPersonne;import org.tela_botanica.client.composants.pagination.ProxyStructures;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.aDonnee;import org.tela_botanica.client.modeles.personne.Personne;import org.tela_botanica.client.modeles.personne.PersonneListe;import org.tela_botanica.client.modeles.projet.Projet;import org.tela_botanica.client.modeles.publication.Publication;import org.tela_botanica.client.modeles.publication.PublicationAPersonne;import org.tela_botanica.client.modeles.publication.PublicationAPersonneListe;import org.tela_botanica.client.modeles.structure.Structure;import org.tela_botanica.client.synchronisation.Sequenceur;import org.tela_botanica.client.util.Debug;import org.tela_botanica.client.util.Pattern;import org.tela_botanica.client.util.UtilArray;import org.tela_botanica.client.util.UtilString;import org.tela_botanica.client.vues.FenetreForm;import org.tela_botanica.client.vues.Formulaire;import org.tela_botanica.client.vues.FormulaireBarreValidation;import org.tela_botanica.client.vues.personne.PersonneForm;import com.extjs.gxt.ui.client.Style.Scroll;import com.extjs.gxt.ui.client.Style.SortDir;import com.extjs.gxt.ui.client.core.XTemplate;import com.extjs.gxt.ui.client.data.ModelData;import com.extjs.gxt.ui.client.data.ModelType;import com.extjs.gxt.ui.client.event.BaseEvent;import com.extjs.gxt.ui.client.event.ButtonEvent;import com.extjs.gxt.ui.client.event.Events;import com.extjs.gxt.ui.client.event.Listener;import com.extjs.gxt.ui.client.event.SelectionChangedEvent;import com.extjs.gxt.ui.client.event.SelectionChangedListener;import com.extjs.gxt.ui.client.event.SelectionListener;import com.extjs.gxt.ui.client.store.ListStore;import com.extjs.gxt.ui.client.store.Store;import com.extjs.gxt.ui.client.store.StoreEvent;import com.extjs.gxt.ui.client.widget.ContentPanel;import com.extjs.gxt.ui.client.widget.Info;import com.extjs.gxt.ui.client.widget.LayoutContainer;import com.extjs.gxt.ui.client.widget.MessageBox;import com.extjs.gxt.ui.client.widget.Text;import com.extjs.gxt.ui.client.widget.button.Button;import com.extjs.gxt.ui.client.widget.button.ButtonBar;import com.extjs.gxt.ui.client.widget.form.ComboBox;import com.extjs.gxt.ui.client.widget.form.Field;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.TextField;import com.extjs.gxt.ui.client.widget.form.Validator;import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;import com.extjs.gxt.ui.client.widget.grid.CellEditor;import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;import com.extjs.gxt.ui.client.widget.grid.ColumnModel;import com.extjs.gxt.ui.client.widget.grid.EditorGrid;import com.extjs.gxt.ui.client.widget.grid.GridSelectionModel;import com.extjs.gxt.ui.client.widget.grid.RowExpander;import com.extjs.gxt.ui.client.widget.grid.RowNumberer;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.extjs.gxt.ui.client.widget.layout.RowData;import com.extjs.gxt.ui.client.widget.layout.RowLayout;import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem;import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;import com.google.gwt.core.client.GWT;public class PublicationForm extends Formulaire implements Rafraichissable {//-------------//// ATTRIBUTS ////-------------///** Publication **/// on se sert d'un objet Publication lorsque l'on est en mode MODIFIERprivate Publication publication;// on se sert de l'identifiant d'une publication lorsque l'on est en mode AJOUTERprivate String publicationId = null;/** Auteurs **/private PublicationAPersonneListe auteursInitialListe = null;private PublicationAPersonneListe auteursAjoutes = null;private PublicationAPersonneListe auteursSupprimes = null;private PublicationAPersonneListe auteursModifies = null;private ContentPanel auteursFieldset = null;private ChampComboBoxRechercheTempsReelPaginable projetsCombo = 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 ChampComboBoxRechercheTempsReelPaginable editeurCombobox = null;private TextField<String> datePublicationChp = null;private TextField<String> tomeChp = null;private TextField<String> fasciculeChp = null;private TextField<String> pagesChp = null;private LayoutContainer zoneHaut, zoneBas;private ToolBar barreOutils = null;private GrillePaginable<ModelData> grilleAuteurs;private ChampComboBoxRechercheTempsReelPaginable personnesSaisiesComboBox = null;private Button personnesBoutonSupprimer = null;private Button personnesBoutonModifier = null;private Button boutonAuteurUp = null;private Button boutonAuteurDown = null;private FenetreForm fenetreFormulaire = null;private Sequenceur sequenceur;private String modeDeCreation = null;boolean changeOrderMarker = false;//----------------------//// Constructeurs //------------------------------------------------------------public PublicationForm(Mediateur mediateurCourrant, String publicationId) {initialiserPublicationForm(mediateurCourrant, publicationId);}public PublicationForm(Mediateur mediateurCourrant, String publicationId, Rafraichissable vueARafraichirApresValidation) {vueExterneARafraichirApresValidation = vueARafraichirApresValidation;initialiserPublicationForm(mediateurCourrant, publicationId);}//-----------------------//// Initialisation //------------------------------------------------------------private void initialiserPublicationForm(Mediateur mediateurCourrant, String publicationId) {sequenceur = new Sequenceur();publication = new Publication();publication.setId(publicationId);this.publicationId = publicationId;auteursInitialListe = new PublicationAPersonneListe();initialiserAuteurs(); // Crée les listes d'auteurs ajoutés et supprimés// Si 'publicationId' est vide alors on est en mode "AJOUTER", sinon on est en mode "MODIFIER"modeDeCreation = (UtilString.isEmpty(publicationId) ? Formulaire.MODE_AJOUTER : Formulaire.MODE_MODIFIER);initialiserFormulaire(mediateurCourrant, modeDeCreation, MenuApplicationId.PUBLICATION);panneauFormulaire.setLayout(new RowLayout());panneauFormulaire.setStyleAttribute("padding", "0");zoneHaut = new LayoutContainer(new FitLayout());zoneBas = new LayoutContainer(new FlowLayout());panneauFormulaire.add(zoneHaut, new RowData(1, 0.3));panneauFormulaire.add(zoneBas, new RowData(1, 0.5));panneauFormulaire.setScrollMode(Scroll.AUTO);genererTitreFormulaire();creerZoneAuteurs();zoneHaut.add(auteursFieldset);creerZoneGeneralites();zoneBas.add(generalitesFieldset);creerZoneEdition();zoneBas.add(editionFieldset);if (modeDeCreation.equals(Formulaire.MODE_MODIFIER)) {mediateurCourrant.selectionnerPublication(this, publicationId, sequenceur);sequenceur.enfilerRafraichissement(this, new Information("chargement_modifier_ok"));}}private void initialiserAuteurs() {auteursAjoutes = new PublicationAPersonneListe();auteursSupprimes = new PublicationAPersonneListe();auteursModifies = new PublicationAPersonneListe();}//-----------------------//// User Interface //------------------------------------------------------------private ToolBar creerBarreOutilsGrille() {ToolBar barreOutils = new ToolBar();Button ajouterBouton = creerBoutonAjouter();barreOutils.add(ajouterBouton);barreOutils.add(new Text(" ou "));creerComboBoxPersonnesSaisies();barreOutils.add(personnesSaisiesComboBox);barreOutils.add(new SeparatorToolItem());personnesBoutonModifier = creerBoutonModifier();barreOutils.add(personnesBoutonModifier);barreOutils.add(new SeparatorToolItem());personnesBoutonSupprimer = creerBoutonSupprimer();barreOutils.add(personnesBoutonSupprimer);barreOutils.add(new SeparatorToolItem());Button rafraichirBouton = creerBoutonRafraichir();barreOutils.add(rafraichirBouton);barreOutils.add(new SeparatorToolItem());barreOutils.add(new Text(i18nC.deplacerAuteur()));boutonAuteurUp = creerBoutonAuteurUp();barreOutils.add(boutonAuteurUp);boutonAuteurDown = creerBoutonAuteurDown();barreOutils.add(boutonAuteurDown);return barreOutils;}public void actualiserEtatBoutonsBarreOutils() {// Activation des boutons si la grille contient un élémentif (grilleAuteurs.getStore().getCount() > 0) {personnesBoutonSupprimer.enable();personnesBoutonModifier.enable();}// Désactivation des boutons si la grille ne contient plus d'élémentif (grilleAuteurs.getStore().getCount() == 0) {personnesBoutonSupprimer.disable();personnesBoutonModifier.disable();}}private Button creerBoutonAuteurUp() {Button bouton = new Button();bouton.setIcon(Images.ICONES.arrowUp());bouton.setEnabled(false);bouton.addSelectionListener(new SelectionListener<ButtonEvent>() {public void componentSelected(ButtonEvent ce) {if (grilleAuteurs.getGrille().getSelectionModel().getSelectedItem() != null) {ModelData publiAPersonneSelectionnee = grilleAuteurs.getSelectionModel().getSelectedItem();int index = grilleAuteurs.getStore().indexOf(publiAPersonneSelectionnee);int newIndex = index - 1; // l'auteur monte dans dans la liste donc son ordre diminueint newOrdre = newIndex + 1; // parce que index commence à zéro// le marqueur suivant est obligatoire sinon les évènements liés au magasin se// déclenchent et posent problèmechangeOrderMarker = true;publiAPersonneSelectionnee.set("_ordre_", String.valueOf(newOrdre));ModelData publiAPersonneSwitch = grilleAuteurs.getStore().getAt(index-1);int newOrdrePapSwitch = newOrdre + 1;publiAPersonneSwitch.set("_ordre_", String.valueOf(newOrdrePapSwitch));grilleAuteurs.getStore().update(publiAPersonneSwitch);grilleAuteurs.getStore().remove(publiAPersonneSelectionnee);grilleAuteurs.getStore().insert(publiAPersonneSelectionnee, newIndex);changeOrderMarker = false;grilleAuteurs.getSelectionModel().select(newIndex, true);}}});return bouton;}private Button creerBoutonAuteurDown() {Button bouton = new Button();bouton.setIcon(Images.ICONES.arrowDown());bouton.setEnabled(false);bouton.addSelectionListener(new SelectionListener<ButtonEvent>() {public void componentSelected(ButtonEvent ce) {if (grilleAuteurs.getSelectionModel().getSelectedItem() != null) {ModelData publiAPersonneSelectionnee = grilleAuteurs.getSelectionModel().getSelectedItem();int index = grilleAuteurs.getStore().indexOf(publiAPersonneSelectionnee);int newIndex = index + 1; // l'auteur monte dans dans la liste donc son ordre diminueint newOrdre = newIndex + 1; // parce que index commence à zéro// le marqueur suivant est obligatoire sinon les évènements liés au magasin se// déclenchent et posent problèmechangeOrderMarker = true;publiAPersonneSelectionnee.set("_ordre_", String.valueOf(newOrdre));ModelData publiAPersonneSwitch = grilleAuteurs.getStore().getAt(index+1);int newOrdrePapSwitch = index + 1;publiAPersonneSwitch.set("_ordre_", String.valueOf(newOrdrePapSwitch));grilleAuteurs.getStore().update(publiAPersonneSwitch);grilleAuteurs.getStore().remove(publiAPersonneSelectionnee);grilleAuteurs.getStore().insert(publiAPersonneSelectionnee, newIndex);changeOrderMarker = false;grilleAuteurs.getSelectionModel().select(newIndex, true);}}});return bouton;}private Button creerBoutonAjouter() {Button bouton = new Button(i18nC.ajouter());bouton.setIcon(Images.ICONES.vcardAjouter());bouton.addSelectionListener(new SelectionListener<ButtonEvent>() {public void componentSelected(ButtonEvent ce) {fenetreFormulaire = creerFenetreModaleAvecFormulairePersonne(Formulaire.MODE_AJOUTER);fenetreFormulaire.show();}});return bouton;}private Button creerBoutonModifier() {Button bouton = new Button(i18nC.modifier());bouton.setIcon(Images.ICONES.vcardModifier());bouton.addSelectionListener(new SelectionListener<ButtonEvent>() {public void componentSelected(ButtonEvent ce) {Personne personneSaisieSelectionnee = new PublicationAPersonne(grilleAuteurs.getSelectionModel().getSelectedItem(), false).getPersonne();if (personneSaisieSelectionnee == null) {InfoLogger.display(i18nC.informationTitreGenerique(), i18nC.selectionnerPublication());} else {fenetreFormulaire = creerFenetreModaleAvecFormulairePersonne(Formulaire.MODE_MODIFIER);fenetreFormulaire.show();}}});return bouton;}private FenetreForm creerFenetreModaleAvecFormulairePersonne(String mode) {String personneId = null;if (mode.equals(Formulaire.MODE_MODIFIER)) {Personne personneSaisieSelectionnee = new PublicationAPersonne(grilleAuteurs.getSelectionModel().getSelectedItem(), false).getPersonne();personneId = personneSaisieSelectionnee.getId();}final FenetreForm fenetre = new FenetreForm("");final PersonneForm formulaire = creerFormulairePersonne(fenetre, personneId);fenetre.add(formulaire);return fenetre;}private PersonneForm creerFormulairePersonne(final FenetreForm fenetre, final String personneId) {PersonneForm formulairePersonne = new PersonneForm(mediateur, personneId, this);FormPanel panneauFormulaire = formulairePersonne.getFormulaire();fenetre.setHeading(panneauFormulaire.getHeading());panneauFormulaire.setHeaderVisible(false);panneauFormulaire.setTopComponent(null);// FIXME : avec GXT-2.1.0 la redéfinition du bottom component ne marche plus. Nous le cachons et en créeons un dans la fenêtre.panneauFormulaire.getBottomComponent().hide();SelectionListener<ButtonEvent> ecouteur = creerEcouteurValidationFormulairePersonne(fenetre, formulairePersonne);final ButtonBar barreValidation = new FormulaireBarreValidation(ecouteur);fenetre.setBottomComponent(barreValidation);return formulairePersonne;}private SelectionListener<ButtonEvent> creerEcouteurValidationFormulairePersonne(final FenetreForm fenetre, final PersonneForm formulaire) {SelectionListener<ButtonEvent> ecouteur = new SelectionListener<ButtonEvent>() {public void componentSelected(ButtonEvent ce) {String code = ((Button) ce.getComponent()).getData("code");if (code.equals(FormulaireBarreValidation.CODE_BOUTON_VALIDER)) {if (formulaire.soumettreFormulaire()) {fenetre.hide();}} else if (code.equals(FormulaireBarreValidation.CODE_BOUTON_APPLIQUER)) {formulaire.soumettreFormulaire();} else if (code.equals(FormulaireBarreValidation.CODE_BOUTON_ANNULER)) {fenetre.hide();} else if (code.equals(FormulaireBarreValidation.CODE_BOUTON_REINITIALISER)) {fenetreFormulaire.hide();fenetreFormulaire = creerFenetreModaleAvecFormulairePersonne(formulaire.mode);fenetreFormulaire.show();}}};return ecouteur;}private Button creerBoutonSupprimer() {Button bouton = new Button(i18nC.supprimer());bouton.setIcon(Images.ICONES.vcardSupprimer());bouton.addSelectionListener(new SelectionListener<ButtonEvent>() {public void componentSelected(ButtonEvent ce) {PublicationAPersonne personneSelectionnee = new PublicationAPersonne(grilleAuteurs.getSelectionModel().getSelectedItem(), false);if (personneSelectionnee == null) {InfoLogger.display(i18nC.informationTitreGenerique(), i18nC.selectionnerPublication());} else {supprimerDansGrille(personneSelectionnee);}}});return bouton;}private Button creerBoutonRafraichir() {Button bouton = new Button(i18nC.rafraichir());bouton.setIcon(Images.ICONES.rafraichir());bouton.addSelectionListener(new SelectionListener<ButtonEvent>() {public void componentSelected(ButtonEvent ce) {actualiserGrille();}});return bouton;}private void actualiserGrille() {if (mode.equals(Formulaire.MODE_MODIFIER)) {// FIXME : c'est la merde//mediateur.selectionner(this, null, personneSelectionnee.getId(), "%");} else {grilleAuteurs.getStore().removeAll();layout();}}private void creerComboBoxPersonnesSaisies() {ModelType modelTypePersonnes = new ModelType();modelTypePersonnes.setRoot("personnes");modelTypePersonnes.setTotalName("nbElements");modelTypePersonnes.addField("cp_fmt_nom_complet");modelTypePersonnes.addField("cp_nom");modelTypePersonnes.addField("cp_prenom");modelTypePersonnes.addField("cp_id_personne");modelTypePersonnes.addField("cp_code_postal");modelTypePersonnes.addField("cp_ville");modelTypePersonnes.addField("cp_truk_courriel");String displayNamePersonnes = "cp_fmt_nom_complet";ProxyPersonnes<ModelData> proxyPersonnes = new ProxyPersonnes<ModelData>(null);personnesSaisiesComboBox = new ChampComboBoxRechercheTempsReelPaginable(proxyPersonnes, modelTypePersonnes, displayNamePersonnes);personnesSaisiesComboBox.getCombo().addListener(Events.Select, new Listener<BaseEvent>() {public void handleEvent(BaseEvent be) {if (personnesSaisiesComboBox.getValeur() instanceof ModelData) {// N'ajouter l'auteur que s'il n'est pas déjà présent dans la grille et dans les valeurs initialesPersonne personneSaisieSelectionnee = new Personne(personnesSaisiesComboBox.getValeur());PublicationAPersonne pap = new PublicationAPersonne(false);pap.setPersonne(personneSaisieSelectionnee, true);pap.setOrdreAuteurs(String.valueOf(grilleAuteurs.getStore().getCount()+1));if (modeDeCreation != Formulaire.MODE_AJOUTER) {pap.setPublicationLiee(publication);pap.setIdPublication(publicationId);}if (grilleAuteurs.getStore().findModel(pap) != null) {Info.display("Information", "La personne est déjà présente dans la liste d'auteurs");} else {ajouterDansGrille(pap);personnesSaisiesComboBox.getCombo().setValue(null);}}}});}private void ajouterDansGrille(PublicationAPersonne pap) {ajouterDansGrille(pap, grilleAuteurs.getStore().getCount());}private void ajouterDansGrille(PublicationAPersonne pap, int index) {if (pap != null) {if (!grilleAuteurs.getStore().contains(pap)) {//1) si elle ne fait pas partie des initiaux, ajouter à la liste à ajouterif (!auteursInitialListe.containsValue(pap)) {auteursAjoutes.put(pap.getId(), pap);}// L'enlever de la liste à supprimerif (auteursSupprimes.containsValue(pap)) {auteursSupprimes.remove(pap);}//2) Ajouter a la grillegrilleAuteurs.getStore().insert(pap, index);grilleAuteurs.getSelectionModel().select(index, false);} else {InfoLogger.display("Information", "La personne choisie existe déjà dans la liste.");}}}/*** Met à jour la grille avec les informations contenus dans la variable listePublicationsLiees*//*private void mettreAJourGrille() {grille.getStore().removeAll();grille.getStore().add(listePersonne.toList());}*/private void supprimerDansGrille(PublicationAPersonne pap) {if (pap != null) {// 1) Ajouter a la liste des personne à supprimer uniquement si est présente dans la liste initialeif (auteursInitialListe.containsValue(pap)) {auteursSupprimes.put(pap.getId(), pap);}if (auteursAjoutes.containsValue(pap)) {auteursAjoutes.remove(pap);}if (auteursModifies.containsValue(pap)) {auteursModifies.remove(pap);}// 2) Supprimer la personne de la listegrilleAuteurs.getStore().remove(pap);} else {Info.display("Information", "Vous devez sélectionner une personne");}}private GrillePaginable<ModelData> creerGrilleAuteurs() {// ModelTypeModelType modelTypePersonnesAPublication = new ModelType();modelTypePersonnesAPublication.setRoot("publicationsAPersonne");modelTypePersonnesAPublication.setTotalName("nbElements");modelTypePersonnesAPublication.addField("cpuap_id_personne");modelTypePersonnesAPublication.addField("cpuap_id_publication");modelTypePersonnesAPublication.addField("cpuap_id_role");modelTypePersonnesAPublication.addField("cpuap_ordre");modelTypePersonnesAPublication.addField("cp_id_personne");modelTypePersonnesAPublication.addField("cp_fmt_nom_complet");modelTypePersonnesAPublication.addField("cp_nom");modelTypePersonnesAPublication.addField("cp_prenom");modelTypePersonnesAPublication.addField("cp_id_personne");modelTypePersonnesAPublication.addField("cp_code_postal");modelTypePersonnesAPublication.addField("cp_ville");modelTypePersonnesAPublication.addField("cp_truk_courriel");// ProxyProxyPersonnesAPublication<ModelData> proxyPersonnesAPublication = new ProxyPersonnesAPublication<ModelData>(null, publicationId);// ColonnesList<ColumnConfig> colonnes = new ArrayList<ColumnConfig>();ColumnConfig columnOrdre = new ColumnConfig("_ordre_", i18nC.ordre(), 15);colonnes.add(columnOrdre);colonnes.add(new ColumnConfig("cp_fmt_nom_complet", i18nC.personneNomComplet(), 150));colonnes.add(new ColumnConfig("cp_code_postal", i18nC.personneCodePostal(), 150));colonnes.add(new ColumnConfig("cp_ville", i18nC.personneVille(), 75));colonnes.add(new ColumnConfig("cp_truk_courriel", i18nC.personneCourriel(), 75));// Champs de traitementHashMap<String, String> virtualFields = new HashMap<String, String>();virtualFields.put("_ordre_", "cpuap_ordre");// Modele de selectionGridSelectionModel<ModelData> modeleDeSelection = new GridSelectionModel<ModelData>();modeleDeSelection.addListener(Events.SelectionChange, new SelectionChangedListener<ModelData>() {public void selectionChanged(SelectionChangedEvent<ModelData> se) {ModelData papSelectionnee = grilleAuteurs.getGrille().getSelectionModel().getSelectedItem();int index = grilleAuteurs.getStore().indexOf(papSelectionnee);if (index >= 1) boutonAuteurUp.setEnabled(true);else boutonAuteurUp.setEnabled(false);if ((index+1) < grilleAuteurs.getStore().getCount()) boutonAuteurDown.setEnabled(true);else boutonAuteurDown.setEnabled(false);}});ColumnModel modeleDeColonnes = new ColumnModel(colonnes);// Grillefinal GrillePaginable<ModelData> grilleAuteurs = new GrillePaginable<ModelData>(modelTypePersonnesAPublication, virtualFields, proxyPersonnesAPublication, colonnes, modeleDeColonnes);grilleAuteurs.getGrille().setHeight("100%");grilleAuteurs.getGrille().setBorders(true);grilleAuteurs.getGrille().setSelectionModel(modeleDeSelection);grilleAuteurs.getGrille().getView().setForceFit(true);grilleAuteurs.getGrille().setAutoExpandColumn("fmt_nom_complet");grilleAuteurs.getGrille().setStripeRows(true);grilleAuteurs.getGrille().setTrackMouseOver(true);// Rajouter des écouteursgrilleAuteurs.getStore().addListener(Store.Add, new Listener<StoreEvent<ModelData>>() {public void handleEvent(StoreEvent<ModelData> ce) {if (!changeOrderMarker) {actualiserEtatBoutonsBarreOutils();}}});grilleAuteurs.getStore().addListener(Store.Remove, new Listener<StoreEvent<ModelData>>() {public void handleEvent(StoreEvent<ModelData> ce) {if (!changeOrderMarker) {actualiserEtatBoutonsBarreOutils();}}});grilleAuteurs.getStore().addListener(Store.Update, new Listener<StoreEvent<ModelData>>() {public void handleEvent(StoreEvent<ModelData> ce) {if (!changeOrderMarker) {if (ce.getRecord().isModified("_ordre_")) {// s'il s'agit d'un auteur que l'on vient d'ajouter à la liste, alors on a pas besoin// de faire quoique ce soit car l'auteur est déjà dans la liste des auteurs ajoutésif (ce.getModel().get("_etat_").equals(aDonnee.ETAT_AJOUTE)) {// ... do nothing// s'il s'agit d'un auteur qui était déjà présent dans la liste initiale, il faut// ajouter cet auteur à la liste des auteurs modifiés} else {PublicationAPersonne pap = new PublicationAPersonne(ce.getModel(), false);auteursModifies.put(pap.getId(), pap);}}}}});return grilleAuteurs;}private void genererTitreFormulaire() {String titre = i18nC.publicationTitreFormAjout();if (mode.equals(Formulaire.MODE_MODIFIER)) {titre = i18nC.publicationTitreFormModif();if (publication != null) {titre += " - "+i18nC.id()+": "+publication.getId()+" - "+publication.getTitre();}}panneauFormulaire.setHeading(titre);}private void creerZoneAuteurs() {auteursFieldset = new ContentPanel();auteursFieldset.setLayout(new FitLayout());auteursFieldset.setHeading("Auteurs");creerChampsAuteur();}private void creerChampsAuteur() {auteursFieldset.removeAll();barreOutils = creerBarreOutilsGrille();auteursFieldset.setTopComponent(barreOutils);grilleAuteurs = creerGrilleAuteurs();auteursFieldset.add(grilleAuteurs);auteursFieldset.layout();}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);ModelType modelTypeProjets = new ModelType();modelTypeProjets.setRoot("projets");modelTypeProjets.setTotalName("nbElements");modelTypeProjets.addField("cpr_nom");modelTypeProjets.addField("cpr_id_projet");String displayNameProjets = "cpr_nom";ProxyProjets<ModelData> proxyProjets = new ProxyProjets<ModelData>(null);projetsCombo = new ChampComboBoxRechercheTempsReelPaginable(proxyProjets, modelTypeProjets, displayNameProjets);projetsCombo.setWidth(200, 600);projetsCombo.getCombo().setTabIndex(tabIndex++);projetsCombo.getCombo().setFieldLabel(i18nC.projetChamp());projetsCombo.getCombo().setForceSelection(true);projetsCombo.getCombo().addStyleName(ComposantClass.OBLIGATOIRE);projetsCombo.getCombo().addListener(Events.Valid, Formulaire.creerEcouteurChampObligatoire());projetsCombo.getCombo().setValidator(new Validator() {public String validate(Field<?> field, String value) {String retour = null;if (field.getRawValue().equals("")) {field.setValue(null);} else if (projetsCombo.getStore().findModel("cpr_nom", field.getRawValue()) == null) {String contenuBrut = field.getRawValue();field.setValue(null);field.setRawValue(contenuBrut);retour = "Veuillez sélectionner une valeur ou laisser le champ vide";}return retour;}});generalitesFieldset.add(projetsCombo, new FormData(600, 0));titreChp = new TextField<String>();titreChp.setName("cpu");titreChp.setFieldLabel("Titre de l'article ou de l'ouvrage");titreChp.addStyleName(ComposantClass.OBLIGATOIRE);titreChp.addListener(Events.Valid, creerEcouteurChampObligatoire());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);/*****************************************************//** Champ 'Editeur de la publication' **//*****************************************************/ModelType modelTypeStructures = new ModelType();modelTypeStructures.setRoot("structures");modelTypeStructures.setTotalName("nbElements");modelTypeStructures.addField("cs_nom");modelTypeStructures.addField("cs_id_structure");String displayNameStructures = "cs_nom";ProxyStructures<ModelData> proxyStructures = new ProxyStructures<ModelData>(null);editeurCombobox = new ChampComboBoxRechercheTempsReelPaginable(proxyStructures, modelTypeStructures, displayNameStructures);editeurCombobox.setWidth(200, 600);editeurCombobox.getCombo().setTabIndex(tabIndex++);editeurCombobox.getCombo().setEmptyText("Sélectionner un éditeur...");editeurCombobox.getCombo().setFieldLabel("Éditeur de la publication");editeurCombobox.getCombo().setEditable(true);editionFieldset.add(editeurCombobox, new FormData(600, 0));/*********************************************//** Champ 'Date de publication' **//*********************************************/datePublicationChp = new TextField<String>();datePublicationChp.setMaxLength(4);datePublicationChp.setMinLength(4);datePublicationChp.setFieldLabel("Année de publication");datePublicationChp.addStyleName(ComposantClass.OBLIGATOIRE);datePublicationChp.addListener(Events.Valid, creerEcouteurChampObligatoire());editionFieldset.add(datePublicationChp, new FormData(40, 0));/*********************************//** Champ 'Tome' **//*********************************/tomeChp = new TextField<String>();tomeChp.setFieldLabel("Série de la revue ou tome");editionFieldset.add(tomeChp, new FormData(75, 0));/*************************************//** Champ 'Fascicule' **//*************************************/fasciculeChp = new TextField<String>();fasciculeChp.setFieldLabel("Fascicule de la revue");editionFieldset.add(fasciculeChp, new FormData(75, 0));/*********************************//** Champ 'Pages' **//*********************************/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));}//-------------------------//// Méthodes privées //------------------------------------------------------------private void miseAJourAuteursInitialListe() {Iterator<String> clesAjoutees = auteursAjoutes.keySet().iterator();while (clesAjoutees.hasNext()) {PublicationAPersonne auteurAjoute = auteursAjoutes.get(clesAjoutees.next());auteursInitialListe.put(auteurAjoute.getId(), auteurAjoute);}Iterator<String> clesSupprimees = auteursSupprimes.keySet().iterator();while (clesSupprimees.hasNext()) {PublicationAPersonne auteurSupprime = auteursSupprimes.get(clesSupprimees.next());auteursInitialListe.remove(auteurSupprime.getId());}}public boolean soumettreFormulaire() {boolean formulaireValideOk = verifierFormulaire();if (formulaireValideOk) {soumettrePublication();}return formulaireValideOk;}private void soumettrePublication() {Publication publicationCollectee = collecterPublication();if (publicationCollectee != null) {// Pour l'enregistrement des publications, on utilise le séquenceur// Il doit attendre le retour de l'enregistrement pour poursuivresequenceur = new Sequenceur();int seqId = sequenceur.lancerRequeteSynchrone(this);if (mode.equals(Formulaire.MODE_AJOUTER)) {mediateur.ajouterPublication(sequenceur, publicationCollectee, seqId);} else if (mode.equals(Formulaire.MODE_MODIFIER)) {mediateur.modifierPublication(sequenceur, publicationCollectee, seqId);}// si l'on est en mode MODIFIER, on soumet les auteurs meme si les informations de la publication// restent inchangées car il se peut que les auteurs aient été modifiés} else if (mode.equals(Formulaire.MODE_MODIFIER)) {soumettreAuteurs();}}private void soumettreAuteurs() {formaterOrdreAuteurs();//1) Auteurs ajoutés :PublicationAPersonneListe listeAuteursAAjouter = new PublicationAPersonneListe();Iterator<String> itAuteur = auteursAjoutes.keySet().iterator();while (itAuteur.hasNext()) {String cle = itAuteur.next();PublicationAPersonne publiAPersonne = auteursAjoutes.get(cle);publiAPersonne.setIdPublication(this.publicationId);publiAPersonne.setOrdreAuteurs(publiAPersonne.getOrdreAuteurs());listeAuteursAAjouter.put(cle, publiAPersonne);}// - envoyer au mediateur SSI personnes à ajouterif (listeAuteursAAjouter.size() > 0) {int seqId = sequenceur.lancerRequeteSynchrone(this);mediateur.ajouterPublicationAPersonne(sequenceur, this.publicationId, listeAuteursAAjouter, PublicationAPersonne.ROLE_AUTEUR, seqId);}//2) Auteurs supprimés :PublicationAPersonneListe listeAuteursASupprimer = new PublicationAPersonneListe();itAuteur = auteursSupprimes.keySet().iterator();while (itAuteur.hasNext()) {String cle = itAuteur.next();PublicationAPersonne publiAPersonne = auteursSupprimes.get(cle);listeAuteursASupprimer.put(cle, publiAPersonne);}// - Envoyer au médiateur SSI personnes à supprimerif (listeAuteursASupprimer.size() > 0) {// Pour une suppression des auteurs, on a pas besoin d'attendre le retourmediateur.supprimerPublicationAPersonne(this, listeAuteursASupprimer);}//3) Auteurs modifiés :PublicationAPersonneListe listeAuteursAModifier = new PublicationAPersonneListe();itAuteur = auteursModifies.keySet().iterator();while (itAuteur.hasNext()) {String cle = itAuteur.next();PublicationAPersonne publiAPersonne = auteursModifies.get(cle);listeAuteursAModifier.put(cle, publiAPersonne);}// - Envoyer au médiateur SSI personnes à modifierif (listeAuteursAModifier.size() > 0) {int seqId = sequenceur.lancerRequeteSynchrone(this);mediateur.modifierPublicationAPersonne(sequenceur, this.publicationId, listeAuteursAModifier, PublicationAPersonne.ROLE_AUTEUR, seqId);}sequenceur.enfilerRafraichissement(this, new Information("auteurs_enregistres"));}private void formaterOrdreAuteurs() {ListStore<ModelData> store = grilleAuteurs.getStore();List<ModelData> auteurs = grilleAuteurs.getStore().getModels();Iterator<ModelData> itAuteurs = auteurs.iterator();while (itAuteurs.hasNext()) {ModelData selection = itAuteurs.next();PublicationAPersonne pap = new PublicationAPersonne(selection, false);int ordre = store.indexOf(selection) + 1;if (pap.getOrdreAuteurs() != String.valueOf(ordre)) {pap.setOrdreAuteurs(String.valueOf(ordre));auteursModifies.put(pap.getId(), pap);}}}private void peuplerFormulaire() {setValeurComboProjets();titreChp.setValue(publication.getTitre());collectionChp.setValue(publication.getCollection());uriChp.setValue(publication.getURI());datePublicationChp.setValue(reduireDateParAnnee(publication.getDateParution()));tomeChp.setValue(publication.getIndicationNvt());fasciculeChp.setValue(publication.getFascicule());pagesChp.setValue(publication.getPages());if (publication.getEditeur().matches("^[0-9]+$")) {editeurCombobox.getCombo().setValue(editeurCombobox.getStore().findModel("cs_id_structure", publication.getEditeur()));} else {editeurCombobox.getCombo().setRawValue(publication.getEditeur());}}private Publication collecterPublication() {Publication publicationCollectee = (Publication) publication.cloner(new Publication());publicationCollectee.setIdProjet(getValeurComboProjets());publicationCollectee.setAuteur(construireIntituleAuteur());String titre = titreChp.getValue();publicationCollectee.setTitre(titre);String collection = collectionChp.getValue();publicationCollectee.setCollection(collection);publicationCollectee.setNomComplet(construireNomComplet());String uri = uriChp.getValue();publicationCollectee.setUri(uri);String editeur = "";if (editeurCombobox.getValeur() != null) {Structure structure = new Structure(editeurCombobox.getValeur());editeur = structure.getId();publicationCollectee.setStructureEditeur(structure);} else if (!UtilString.isEmpty(editeurCombobox.getCombo().getRawValue())) {editeur = editeurCombobox.getCombo().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);Publication publicationARetourner = null;if (!publicationCollectee.comparer(publication)) {publicationARetourner = publication = publicationCollectee;}return publicationARetourner;}private String construireIntituleEditeur() {String editeur = "";if (editeurCombobox.getValeur() != null) {Structure structure = new Structure(editeurCombobox.getValeur());if (structure == null) editeur = editeurCombobox.getCombo().getRawValue();else editeur = structure.getNom();} else if (!UtilString.isEmpty(editeurCombobox.getCombo().getRawValue())) {editeur = editeurCombobox.getCombo().getRawValue();}return editeur;}private String construireIntituleAuteur() {String intituleAuteur = "";// rangé par ordre désigné par le champ 'cpuap_ordre' de la table PublicationAPersonnegrilleAuteurs.getStore().sort("_ordre_", SortDir.ASC);List<ModelData> auteurs = grilleAuteurs.getStore().getModels();Iterator<ModelData> itAuteurs = auteurs.iterator();while (itAuteurs.hasNext()) {Personne personneCourante = new PublicationAPersonne(itAuteurs.next(), false).getPersonne();intituleAuteur += personneCourante.getNom().toUpperCase() + " " + personneCourante.getPrenom();if (itAuteurs.hasNext()) {intituleAuteur+=", ";}}return intituleAuteur;}private String construireNomComplet() {// Intitulé de la publication complet : fmt_auteur, date_parution(année). titre. Editeur (nom), collection, fascicule, indication_nvt. pages.String nomComplet = "";String auteurs = construireIntituleAuteur();String annee = datePublicationChp.getRawValue();String titre = titreChp.getValue();String editeur = construireIntituleEditeur();nomComplet += auteurs+", "+annee+". "+titre+".";if (!UtilString.isEmpty(editeur)) {nomComplet += " Éditeur "+editeur+".";}if (collectionChp.getValue() != null) {String revue = collectionChp.getValue();nomComplet += ", "+revue;}if (fasciculeChp.getValue() != null) {String fascicule = fasciculeChp.getValue();nomComplet += ", "+fascicule;}if (tomeChp.getValue() != null) {String tomaison = tomeChp.getValue();nomComplet += ", "+tomaison;}if (collectionChp.getValue() != null || fasciculeChp.getValue() != null || tomeChp.getValue() != null) {nomComplet += ".";}if (pagesChp.getValue() != null) {String pages = pagesChp.getValue();nomComplet += pages+".";}return nomComplet;}public 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 "";}}//---------------------------//// Méthodes publiques //------------------------------------------------------------public boolean verifierFormulaire() {boolean valide = true;ArrayList<String> messages = new ArrayList<String>();// Tester si au moins un auteur est présentif (grilleAuteurs.getStore().getModels().size() == 0) {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;}//-------------------//// Accesseurs //------------------------------------------------------------private String getValeurComboProjets() {String valeur = "";if (projetsCombo.getValeur() != null) {Projet projet = new Projet(projetsCombo.getValeur());valeur = projet.getId();}return valeur;}private void setValeurComboProjets() {if (mode.equals(Formulaire.MODE_MODIFIER) && publication != null) {if (projetsCombo.getCombo().getStore() != null&& publication != null&& publication.getIdProjet() != null&& !UtilString.isEmpty(publication.getIdProjet())) {projetsCombo.chargerValeurInitiale(publication.getIdProjet(), "cpr_id_projet");}} else if (mode.equals(Formulaire.MODE_AJOUTER)) {projetsCombo.getCombo().setValue(projetsCombo.getStore().findModel("cpr_id_projet", mediateur.getProjetId()));} else {projetsCombo.getCombo().setValue(null);}}//-------------------//// Rafraichir //------------------------------------------------------------public void rafraichir(Object nouvellesDonnees) {if (nouvellesDonnees instanceof Publication) {publication = (Publication) nouvellesDonnees;} else if (nouvellesDonnees instanceof Information) {rafraichirInformation((Information) nouvellesDonnees);} else {GWT.log(Mediateur.i18nM.erreurRafraichir(nouvellesDonnees.getClass(), this.getClass()), null);}}private void rafraichirInformation(Information info) {String type = info.getType();if (type.equals("auteurs_enregistres")) {miseAJourAuteursInitialListe();initialiserAuteurs();repandreRafraichissement();controlerFermeture();} else if (type.equals("chargement_modifier_ok")) {peuplerFormulaire();genererTitreFormulaire();}if (type.equals("personne_ajoutee")) {if (info.getDonnee(0) != null) {Personne personne = (Personne) info.getDonnee(0);PublicationAPersonne pap = new PublicationAPersonne();pap.setPersonne(personne);if (modeDeCreation != Formulaire.MODE_AJOUTER) pap.setPublicationLiee(publication);ajouterDansGrille(pap);}} else if (type.equals("personne_modifiee")) {if (info.getDonnee(0) != null) {// créer la nouvelle entréePersonne personne = (Personne) info.getDonnee(0);PublicationAPersonne pap = new PublicationAPersonne();pap.setPersonne(personne);if (modeDeCreation != Formulaire.MODE_AJOUTER) pap.setPublicationLiee(publication);// supprimer l'entrée précédentePublicationAPersonne personneDansGrille = new PublicationAPersonne(grilleAuteurs.getStore().findModel("cp_id_personne", personne.getId()), false);int index = grilleAuteurs.getStore().indexOf(personneDansGrille);grilleAuteurs.getStore().remove(personneDansGrille);// ajouter la nouvelle entrée dans la grilleajouterDansGrille(pap, index);}} else if (info.getType().equals("modif_publication")) {InfoLogger.display("Modification d'une publication", info.toString());soumettreAuteurs();} else if (info.getType().equals("ajout_publication")) {if (info.getDonnee(0) != null && info.getDonnee(0) instanceof String && ((String) info.getDonnee(0)).matches("[0-9]+")) {String idPublication = (String) info.getDonnee(0);this.publicationId = idPublication;this.publication.setId(idPublication);soumettreAuteurs();InfoLogger.display("Ajout d'une publication", "La publication '"+publicationId+"' a bien été ajoutée");} else {InfoLogger.display("Ajout d'une publication", info.toString());}}}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);}}}