Subversion Repositories eFlore/Applications.coel

Rev

Rev 1789 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
985 jpm 1
package org.tela_botanica.client.vues.commentaire;
2
 
3
import java.util.ArrayList;
4
import java.util.HashMap;
5
import java.util.Iterator;
6
import java.util.List;
7
 
8
import org.tela_botanica.client.Mediateur;
9
import org.tela_botanica.client.RegistreId;
1633 aurelien 10
import org.tela_botanica.client.composants.ChampFiltreRecherche;
1239 cyprien 11
import org.tela_botanica.client.composants.InfoLogger;
985 jpm 12
import org.tela_botanica.client.i18n.Constantes;
13
import org.tela_botanica.client.images.Images;
14
import org.tela_botanica.client.interfaces.Rafraichissable;
15
import org.tela_botanica.client.modeles.Information;
990 jpm 16
import org.tela_botanica.client.modeles.MenuApplicationId;
985 jpm 17
import org.tela_botanica.client.modeles.Utilisateur;
18
import org.tela_botanica.client.modeles.Valeur;
19
import org.tela_botanica.client.modeles.ValeurListe;
20
import org.tela_botanica.client.modeles.aDonnee;
1613 aurelien 21
import org.tela_botanica.client.modeles.collection.Collection;
985 jpm 22
import org.tela_botanica.client.modeles.commentaire.Commentaire;
23
import org.tela_botanica.client.modeles.commentaire.CommentaireListe;
1762 mathias 24
import org.tela_botanica.client.modeles.personne.Personne;
25
import org.tela_botanica.client.modeles.personne.PersonneAsyncDao;
1049 gduche 26
import org.tela_botanica.client.modeles.structure.StructureListe;
990 jpm 27
import org.tela_botanica.client.util.Debug;
1049 gduche 28
import org.tela_botanica.client.vues.BarrePaginationVue;
985 jpm 29
 
30
import com.extjs.gxt.ui.client.Registry;
31
import com.extjs.gxt.ui.client.Style.SortDir;
32
import com.extjs.gxt.ui.client.event.BaseEvent;
33
import com.extjs.gxt.ui.client.event.ButtonEvent;
34
import com.extjs.gxt.ui.client.event.Events;
1762 mathias 35
import com.extjs.gxt.ui.client.event.GridEvent;
985 jpm 36
import com.extjs.gxt.ui.client.event.Listener;
37
import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
38
import com.extjs.gxt.ui.client.event.SelectionChangedListener;
39
import com.extjs.gxt.ui.client.event.SelectionListener;
40
import com.extjs.gxt.ui.client.store.GroupingStore;
41
import com.extjs.gxt.ui.client.store.ListStore;
1329 cyprien 42
import com.extjs.gxt.ui.client.util.Util;
985 jpm 43
import com.extjs.gxt.ui.client.widget.ContentPanel;
44
import com.extjs.gxt.ui.client.widget.Info;
45
import com.extjs.gxt.ui.client.widget.button.Button;
46
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
47
import com.extjs.gxt.ui.client.widget.grid.ColumnData;
48
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
49
import com.extjs.gxt.ui.client.widget.grid.Grid;
50
import com.extjs.gxt.ui.client.widget.grid.GridCellRenderer;
51
import com.extjs.gxt.ui.client.widget.grid.GridGroupRenderer;
52
import com.extjs.gxt.ui.client.widget.grid.GridSelectionModel;
53
import com.extjs.gxt.ui.client.widget.grid.GroupColumnData;
54
import com.extjs.gxt.ui.client.widget.grid.GroupingView;
55
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
990 jpm 56
import com.extjs.gxt.ui.client.widget.menu.Menu;
985 jpm 57
import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
58
import com.google.gwt.core.client.GWT;
1613 aurelien 59
import com.google.gwt.user.client.Window;
985 jpm 60
 
