Rev 198 | Rev 215 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
package org.tela_botanica.client.vues;import java.util.HashMap;import java.util.Iterator;import org.tela_botanica.client.RegistreId;import org.tela_botanica.client.interfaces.Rafraichissable;import org.tela_botanica.client.modeles.Personne;import org.tela_botanica.client.modeles.StructureListe;import com.extjs.gxt.ui.client.Registry;import com.extjs.gxt.ui.client.Style.Scroll;import com.extjs.gxt.ui.client.event.ComponentEvent;import com.extjs.gxt.ui.client.event.KeyListener;import com.extjs.gxt.ui.client.util.Params;import com.extjs.gxt.ui.client.widget.Html;import com.extjs.gxt.ui.client.widget.LayoutContainer;import com.extjs.gxt.ui.client.widget.TabItem;import com.extjs.gxt.ui.client.widget.TabPanel;import com.extjs.gxt.ui.client.widget.form.Field;import com.extjs.gxt.ui.client.widget.form.FieldSet;import com.extjs.gxt.ui.client.widget.form.TextArea;import com.extjs.gxt.ui.client.widget.form.TextField;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.FormLayout;import com.extjs.gxt.ui.client.widget.layout.TableLayout;import com.google.gwt.dom.client.LinkElement;import com.google.gwt.dom.client.NodeList;import com.google.gwt.user.client.Window;import com.google.gwt.user.client.ui.Hyperlink;import com.google.gwt.user.client.ui.Image;import com.google.gwt.user.client.ui.Label;import com.google.gwt.user.client.ui.TextBox;import com.google.gwt.user.client.ui.Widget;import com.google.gwt.user.client.ui.HTMLTable.CellFormatter;public class PersonneDetailPanneauVue extends TabPanel implements Rafraichissable {// Le panneau détail se compose de formulaires tabulés// Onglet 1 : identite & contactprivate TabItem identite;private FieldSet fsIdentite;private FieldSet fsContact;// Onglet 2 : Adressesprivate TabItem tabAdresse;private FieldSet fsAdressePerso;// contient : adresse perso / adresse pro//TODO : Onglet Info Naturaliste// > Se baser sur la présentation thunderBirdpublic PersonneDetailPanneauVue() {//Constructeur de la classeRegistry.register(RegistreId.PANNEAU_PERSONNE_DETAIL, this);setLayout(new FitLayout());identite = new TabItem("Identité");identite.setLayout(new TableLayout(2));identite.setScrollMode(Scroll.AUTO);/** NOTES : J'ai utilisé un TableLayout pour avoir une présentation ou l'image, si elle existe, soit placée à droite des informations d'identité.* Cependant, une imagetrop grande bouleverse la mise en page.* Il faut trouver une solution pour fixer ca :* - par CSS ?* - utiliser un FlexTable ?* - utiliser plusieurs panneaux?* */fsIdentite = new FieldSet();fsIdentite.setLayout(new FormLayout());fsContact = new FieldSet();fsContact.setLayout(new FormLayout());this.add(identite);//Onglet Adresse:tabAdresse = new TabItem("Adresses");fsAdressePerso = new FieldSet();fsAdressePerso.setLayout(new FormLayout());//TODO : ajouter info naturaliste}public void afficherDetailPersonne(Personne personne) {if (personne != null) {//MAJ Identité : Configurer les fieldSetidentite.removeAll();fsIdentite.setHeading("Identité");fsIdentite.setWidth("350px");fsContact.setHeading("Contact");fsContact.setWidth("350px");identite.add(fsIdentite);//La personne peut avoir un logoString logoUrl = (String) personne.obtenirValeurChamp("truk_logo");if ((logoUrl!=null)&&(!logoUrl.trim().equals(""))) {//Si c'est le cas, on l'affiche sur la même ligne que fsIdentitéImage img = new Image();img.setUrl(logoUrl);img.setStyleName("logo-personne");// FIXME : pour avoir un affichage correct, je force la redimension à 300px. Idéalement, ce serait un max-height qu'il faudrait.// FIXME : L'image devrait se mettre sur deux lignes au lieu d'une, ca décale tout ...img.setHeight("300px");identite.add(img);} else {//Sinon, on doit mettre une case vide pour garder une présentation en colonne de fsIdentite & fsContactidentite.add(new Label());}identite.add(fsContact);fsIdentite.removeAll();fsContact.removeAll();//Ajout des champs Identité// TODO: projet// nom completObject nomComplet = personne.obtenirValeurChamp("fmt_nom_complet");ajouterTextFieldNonEditable(fsIdentite,"Nom", nomComplet);// TODO : nom autre// abreviationObject abreviation = personne.obtenirValeurChamp("abreviation");ajouterTextFieldNonEditable(fsIdentite, "Abreviation", abreviation);// date naissanceObject dateNaissance = personne.obtenirValeurChamp("date_naissance");ajouterTextFieldNonEditable(fsIdentite, "Date de naissance", dateNaissance);// lieu naissanceObject lieuNaissance = personne.obtenirValeurChamp("lieu_naissance");ajouterTextFieldNonEditable(fsIdentite, "Lieu de naissance", lieuNaissance);// date decesObject dateDeces = personne.obtenirValeurChamp("date_deces");ajouterTextFieldNonEditable(fsIdentite, "Date de décès", dateDeces);// lieu decesObject lieuDeces = personne.obtenirValeurChamp("lieu_deces");ajouterTextFieldNonEditable(fsIdentite, "Lieu de décès", lieuDeces);//DescriptionString description = (String) personne.obtenirValeurChamp("description");if ((description!=null)&&(!description.trim().equals(""))) {TextArea txtDescription = new TextArea();txtDescription.setFieldLabel("Description");txtDescription.setValue(description);rendreNonEditable(txtDescription);fsIdentite.add(txtDescription);}//CONTACT//FIXME : courriel est un champ TRUK// on doit afficher N entréesString courriel = (String) personne.obtenirValeurChamp("courriel");Hyperlink lnkCourriel = new Hyperlink();lnkCourriel.setHTML("<b style=\"margin:0 50px 0 0 ; color:black;\">Courriel:</b><a href=\"mailto:" + courriel + "\">" + courriel + "</a>");fsContact.add(lnkCourriel);fsContact.addText("<br >");/** Adresses :String adresse01 = (String) personne.obtenirValeurChamp("adresse_01");ajouterTextFieldNonEditable(fsContact, "Adresse", adresse01);String adresse02 = (String) personne.obtenirValeurChamp("adresse_02");ajouterTextFieldNonEditable(fsContact, "", adresse02);String boitePostale = (String) personne.obtenirValeurChamp("bp");ajouterTextFieldNonEditable(fsContact, "Boite Postale", boitePostale);String codePostal = (String) personne.obtenirValeurChamp("code_postal");ajouterTextFieldNonEditable(fsContact, "Code postal", codePostal);String ville = (String) personne.obtenirValeurChamp("ville");ajouterTextFieldNonEditable(fsContact, "Ville", ville);String region = (String) personne.obtenirValeurChamp("region");ajouterTextFieldNonEditable(fsContact, "Région", region);String pays = (String) personne.obtenirValeurChamp("pays");ajouterTextFieldNonEditable(fsContact, "Pays", pays);fsContact.addText("<br >"); */layout();}}private void ajouterTextFieldNonEditable(FieldSet fs, String tfLabel, Object tfValue) {if ((tfValue!=null)&&(!tfValue.toString().trim().equals(""))) {TextField tf = new TextField();tf.setFieldLabel(tfLabel);if ((tfLabel==null)||("".equals(tfLabel))) {tf.setHideLabel(true);tf.setStyleAttribute("margin", "0 0 0 105px");}tf.setValue(tfValue);// Non éditable : on empêche l'évènement par défautrendreNonEditable(tf);//Ajout au fieldSetfs.add(tf);}}private void rendreNonEditable(Field field) {field.addKeyListener(new KeyListener() {public void componentKeyPress(ComponentEvent ev) {ev.stopEvent();}});}public void rafraichir(Object nouvelleDonnees) {if (nouvelleDonnees instanceof Personne) {afficherDetailPersonne((Personne) nouvelleDonnees);} else if (nouvelleDonnees instanceof StructureListe) {StructureListe listeInstitutions = (StructureListe) nouvelleDonnees;// Test pour savoir si la liste contient des élémentsif (listeInstitutions.size() == 0) {afficherDetailPersonne(null);}}}}