Subversion Repositories eFlore/Applications.coel

Rev

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