Subversion Repositories eFlore/Applications.coel

Rev

Rev 498 | Rev 543 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
61 jpm 1
package org.tela_botanica.client.composants;
2
 
69 jpm 3
import org.tela_botanica.client.ComposantClass;
66 jpm 4
import org.tela_botanica.client.ComposantId;
5
import org.tela_botanica.client.RegistreId;
498 jp_milcent 6
import org.tela_botanica.client.images.Images;
66 jpm 7
import org.tela_botanica.client.modeles.Configuration;
324 jp_milcent 8
import org.tela_botanica.client.modeles.Information;
66 jpm 9
import org.tela_botanica.client.modeles.Menu;
311 jp_milcent 10
import org.tela_botanica.client.util.Print;
66 jpm 11
 
498 jp_milcent 12
import com.extjs.gxt.ui.client.event.Events;
66 jpm 13
import com.extjs.gxt.ui.client.Registry;
61 jpm 14
import com.extjs.gxt.ui.client.Style.LayoutRegion;
66 jpm 15
import com.extjs.gxt.ui.client.Style.Scroll;
498 jp_milcent 16
import com.extjs.gxt.ui.client.event.ButtonEvent;
66 jpm 17
import com.extjs.gxt.ui.client.event.Listener;
69 jpm 18
import com.extjs.gxt.ui.client.event.SelectionListener;
498 jp_milcent 19
import com.extjs.gxt.ui.client.event.TreePanelEvent;
66 jpm 20
import com.extjs.gxt.ui.client.store.Store;
21
import com.extjs.gxt.ui.client.store.TreeStore;
61 jpm 22
import com.extjs.gxt.ui.client.util.Margins;
23
import com.extjs.gxt.ui.client.widget.ContentPanel;
24
import com.extjs.gxt.ui.client.widget.Dialog;
66 jpm 25
import com.extjs.gxt.ui.client.widget.HtmlContainer;
324 jp_milcent 26
import com.extjs.gxt.ui.client.widget.Info;
343 jp_milcent 27
import com.extjs.gxt.ui.client.widget.LayoutContainer;
498 jp_milcent 28
import com.extjs.gxt.ui.client.widget.form.StoreFilterField;
61 jpm 29
import com.extjs.gxt.ui.client.widget.button.Button;
30
import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
31
import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData;
343 jp_milcent 32
import com.extjs.gxt.ui.client.widget.layout.FlowLayout;
33
import com.extjs.gxt.ui.client.widget.layout.FormLayout;
498 jp_milcent 34
import com.extjs.gxt.ui.client.widget.treepanel.TreePanel;
66 jpm 35
import com.google.gwt.core.client.GWT;
324 jp_milcent 36
import com.google.gwt.http.client.Request;
37
import com.google.gwt.http.client.RequestBuilder;
38
import com.google.gwt.http.client.RequestCallback;
39
import com.google.gwt.http.client.RequestException;
40
import com.google.gwt.http.client.Response;
41
import com.google.gwt.json.client.JSONArray;
42
import com.google.gwt.json.client.JSONObject;
43
import com.google.gwt.json.client.JSONParser;
44
import com.google.gwt.json.client.JSONValue;
66 jpm 45
import com.google.gwt.user.client.Event;
61 jpm 46
 
