1 /*
2  *   file: form_address.c
3  *
4  *  Copyright (C) Nicola Fragale <nicolafragale@libero.it>
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 2 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, write to the Free Software
18  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19  */
20 
21 #include <gtk/gtk.h>
22 #include <glib/gi18n-lib.h>
23 #include <glade/glade.h>
24 
25 #include "libral.h"
26 
27 #include "app.h"
28 #include "form.h"
29 #include "form_address.h"
30 #include "groups_cb.h"
31 #include "models.h"
32 #include "types.h"
33 #include "utils.h"
34 
35 
36 struct _RubricaFormAddressPrivate {
37   GtkWidget* st;
38   GtkWidget* num;
39   GtkWidget* zip;
40   GtkWidget* city;
41   GtkWidget* prov;
42   GtkWidget* state;
43   GtkWidget* country;
44   GtkWidget* add_type;
45   GtkWidget* add_tree;
46   GtkWidget* add_add;
47   GtkWidget* add_del;
48   GtkWidget* add_mod;
49 
50   gboolean dispose_has_run;
51 };
52 
53 
54 static void rubrica_form_address_class_init (RubricaFormAddressClass* klass);
55 static void rubrica_form_address_init       (RubricaFormAddress* obj);
56 
57 static void rubrica_form_address_dispose    (RubricaFormAddress* obj);
58 static void rubrica_form_address_finalize   (RubricaFormAddress* obj);
59 
60 
61 static gboolean extract_addresses         (GtkTreeModel *model,
62 					   GtkTreePath *path,
63 					   GtkTreeIter *iter, gpointer data);
64 
65 static void     form_address_extract_data (RubricaFormAddress* form,
66 					   RCard *card);
67 static void     form_address_display_data (RubricaFormAddress* form,
68 					   RCard *card);
69 static void     form_address_clean_form   (RubricaFormAddress* form);
70 
71 
72 static RubricaFormClass* parent_class;
73 
74 
75 GType
rubrica_form_address_get_type()76 rubrica_form_address_get_type()
77 {
78   static GType form_address_type = 0;
79 
80   if (!form_address_type)
81     {
82       static const GTypeInfo form_address_info =
83 	{
84 	  sizeof(RubricaFormAddressClass),
85 	  NULL,
86 	  NULL,
87 	  (GClassInitFunc) rubrica_form_address_class_init,
88 	  NULL,
89 	  NULL,
90 	  sizeof(RubricaFormAddress),
91 	  0,
92 	  (GInstanceInitFunc) rubrica_form_address_init
93 	};
94 
95       form_address_type = g_type_register_static (RUBRICA_FORM_TYPE,
96 						  "RubricaFormAddress",
97 						  &form_address_info, 0);
98     }
99 
100   return form_address_type;
101 }
102 
103 
104 static void
rubrica_form_address_class_init(RubricaFormAddressClass * klass)105 rubrica_form_address_class_init(RubricaFormAddressClass* klass)
106 {
107   GObjectClass *class;
108 
109   class  = G_OBJECT_CLASS (klass);
110   class->dispose  = (GObjectFinalizeFunc) rubrica_form_address_dispose;
111   class->finalize = (GObjectFinalizeFunc) rubrica_form_address_finalize;
112 
113   parent_class = RUBRICA_FORM_CLASS(klass);
114   parent_class->extract_data = (gpointer) form_address_extract_data;
115   parent_class->display_data = (gpointer) form_address_display_data;
116   parent_class->clean_form   = (gpointer) form_address_clean_form;
117 }
118 
119 
120 static void
rubrica_form_address_init(RubricaFormAddress * self)121 rubrica_form_address_init(RubricaFormAddress* self)
122 {
123   self->priv = g_new(RubricaFormAddressPrivate, 1);
124 
125   self->priv->st       = NULL;
126   self->priv->num      = NULL;
127   self->priv->zip      = NULL;
128   self->priv->city     = NULL;
129   self->priv->prov     = NULL;
130   self->priv->state    = NULL;
131   self->priv->country  = NULL;
132   self->priv->add_type = NULL;
133   self->priv->add_tree = NULL;
134   self->priv->add_add  = NULL;
135   self->priv->add_del  = NULL;
136   self->priv->add_mod  = NULL;
137 
138   self->priv->dispose_has_run = FALSE;
139 }
140 
141 
142 
143 static void
rubrica_form_address_dispose(RubricaFormAddress * self)144 rubrica_form_address_dispose (RubricaFormAddress* self)
145 {
146   g_return_if_fail(IS_RUBRICA_FORM(self));
147 
148   if (self->priv->dispose_has_run)
149     return;
150 
151   g_object_unref(self->priv->st);
152   g_object_unref(self->priv->num);
153   g_object_unref(self->priv->zip);
154   g_object_unref(self->priv->city);
155   g_object_unref(self->priv->prov);
156   g_object_unref(self->priv->state);
157   g_object_unref(self->priv->country);
158   g_object_unref(self->priv->add_type);
159   g_object_unref(self->priv->add_tree);
160   g_object_unref(self->priv->add_add);
161   g_object_unref(self->priv->add_del);
162   g_object_unref(self->priv->add_mod);
163 
164   self->priv->dispose_has_run = TRUE;
165 }
166 
167 
168 static void
rubrica_form_address_finalize(RubricaFormAddress * self)169 rubrica_form_address_finalize (RubricaFormAddress* self)
170 {
171   g_return_if_fail(IS_RUBRICA_FORM(self));
172 
173   g_free(self->priv);
174   self->priv = NULL;
175 }
176 
177 
178 gboolean
extract_addresses(GtkTreeModel * model,GtkTreePath * path,GtkTreeIter * iter,gpointer data)179 extract_addresses (GtkTreeModel *model, GtkTreePath *path,
180 		   GtkTreeIter *iter, gpointer data)
181 {
182   RCard* card = (RCard*) data;
183   RAddress* address = NULL;
184   RAddressType adtype;
185   gchar *type, *street, *number, *city;
186   gchar *zip, *province, *state, *country;
187 
188   gtk_tree_model_get(model, iter,
189 		     ADDRESS_STREET_COLUMN,   &street,
190 		     ADDRESS_NUMBER_COLUMN,   &number,
191 		     ADDRESS_CITY_COLUMN,     &city,
192 		     ADDRESS_TYPE_COLUMN,     &type,
193 		     ADDRESS_ZIP_COLUMN,      &zip,
194 		     ADDRESS_PROVINCE_COLUMN, &province,
195 		     ADDRESS_STATE_COLUMN,    &state,
196 		     ADDRESS_COUNTRY_COLUMN,  &country,
197 		     -1);
198   adtype = r_address_lookup_str2enum(type);
199 
200   address = r_address_new();
201   g_object_set(address, "address-type", adtype, "street", street,
202 	       "street-number", number, "city", city, "zip", zip,
203 	       "province", province, "state", state,
204 	       "country", country, NULL);
205   r_card_add_address(R_CARD(card), address);
206 
207   return FALSE;
208 }
209 
210 
211 static void
form_address_extract_data(RubricaFormAddress * form,RCard * card)212 form_address_extract_data (RubricaFormAddress* form, RCard *card)
213 {
214   GtkTreeModel* model = NULL;
215 
216   g_return_if_fail(IS_R_CARD(card));
217 
218   model = gtk_tree_view_get_model(GTK_TREE_VIEW(form->priv->add_tree));
219   if (model)
220     {
221       gtk_tree_model_foreach(GTK_TREE_MODEL(model), extract_addresses, card);
222       g_object_unref(model);
223     }
224 }
225 
226 
227 static void
form_address_display_data(RubricaFormAddress * form,RCard * card)228 form_address_display_data (RubricaFormAddress* form, RCard *card)
229 {
230   GtkTreeView* tree;
231   GtkTreeModel *model;
232   GtkTreeIter iter;
233   gpointer data;
234 
235   gtk_combo_box_set_active(GTK_COMBO_BOX(form->priv->add_type),
236 			   R_ADDRESS_PREF);
237 
238   tree  = (GtkTreeView*) form->priv->add_tree;
239   model = gtk_tree_view_get_model(tree);
240 
241   data = r_card_get_address(R_CARD(card));
242   for (; data; data = r_card_get_next_address(R_CARD(card)))
243     {
244       RAddressType adtype;
245       gchar *street, *number, *city, *label, *type;
246       gchar *zip, *province, *state, *country;
247 
248       g_object_get(R_ADDRESS(data), "address-type", &adtype,
249 		   "street", &street, "street-number", &number,
250 		   "city", &city, "zip", &zip, "province", &province,
251 		   "state", &state, "country", &country, NULL);
252       label = r_address_lookup_enum2lbl(adtype);
253       type  = r_address_lookup_enum2str(adtype);
254 
255       gtk_list_store_append(GTK_LIST_STORE(model), &iter);
256       gtk_list_store_set(GTK_LIST_STORE(model), &iter,
257 			 ADDRESS_STREET_COLUMN,   street,
258 			 ADDRESS_NUMBER_COLUMN,   number,
259 			 ADDRESS_CITY_COLUMN,     city,
260 			 ADDRESS_LABEL_COLUMN,    _(label),
261 			 ADDRESS_TYPE_COLUMN,     type,
262 			 ADDRESS_ZIP_COLUMN,      zip,
263 			 ADDRESS_PROVINCE_COLUMN, province,
264 			 ADDRESS_STATE_COLUMN,    state,
265 			 ADDRESS_COUNTRY_COLUMN,  country,
266 			 -1);
267     }
268 }
269 
270 
271 static void
form_address_clean_form(RubricaFormAddress * form)272 form_address_clean_form (RubricaFormAddress* form)
273 {
274   GtkTreeModel *model;
275 
276   gtk_entry_set_text(GTK_ENTRY(form->priv->st),      "");
277   gtk_entry_set_text(GTK_ENTRY(form->priv->num),     "");
278   gtk_entry_set_text(GTK_ENTRY(form->priv->zip),     "");
279   gtk_entry_set_text(GTK_ENTRY(form->priv->city),    "");
280   gtk_entry_set_text(GTK_ENTRY(form->priv->prov),    "");
281   gtk_entry_set_text(GTK_ENTRY(form->priv->state),   "");
282   gtk_entry_set_text(GTK_ENTRY(form->priv->country), "");
283 
284   gtk_combo_box_set_active(GTK_COMBO_BOX(form->priv->add_type),
285 			   R_ADDRESS_PREF);
286 
287   model = gtk_tree_view_get_model(GTK_TREE_VIEW(form->priv->add_tree));
288   gtk_list_store_clear(GTK_LIST_STORE(model));
289 }
290 
291 
292 /*  Callbacks
293 */
294 void
form_addresses_list_activated(GtkTreeSelection * selection,gpointer data)295 form_addresses_list_activated(GtkTreeSelection *selection, gpointer data)
296 {
297   RubricaFormAddress* form = (RubricaFormAddress*) data;
298   GtkTreeModel *model;
299   GtkTreeIter iter;
300 
301   model = gtk_tree_view_get_model(GTK_TREE_VIEW(form->priv->add_tree));
302 
303   if (gtk_tree_selection_get_selected(selection, &model, &iter))
304     {
305       RAddressType adtype;
306       gchar *street, *number, *city, *zip;
307       gchar *province, *state, *country, *type;
308 
309       gtk_tree_model_get(model, &iter,
310 			 ADDRESS_STREET_COLUMN,   &street,
311 			 ADDRESS_NUMBER_COLUMN,   &number,
312 			 ADDRESS_CITY_COLUMN,     &city,
313 			 ADDRESS_TYPE_COLUMN,     &type,
314 			 ADDRESS_ZIP_COLUMN,      &zip,
315 			 ADDRESS_PROVINCE_COLUMN, &province,
316 			 ADDRESS_STATE_COLUMN,    &state,
317 			 ADDRESS_COUNTRY_COLUMN,  &country,
318 			 -1);
319       adtype = r_address_lookup_str2enum(type);
320 
321       gtk_combo_box_set_active(GTK_COMBO_BOX(form->priv->add_type), adtype);
322       gtk_entry_set_text(GTK_ENTRY(form->priv->st),      street ? street : "");
323       gtk_entry_set_text(GTK_ENTRY(form->priv->num),     number ? number : "");
324       gtk_entry_set_text(GTK_ENTRY(form->priv->zip),     zip  ? zip : "");
325       gtk_entry_set_text(GTK_ENTRY(form->priv->city),    city ? city : "");
326       gtk_entry_set_text(GTK_ENTRY(form->priv->prov),
327 			 province ? province : "");
328       gtk_entry_set_text(GTK_ENTRY(form->priv->state),   state ? state : "");
329       gtk_entry_set_text(GTK_ENTRY(form->priv->country),
330 			 country ? country : "");
331 
332       gtk_widget_set_sensitive(form->priv->add_mod, TRUE);
333       gtk_widget_set_sensitive(form->priv->add_del, TRUE);
334     }
335 }
336 
337 
338 void
form_address_add_clicked(GtkButton * button,gpointer data)339 form_address_add_clicked (GtkButton *button, gpointer data)
340 {
341   GtkTreeModel *model;
342   GtkTreeIter iter;
343   RubricaFormAddress *form = (RubricaFormAddress*) data;
344   RAddress* address;
345   RAddressType addtype;
346   gchar *street, *number, *city, *zip, *type;
347   gchar *label, *prov, *state, *country;
348 
349   gtk_widget_set_sensitive(GTK_WIDGET(form->priv->add_mod), FALSE);
350   gtk_widget_set_sensitive(GTK_WIDGET(form->priv->add_del), FALSE);
351 
352   model = gtk_tree_view_get_model(GTK_TREE_VIEW(form->priv->add_tree));
353   g_return_if_fail(GTK_IS_TREE_MODEL(model));
354 
355   address = r_address_new();
356 
357   addtype = gtk_combo_box_get_active(GTK_COMBO_BOX(form->priv->add_type));
358   street  = g_strdup(gtk_entry_get_text(GTK_ENTRY(form->priv->st)));
359   number  = g_strdup(gtk_entry_get_text(GTK_ENTRY(form->priv->num)));
360   city    = g_strdup(gtk_entry_get_text(GTK_ENTRY(form->priv->city)));
361   zip     = g_strdup(gtk_entry_get_text(GTK_ENTRY(form->priv->zip)));
362   prov    = g_strdup(gtk_entry_get_text(GTK_ENTRY(form->priv->prov)));
363   state   = g_strdup(gtk_entry_get_text(GTK_ENTRY(form->priv->state)));
364   country = g_strdup(gtk_entry_get_text(GTK_ENTRY(form->priv->country)));
365 
366   g_object_set(address, "address-type", addtype, "street", street,
367 	       "street-number", number, "city", city, "zip", zip,
368 	       "province", prov, "state", state, "country", country, NULL);
369 
370   type  = r_address_lookup_enum2str(addtype);
371   label = _(r_address_lookup_enum2lbl(addtype));
372 
373   gtk_list_store_append(GTK_LIST_STORE(model), &iter);
374   gtk_list_store_set(GTK_LIST_STORE(model), &iter,
375 		     ADDRESS_STREET_COLUMN,   street,
376 		     ADDRESS_NUMBER_COLUMN,   number,
377 		     ADDRESS_LABEL_COLUMN,    label,
378 		     ADDRESS_TYPE_COLUMN,     type,
379 		     ADDRESS_CITY_COLUMN,     city,
380 		     ADDRESS_ZIP_COLUMN,      zip,
381 		     ADDRESS_PROVINCE_COLUMN, prov,
382 		     ADDRESS_STATE_COLUMN,    state,
383 		     ADDRESS_COUNTRY_COLUMN,  country,
384 		     -1);
385 
386   gtk_combo_box_set_active(GTK_COMBO_BOX(form->priv->add_type),
387 			   R_ADDRESS_PREF);
388   gtk_entry_set_text(GTK_ENTRY(form->priv->st),     "");
389   gtk_entry_set_text(GTK_ENTRY(form->priv->num),    "");
390   gtk_entry_set_text(GTK_ENTRY(form->priv->zip),    "");
391   gtk_entry_set_text(GTK_ENTRY(form->priv->city),   "");
392   gtk_entry_set_text(GTK_ENTRY(form->priv->prov),   "");
393   gtk_entry_set_text(GTK_ENTRY(form->priv->state),  "");
394   gtk_entry_set_text(GTK_ENTRY(form->priv->country),"");
395 }
396 
397 
398 void
form_address_mod_clicked(GtkButton * button,gpointer data)399 form_address_mod_clicked (GtkButton *button, gpointer data)
400 {
401   GtkTreeModel *model;
402   GtkTreeIter iter;
403   GtkTreeSelection *sel;
404   RAddress* address;
405   RubricaFormAddress* form = (RubricaFormAddress*) data;
406 
407   model = gtk_tree_view_get_model(GTK_TREE_VIEW(form->priv->add_tree));
408   g_return_if_fail(GTK_IS_TREE_MODEL(model));
409 
410   sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(form->priv->add_tree));
411 
412   if (gtk_tree_selection_get_selected(sel, NULL, &iter))
413   {
414     gint i;
415     GtkTreePath *path;
416     gchar *street, *number, *city, *zip, *type;
417     gchar *prov, *state, *country, *label;
418     RAddressType addtype;
419 
420     /* create a new address and fill with form's data */
421     address = r_address_new();
422 
423     addtype = gtk_combo_box_get_active(GTK_COMBO_BOX(form->priv->add_type));
424     street  = g_strdup(gtk_entry_get_text(GTK_ENTRY(form->priv->st)));
425     number  = g_strdup(gtk_entry_get_text(GTK_ENTRY(form->priv->num)));
426     city    = g_strdup(gtk_entry_get_text(GTK_ENTRY(form->priv->city)));
427     zip     = g_strdup(gtk_entry_get_text(GTK_ENTRY(form->priv->zip)));
428     prov    = g_strdup(gtk_entry_get_text(GTK_ENTRY(form->priv->prov)));
429     state   = g_strdup(gtk_entry_get_text(GTK_ENTRY(form->priv->state)));
430     country = g_strdup(gtk_entry_get_text(GTK_ENTRY(form->priv->country)));
431 
432     g_object_set(address, "address-type", addtype, "street", street,
433 		 "street-number", number, "city", city, "zip", zip,
434 		 "province", prov, "state", state, "country", country, NULL);
435 
436     type  = r_address_lookup_enum2str(addtype);
437     label = _(r_address_lookup_enum2lbl(addtype));
438 
439     /* remove old address from tree list
440      */
441     path = gtk_tree_model_get_path(model, &iter);
442     i = gtk_tree_path_get_indices(path)[0];
443 
444     gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
445     gtk_tree_path_free(path);
446 
447     /* insert new address into the tree list
448      */
449     gtk_list_store_insert(GTK_LIST_STORE(model), &iter, i);
450     gtk_list_store_set(GTK_LIST_STORE(model), &iter,
451 		       ADDRESS_STREET_COLUMN,   street,
452 		       ADDRESS_NUMBER_COLUMN,   number,
453 		       ADDRESS_LABEL_COLUMN,    label,
454 		       ADDRESS_TYPE_COLUMN,     type,
455 		       ADDRESS_CITY_COLUMN,     city,
456 		       ADDRESS_ZIP_COLUMN,      zip,
457 		       ADDRESS_PROVINCE_COLUMN, prov,
458 		       ADDRESS_STATE_COLUMN,    state,
459 		       ADDRESS_COUNTRY_COLUMN,  country,
460 		       -1);
461 
462     /* clean form
463      */
464     gtk_combo_box_set_active(GTK_COMBO_BOX(form->priv->add_type),
465 			     R_ADDRESS_PREF);
466     gtk_entry_set_text(GTK_ENTRY(form->priv->st),      "");
467     gtk_entry_set_text(GTK_ENTRY(form->priv->num),     "");
468     gtk_entry_set_text(GTK_ENTRY(form->priv->zip),     "");
469     gtk_entry_set_text(GTK_ENTRY(form->priv->city),    "");
470     gtk_entry_set_text(GTK_ENTRY(form->priv->prov),    "");
471     gtk_entry_set_text(GTK_ENTRY(form->priv->state),   "");
472     gtk_entry_set_text(GTK_ENTRY(form->priv->country), "");
473 
474     gtk_widget_set_sensitive(GTK_WIDGET(form->priv->add_mod), FALSE);
475     gtk_widget_set_sensitive(GTK_WIDGET(form->priv->add_del), FALSE);
476   }
477 }
478 
479 
480 void
form_address_del_clicked(GtkButton * button,gpointer data)481 form_address_del_clicked (GtkButton *button, gpointer data)
482 {
483   GtkTreeModel *model;
484   GtkTreeIter iter;
485   GtkTreeSelection *sel;
486   RubricaFormAddress* form = (RubricaFormAddress*) data;
487 
488   model = gtk_tree_view_get_model(GTK_TREE_VIEW(form->priv->add_tree));
489   sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(form->priv->add_tree));
490 
491   if (gtk_tree_selection_get_selected(sel, NULL, &iter))
492   {
493     gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
494 
495     gtk_combo_box_set_active(GTK_COMBO_BOX(form->priv->add_type),
496 			     R_ADDRESS_PREF);
497     gtk_entry_set_text(GTK_ENTRY(form->priv->st),      "");
498     gtk_entry_set_text(GTK_ENTRY(form->priv->num),     "");
499     gtk_entry_set_text(GTK_ENTRY(form->priv->zip),     "");
500     gtk_entry_set_text(GTK_ENTRY(form->priv->city),    "");
501     gtk_entry_set_text(GTK_ENTRY(form->priv->prov),    "");
502     gtk_entry_set_text(GTK_ENTRY(form->priv->state),   "");
503     gtk_entry_set_text(GTK_ENTRY(form->priv->country), "");
504 
505     gtk_widget_set_sensitive(GTK_WIDGET(form->priv->add_mod), FALSE);
506     gtk_widget_set_sensitive(GTK_WIDGET(form->priv->add_del), FALSE);
507   }
508 }
509 
510 
511 
512 
513 
514 /*   ***************************** Public *****************************
515 */
516 
517 
518 /**
519  * rubrica_form_address_new
520  *
521  * create a #RubricaFormAddress
522  *
523  * Returns: a new #RubricaFormAddress
524  */
525 RubricaFormAddress*
rubrica_form_address_new(RubricaApp * app,GladeXML * gui)526 rubrica_form_address_new(RubricaApp* app, GladeXML *gui)
527 {
528   RubricaFormAddress* form;
529   GtkTreeView *tree;
530   GtkTreeModel *model;
531   GtkTreeSelection *selection;
532   GtkWidget* combo_box;
533   GtkWidget* add_label;
534   gint i;
535 
536   form = g_object_new(rubrica_form_address_get_type(), NULL);
537 
538   form->priv->st       = glade_xml_get_widget(gui, "st");
539   form->priv->num      = glade_xml_get_widget(gui, "num");
540   form->priv->zip      = glade_xml_get_widget(gui, "zip");
541   form->priv->city     = glade_xml_get_widget(gui, "city");
542   form->priv->prov     = glade_xml_get_widget(gui, "prov");
543   form->priv->state    = glade_xml_get_widget(gui, "state");
544   form->priv->country  = glade_xml_get_widget(gui, "country");
545   form->priv->add_tree = glade_xml_get_widget(gui, "addresses_tree");
546   form->priv->add_add  = glade_xml_get_widget(gui, "add_add");
547   form->priv->add_del  = glade_xml_get_widget(gui, "add_del");
548   form->priv->add_mod  = glade_xml_get_widget(gui, "add_mod");
549 
550   add_label = glade_xml_get_widget(gui, "add_label");
551   combo_box = glade_xml_get_widget(gui, "add_combo_box");
552 
553   form->priv->add_type = gtk_combo_box_new_text ();
554   gtk_box_pack_start(GTK_BOX(combo_box), form->priv->add_type, TRUE, TRUE, 0);
555   gtk_widget_show(form->priv->add_type);
556   for (i = R_ADDRESS_PREF; i <= R_ADDRESS_UNKNOWN; i++)
557     gtk_combo_box_append_text(GTK_COMBO_BOX(form->priv->add_type),
558 			      _(r_address_lookup_enum2lbl(i)));
559 
560   gtk_label_set_mnemonic_widget(GTK_LABEL(add_label), form->priv->add_type);
561   gtk_combo_box_set_active(GTK_COMBO_BOX(form->priv->add_type),
562 			   R_ADDRESS_PREF);
563 
564   gtk_widget_set_sensitive(GTK_WIDGET(form->priv->add_mod), FALSE);
565   gtk_widget_set_sensitive(GTK_WIDGET(form->priv->add_del), FALSE);
566 
567   /*   address model/view
568    */
569   tree = (GtkTreeView *) form->priv->add_tree;
570   model = rubrica_model_new(ADDRESS_MODEL);
571   gtk_tree_view_set_model(tree, GTK_TREE_MODEL(model));
572   selection = gtk_tree_view_get_selection(tree);
573   gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
574 
575   rubrica_model_add_columns(tree, ADDRESS_COLUMNS);
576 
577   g_signal_connect(G_OBJECT(selection), "changed",
578 		   G_CALLBACK(form_addresses_list_activated), form);
579   g_object_unref(model);
580 
581   /*    address buttons
582   */
583   g_signal_connect (G_OBJECT (form->priv->add_add), "clicked",
584 		    G_CALLBACK (form_address_add_clicked), form);
585   g_signal_connect (G_OBJECT (form->priv->add_mod), "clicked",
586 		    G_CALLBACK (form_address_mod_clicked), form);
587   g_signal_connect (G_OBJECT (form->priv->add_del), "clicked",
588 		    G_CALLBACK (form_address_del_clicked), form);
589 
590   gtk_widget_grab_focus (form->priv->st);
591   return form;
592 }
593 
594 
595 /**
596  * rubrica_form_address_free
597  * @form: a #RubricaFormAddress
598  *
599  * free the #RubricaFormAddress
600  */
601 void
rubrica_form_address_free(RubricaFormAddress * form)602 rubrica_form_address_free(RubricaFormAddress* form)
603 {
604   g_return_if_fail(IS_RUBRICA_FORM(form));
605 
606   g_object_unref(form);
607 }
608