Subversion Repositories eFlore/Applications.cel

Rev

Rev 2392 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1940 aurelien 1
package org.tela_botanica.client.util;
2
 
1967 aurelien 3
import java.util.ArrayList;
1940 aurelien 4
import java.util.HashMap;
5
import java.util.Iterator;
1967 aurelien 6
import java.util.List;
1940 aurelien 7
import java.util.Map;
8
 
9
import org.tela_botanica.client.interfaces.Rafraichissable;
10
import org.tela_botanica.client.modeles.dao.ListeReferentielChampsEtendusDAO;
2033 aurelien 11
import org.tela_botanica.client.modeles.objets.ListeGroupesChampsEtendus;
2602 aurelien 12
import org.tela_botanica.client.util.autocompletion.AutoCompletionComboBox;
1940 aurelien 13
 
2392 aurelien 14
import com.google.gwt.core.client.Callback;
2602 aurelien 15
import com.google.gwt.event.dom.client.ChangeEvent;
16
import com.google.gwt.event.dom.client.ChangeHandler;
17
import com.google.gwt.http.client.Response;
1940 aurelien 18
import com.google.gwt.user.client.Window;
1945 aurelien 19
import com.google.gwt.user.client.ui.HTML;
1940 aurelien 20
import com.google.gwt.user.client.ui.HorizontalPanel;
2602 aurelien 21
import com.google.gwt.user.client.ui.Label;
22
import com.google.gwt.user.client.ui.ListBox;
1940 aurelien 23
import com.gwtext.client.core.EventCallback;
24
import com.gwtext.client.core.EventObject;
2392 aurelien 25
import com.gwtext.client.core.Ext;
1940 aurelien 26
import com.gwtext.client.widgets.Button;
2033 aurelien 27
import com.gwtext.client.widgets.Panel;
1940 aurelien 28
import com.gwtext.client.widgets.event.ButtonListenerAdapter;
29
import com.gwtext.client.widgets.form.FormPanel;
2033 aurelien 30
import com.gwtext.client.widgets.layout.FormLayout;
1940 aurelien 31
 
