Rev 1971 | Blame | Compare with Previous | Last modification | View Log | RSS feed
package org.tela_botanica.client.util;import java.util.ArrayList;import java.util.Date;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import org.tela_botanica.client.interfaces.Rafraichissable;import org.tela_botanica.client.modeles.dao.ListeReferentielChampsEtendusDAO;import org.tela_botanica.client.modeles.objets.Configuration;import com.google.gwt.user.client.Timer;import com.google.gwt.user.client.Window;import com.google.gwt.user.client.ui.HTML;import com.google.gwt.user.client.ui.HorizontalPanel;import com.gwtext.client.core.EventCallback;import com.gwtext.client.core.EventObject;import com.gwtext.client.core.ListenerConfig;import com.gwtext.client.data.ArrayReader;import com.gwtext.client.data.FieldDef;import com.gwtext.client.data.MemoryProxy;import com.gwtext.client.data.Record;import com.gwtext.client.data.RecordDef;import com.gwtext.client.data.SimpleStore;import com.gwtext.client.data.Store;import com.gwtext.client.data.StringFieldDef;import com.gwtext.client.widgets.Button;import com.gwtext.client.widgets.event.ButtonListenerAdapter;import com.gwtext.client.widgets.form.ComboBox;import com.gwtext.client.widgets.form.Field;import com.gwtext.client.widgets.form.FormPanel;import com.gwtext.client.widgets.form.event.ComboBoxListenerAdapter;@SuppressWarnings("unchecked")public abstract class FormulaireSaisieChampEtendu extends FormPanel implements Rafraichissable {private final int KEY_ALT = 18;private final int KEY_BACKSPACE = 8;private final int KEY_CTRL = 17;private final int KEY_DELETE = 46;private final int KEY_DOWN = 40;private final int KEY_END = 35;private final int KEY_ENTER = 13;private final int KEY_ESCAPE = 27;private final int KEY_HOME = 36;private final int KEY_LEFT = 37;private final int KEY_PAGEDOWN = 34;private final int KEY_PAGEUP = 33;private final int KEY_RIGHT = 39;private final int KEY_SHIFT = 16;private final int KEY_TAB = 9;private final int KEY_UP = 38;final ComboBox nChamp;final String resultTplRefPerso = "<div class=\"search-item-ref\">{label}</div>";Button ajouterChampsEtenduEtFermer;Button ajouterChampsEtendu;Button annulerAjouterChampEtendu;String idChamp = null;final ComboBox groupesChampsEtendus;private Timer timer = null;private Map<String, String> cacheClesValeur;private Record rdSelectionne = null;private Record groupeSelectionne = null;private String valeurBrute = "";public FormulaireSaisieChampEtendu() {super();setPaddings(3);setBodyBorder(false);HTML indicationSaisieGroupe = new HTML("Vous pouvez ajouter plusieurs champs à la fois correspondant à un groupe "+"par exemple les champs du projet sauvage de ma rue ou florilèges, ou bien "+"les champs phytosociolgiques ");indicationSaisieGroupe.addStyleName("aideCreerChampEtendu");groupesChampsEtendus = new ComboBox();groupesChampsEtendus.setLabel("Ajouter un groupe de champs");groupesChampsEtendus.setStore(getGroupesChampsEtendusStore());groupesChampsEtendus.setDisplayField("label") ;groupesChampsEtendus.setValueField("valeur");groupesChampsEtendus.setEditable(false);groupesChampsEtendus.setHideTrigger(false);groupesChampsEtendus.setForceSelection(true);groupesChampsEtendus.setCls("champ-separation");groupesChampsEtendus.setValue("");if(groupesChampsEtendusSontDefinis()) {add(indicationSaisieGroupe);add(groupesChampsEtendus);}HTML indicationSaisie = new HTML("Saisissez un nom de champ ou choisisez un nom proposé par l'autocomplétion "+"Si vous choissisez un nom de champ existant vous pourrez profiter d'une autocomplétion "+"sur les valeur déjà saisies pour ce champ par les autres utilisateurs");indicationSaisie.addStyleName("aideCreerChampEtendu");add(indicationSaisie);HorizontalPanel hp = new HorizontalPanel();hp.setBorderWidth(0);nChamp = new ComboBox("Nom du champ", "nom_champ_etendu");add(nChamp);ajouterChampsEtenduEtFermer = new Button("Ajouter et fermer");ajouterChampsEtenduEtFermer.setTooltip("Ajouter un champ étendu ou un groupe de champs et fermer la fenêtre");ajouterChampsEtendu = new Button("Ajouter");ajouterChampsEtendu.setTooltip("Ajouter un champ étendu ou un groupe de champ");annulerAjouterChampEtendu = new Button("Annuler");annulerAjouterChampEtendu.setTooltip("Fermer la fenêtre sans ajouter de champ");hp.add(ajouterChampsEtenduEtFermer);hp.add(ajouterChampsEtendu);hp.add(annulerAjouterChampEtendu);add(hp);nChamp.setTpl(resultTplRefPerso);nChamp.setMode(ComboBox.REMOTE);nChamp.setItemSelector("div.search-item-ref");nChamp.setTypeAhead(false);nChamp.setLoadingText("Recherche...");nChamp.setHideTrigger(true);nChamp.setValidateOnBlur(false);nChamp.setWidth("250px");nChamp.focus();ajouterListeners();}private void ajouterListeners() {ListenerConfig listenerConfigAutocompletion=new ListenerConfig();listenerConfigAutocompletion.setDelay(200);listenerConfigAutocompletion.setStopPropagation(false);listenerConfigAutocompletion.setStopEvent(true);nChamp.addKeyPressListener(new EventCallback() {@Overridepublic void execute(EventObject e) {switch(e.getKey()) {case KEY_ALT:case KEY_CTRL:case KEY_END:case KEY_HOME:case KEY_LEFT:case KEY_PAGEDOWN:case KEY_PAGEUP:case KEY_RIGHT:case KEY_SHIFT:case KEY_TAB:case KEY_UP:break;case KEY_ENTER:if(rdSelectionne != null) {nChamp.setValue(rdSelectionne.getAsString("label"));idChamp = rdSelectionne.getAsString("cle");valeurBrute = rdSelectionne.getAsString("label");}break;case KEY_DOWN:if(nChamp.getValueAsString().isEmpty() && !nChamp.isExpanded()) {obtenirListeValeurs("*");}break;case KEY_ESCAPE:surAnnulation();break;default:if(timer != null) {timer.cancel();}timer = new Timer() {@Overridepublic void run() {obtenirListeValeurs();}};timer.schedule(300);valeurBrute = nChamp.getValueAsString();nChamp.setValue(valeurBrute);}}},listenerConfigAutocompletion);// Listener completionnChamp.addListener(new ComboBoxListenerAdapter() {@Overridepublic void onSelect(ComboBox comboBox, Record record, int index) {rdSelectionne = record;}@Overridepublic void onBlur(Field field) {nChamp.setRawValue(valeurBrute);nChamp.collapse();}});groupesChampsEtendus.addListener(new ComboBoxListenerAdapter() {@Overridepublic void onSelect(ComboBox comboBox, Record record, int index) {groupeSelectionne = record;}});ajouterChampsEtenduEtFermer.addListener(new ButtonListenerAdapter() {@Overridepublic void onClick(Button button, EventObject e) {if(doitAjouterGroupe()) {surValidationMultiple(renvoyerListeChampsEtendus(groupeSelectionne.getAsString("valeur")));} else {if(champEtenduEstValide()) {surValidation(validerEtRenvoyerChampEtendu());} else {Window.alert("Le nom du champ étendu ne peut pas être vide");}}}});ajouterChampsEtendu.addListener(new ButtonListenerAdapter() {@Overridepublic void onClick(Button button, EventObject e) {if(champEtenduEstValide()) {surAjout(validerEtRenvoyerChampEtendu());raz();} else {Window.alert("Le nom du champ étendu ne peut pas être vide");}}});annulerAjouterChampEtendu.addListener(new ButtonListenerAdapter() {@Overridepublic void onClick(Button button, EventObject e) {surAnnulation();}});}private void raz() {timer = null;idChamp = null;nChamp.clearValue();nChamp.focus();}private ChampSaisieEtendu validerEtRenvoyerChampEtendu() {String valeurChamp = nChamp.getValueAsString();String idNouveauChamp = "";if(!estUnChampSelectionne(valeurChamp)) {Date date = new Date();// affectation d'un id temporaire qui sera remplacé par l'id auto généré à partir// du labelidNouveauChamp = "tempid_"+date.getTime();} else {idNouveauChamp = idChamp;}ChampSaisieEtendu retour = new ChampSaisieEtendu(valeurChamp, idNouveauChamp);retour.setId(idNouveauChamp);return retour;}private List<ChampSaisieEtendu> renvoyerListeChampsEtendus(String groupe) {List<ChampSaisieEtendu> champsDuGroupe = new ArrayList<ChampSaisieEtendu>();HashMap<String, String> listeChampsEtendus = Configuration.getGroupesChampsEtendus().get(groupe);for (Iterator<String> iterator = listeChampsEtendus.keySet().iterator(); iterator.hasNext();) {String cle = iterator.next();String label = listeChampsEtendus.get(cle);ChampSaisieEtendu champ = new ChampSaisieEtendu(label, cle);champsDuGroupe.add(champ);}return champsDuGroupe;}private boolean doitAjouterGroupe() {return groupeSelectionne != null && !groupeSelectionne.getAsString("valeur").equals("");}private boolean champEtenduEstValide() {String valeurChamp = nChamp.getValueAsString();return (valeurChamp != null && !valeurChamp.isEmpty());}private boolean estUnChampSelectionne(String valeur) {return cacheClesValeur.containsValue(valeur);}private void obtenirListeValeurs() {obtenirListeValeurs(nChamp.getValueAsString());}private void obtenirListeValeurs(String valeur) {ListeReferentielChampsEtendusDAO lrce = new ListeReferentielChampsEtendusDAO(null);lrce.obtenirListeNomsChampsEtendus(this, valeur+"*");}public abstract void surAjout(ChampSaisieEtendu champ);public abstract void surAjoutMultiple(List<ChampSaisieEtendu> champs);public abstract void surValidation(ChampSaisieEtendu champ);public abstract void surValidationMultiple(List<ChampSaisieEtendu> champs);public abstract void surAnnulation();public void rafraichir(Object nouvelleDonnees, boolean repandreRaffraichissement) {int i = 0;HashMap<String, String> clesLabels = (HashMap<String, String>)nouvelleDonnees;cacheClesValeur = clesLabels;Object[][] refData = new Object[clesLabels.keySet().size()][2];for (Iterator<String> it = clesLabels.keySet().iterator(); it.hasNext();){String cle = it.next();String label= clesLabels.get(cle);refData[i][0]= cle;refData[i][1]= label;i++;}FieldDef defCle = new StringFieldDef("cle");FieldDef defLabel = new StringFieldDef("label");FieldDef[] defTab = {defCle, defLabel};RecordDef rd = new RecordDef(defTab);final MemoryProxy dataProxy = new MemoryProxy(refData);final ArrayReader reader = new ArrayReader(rd);Store store=new Store(dataProxy,reader);nChamp.setStore(store);store.load();}private boolean groupesChampsEtendusSontDefinis() {return Configuration.getGroupesChampsEtendus().size() > 0;}private Store getGroupesChampsEtendusStore() {int i = 1;Map<String, HashMap<String, String>> listeGroupesChampsEtendus = Configuration.getGroupesChampsEtendus();Object[][] valeurs = new Object[listeGroupesChampsEtendus.size()+1][2];valeurs[0][0] = "...";valeurs[0][1] = "";if(listeGroupesChampsEtendus.size() > 0) {for (Iterator<String> it = listeGroupesChampsEtendus.keySet().iterator(); it.hasNext();){String cle = it.next();valeurs[i][0]= cle;valeurs[i][1]= cle;i++;}}SimpleStore store = new SimpleStore(new String[] {"label","valeur"},valeurs);store.load();return store;}}