Subversion Repositories eFlore/Applications.coel

Rev

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