Subversion Repositories eFlore/Applications.coel

Rev

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