47
public class AideFenetre extends Dialog {
48
 
311 jp_milcent 49
	private static final String SERVICE_NOM = "CoelAide";
324 jp_milcent 50
	private static final String PAGE_SOMMAIRE_CODE = "AideCoelSommaire";
311 jp_milcent 51
	private static final String PAGE_A_OUVRIR_CODE = "AideCoelPresentationGenerale";
52
	private static Menu pagePrincipale = null;
498 jp_milcent 53
	private static Menu menuAOuvrirParDefaut = null;
54
	private TreePanel<Menu> arbre = null;
69 jpm 55
	private TreeStore<Menu> magazin = null;
56
	private StoreFilterField<Menu> filtre = null;
324 jp_milcent 57
	private Menu sommaire = null;
343 jp_milcent 58
	private ContentPanel sommairePanneau = null;
66 jpm 59
	private ContentPanel contenuPanneau = null;
324 jp_milcent 60
	private HtmlContainer conteneurDuHtml;
343 jp_milcent 61
	private LayoutContainer entetePanneau;
324 jp_milcent 62
 
61 jpm 63
	public AideFenetre() {
64
		setBodyBorder(false);
69 jpm 65
		setButtons(Dialog.OK);
516 jp_milcent 66
		setIcon(Images.ICONES.appPanneauListe());
61 jpm 67
		setHeading("COEL - Aide");
324 jp_milcent 68
		setWidth(675);
69
		setHeight(400);
61 jpm 70
		setHideOnButtonClick(true);
324 jp_milcent 71
		setLayout(new BorderLayout());
61 jpm 72
 
343 jp_milcent 73
		// Panneau Nord : entête
74
		entetePanneau = new LayoutContainer();
75
		entetePanneau.setLayout(new FlowLayout());
76
		BorderLayoutData enteteDisposition = new BorderLayoutData(LayoutRegion.NORTH, 30);
77
		add(entetePanneau, enteteDisposition);
78
 
79
		inititialiserSommaireArbreFiltre();
516 jp_milcent 80
 
343 jp_milcent 81
 
66 jpm 82
		// Panneau Ouest : sommaire
516 jp_milcent 83
		creerSommaire();
343 jp_milcent 84
		sommairePanneau = new ContentPanel();
324 jp_milcent 85
		sommairePanneau.setScrollMode(Scroll.AUTO);
358 jp_milcent 86
		BorderLayoutData sommaireDisposition = new BorderLayoutData(LayoutRegion.WEST, 230, 175, 350);
66 jpm 87
		sommaireDisposition.setMargins(new Margins(0, 5, 0, 0));
88
		sommaireDisposition.setSplit(true);
89
		sommaireDisposition.setFloatable(true);
343 jp_milcent 90
 
498 jp_milcent 91
		Button plierDeplierToutBtn = new Button(null, new SelectionListener<ButtonEvent>() {
92
			public void componentSelected(ButtonEvent be) {
93
				Button boutonPlierDeplierTout = (Button) be.getSource();
94
				// CHECK : vérifier si cela marche
95
				if (boutonPlierDeplierTout.getIcon().equals(Images.ICONES.deplierTout())) {
96
					boutonPlierDeplierTout.setIcon(Images.ICONES.deplierTout());
343 jp_milcent 97
					arbre.expandAll();
498 jp_milcent 98
				} else if (boutonPlierDeplierTout.getIcon().equals(Images.ICONES.replierTout())) {
99
					boutonPlierDeplierTout.setIcon(Images.ICONES.replierTout());
343 jp_milcent 100
					arbre.collapseAll();
101
				}
102
			}
103
		});
498 jp_milcent 104
		plierDeplierToutBtn.setIcon(Images.ICONES.deplierTout());
343 jp_milcent 105
		plierDeplierToutBtn.setToolTip("Étendre le sommaire");
106
		sommairePanneau.getHeader().insertTool(plierDeplierToutBtn, 0);
107
 
66 jpm 108
		add(sommairePanneau, sommaireDisposition);
61 jpm 109
 
66 jpm 110
		// Chargement de l'arbre du sommaire et de son filtre
324 jp_milcent 111
		getSommaireArbreModele();
61 jpm 112
 
66 jpm 113
		// Panneau Central : contenu
114
		contenuPanneau = new ContentPanel();
115
		contenuPanneau.setScrollMode(Scroll.AUTO);
69 jpm 116
		// Barre d'outils
498 jp_milcent 117
		Button imprimerBtn = new Button(null, new SelectionListener<ButtonEvent>() {
118
			public void componentSelected(ButtonEvent be) {
324 jp_milcent 119
				Print.it(conteneurDuHtml.el().getInnerHtml());
311 jp_milcent 120
			}
69 jpm 121
		});
516 jp_milcent 122
		imprimerBtn.setIcon(Images.ICONES.imprimer());
69 jpm 123
		contenuPanneau.getHeader().insertTool(imprimerBtn, 0);
66 jpm 124
		BorderLayoutData contenuDisposition = new BorderLayoutData(LayoutRegion.CENTER);
324 jp_milcent 125
		add(contenuPanneau, contenuDisposition);
61 jpm 126
	}
127
 
498 jp_milcent 128
	private void etendreArbre(Menu menuAOuvrir) {
129
		arbre.setExpanded(menuAOuvrir, true);
311 jp_milcent 130
	}
131
 
498 jp_milcent 132
	private void etendreArbre(String menuCode) {
133
		Menu menuAOuvrir = magazin.findModel("code", menuCode);
134
		if (menuAOuvrir != null) {
135
			arbre.setExpanded(menuAOuvrir, true);
136
		}
311 jp_milcent 137
	}
138
 
498 jp_milcent 139
	private void creerSommaire() {
516 jp_milcent 140
		magazin = new TreeStore<Menu>();
66 jpm 141
 
142
		filtre.bind(magazin);
343 jp_milcent 143
 
516 jp_milcent 144
		arbre = new TreePanel<Menu>(magazin);
145
		arbre.getStyle().setLeafIcon(Images.ICONES.aide());
498 jp_milcent 146
		arbre.addListener(Events.OnClick, new Listener<TreePanelEvent<Menu>>(){
147
			public void handleEvent(TreePanelEvent<Menu> tpe) {
148
				TreePanel<Menu> f = tpe.getComponent();
149
				if (f.getModel() != null) {
150
					Menu menu = f.getModel();
151
					if (menu.get("code") != null) {
152
						selectionSommaire((String) menu.get("code"));
153
					}
66 jpm 154
				}
155
			}
325 jp_milcent 156
		});
66 jpm 157
	}
158
 
498 jp_milcent 159
	private void definirMenuAOuvrirParDefaut() {
160
		menuAOuvrirParDefaut = magazin.findModel("code", PAGE_A_OUVRIR_CODE);
311 jp_milcent 161
	}
162
 
66 jpm 163
	private void selectionSommaire(String page) {
164
		String serviceUrl = ((Configuration) Registry.get(RegistreId.CONFIG)).getServiceBaseUrl();
311 jp_milcent 165
		String aidePageUrl = serviceUrl+SERVICE_NOM+"/"+page;
66 jpm 166
		GWT.log("Sélection : "+aidePageUrl, null);
167
		chargerPageAide(aidePageUrl);
168
	}
169
 
170
	private void chargerPageAide(String url) {
171
		GWT.log("Charger : "+url, null);
324 jp_milcent 172
		conteneurDuHtml = new HtmlContainer() {
66 jpm 173
			public void onBrowserEvent(Event e) {
174
				// Nous vérifions que l'évenement est un clic et qu'il a lieu sur un lien
498 jp_milcent 175
				if (e.getTypeInt() == Event.ONCLICK && e.getEventTarget().equals("A")) {
66 jpm 176
					e.preventDefault();
498 jp_milcent 177
					String urlPageAideCible = e.getEventTarget().toString();
311 jp_milcent 178
					chargerPageAide(urlPageAideCible);
179
					String codePageAideCible = urlPageAideCible.substring(urlPageAideCible.lastIndexOf("/")+1);
180
					etendreArbre(codePageAideCible);
181
					GWT.log("Clic : "+urlPageAideCible+"::"+codePageAideCible, null);
182
				} else {
183
					GWT.log("Event :"+e.getType(), null);
66 jpm 184
				}
185
			}
186
		};
311 jp_milcent 187
 
188
		conteneurDuHtml.setId(ComposantId.PANNEAU_AIDE);
189
		conteneurDuHtml.setWidth(400);
190
		conteneurDuHtml.sinkEvents(Event.ONCLICK);
191
		conteneurDuHtml.setUrl(url);
192
		conteneurDuHtml.recalculate();
193
 
66 jpm 194
		contenuPanneau.removeAll();
311 jp_milcent 195
		contenuPanneau.add(conteneurDuHtml);
66 jpm 196
		contenuPanneau.layout();
197
	}
198
 
199
	private void inititialiserSommaireArbreFiltre() {
69 jpm 200
		filtre = new StoreFilterField<Menu>() {
66 jpm 201
			@Override
69 jpm 202
			protected boolean doSelect(Store<Menu> magazin, Menu parent, Menu enregistrement, String propriete, String filtre) {
311 jp_milcent 203
				Boolean retour = false;
69 jpm 204
				// Seul les feuilles sont traitées par le filtre
311 jp_milcent 205
				String nomMenu = enregistrement.getNom();
206
				String nomMenuMinuscule = nomMenu.toLowerCase();
207
				String nomFiltreMinuscule = filtre.toLowerCase();
208
				if (nomMenuMinuscule.matches(".*"+nomFiltreMinuscule+".*")) {
209
					retour = true;
69 jpm 210
				}
343 jp_milcent 211
				return retour;
66 jpm 212
			}
213
		};
343 jp_milcent 214
		filtre.setFieldLabel("Chercher");
215
		filtre.setLabelStyle("font-weight:normal;");
216
		filtre.setToolTip("Filtrer le sommaire");
217
		filtre.setWidth(200);
218
 
219
		FormLayout fl = new FormLayout();
220
		fl.setLabelWidth(55);
498 jp_milcent 221
		// CHECK : vérifier si c'est bon sans la largeur
222
		//fl.setPadding(5);
343 jp_milcent 223
 
224
		ContentPanel fp = new ContentPanel();
225
		fp.setHeaderVisible(false);
226
		fp.setLayout(fl);
227
		fp.add(filtre);
228
		entetePanneau.add(fp);
66 jpm 229
	}
230
 
324 jp_milcent 231
	public void getSommaireArbreModele() {
232
		String serviceUrl = ((Configuration) Registry.get(RegistreId.CONFIG)).getServiceBaseUrl();
233
		String sommairePageUrl = serviceUrl+SERVICE_NOM+"/"+PAGE_SOMMAIRE_CODE+"/sommaire";
234
		RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, sommairePageUrl);
235
		try {
236
			rb.sendRequest(null, new RequestCallback() {
66 jpm 237
 
324 jp_milcent 238
				public void onError(Request request, Throwable exception) {
239
					// Gestion des exceptions déclenchées par l'exécution de la requête
240
					GWT.log("Erreur à l'exécution du service "+SERVICE_NOM+" (selection)", exception);
241
					Info.display("Erreur de Requête", "Une erreur s'est produite lors de l'exécution de la requête.");
242
				}
243
 
244
				public void onErrorHTTP(Request request, Response reponse) {
245
					// Gestion des erreurs HTTP renvoyé par Apache ou JRest
246
					Information info = new Information("erreur_jrest", JSONParser.parse(reponse.getText()).isArray());
247
					GWT.log("Erreur JREST - Code "+reponse.getStatusCode()+"\n"+info.getMessages().toString(), null);
248
					Info.display("Erreur JREST - Code "+reponse.getStatusCode(), info.toString());
249
				}
250
 
251
				public void onResponseReceived(Request request, Response response) {
252
					// Si le code de réponse HTTP ne vaut pas 200 OK, on lance le mécanise d'erreur HTTP
253
					if (response.getStatusCode() != 200) {
254
						onErrorHTTP(request, response);
255
					} else {
256
						if (response.getText().length() != 0 && response.getText() != null) {
257
							final JSONValue responseValue = JSONParser.parse(response.getText());
258
							JSONArray jsonArray = responseValue.isArray();
259
 
260
							if (jsonArray != null) {
261
								sommaire = new Menu("Sommaire");
262
								ajouterMenuRecursivement(sommaire, jsonArray);
66 jpm 263
 
516 jp_milcent 264
								magazin.removeAll();
324 jp_milcent 265
								magazin.add(sommaire, true);
266
 
498 jp_milcent 267
								definirMenuAOuvrirParDefaut();
325 jp_milcent 268
 
324 jp_milcent 269
								sommairePanneau.add(arbre);
498 jp_milcent 270
								sommairePanneau.layout();
343 jp_milcent 271
 
324 jp_milcent 272
								// Chargement de la page racine
273
								selectionSommaire(pagePrincipale.getCode());
498 jp_milcent 274
								etendreArbre(menuAOuvrirParDefaut);
324 jp_milcent 275
							} else {
276
								GWT.log("\n\tLa réponse n'est pas un objet ou un talbeau JSON et vaut : "+responseValue.toString(), null);
277
							}
278
						}
279
					}
280
				}
281
			});
282
		} catch (RequestException e) {
283
			e.printStackTrace();
66 jpm 284
		}
324 jp_milcent 285
	}
