Subversion Repositories eFlore/Applications.coel

Rev

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