Subversion Repositories eFlore/Applications.coel

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

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