286
 
287
	private void ajouterMenuRecursivement(Menu brancheSommaire, JSONArray tableau) {
288
		final int tailleMax = tableau.size();
69 jpm 289
 
324 jp_milcent 290
		for (int i = 0; i < tailleMax; i++) {
291
			JSONObject pageCourante = tableau.get(i).isObject() ;
292
			if (pageCourante != null) {
293
				Menu menuCourrant = new Menu();
294
 
295
				if (pageCourante.get("code") != null) {
296
					menuCourrant.setCode(pageCourante.get("code").isString().stringValue());
297
				}
298
				if (pageCourante.get("txt") != null) {
299
					menuCourrant.setNom(pageCourante.get("txt").isString().stringValue());
300
				}
301
 
302
				if (menuCourrant.getNom() == null && menuCourrant.getCode() == null) {
303
					menuCourrant = (Menu) brancheSommaire.getChild((brancheSommaire.getChildCount() - 1));
304
				} else {
305
					if (brancheSommaire != null) {
306
						brancheSommaire.add(menuCourrant);
307
						if (pagePrincipale == null) {
308
							pagePrincipale = menuCourrant;
309
						}
310
					}
311
				}
312
 
313
				if (pageCourante.get("liste") != null) {
314
					ajouterMenuRecursivement(menuCourrant, pageCourante.get("liste").isArray());
315
				}
316
			}
317
		}
66 jpm 318
	}
61 jpm 319
}