Subversion Repositories eFlore/Applications.coel

Rev

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