Subversion Repositories eFlore/Applications.coel

Rev

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