61
public class CommentaireListeVue extends ContentPanel implements Rafraichissable {
62
 
63
	private Mediateur mediateur = null;
64
	private Constantes i18nC = null;
65
 
66
	private Grid<Commentaire> grille = null;
67
	private GroupingStore<Commentaire> store = null;
68
	private ColumnModel modeleDesColonnes = null;
69
 
70
	private Button ajouter;
71
	private Button modifier;
72
	private Button supprimer;
73
 
1049 gduche 74
	private BarrePaginationVue pagination = null;
1633 aurelien 75
	private ChampFiltreRecherche champFiltreRecherche = null;
1049 gduche 76
 
985 jpm 77
	private CommentaireListe commentaires = null;
78
	protected boolean commentairesChargementOk = false;
79
 
80
	protected HashMap<String, Valeur> ontologie = null;
81
	protected boolean ontologieChargementOk = false;
82
 
1613 aurelien 83
	private int indexElementSelectionne = 0;
84
	private Commentaire commentaireSelectionne = null;
85
 
985 jpm 86
	public CommentaireListeVue(Mediateur mediateurCourant) {
87
		mediateur = mediateurCourant;
88
		i18nC = Mediateur.i18nC;
89
 
90
		setLayout(new FitLayout());
1789 aurelien 91
		setHeaderVisible(false);
985 jpm 92
 
93
		// Gestion de l'ontologie
94
		ontologie = new HashMap<String, Valeur>();
1322 gduche 95
		mediateur.obtenirListeValeurEtRafraichir(this, "typeCommentaireCollection", null);
985 jpm 96
 
97
		// Gestion de la barre d'outil
98
		ToolBar toolBar = new ToolBar();
99
		ajouter = new Button(i18nC.ajouter());
100
		ajouter.setIcon(Images.ICONES.ajouter());
101
		ajouter.addSelectionListener(new SelectionListener<ButtonEvent>() {
102
			public void componentSelected(ButtonEvent be) {
103
				mediateur.clicAjouterCommentaire();
104
			}
105
		});
1630 aurelien 106
		ajouter.setToolTip(i18nC.indicationCreerUneFiche()+" "+i18nC.commentaireSingulier());
985 jpm 107
		toolBar.add(ajouter);
108
 
109
		modifier = new Button(i18nC.modifier());
110
		modifier.setIcon(Images.ICONES.formModifier());
111
		modifier.addSelectionListener(new SelectionListener<ButtonEvent>() {
112
			public void componentSelected(ButtonEvent be) {
113
				mediateur.clicModifierCommentaire(grille.getSelectionModel().getSelectedItems());
114
			}
115
		});
1630 aurelien 116
		modifier.setToolTip(i18nC.indicationModifierUneFiche());
985 jpm 117
		toolBar.add(modifier);
118
 
119
		supprimer = new Button(i18nC.supprimer());
120
		supprimer.setIcon(Images.ICONES.supprimer());
121
		supprimer.addSelectionListener(new SelectionListener<ButtonEvent>() {
122
			public void componentSelected(ButtonEvent be) {
123
				mediateur.clicSupprimerCommentaire(grille.getSelectionModel().getSelectedItems());
124
			}
125
		});
1630 aurelien 126
		supprimer.setToolTip(i18nC.indicationSupprimerUneFiche());
985 jpm 127
		toolBar.add(supprimer);
128
		setTopComponent(toolBar);
129
 
130
		// Gestion de la grille
131
		List<ColumnConfig> colonnes = new ArrayList<ColumnConfig>();
132
		// ATTENTION : les noms des colonnes doivent correspondre aux noms variables de la classe utilisée dans la liste
1329 cyprien 133
		colonnes.add(new ColumnConfig("_collection_nom_", i18nC.commentaireCollection(), 150));
985 jpm 134
		colonnes.add(creerColonneType());
135
		colonnes.add(new ColumnConfig("_titre_", i18nC.commentaireTitre(), 150));
136
		colonnes.add(new ColumnConfig("_ponderation_", i18nC.commentairePonderation(), 30));
137
		colonnes.add(creerColonneAcces());
138
		modeleDesColonnes = new ColumnModel(colonnes);
139
 
140
		GridSelectionModel<Commentaire> modeleDeSelection = new GridSelectionModel<Commentaire>();
141
		modeleDeSelection.addSelectionChangedListener(new SelectionChangedListener<Commentaire>() {
142
			public void selectionChanged(SelectionChangedEvent<Commentaire> event) {
1613 aurelien 143
				commentaireSelectionne = (Commentaire) event.getSelectedItem();
144
				indexElementSelectionne = store.indexOf(commentaireSelectionne);
145
				clicListe(commentaireSelectionne);
985 jpm 146
			}
147
		});
148
 
149
		store = new GroupingStore<Commentaire>();
150
		store.groupBy("_collection_nom_");
990 jpm 151
		store.setRemoteGroup(false);
985 jpm 152
 
153
		GroupingView vueDeGroupe = new GroupingView();
154
		vueDeGroupe.setShowGroupedColumn(false);
155
		vueDeGroupe.setForceFit(true);
990 jpm 156
		vueDeGroupe.setAutoFill(true);
985 jpm 157
		vueDeGroupe.setGroupRenderer(new GridGroupRenderer() {
158
			public String render(GroupColumnData data) {
1680 raphael 159
				String f = modeleDesColonnes.getColumnById(data.field).getHeaderHtml();
985 jpm 160
				String l = data.models.size() == 1 ? i18nC.commentaireSingulier() : i18nC.commentairePluriel();
1329 cyprien 161
 
162
				if (Util.isEmptyString(data.group)) return f + ": aucune (" + data.models.size() + " " + l + ")";
163
				else return f + ": " + data.group + " (" + data.models.size() + " " + l + ")";
985 jpm 164
			}
165
		});
166
 
167
		grille = new Grid<Commentaire>(store, modeleDesColonnes);
168
		grille.setView(vueDeGroupe);
169
		grille.setWidth("100%");
170
		grille.setAutoExpandColumn("_titre_");
171
		grille.setSelectionModel(modeleDeSelection);
172
		grille.addListener(Events.ViewReady, new Listener<BaseEvent>() {
173
			public void handleEvent(BaseEvent be) {
174
				grille.getSelectionModel().select(0, false);
175
			}
176
		});
177
		grille.addListener(Events.OnDoubleClick, new Listener<BaseEvent>(){
178
			public void handleEvent(BaseEvent be) {
179
				modifier.fireEvent(Events.Select);
180
			}
181
		});
1762 mathias 182
		// @TODO marche pas à cause des méta machin de merde
183
		/*grille.addListener(Events.SortChange, new Listener<BaseEvent>() {
184
 
185
			@Override
186
			public void handleEvent(BaseEvent be) {
187
				GridEvent ge = (GridEvent<Commentaire>) be;
188
				// TODO rajouter un test sur le sort state pour trier par nom par défaut
189
				String tri = ge.getSortInfo().getSortField();
190
				if(tri.equals("fmt_nom_complet")) {
191
					tri = "nom";
192
				}
193
				CommentaireAsyncDao.tri = Commentaire.PREFIXE+"_"+tri+" "+ge.getSortInfo().getSortDir().toString();
194
				pagination.changePage();
195
			}
196
		});*/
985 jpm 197
		add(grille);
1049 gduche 198
 
1633 aurelien 199
		CommentaireListe commentaireListe = new CommentaireListe();
200
		champFiltreRecherche = new ChampFiltreRecherche(mediateur, toolBar, commentaireListe);
1049 gduche 201
		// Définition de la barre de pagination
1687 raphael 202
		pagination = new BarrePaginationVue(commentaireListe, mediateur, champFiltreRecherche);
1049 gduche 203
		setBottomComponent(pagination);
985 jpm 204
	}
205
 
206
	private ColumnConfig creerColonneType() {
207
		GridCellRenderer<Commentaire> typeRendu = new GridCellRenderer<Commentaire>() {
208
			public String render(Commentaire model, String property, ColumnData config, int rowIndex, int colIndex, ListStore<Commentaire> store, Grid<Commentaire> grid) {
209
				// FIXME : créer une classe Ontologie qui mixe le code ci-dessous et tout ce qui concerne l'ontologie dans DetailVue
210
				String type = "";
211
				String[] valeurs = model.getCollectionACommentaire().getType().split(aDonnee.SEPARATEUR_VALEURS);
1329 cyprien 212
 
985 jpm 213
				int nbreValeurs = valeurs.length;
1329 cyprien 214
 
985 jpm 215
				int indexAvtDernier = nbreValeurs - 1;
216
				if (nbreValeurs > 0)	{
217
					for (int i = 0; i < nbreValeurs; i++)	{
218
						String valeur = valeurs[i];
1329 cyprien 219
 
985 jpm 220
						if (valeur.matches("^[0-9]+$"))	{
221
							if (valeur.equals("0")) {
222
								valeur = "";
223
							} else if (ontologie != null) {
224
								Valeur valeurOntologie = ontologie.get(valeur);
225
								if (valeurOntologie != null) {
226
									valeur = valeurOntologie.getNom();
227
								}
228
							}
229
						}
230
						if (i != indexAvtDernier) {
231
							type += valeur+", ";
232
						} else {
233
							type += valeur;
234
						}
235
					}
236
				}
1329 cyprien 237
 
985 jpm 238
				model.set("_type_", type);
239
				return type;
240
			}
241
		};
242
		ColumnConfig typeColonne = new ColumnConfig("_type_", i18nC.commentaireType(), 100);
243
		typeColonne.setRenderer(typeRendu);
244
		return typeColonne;
245
	}
246
 
247
	private ColumnConfig creerColonneAcces() {
248
		GridCellRenderer<Commentaire> accesRendu = new GridCellRenderer<Commentaire>() {
249
			public String render(Commentaire model, String property, ColumnData config, int rowIndex, int colIndex, ListStore<Commentaire> store, Grid<Commentaire> grid) {
250
				String acces = (model.etrePublic() ? i18nC.donneePublic() : i18nC.donneePrivee());
251
				model.set("_public_", acces);
252
				return acces;
253
			}
254
		};
255
		ColumnConfig accesColonne = new ColumnConfig("_public_", i18nC.commentairePublic(), 30);
256
		accesColonne.setRenderer(accesRendu);
257
		return accesColonne;
258
	}
259
 
260
	private void clicListe(Commentaire commentaire) {
261
		if (commentaire != null && store.getCount() > 0) {
262
			mediateur.clicListeCommentaire(commentaire);
263
		}
264
	}
265
 
266
	private void gererEtatActivationBouton() {
267
		int nbreElementDuMagazin = store.getCount();
268
		ajouter.enable();
269
		if (nbreElementDuMagazin <= 0) {
270
			supprimer.disable();
271
			modifier.disable();
272
		} else if (nbreElementDuMagazin > 0) {
273
			modifier.enable();
274
			if (((Utilisateur) Registry.get(RegistreId.UTILISATEUR_COURANT)).isIdentifie()) {
275
				supprimer.enable();
276
			}
277
		}
278
	}
279
 
280
	public void rafraichir(Object nouvellesDonnees) {
281
		if (nouvellesDonnees instanceof CommentaireListe) {
282
			commentaires = (CommentaireListe) nouvellesDonnees;
1049 gduche 283
 
1633 aurelien 284
			champFiltreRecherche.setListePaginable(commentaires);
285
 
1049 gduche 286
			pagination.setlistePaginable(commentaires);
287
			pagination.rafraichir(commentaires.getPageTable());
288
 
985 jpm 289
			commentairesChargementOk = true;
290
		} else if (nouvellesDonnees instanceof ValeurListe) {
291
			ValeurListe listeValeursReceptionnee = (ValeurListe) nouvellesDonnees;
292
			Iterator<String> it = listeValeursReceptionnee.keySet().iterator();
293
			while (it.hasNext()) {
294
				String cle = it.next();
295
				Valeur valeur = listeValeursReceptionnee.get(cle);
296
				if (valeur != null) {
297
					ontologie.put(cle, valeur);
298
				}
299
			}
300
			ontologieChargementOk = true;
301
		} else if (nouvellesDonnees instanceof Information) {
302
			Information info = (Information) nouvellesDonnees;
303
			if (info.getType().equals("maj_utilisateur")) {
304
				gererEtatActivationBouton();
305
			} else if (info.getType().equals("suppression_commentaire")) {
306
				String message = info.toString();
307
				if (info.getDonnee(0) != null) {
308
					message = (String) info.getDonnee(0);
309
				}
1239 cyprien 310
				InfoLogger.display(i18nC.commentaireTitreSuppression(), message);
985 jpm 311
				supprimerCommentairesSelectionnees();
312
				gererEtatActivationBouton();
1613 aurelien 313
			} else if (info.getType().equals("commentaire_modifiee")) {
314
				// GXT c'est pourri et la grille ne prend en compte les modifications
315
				// du store, donc en attendant, on recharge tout, comme pour la suppression
316
				/*Commentaire commModifie = (Commentaire)info.getDonnee(0);
317
				store.remove(indexElementSelectionne);
318
				store.insert(commModifie, indexElementSelectionne);
319
				grille.reconfigure(store, modeleDesColonnes);
320
				grille.repaint();*/
321
				mediateur.clicMenu(MenuApplicationId.COMMENTAIRE);
985 jpm 322
			}
323
		} else {
324
			GWT.log(Mediateur.i18nM.erreurRafraichir(nouvellesDonnees.getClass(), this.getClass()), null);
325
		}
326
 
327
		if (etrePretAAfficherListe()) {
328
			chargerListe();
329
		}
330
		layout();
331
	}
332
 
333
	private boolean etrePretAAfficherListe() {
334
		boolean ok = false;
335
		if (commentairesChargementOk && ontologieChargementOk) {
336
			ok = true;
337
		}
338
		return ok;
339
	}
340
 
341
	private void chargerListe() {
342
		if (commentaires != null) {
343
			List<Commentaire> liste = commentaires.toList();
1329 cyprien 344
 
985 jpm 345
			store.removeAll();
346
			store.add(liste);
347
 
348
			mediateur.actualiserPanneauCentral();
349
		}
350
	}
351
 
352
	private void supprimerCommentairesSelectionnees() {
990 jpm 353
		// FIXME : le code ci-dessous ne marche pas avec la GroupingView, nous utilisons le rechargement du menu à la place
354
		/*
985 jpm 355
		List<Commentaire> commentairesSelectionnees = grille.getSelectionModel().getSelectedItems();
356
		Iterator<Commentaire> it = commentairesSelectionnees.iterator();
357
		while (it.hasNext()) {
990 jpm 358
			Commentaire commentaireASupprimer = it.next();
359
			Debug.log(commentaireASupprimer.getId());
360
			grille.getStore().remove(commentaireASupprimer);
985 jpm 361
		}
362
		layout(true);
990 jpm 363
		*/
364
		mediateur.clicMenu(MenuApplicationId.COMMENTAIRE);
985 jpm 365
	}
1687 raphael 366
}