150 |
gduche |
1 |
package org.tela_botanica.client.vues;
|
|
|
2 |
|
189 |
gduche |
3 |
|
|
|
4 |
|
197 |
gduche |
5 |
import java.util.HashMap;
|
|
|
6 |
import java.util.Iterator;
|
189 |
gduche |
7 |
|
197 |
gduche |
8 |
|
150 |
gduche |
9 |
import org.tela_botanica.client.RegistreId;
|
|
|
10 |
import org.tela_botanica.client.interfaces.Rafraichissable;
|
|
|
11 |
import org.tela_botanica.client.modeles.Personne;
|
227 |
aurelien |
12 |
import org.tela_botanica.client.modeles.PersonneListe;
|
150 |
gduche |
13 |
import org.tela_botanica.client.modeles.StructureListe;
|
|
|
14 |
|
|
|
15 |
import com.extjs.gxt.ui.client.Registry;
|
|
|
16 |
import com.extjs.gxt.ui.client.Style.Scroll;
|
197 |
gduche |
17 |
import com.extjs.gxt.ui.client.event.ComponentEvent;
|
|
|
18 |
import com.extjs.gxt.ui.client.event.KeyListener;
|
150 |
gduche |
19 |
import com.extjs.gxt.ui.client.util.Params;
|
215 |
aurelien |
20 |
import com.extjs.gxt.ui.client.widget.ContentPanel;
|
150 |
gduche |
21 |
import com.extjs.gxt.ui.client.widget.Html;
|
197 |
gduche |
22 |
import com.extjs.gxt.ui.client.widget.LayoutContainer;
|
217 |
aurelien |
23 |
import com.extjs.gxt.ui.client.widget.PagingToolBar;
|
189 |
gduche |
24 |
import com.extjs.gxt.ui.client.widget.TabItem;
|
|
|
25 |
import com.extjs.gxt.ui.client.widget.TabPanel;
|
200 |
gduche |
26 |
import com.extjs.gxt.ui.client.widget.form.Field;
|
197 |
gduche |
27 |
import com.extjs.gxt.ui.client.widget.form.FieldSet;
|
246 |
gduche |
28 |
import com.extjs.gxt.ui.client.widget.form.LabelField;
|
200 |
gduche |
29 |
import com.extjs.gxt.ui.client.widget.form.TextArea;
|
197 |
gduche |
30 |
import com.extjs.gxt.ui.client.widget.form.TextField;
|
215 |
aurelien |
31 |
import com.extjs.gxt.ui.client.widget.layout.CenterLayout;
|
150 |
gduche |
32 |
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
|
197 |
gduche |
33 |
import com.extjs.gxt.ui.client.widget.layout.FlowLayout;
|
|
|
34 |
import com.extjs.gxt.ui.client.widget.layout.FormLayout;
|
|
|
35 |
import com.extjs.gxt.ui.client.widget.layout.TableLayout;
|
217 |
aurelien |
36 |
import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
|
|
|
37 |
import com.extjs.gxt.ui.client.widget.toolbar.ToolItem;
|
197 |
gduche |
38 |
import com.google.gwt.dom.client.LinkElement;
|
|
|
39 |
import com.google.gwt.dom.client.NodeList;
|
|
|
40 |
import com.google.gwt.user.client.Window;
|
189 |
gduche |
41 |
import com.google.gwt.user.client.ui.Hyperlink;
|
197 |
gduche |
42 |
import com.google.gwt.user.client.ui.Image;
|
189 |
gduche |
43 |
import com.google.gwt.user.client.ui.Label;
|
215 |
aurelien |
44 |
import com.google.gwt.user.client.ui.Panel;
|
|
|
45 |
import com.google.gwt.user.client.ui.SimplePanel;
|
200 |
gduche |
46 |
import com.google.gwt.user.client.ui.TextBox;
|
189 |
gduche |
47 |
import com.google.gwt.user.client.ui.Widget;
|
|
|
48 |
import com.google.gwt.user.client.ui.HTMLTable.CellFormatter;
|
150 |
gduche |
49 |
|
189 |
gduche |
50 |
public class PersonneDetailPanneauVue extends TabPanel implements Rafraichissable {
|
150 |
gduche |
51 |
|
197 |
gduche |
52 |
// Le panneau détail se compose de formulaires tabulés
|
189 |
gduche |
53 |
|
197 |
gduche |
54 |
// Onglet 1 : identite & contact
|
215 |
aurelien |
55 |
private TabItem tabIdentite;
|
|
|
56 |
|
|
|
57 |
private ContentPanel panneauIdentite;
|
|
|
58 |
private ContentPanel panneauImage;
|
|
|
59 |
|
197 |
gduche |
60 |
private FieldSet fsIdentite;
|
|
|
61 |
private FieldSet fsContact;
|
189 |
gduche |
62 |
|
200 |
gduche |
63 |
// Onglet 2 : Adresses
|
|
|
64 |
private TabItem tabAdresse;
|
|
|
65 |
private FieldSet fsAdressePerso;
|
198 |
gduche |
66 |
// contient : adresse perso / adresse pro
|
|
|
67 |
|
215 |
aurelien |
68 |
// Onglet 3 : Informations naturalistes
|
|
|
69 |
private TabItem tabInfosNat;
|
198 |
gduche |
70 |
|
|
|
71 |
// > Se baser sur la présentation thunderBird
|
|
|
72 |
|
|
|
73 |
|
150 |
gduche |
74 |
public PersonneDetailPanneauVue() {
|
189 |
gduche |
75 |
|
198 |
gduche |
76 |
//Constructeur de la classe
|
150 |
gduche |
77 |
Registry.register(RegistreId.PANNEAU_PERSONNE_DETAIL, this);
|
189 |
gduche |
78 |
setLayout(new FitLayout());
|
150 |
gduche |
79 |
|
215 |
aurelien |
80 |
tabIdentite = new TabItem("Identité");
|
|
|
81 |
TableLayout tLayout = new TableLayout(2);
|
|
|
82 |
tabIdentite.setLayout(tLayout);
|
|
|
83 |
tabIdentite.setScrollMode(Scroll.AUTO);
|
189 |
gduche |
84 |
|
215 |
aurelien |
85 |
panneauIdentite = new ContentPanel();
|
|
|
86 |
panneauIdentite.setWidth("400px");
|
|
|
87 |
panneauIdentite.setHeaderVisible(false);
|
|
|
88 |
panneauIdentite.setBorders(false);
|
|
|
89 |
panneauIdentite.setBodyBorder(false);
|
|
|
90 |
panneauImage = new ContentPanel();
|
|
|
91 |
panneauImage.setWidth("350px");
|
|
|
92 |
panneauImage.setBorders(false);
|
|
|
93 |
panneauImage.setBodyBorder(false);
|
|
|
94 |
panneauImage.setHeaderVisible(false);
|
|
|
95 |
panneauImage.setStyleName("conteneur-image-centre");
|
200 |
gduche |
96 |
|
215 |
aurelien |
97 |
tabIdentite.add(panneauIdentite);
|
|
|
98 |
tabIdentite.add(panneauImage);
|
|
|
99 |
|
197 |
gduche |
100 |
fsIdentite = new FieldSet();
|
|
|
101 |
fsIdentite.setLayout(new FormLayout());
|
|
|
102 |
|
|
|
103 |
|
|
|
104 |
fsContact = new FieldSet();
|
|
|
105 |
fsContact.setLayout(new FormLayout());
|
|
|
106 |
|
215 |
aurelien |
107 |
this.add(tabIdentite);
|
197 |
gduche |
108 |
|
200 |
gduche |
109 |
//Onglet Adresse:
|
215 |
aurelien |
110 |
tabAdresse = new TabItem("Adresse");
|
200 |
gduche |
111 |
fsAdressePerso = new FieldSet();
|
|
|
112 |
fsAdressePerso.setLayout(new FormLayout());
|
|
|
113 |
|
215 |
aurelien |
114 |
this.add(tabAdresse);
|
200 |
gduche |
115 |
|
215 |
aurelien |
116 |
//Onglet info naturalistes
|
|
|
117 |
tabInfosNat = new TabItem("Informations naturalistes");
|
200 |
gduche |
118 |
|
215 |
aurelien |
119 |
this.add(tabInfosNat);
|
198 |
gduche |
120 |
|
150 |
gduche |
121 |
}
|
|
|
122 |
|
|
|
123 |
public void afficherDetailPersonne(Personne personne) {
|
|
|
124 |
if (personne != null) {
|
198 |
gduche |
125 |
|
|
|
126 |
|
|
|
127 |
//MAJ Identité : Configurer les fieldSet
|
215 |
aurelien |
128 |
panneauIdentite.removeAll();
|
|
|
129 |
panneauImage.removeAll();
|
150 |
gduche |
130 |
|
197 |
gduche |
131 |
fsIdentite.setHeading("Identité");
|
|
|
132 |
fsIdentite.setWidth("350px");
|
183 |
gduche |
133 |
|
197 |
gduche |
134 |
fsContact.setHeading("Contact");
|
|
|
135 |
fsContact.setWidth("350px");
|
183 |
gduche |
136 |
|
197 |
gduche |
137 |
|
215 |
aurelien |
138 |
panneauIdentite.add(fsIdentite);
|
|
|
139 |
|
198 |
gduche |
140 |
//La personne peut avoir un logo
|
197 |
gduche |
141 |
String logoUrl = (String) personne.obtenirValeurChamp("truk_logo");
|
198 |
gduche |
142 |
|
197 |
gduche |
143 |
if ((logoUrl!=null)&&(!logoUrl.trim().equals(""))) {
|
198 |
gduche |
144 |
//Si c'est le cas, on l'affiche sur la même ligne que fsIdentité
|
197 |
gduche |
145 |
Image img = new Image();
|
|
|
146 |
img.setUrl(logoUrl);
|
200 |
gduche |
147 |
img.setStyleName("logo-personne");
|
215 |
aurelien |
148 |
|
246 |
gduche |
149 |
panneauImage.add(img);
|
|
|
150 |
|
|
|
151 |
// FIXME : problème avec la taille du panneau > ne se fixe pas automatiquement à la taille de l'image
|
|
|
152 |
|
|
|
153 |
panneauImage.setBorders(true);
|
189 |
gduche |
154 |
}
|
150 |
gduche |
155 |
|
215 |
aurelien |
156 |
panneauIdentite.add(fsContact);
|
183 |
gduche |
157 |
|
197 |
gduche |
158 |
fsIdentite.removeAll();
|
|
|
159 |
fsContact.removeAll();
|
215 |
aurelien |
160 |
fsAdressePerso.removeAll();
|
197 |
gduche |
161 |
//Ajout des champs Identité
|
|
|
162 |
|
|
|
163 |
|
|
|
164 |
|
|
|
165 |
// TODO: projet
|
|
|
166 |
|
|
|
167 |
// nom complet
|
|
|
168 |
Object nomComplet = personne.obtenirValeurChamp("fmt_nom_complet");
|
|
|
169 |
ajouterTextFieldNonEditable(fsIdentite,"Nom", nomComplet);
|
|
|
170 |
|
|
|
171 |
|
|
|
172 |
// TODO : nom autre
|
|
|
173 |
|
|
|
174 |
// abreviation
|
|
|
175 |
Object abreviation = personne.obtenirValeurChamp("abreviation");
|
|
|
176 |
ajouterTextFieldNonEditable(fsIdentite, "Abreviation", abreviation);
|
|
|
177 |
|
|
|
178 |
// date naissance
|
|
|
179 |
Object dateNaissance = personne.obtenirValeurChamp("date_naissance");
|
|
|
180 |
ajouterTextFieldNonEditable(fsIdentite, "Date de naissance", dateNaissance);
|
|
|
181 |
|
|
|
182 |
// lieu naissance
|
|
|
183 |
Object lieuNaissance = personne.obtenirValeurChamp("lieu_naissance");
|
|
|
184 |
ajouterTextFieldNonEditable(fsIdentite, "Lieu de naissance", lieuNaissance);
|
|
|
185 |
|
|
|
186 |
// date deces
|
|
|
187 |
Object dateDeces = personne.obtenirValeurChamp("date_deces");
|
|
|
188 |
ajouterTextFieldNonEditable(fsIdentite, "Date de décès", dateDeces);
|
|
|
189 |
|
|
|
190 |
// lieu deces
|
|
|
191 |
Object lieuDeces = personne.obtenirValeurChamp("lieu_deces");
|
|
|
192 |
ajouterTextFieldNonEditable(fsIdentite, "Lieu de décès", lieuDeces);
|
|
|
193 |
|
200 |
gduche |
194 |
//Description
|
|
|
195 |
String description = (String) personne.obtenirValeurChamp("description");
|
|
|
196 |
if ((description!=null)&&(!description.trim().equals(""))) {
|
|
|
197 |
TextArea txtDescription = new TextArea();
|
|
|
198 |
txtDescription.setFieldLabel("Description");
|
|
|
199 |
txtDescription.setValue(description);
|
|
|
200 |
|
|
|
201 |
rendreNonEditable(txtDescription);
|
|
|
202 |
|
|
|
203 |
fsIdentite.add(txtDescription);
|
|
|
204 |
}
|
197 |
gduche |
205 |
|
|
|
206 |
|
|
|
207 |
//CONTACT
|
|
|
208 |
|
215 |
aurelien |
209 |
// Courriel est un champ TRUK
|
198 |
gduche |
210 |
// on doit afficher N entrées
|
215 |
aurelien |
211 |
// Voir si le | (pipe) est bien le bon séparateur
|
|
|
212 |
String courriels = (String) personne.obtenirValeurChamp("truk_courriel");
|
|
|
213 |
String[] tabCourriel = courriels.split("\\|");
|
|
|
214 |
Html intituleHTML = new Html("<b style=\"margin:0 50px 0 0 ; color:black;\">Courriel:</b>");
|
|
|
215 |
fsContact.add(intituleHTML);
|
|
|
216 |
|
|
|
217 |
for(int i = 0 ; i < tabCourriel.length ; i++) {
|
|
|
218 |
String courriel = tabCourriel[i];
|
|
|
219 |
Hyperlink lnkCourriel = new Hyperlink();
|
|
|
220 |
lnkCourriel.setHTML("<a href=\"mailto:" + courriel + "\">" + courriel + "</a>");
|
|
|
221 |
fsContact.add(lnkCourriel);
|
|
|
222 |
}
|
197 |
gduche |
223 |
|
215 |
aurelien |
224 |
panneauIdentite.add(fsContact);
|
197 |
gduche |
225 |
|
198 |
gduche |
226 |
|
215 |
aurelien |
227 |
fsAdressePerso.setHeading("Adresse personnelle");
|
|
|
228 |
|
198 |
gduche |
229 |
/*
|
|
|
230 |
* Adresses :
|
215 |
aurelien |
231 |
* */
|
197 |
gduche |
232 |
String adresse01 = (String) personne.obtenirValeurChamp("adresse_01");
|
215 |
aurelien |
233 |
ajouterTextFieldNonEditable(fsAdressePerso, "Adresse", adresse01);
|
197 |
gduche |
234 |
|
|
|
235 |
|
|
|
236 |
String adresse02 = (String) personne.obtenirValeurChamp("adresse_02");
|
215 |
aurelien |
237 |
ajouterTextFieldNonEditable(fsAdressePerso, "", adresse02);
|
197 |
gduche |
238 |
|
|
|
239 |
String boitePostale = (String) personne.obtenirValeurChamp("bp");
|
215 |
aurelien |
240 |
ajouterTextFieldNonEditable(fsAdressePerso, "Boite Postale", boitePostale);
|
197 |
gduche |
241 |
|
|
|
242 |
String codePostal = (String) personne.obtenirValeurChamp("code_postal");
|
215 |
aurelien |
243 |
ajouterTextFieldNonEditable(fsAdressePerso, "Code postal", codePostal);
|
197 |
gduche |
244 |
|
|
|
245 |
String ville = (String) personne.obtenirValeurChamp("ville");
|
215 |
aurelien |
246 |
ajouterTextFieldNonEditable(fsAdressePerso, "Ville", ville);
|
197 |
gduche |
247 |
|
|
|
248 |
String region = (String) personne.obtenirValeurChamp("region");
|
215 |
aurelien |
249 |
ajouterTextFieldNonEditable(fsAdressePerso, "Région", region);
|
197 |
gduche |
250 |
|
|
|
251 |
String pays = (String) personne.obtenirValeurChamp("pays");
|
215 |
aurelien |
252 |
ajouterTextFieldNonEditable(fsAdressePerso, "Pays", pays);
|
197 |
gduche |
253 |
|
215 |
aurelien |
254 |
fsAdressePerso.addText("<br >");
|
|
|
255 |
fsAdressePerso.setWidth("350px");
|
197 |
gduche |
256 |
|
215 |
aurelien |
257 |
tabAdresse.add(fsAdressePerso);
|
|
|
258 |
tabAdresse.setScrollMode(Scroll.AUTO);
|
246 |
gduche |
259 |
|
215 |
aurelien |
260 |
|
150 |
gduche |
261 |
layout();
|
197 |
gduche |
262 |
}
|
|
|
263 |
}
|
|
|
264 |
|
200 |
gduche |
265 |
private void ajouterTextFieldNonEditable(FieldSet fs, String tfLabel, Object tfValue) {
|
197 |
gduche |
266 |
|
|
|
267 |
if ((tfValue!=null)&&(!tfValue.toString().trim().equals(""))) {
|
189 |
gduche |
268 |
|
246 |
gduche |
269 |
|
|
|
270 |
LabelField tf = new LabelField();
|
197 |
gduche |
271 |
|
246 |
gduche |
272 |
tf.setFieldLabel(tfLabel + ":");
|
197 |
gduche |
273 |
if ((tfLabel==null)||("".equals(tfLabel))) {
|
|
|
274 |
tf.setHideLabel(true);
|
|
|
275 |
tf.setStyleAttribute("margin", "0 0 0 105px");
|
|
|
276 |
}
|
|
|
277 |
tf.setValue(tfValue);
|
|
|
278 |
|
|
|
279 |
// Non éditable : on empêche l'évènement par défaut
|
200 |
gduche |
280 |
rendreNonEditable(tf);
|
246 |
gduche |
281 |
|
200 |
gduche |
282 |
//Ajout au fieldSet
|
|
|
283 |
fs.add(tf);
|
|
|
284 |
}
|
|
|
285 |
}
|
|
|
286 |
|
|
|
287 |
private void rendreNonEditable(Field field) {
|
197 |
gduche |
288 |
|
200 |
gduche |
289 |
field.addKeyListener(new KeyListener() {
|
197 |
gduche |
290 |
public void componentKeyPress(ComponentEvent ev) {
|
|
|
291 |
ev.stopEvent();
|
|
|
292 |
}
|
|
|
293 |
});
|
200 |
gduche |
294 |
}
|
197 |
gduche |
295 |
|
|
|
296 |
|
183 |
gduche |
297 |
public void rafraichir(Object nouvelleDonnees) {
|
227 |
aurelien |
298 |
|
|
|
299 |
// Si on a reçu une personne on en affiche les détails
|
183 |
gduche |
300 |
if (nouvelleDonnees instanceof Personne) {
|
|
|
301 |
afficherDetailPersonne((Personne) nouvelleDonnees);
|
227 |
aurelien |
302 |
}
|
150 |
gduche |
303 |
}
|
|
|
304 |
|
197 |
gduche |
305 |
}
|