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