32
@SuppressWarnings("unchecked")
33
public abstract class FormulaireSaisieChampEtendu extends FormPanel implements Rafraichissable {
34
 
2602 aurelien 35
	final AutoCompletionComboBox nChamp;
1945 aurelien 36
	Button ajouterChampsEtenduEtFermer;
37
	Button ajouterChampsEtendu;
38
	Button annulerAjouterChampEtendu;
1940 aurelien 39
	String idChamp = null;
40
 
2033 aurelien 41
	Panel conteneurGroupesChampsEtendus;
2602 aurelien 42
	Panel conteneurlabelGroupe;
43
	ListBox listeGroupeChampsEtendus;
2033 aurelien 44
	HTML indicationSaisieGroupe;
1967 aurelien 45
 
2033 aurelien 46
	private static ListeGroupesChampsEtendus cacheGroupes;
2602 aurelien 47
	private static Map<String, String> cacheLabelsCle;
2033 aurelien 48
 
2392 aurelien 49
	private HTML descriptionChamp = null;
2602 aurelien 50
    private String groupeSelectionne = null;
2392 aurelien 51
 
1940 aurelien 52
	public FormulaireSaisieChampEtendu() {
53
		super();
54
		setPaddings(3);
55
		setBodyBorder(false);
56
 
2033 aurelien 57
		indicationSaisieGroupe = new HTML("Vous pouvez ajouter plusieurs champs à la fois correspondant à un groupe "+
58
				"par exemple les champs des projet 'sauvages de ma rue' ou 'florilèges', etc... <br />"+
59
				"De nouveaux groupes seront ajoutés régulièrement en fonction des champs les plus utilisés");
1967 aurelien 60
		indicationSaisieGroupe.addStyleName("aideCreerChampEtendu");
61
 
2602 aurelien 62
		conteneurlabelGroupe = new Panel();
63
		conteneurlabelGroupe.setStyleName("panneauEnLigne");
64
		conteneurlabelGroupe.addStyleName("selecteurGroupeEtendus");
65
		conteneurlabelGroupe.setBorder(false);
66
		Label labelGroupeChampsEtendus = new Label("Ajouter un groupe de champs :");
67
		listeGroupeChampsEtendus = new ListBox();
68
		listeGroupeChampsEtendus.setWidth("315px");
69
		conteneurlabelGroupe.add(labelGroupeChampsEtendus);
70
		conteneurlabelGroupe.add(listeGroupeChampsEtendus);
1967 aurelien 71
 
2033 aurelien 72
		conteneurGroupesChampsEtendus = new Panel();
73
		conteneurGroupesChampsEtendus.setBorder(false);
74
		conteneurGroupesChampsEtendus.setPaddings(0);
75
		conteneurGroupesChampsEtendus.setMargins(0);
76
		conteneurGroupesChampsEtendus.setLayout(new FormLayout());
77
		conteneurGroupesChampsEtendus.setWidth("100%");
78
 
79
		add(conteneurGroupesChampsEtendus);
80
 
81
		if(cacheGroupes == null) {
82
			ListeReferentielChampsEtendusDAO lrceDao = new ListeReferentielChampsEtendusDAO(null);
83
			lrceDao.obtenirGroupesChampsEtendus(this);
84
		} else {
85
			this.rafraichir(cacheGroupes, false);
1967 aurelien 86
		}
2033 aurelien 87
 
1945 aurelien 88
		HTML indicationSaisie = new HTML("Saisissez un nom de champ ou choisisez un nom proposé par l'autocomplétion "+
89
				"Si vous choissisez un nom de champ existant vous pourrez profiter d'une autocomplétion "+
2392 aurelien 90
				"sur les valeurs déjà saisies pour ce champ par les autres utilisateurs.<br /> "+
91
				"Les champs de la forme 'label (clé)' sont des champs 'standards' ayant un rôle et une description " +
92
				"bien définie");
1945 aurelien 93
		indicationSaisie.addStyleName("aideCreerChampEtendu");
94
		add(indicationSaisie);
95
 
1940 aurelien 96
		HorizontalPanel hp = new HorizontalPanel();
97
		hp.setBorderWidth(0);
2602 aurelien 98
 
99
 
100
		nChamp = new AutoCompletionComboBox("Nom du champ", ListeReferentielChampsEtendusDAO.getUrlRequeteNomsChampsEtendus()) {
101
			@Override
102
			protected Map<String, String> parserResultatRequete(
103
					Response response) {
104
				Map<String, String> clesLabels = ListeReferentielChampsEtendusDAO.parserRetourListeNomsChampsEtendus(response);
105
				cacheLabelsCle = new HashMap<String, String>();
106
				for(Map.Entry<String, String> entry : clesLabels.entrySet()){
107
					cacheLabelsCle.put(entry.getValue(), entry.getKey());
108
				}
109
				return clesLabels;
110
			}
111
 
112
			@Override
113
			protected void onSelectionValeur() {
114
				telechargerEtAfficherDescriptionChamps(cacheLabelsCle.get(nChamp.getRawValue()));
115
			}
116
 
117
			@Override
118
			protected void onValidationSaisie() {
119
				// rien à faire ici
120
			}
121
 
122
			@Override
123
			protected void onModificationValeur() {
124
				// rien à faire ici non plus
125
			}
126
 
127
		};
128
 
129
		nChamp.addStyleName("panneauEnLigne");
1940 aurelien 130
		add(nChamp);
131
 
2392 aurelien 132
		descriptionChamp = new HTML();
133
		descriptionChamp.addStyleName("aideWikiChampEtendu");
134
		add(descriptionChamp);
135
 
1967 aurelien 136
		ajouterChampsEtenduEtFermer = new Button("Ajouter et fermer");
137
		ajouterChampsEtenduEtFermer.setTooltip("Ajouter un champ étendu ou un groupe de champs et fermer la fenêtre");
1940 aurelien 138
		ajouterChampsEtendu = new Button("Ajouter");
1967 aurelien 139
		ajouterChampsEtendu.setTooltip("Ajouter un champ étendu ou un groupe de champ");
1940 aurelien 140
		annulerAjouterChampEtendu = new Button("Annuler");
1945 aurelien 141
		annulerAjouterChampEtendu.setTooltip("Fermer la fenêtre sans ajouter de champ");
1940 aurelien 142
 
1945 aurelien 143
		hp.add(ajouterChampsEtenduEtFermer);
1940 aurelien 144
		hp.add(ajouterChampsEtendu);
145
		hp.add(annulerAjouterChampEtendu);
146
		add(hp);
147
 
148
		ajouterListeners();
149
	}
150
 
151
	private void ajouterListeners() {
2602 aurelien 152
 
153
	    listeGroupeChampsEtendus.addChangeHandler(new ChangeHandler() {
1940 aurelien 154
			@Override
2602 aurelien 155
			public void onChange(ChangeEvent event) {
156
				groupeSelectionne = listeGroupeChampsEtendus.getValue(listeGroupeChampsEtendus.getSelectedIndex());
1940 aurelien 157
			}
2602 aurelien 158
		});
1940 aurelien 159
 
1945 aurelien 160
	    ajouterChampsEtenduEtFermer.addListener(new ButtonListenerAdapter() {
161
			@Override
162
			public void onClick(Button button, EventObject e) {
1967 aurelien 163
				if(doitAjouterGroupe()) {
2602 aurelien 164
					surValidationMultiple(renvoyerListeChampsEtendus(groupeSelectionne));
1945 aurelien 165
				} else {
1967 aurelien 166
					if(champEtenduEstValide()) {
167
						surValidation(validerEtRenvoyerChampEtendu());
168
					} else {
169
						Window.alert("Le nom du champ étendu ne peut pas être vide");
170
					}
171
				}
1945 aurelien 172
			}
173
		});
174
 
1940 aurelien 175
	    ajouterChampsEtendu.addListener(new ButtonListenerAdapter() {
176
			@Override
177
			public void onClick(Button button, EventObject e) {
1945 aurelien 178
				if(champEtenduEstValide()) {
179
					surAjout(validerEtRenvoyerChampEtendu());
180
					raz();
181
				} else {
182
					Window.alert("Le nom du champ étendu ne peut pas être vide");
183
				}
1940 aurelien 184
			}
185
		});
186
 
187
	    annulerAjouterChampEtendu.addListener(new ButtonListenerAdapter() {
188
			@Override
189
			public void onClick(Button button, EventObject e) {
190
				surAnnulation();
191
			}
192
		});
193
	}
194
 
1945 aurelien 195
	private void raz() {
196
		idChamp = null;
2602 aurelien 197
		nChamp.reset();
1945 aurelien 198
		nChamp.focus();
199
	}
200
 
2392 aurelien 201
	private ChampSaisieEtendu validerEtRenvoyerChampEtendu() {
2602 aurelien 202
		String labelChamp = nChamp.getRawValue();
203
		String cleChamp = cacheLabelsCle.containsKey(labelChamp) ? cacheLabelsCle.get(labelChamp) : labelChamp;
204
		ChampSaisieEtendu retour = new ChampSaisieEtendu(labelChamp, cleChamp, ListeReferentielChampsEtendusDAO.getUrlRequeteValeursChampEtendu(cleChamp));
205
		retour.setId(cleChamp);
1945 aurelien 206
		return retour;
1940 aurelien 207
	}
208
 
1967 aurelien 209
	private List<ChampSaisieEtendu> renvoyerListeChampsEtendus(String groupe) {
210
		List<ChampSaisieEtendu> champsDuGroupe = new ArrayList<ChampSaisieEtendu>();
2033 aurelien 211
		HashMap<String, String> listeChampsEtendus = cacheGroupes.get(groupe);
1967 aurelien 212
		for (Iterator<String> iterator = listeChampsEtendus.keySet().iterator(); iterator.hasNext();) {
213
			String cle = iterator.next();
214
			String label = listeChampsEtendus.get(cle);
2602 aurelien 215
			ChampSaisieEtendu champ = new ChampSaisieEtendu(label, cle,  ListeReferentielChampsEtendusDAO.getUrlRequeteValeursChampEtendu(cle));
1967 aurelien 216
			champsDuGroupe.add(champ);
217
		}
218
 
219
		return champsDuGroupe;
220
	}
221
 
222
	private boolean doitAjouterGroupe() {
2602 aurelien 223
		return groupeSelectionne != null && !groupeSelectionne.equals("");
1967 aurelien 224
	}
225
 
1945 aurelien 226
	private boolean champEtenduEstValide() {
2392 aurelien 227
		String valeurChamp = nChamp.getRawValue();
1945 aurelien 228
		return (valeurChamp != null && !valeurChamp.isEmpty());
229
	}
230
 
231
	public abstract void surAjout(ChampSaisieEtendu champ);
1967 aurelien 232
	public abstract void surAjoutMultiple(List<ChampSaisieEtendu> champs);
1940 aurelien 233
	public abstract void surValidation(ChampSaisieEtendu champ);
1967 aurelien 234
	public abstract void surValidationMultiple(List<ChampSaisieEtendu> champs);
1940 aurelien 235
	public abstract void surAnnulation();
236
 
2602 aurelien 237
	public void rafraichir(Object nouvelleDonnees, boolean repandreRaffraichissement) {
2033 aurelien 238
		if(nouvelleDonnees instanceof ListeGroupesChampsEtendus) {
239
			cacheGroupes  = (ListeGroupesChampsEtendus)nouvelleDonnees;
2602 aurelien 240
			listeGroupeChampsEtendus.addItem("...");
241
			for (Iterator<String> iterator = cacheGroupes.keySet().iterator(); iterator.hasNext();) {
242
				listeGroupeChampsEtendus.addItem(iterator.next());
243
			}
244
 
2033 aurelien 245
			if(cacheGroupes.size() > 0) {
246
				conteneurGroupesChampsEtendus.add(indicationSaisieGroupe);
2602 aurelien 247
				conteneurGroupesChampsEtendus.add(conteneurlabelGroupe);
2033 aurelien 248
				doLayout();
249
			}
250
		}
1940 aurelien 251
	}
1967 aurelien 252
 
2392 aurelien 253
 
254
    private void telechargerEtAfficherDescriptionChamps(final String cle) {
255
		ListeReferentielChampsEtendusDAO.telechargerDescriptionWikini(cle, new Callback<String, String>() {
256
			@Override
257
			public void onSuccess(String description) {
258
				afficherDescriptionEtLienWikiChampEtendu(cle, description);
259
			}
260
 
261
			@Override
262
			public void onFailure(String reason) {
263
				// rien
264
			}
265
		});
266
	}
267
 
268
    private void afficherDescriptionEtLienWikiChampEtendu(final String cle, String description) {
269
    	if(description.trim().isEmpty()) {
270
			String urlDesc = ListeReferentielChampsEtendusDAO.obtenirUrlEditionDescriptionWiki(cle);
271
			descriptionChamp.setHTML("<span> Aucune description n'existe pour ce champ.<br />" +
272
					"Vous pouvez la remplir sur cette page :" +
273
					"<a id=\"lien_description_wiki_ce_"+cle+"\" href="+urlDesc+" target=\"_blank\">"+cle+"</span></span>");
274
			Ext.get("lien_description_wiki_ce_"+cle).addListener("click", new EventCallback() {
275
				@Override
276
				public void execute(EventObject e) {
277
					ListeReferentielChampsEtendusDAO.creerPageWikini(cle);
278
				}
279
			});
280
		} else {
281
			descriptionChamp.setHTML("<span class=\"descriptionChampEtenduTitre\">Description :</span> "+description);
282
		}
283
    }
1940 aurelien 284
}