Rev 325 | Rev 498 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
package org.tela_botanica.client.composants;import java.util.Iterator;import java.util.List;import org.tela_botanica.client.ComposantClass;import org.tela_botanica.client.ComposantId;import org.tela_botanica.client.RegistreId;import org.tela_botanica.client.modeles.Configuration;import org.tela_botanica.client.modeles.Information;import org.tela_botanica.client.modeles.Menu;import org.tela_botanica.client.util.Print;import com.extjs.gxt.ui.client.Events;import com.extjs.gxt.ui.client.Registry;import com.extjs.gxt.ui.client.Style.LayoutRegion;import com.extjs.gxt.ui.client.Style.Scroll;import com.extjs.gxt.ui.client.binder.TreeBinder;import com.extjs.gxt.ui.client.event.BaseEvent;import com.extjs.gxt.ui.client.event.ComponentEvent;import com.extjs.gxt.ui.client.event.Listener;import com.extjs.gxt.ui.client.event.SelectionListener;import com.extjs.gxt.ui.client.event.TreeEvent;import com.extjs.gxt.ui.client.store.Store;import com.extjs.gxt.ui.client.store.TreeStore;import com.extjs.gxt.ui.client.util.Margins;import com.extjs.gxt.ui.client.widget.ContentPanel;import com.extjs.gxt.ui.client.widget.Dialog;import com.extjs.gxt.ui.client.widget.HtmlContainer;import com.extjs.gxt.ui.client.widget.Info;import com.extjs.gxt.ui.client.widget.LayoutContainer;import com.extjs.gxt.ui.client.widget.StoreFilterField;import com.extjs.gxt.ui.client.widget.button.Button;import com.extjs.gxt.ui.client.widget.form.FormPanel;import com.extjs.gxt.ui.client.widget.layout.BorderLayout;import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData;import com.extjs.gxt.ui.client.widget.layout.FitLayout;import com.extjs.gxt.ui.client.widget.layout.FlowLayout;import com.extjs.gxt.ui.client.widget.layout.FormData;import com.extjs.gxt.ui.client.widget.layout.FormLayout;import com.extjs.gxt.ui.client.widget.toolbar.TextToolItem;import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;import com.extjs.gxt.ui.client.widget.tree.Tree;import com.extjs.gxt.ui.client.widget.tree.TreeItem;import com.google.gwt.core.client.GWT;import com.google.gwt.http.client.Request;import com.google.gwt.http.client.RequestBuilder;import com.google.gwt.http.client.RequestCallback;import com.google.gwt.http.client.RequestException;import com.google.gwt.http.client.Response;import com.google.gwt.json.client.JSONArray;import com.google.gwt.json.client.JSONObject;import com.google.gwt.json.client.JSONParser;import com.google.gwt.json.client.JSONValue;import com.google.gwt.user.client.Event;public class AideFenetre extends Dialog {private static final String SERVICE_NOM = "CoelAide";private static final String PAGE_SOMMAIRE_CODE = "AideCoelSommaire";private static final String PAGE_A_OUVRIR_CODE = "AideCoelPresentationGenerale";private static Menu pagePrincipale = null;private static TreeItem treeItemAOuvrirParDefaut = null;private Tree arbre = null;private TreeStore<Menu> magazin = null;private TreeBinder<Menu> binder = null;private StoreFilterField<Menu> filtre = null;private Menu sommaire = null;private ContentPanel sommairePanneau = null;private ContentPanel contenuPanneau = null;private HtmlContainer conteneurDuHtml;private LayoutContainer entetePanneau;public AideFenetre() {setBodyBorder(false);setButtons(Dialog.OK);setIconStyle(ComposantClass.ICONE_PANNEAU_LISTE);setHeading("COEL - Aide");setWidth(675);setHeight(400);setHideOnButtonClick(true);setLayout(new BorderLayout());// Panneau Nord : entêteentetePanneau = new LayoutContainer();entetePanneau.setLayout(new FlowLayout());BorderLayoutData enteteDisposition = new BorderLayoutData(LayoutRegion.NORTH, 30);add(entetePanneau, enteteDisposition);inititialiserSommaireArbreFiltre();// Panneau Ouest : sommairesommairePanneau = new ContentPanel();sommairePanneau.setScrollMode(Scroll.AUTO);BorderLayoutData sommaireDisposition = new BorderLayoutData(LayoutRegion.WEST, 200, 175, 350);sommaireDisposition.setMargins(new Margins(0, 5, 0, 0));sommaireDisposition.setSplit(true);sommaireDisposition.setFloatable(true);Button plierDeplierToutBtn = new Button(null, new SelectionListener<ComponentEvent>() {public void componentSelected(ComponentEvent ce) {Button boutonPlierDeplierTout = (Button) ce.source;String styleIcone = boutonPlierDeplierTout.getIconStyle();if (styleIcone.equals(ComposantClass.ICONE_DEPLIER_TOUT)) {boutonPlierDeplierTout.setIconStyle(ComposantClass.ICONE_REPLIER_TOUT);arbre.expandAll();} else if (styleIcone.equals(ComposantClass.ICONE_REPLIER_TOUT)) {boutonPlierDeplierTout.setIconStyle(ComposantClass.ICONE_DEPLIER_TOUT);arbre.collapseAll();}}});plierDeplierToutBtn.setIconStyle(ComposantClass.ICONE_DEPLIER_TOUT);plierDeplierToutBtn.setToolTip("Étendre le sommaire");sommairePanneau.getHeader().insertTool(plierDeplierToutBtn, 0);add(sommairePanneau, sommaireDisposition);// Chargement de l'arbre du sommaire et de son filtregetSommaireArbreModele();// Panneau Central : contenucontenuPanneau = new ContentPanel();contenuPanneau.setScrollMode(Scroll.AUTO);// Barre d'outilsButton imprimerBtn = new Button(null, new SelectionListener<ComponentEvent>() {public void componentSelected(ComponentEvent ce) {Print.it(conteneurDuHtml.el().getInnerHtml());}});imprimerBtn.setIconStyle(ComposantClass.ICONE_IMPRIMER);contenuPanneau.getHeader().insertTool(imprimerBtn, 0);BorderLayoutData contenuDisposition = new BorderLayoutData(LayoutRegion.CENTER);add(contenuPanneau, contenuDisposition);}private void etendreArbre(TreeItem treeItemAOuvrir) {arbre.setSelectedItem(treeItemAOuvrir);arbre.expandPath(arbre.getSelectedItem().getPath());}private void etendreArbre(String treeItemId) {arbre.setSelectedItem(chercherTreeItemParItemId(treeItemId));arbre.expandPath(arbre.getSelectedItem().getPath());}private void chargerSommaireArbre() {arbre = new Tree();arbre.getStyle().setLeafIconStyle(ComposantClass.ICONE_AIDE);binder = new TreeBinder<Menu>(arbre, magazin);binder.setAutoLoad(true);binder.setDisplayProperty("nom");binder.init();filtre.bind(magazin);arbre.addListener(Events.OnClick, new Listener<TreeEvent>(){public void handleEvent(TreeEvent be) {TreeItem f = be.item;if (f.getModel() != null && f.getModel().get("code") != null) {selectionSommaire((String) f.getModel().get("code"));}}});}private void attribuerIdAuxTreeItem() {List<TreeItem> liste = arbre.getAllItems();Iterator<TreeItem> it = liste.iterator();while (it.hasNext()) {TreeItem ti = (TreeItem) it.next();if (ti.isLeaf()) {String code = (String) ti.getModel().get("code");ti.setItemId(code);definirPageAOuvrirParDefaut(ti);}}}private TreeItem chercherTreeItemParItemId(String itemIdAChercher) {TreeItem treeItemTrouve = null;if (itemIdAChercher != null) {String itemIdAChercherEnMinuscule = itemIdAChercher.toLowerCase();List<TreeItem> liste = arbre.getAllItems();Iterator<TreeItem> it = liste.iterator();while(it.hasNext()) {TreeItem ti = (TreeItem) it.next();if (ti.getModel() != null) {String codePageAide = (String) ti.getModel().get("code");if (codePageAide != null) {String codePageAideEnMinuscule = codePageAide.toLowerCase();if (itemIdAChercherEnMinuscule.equals(codePageAideEnMinuscule)) {treeItemTrouve = ti;break;}}}}}return treeItemTrouve;}private void definirPageAOuvrirParDefaut(TreeItem menu) {String code = menu.getModel().get("code");if (PAGE_A_OUVRIR_CODE.equals(code)) {treeItemAOuvrirParDefaut = menu;}}private void selectionSommaire(String page) {String serviceUrl = ((Configuration) Registry.get(RegistreId.CONFIG)).getServiceBaseUrl();String aidePageUrl = serviceUrl+SERVICE_NOM+"/"+page;GWT.log("Sélection : "+aidePageUrl, null);chargerPageAide(aidePageUrl);}private void chargerPageAide(String url) {GWT.log("Charger : "+url, null);conteneurDuHtml = new HtmlContainer() {public void onBrowserEvent(Event e) {// Nous vérifions que l'évenement est un clic et qu'il a lieu sur un lienif (e.getTypeInt() == Event.ONCLICK && e.getTarget().getTagName().equals("A")) {e.preventDefault();String urlPageAideCible = e.getTarget().toString();chargerPageAide(urlPageAideCible);String codePageAideCible = urlPageAideCible.substring(urlPageAideCible.lastIndexOf("/")+1);etendreArbre(codePageAideCible);GWT.log("Clic : "+urlPageAideCible+"::"+codePageAideCible, null);} else {GWT.log("Event :"+e.getType(), null);}}};conteneurDuHtml.setId(ComposantId.PANNEAU_AIDE);conteneurDuHtml.setWidth(400);conteneurDuHtml.sinkEvents(Event.ONCLICK);conteneurDuHtml.setUrl(url);conteneurDuHtml.recalculate();contenuPanneau.removeAll();contenuPanneau.add(conteneurDuHtml);contenuPanneau.layout();}private void inititialiserSommaireArbreFiltre() {filtre = new StoreFilterField<Menu>() {@Overrideprotected boolean doSelect(Store<Menu> magazin, Menu parent, Menu enregistrement, String propriete, String filtre) {Boolean retour = false;// Seul les feuilles sont traitées par le filtreString nomMenu = enregistrement.getNom();String nomMenuMinuscule = nomMenu.toLowerCase();String nomFiltreMinuscule = filtre.toLowerCase();if (nomMenuMinuscule.matches(".*"+nomFiltreMinuscule+".*")) {retour = true;}return retour;}};filtre.setFieldLabel("Chercher");filtre.setLabelStyle("font-weight:normal;");filtre.setToolTip("Filtrer le sommaire");filtre.setWidth(200);FormLayout fl = new FormLayout();fl.setLabelWidth(55);fl.setPadding(5);ContentPanel fp = new ContentPanel();fp.setHeaderVisible(false);fp.setLayout(fl);fp.add(filtre);entetePanneau.add(fp);}public void getSommaireArbreModele() {String serviceUrl = ((Configuration) Registry.get(RegistreId.CONFIG)).getServiceBaseUrl();String sommairePageUrl = serviceUrl+SERVICE_NOM+"/"+PAGE_SOMMAIRE_CODE+"/sommaire";RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, sommairePageUrl);try {rb.sendRequest(null, new RequestCallback() {public void onError(Request request, Throwable exception) {// Gestion des exceptions déclenchées par l'exécution de la requêteGWT.log("Erreur à l'exécution du service "+SERVICE_NOM+" (selection)", exception);Info.display("Erreur de Requête", "Une erreur s'est produite lors de l'exécution de la requête.");}public void onErrorHTTP(Request request, Response reponse) {// Gestion des erreurs HTTP renvoyé par Apache ou JRestInformation info = new Information("erreur_jrest", JSONParser.parse(reponse.getText()).isArray());GWT.log("Erreur JREST - Code "+reponse.getStatusCode()+"\n"+info.getMessages().toString(), null);Info.display("Erreur JREST - Code "+reponse.getStatusCode(), info.toString());}public void onResponseReceived(Request request, Response response) {// Si le code de réponse HTTP ne vaut pas 200 OK, on lance le mécanise d'erreur HTTPif (response.getStatusCode() != 200) {onErrorHTTP(request, response);} else {if (response.getText().length() != 0 && response.getText() != null) {final JSONValue responseValue = JSONParser.parse(response.getText());JSONArray jsonArray = responseValue.isArray();if (jsonArray != null) {sommaire = new Menu("Sommaire");ajouterMenuRecursivement(sommaire, jsonArray);magazin = new TreeStore<Menu>();magazin.add(sommaire, true);chargerSommaireArbre();attribuerIdAuxTreeItem();sommairePanneau.add(arbre);sommairePanneau.layout();// Chargement de la page racineselectionSommaire(pagePrincipale.getCode());etendreArbre(treeItemAOuvrirParDefaut);} else {GWT.log("\n\tLa réponse n'est pas un objet ou un talbeau JSON et vaut : "+responseValue.toString(), null);}}}}});} catch (RequestException e) {e.printStackTrace();}}private void ajouterMenuRecursivement(Menu brancheSommaire, JSONArray tableau) {final int tailleMax = tableau.size();for (int i = 0; i < tailleMax; i++) {JSONObject pageCourante = tableau.get(i).isObject() ;if (pageCourante != null) {Menu menuCourrant = new Menu();if (pageCourante.get("code") != null) {menuCourrant.setCode(pageCourante.get("code").isString().stringValue());}if (pageCourante.get("txt") != null) {menuCourrant.setNom(pageCourante.get("txt").isString().stringValue());}if (menuCourrant.getNom() == null && menuCourrant.getCode() == null) {menuCourrant = (Menu) brancheSommaire.getChild((brancheSommaire.getChildCount() - 1));} else {if (brancheSommaire != null) {brancheSommaire.add(menuCourrant);if (pagePrincipale == null) {pagePrincipale = menuCourrant;}}}if (pageCourante.get("liste") != null) {ajouterMenuRecursivement(menuCourrant, pageCourante.get("liste").isArray());}}}}}