2 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 1999-2003 Hiroyuki Yamamoto
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
27 #include <glib/gi18n.h>
28 #include <gdk/gdkkeysyms.h>
29 #include <gtk/gtkwindow.h>
30 #include <gtk/gtksignal.h>
31 #include <gtk/gtklabel.h>
32 #include <gtk/gtkvbox.h>
33 #include <gtk/gtkentry.h>
34 #include <gtk/gtktable.h>
37 #include "addressbook.h"
38 #include "addressitem.h"
41 #include "manage_window.h"
45 #include "prefs_common.h"
47 static struct _PersonEdit_dlg {
51 GtkWidget *cancel_btn;
56 GtkWidget *entry_name;
57 GtkWidget *entry_first;
58 GtkWidget *entry_last;
59 GtkWidget *entry_nick;
62 GtkWidget *entry_email;
63 GtkWidget *entry_alias;
64 GtkWidget *entry_remarks;
65 GtkWidget *clist_email;
67 GtkWidget *email_down;
72 /* Attribute data tab */
73 GtkWidget *entry_atname;
74 GtkWidget *entry_atvalue;
75 GtkWidget *clist_attrib;
76 GtkWidget *attrib_add;
77 GtkWidget *attrib_del;
78 GtkWidget *attrib_mod;
91 } PersonEditEMailColumnPos;
96 } PersonEditAttribColumnPos;
98 #define EDITPERSON_WIDTH 520
99 #define EDITPERSON_HEIGHT 340
101 #define EMAIL_N_COLS 3
102 #define EMAIL_COL_WIDTH_EMAIL 180
103 #define EMAIL_COL_WIDTH_ALIAS 80
105 #define ATTRIB_N_COLS 2
106 #define ATTRIB_COL_WIDTH_NAME 120
107 #define ATTRIB_COL_WIDTH_VALUE 180
111 #define PAGE_ATTRIBUTES 2
113 static void edit_person_status_show( gchar *msg ) {
114 if( personeditdlg.statusbar != NULL ) {
115 gtk_statusbar_pop( GTK_STATUSBAR(personeditdlg.statusbar), personeditdlg.status_cid );
117 gtk_statusbar_push( GTK_STATUSBAR(personeditdlg.statusbar), personeditdlg.status_cid, msg );
122 static void edit_person_ok(GtkWidget *widget, gboolean *cancelled) {
127 static void edit_person_cancel(GtkWidget *widget, gboolean *cancelled) {
132 static gint edit_person_delete_event(GtkWidget *widget, GdkEventAny *event, gboolean *cancelled) {
138 static gboolean edit_person_key_pressed(GtkWidget *widget, GdkEventKey *event, gboolean *cancelled) {
139 if (event && event->keyval == GDK_Escape) {
146 static gchar *_title_new_ = NULL;
147 static gchar *_title_edit_ = NULL;
149 static void edit_person_set_window_title( gint pageNum ) {
152 if( _title_new_ == NULL ) {
153 _title_new_ = g_strdup( _("Add New Person") );
154 _title_edit_ = g_strdup( _("Edit Person Details") );
157 if( pageNum == PAGE_BASIC ) {
158 if( personeditdlg.editNew ) {
159 gtk_window_set_title( GTK_WINDOW(personeditdlg.window), _title_new_ );
162 gtk_window_set_title( GTK_WINDOW(personeditdlg.window), _title_edit_ );
166 if( personeditdlg.entry_name == NULL ) {
167 sTitle = g_strdup( _title_edit_ );
171 name = gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_name), 0, -1 );
172 sTitle = g_strdup_printf( "%s - %s", _title_edit_, name );
175 gtk_window_set_title( GTK_WINDOW(personeditdlg.window), sTitle );
180 static void edit_person_email_clear( gpointer data ) {
181 gtk_entry_set_text( GTK_ENTRY(personeditdlg.entry_email), "" );
182 gtk_entry_set_text( GTK_ENTRY(personeditdlg.entry_alias), "" );
183 gtk_entry_set_text( GTK_ENTRY(personeditdlg.entry_remarks), "" );
186 static void edit_person_attrib_clear( gpointer data ) {
187 gtk_entry_set_text( GTK_ENTRY(personeditdlg.entry_atname), "" );
188 gtk_entry_set_text( GTK_ENTRY(personeditdlg.entry_atvalue), "" );
191 static void edit_person_switch_page( GtkNotebook *notebook, GtkNotebookPage *page,
192 gint pageNum, gpointer user_data)
194 edit_person_set_window_title( pageNum );
195 edit_person_status_show( "" );
199 * Load clist with a copy of person's email addresses.
201 static void edit_person_load_email( ItemPerson *person ) {
202 GList *node = person->listEMail;
203 GtkCList *clist = GTK_CLIST(personeditdlg.clist_email);
204 gchar *text[ EMAIL_N_COLS ];
206 ItemEMail *emorig = ( ItemEMail * ) node->data;
207 ItemEMail *email = addritem_copyfull_item_email( emorig );
209 text[ EMAIL_COL_EMAIL ] = email->address;
210 text[ EMAIL_COL_ALIAS ] = email->obj.name;
211 text[ EMAIL_COL_REMARKS ] = email->remarks;
213 row = gtk_clist_append( clist, text );
214 gtk_clist_set_row_data( clist, row, email );
215 node = g_list_next( node );
219 static void edit_person_email_list_selected( GtkCList *clist, gint row, gint column, GdkEvent *event, gpointer data ) {
220 ItemEMail *email = gtk_clist_get_row_data( clist, row );
223 gtk_entry_set_text( GTK_ENTRY(personeditdlg.entry_email), email->address );
224 if( ADDRITEM_NAME(email) )
225 gtk_entry_set_text( GTK_ENTRY(personeditdlg.entry_alias), ADDRITEM_NAME(email) );
227 gtk_entry_set_text( GTK_ENTRY(personeditdlg.entry_remarks), email->remarks );
228 if (!personeditdlg.read_only) {
229 gtk_widget_set_sensitive(personeditdlg.email_del, TRUE);
230 gtk_widget_set_sensitive(personeditdlg.email_up, row > 0);
231 gtk_widget_set_sensitive(personeditdlg.email_down, gtk_clist_get_row_data(clist, row + 1) != NULL);
234 gtk_widget_set_sensitive(personeditdlg.email_del, FALSE);
235 gtk_widget_set_sensitive(personeditdlg.email_up, FALSE);
236 gtk_widget_set_sensitive(personeditdlg.email_down, FALSE);
238 personeditdlg.rowIndEMail = row;
239 edit_person_status_show( NULL );
242 static void edit_person_email_move( gint dir ) {
243 GtkCList *clist = GTK_CLIST(personeditdlg.clist_email);
244 gint row = personeditdlg.rowIndEMail + dir;
245 ItemEMail *email = gtk_clist_get_row_data( clist, row );
247 gtk_clist_row_move( clist, personeditdlg.rowIndEMail, row );
248 personeditdlg.rowIndEMail = row;
249 if (!personeditdlg.read_only) {
250 gtk_widget_set_sensitive(personeditdlg.email_up, row > 0);
251 gtk_widget_set_sensitive(personeditdlg.email_down, gtk_clist_get_row_data(clist, row + 1) != NULL);
254 gtk_widget_set_sensitive(personeditdlg.email_up, FALSE);
255 gtk_widget_set_sensitive(personeditdlg.email_down, FALSE);
257 edit_person_email_clear( NULL );
258 edit_person_status_show( NULL );
261 static void edit_person_email_move_up( gpointer data ) {
262 edit_person_email_move( -1 );
265 static void edit_person_email_move_down( gpointer data ) {
266 edit_person_email_move( +1 );
269 static void edit_person_email_delete( gpointer data ) {
270 GtkCList *clist = GTK_CLIST(personeditdlg.clist_email);
271 gint row = personeditdlg.rowIndEMail;
272 ItemEMail *email = gtk_clist_get_row_data( clist, row );
273 edit_person_email_clear( NULL );
275 /* Remove list entry */
276 gtk_clist_remove( clist, row );
277 addritem_free_item_email( email );
281 /* Position hilite bar */
282 email = gtk_clist_get_row_data( clist, row );
284 personeditdlg.rowIndEMail = -1 + row;
286 if (!personeditdlg.read_only) {
287 gtk_widget_set_sensitive(personeditdlg.email_del, gtk_clist_get_row_data(clist, 0) != NULL);
288 gtk_widget_set_sensitive(personeditdlg.email_up, gtk_clist_get_row_data(clist, personeditdlg.rowIndEMail + 1) != NULL);
289 gtk_widget_set_sensitive(personeditdlg.email_down, gtk_clist_get_row_data(clist, personeditdlg.rowIndEMail - 1) != NULL);
291 edit_person_status_show( NULL );
294 static ItemEMail *edit_person_email_edit( gboolean *error, ItemEMail *email ) {
295 ItemEMail *retVal = NULL;
296 gchar *sEmail, *sAlias, *sRemarks, *sEmail_;
299 sEmail_ = gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_email), 0, -1 );
300 sAlias = gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_alias), 0, -1 );
301 sRemarks = gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_remarks), 0, -1 );
302 sEmail = mgu_email_check_empty( sEmail_ );
306 if( email == NULL ) {
307 email = addritem_create_item_email();
309 addritem_email_set_address( email, sEmail );
310 addritem_email_set_alias( email, sAlias );
311 addritem_email_set_remarks( email, sRemarks );
316 edit_person_status_show( _( "An E-Mail address must be supplied." ) );
326 static void edit_person_email_modify( gpointer data ) {
327 gboolean errFlg = FALSE;
328 GtkCList *clist = GTK_CLIST(personeditdlg.clist_email);
329 gint row = personeditdlg.rowIndEMail;
330 ItemEMail *email = gtk_clist_get_row_data( clist, row );
332 edit_person_email_edit( &errFlg, email );
334 gtk_clist_set_text( clist, row, EMAIL_COL_EMAIL, email->address );
335 gtk_clist_set_text( clist, row, EMAIL_COL_ALIAS, email->obj.name );
336 gtk_clist_set_text( clist, row, EMAIL_COL_REMARKS, email->remarks );
337 edit_person_email_clear( NULL );
342 static void edit_person_email_add( gpointer data ) {
343 GtkCList *clist = GTK_CLIST(personeditdlg.clist_email);
344 gboolean errFlg = FALSE;
345 ItemEMail *email = NULL;
346 gint row = personeditdlg.rowIndEMail;
347 if( gtk_clist_get_row_data( clist, row ) == NULL ) row = 0;
349 email = edit_person_email_edit( &errFlg, NULL );
351 gchar *text[ EMAIL_N_COLS ];
352 text[ EMAIL_COL_EMAIL ] = email->address;
353 text[ EMAIL_COL_ALIAS ] = email->obj.name;
354 text[ EMAIL_COL_REMARKS ] = email->remarks;
356 row = gtk_clist_insert( clist, 1 + row, text );
357 gtk_clist_set_row_data( clist, row, email );
358 gtk_clist_select_row( clist, row, 0 );
359 edit_person_email_clear( NULL );
364 * Comparison using cell contents (text in first column). Used for sort
365 * address index widget.
367 static gint edit_person_attrib_compare_func(
368 GtkCList *clist, gconstpointer ptr1, gconstpointer ptr2 )
370 GtkCell *cell1 = ((GtkCListRow *)ptr1)->cell;
371 GtkCell *cell2 = ((GtkCListRow *)ptr2)->cell;
372 gchar *name1 = NULL, *name2 = NULL;
374 if( cell1 ) name1 = cell1->u.text;
375 if( cell2 ) name2 = cell2->u.text;
376 if( ! name1 ) return ( name2 != NULL );
377 if( ! name2 ) return -1;
378 return g_utf8_collate( name1, name2 );
381 static gboolean list_find_attribute(const gchar *attr)
383 GtkCList *clist = GTK_CLIST(personeditdlg.clist_attrib);
384 UserAttribute *attrib;
386 while( (attrib = gtk_clist_get_row_data( clist, row )) ) {
387 if (!g_ascii_strcasecmp(attrib->name, attr)) {
388 gtk_clist_select_row(clist, row, 0);
396 static gboolean list_find_email(const gchar *addr)
398 GtkCList *clist = GTK_CLIST(personeditdlg.clist_email);
401 while( (email = gtk_clist_get_row_data( clist, row )) ) {
402 if (!g_ascii_strcasecmp(email->address, addr)) {
403 gtk_clist_select_row(clist, row, 0);
412 * Load clist with a copy of person's email addresses.
414 static void edit_person_load_attrib( ItemPerson *person ) {
415 GList *node = person->listAttrib;
416 GtkCList *clist = GTK_CLIST(personeditdlg.clist_attrib);
417 gchar *text[ ATTRIB_N_COLS ];
419 UserAttribute *atorig = ( UserAttribute * ) node->data;
420 UserAttribute *attrib = addritem_copy_attribute( atorig );
422 text[ ATTRIB_COL_NAME ] = attrib->name;
423 text[ ATTRIB_COL_VALUE ] = attrib->value;
425 row = gtk_clist_append( clist, text );
426 gtk_clist_set_row_data( clist, row, attrib );
427 node = g_list_next( node );
431 static void edit_person_attrib_list_selected( GtkCList *clist, gint row, gint column, GdkEvent *event, gpointer data ) {
432 UserAttribute *attrib = gtk_clist_get_row_data( clist, row );
433 if( attrib && !personeditdlg.read_only) {
434 gtk_entry_set_text( GTK_ENTRY(personeditdlg.entry_atname), attrib->name );
435 gtk_entry_set_text( GTK_ENTRY(personeditdlg.entry_atvalue), attrib->value );
436 gtk_widget_set_sensitive(personeditdlg.attrib_del, TRUE);
438 gtk_widget_set_sensitive(personeditdlg.attrib_del, FALSE);
440 personeditdlg.rowIndAttrib = row;
441 edit_person_status_show( NULL );
444 static void edit_person_attrib_delete( gpointer data ) {
445 GtkCList *clist = GTK_CLIST(personeditdlg.clist_attrib);
446 gint row = personeditdlg.rowIndAttrib;
447 UserAttribute *attrib = gtk_clist_get_row_data( clist, row );
448 edit_person_attrib_clear( NULL );
450 /* Remove list entry */
451 gtk_clist_remove( clist, row );
452 addritem_free_attribute( attrib );
456 /* Position hilite bar */
457 attrib = gtk_clist_get_row_data( clist, row );
459 personeditdlg.rowIndAttrib = -1 + row;
462 if (!personeditdlg.read_only)
463 gtk_widget_set_sensitive(personeditdlg.attrib_del, gtk_clist_get_row_data(clist, 0) != NULL);
465 edit_person_status_show( NULL );
468 static UserAttribute *edit_person_attrib_edit( gboolean *error, UserAttribute *attrib ) {
469 UserAttribute *retVal = NULL;
470 gchar *sName, *sValue, *sName_, *sValue_;
473 sName_ = gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_atname), 0, -1 );
474 sValue_ = gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_atvalue), 0, -1 );
475 sName = mgu_email_check_empty( sName_ );
476 sValue = mgu_email_check_empty( sValue_ );
480 if( sName && sValue ) {
481 if( attrib == NULL ) {
482 attrib = addritem_create_attribute();
484 addritem_attrib_set_name( attrib, sName );
485 addritem_attrib_set_value( attrib, sValue );
490 edit_person_status_show( _( "A Name and Value must be supplied." ) );
499 static void edit_person_attrib_modify( gpointer data ) {
500 gboolean errFlg = FALSE;
501 GtkCList *clist = GTK_CLIST(personeditdlg.clist_attrib);
502 gint row = personeditdlg.rowIndAttrib;
503 UserAttribute *attrib = gtk_clist_get_row_data( clist, row );
505 edit_person_attrib_edit( &errFlg, attrib );
507 gtk_clist_set_text( clist, row, ATTRIB_COL_NAME, attrib->name );
508 gtk_clist_set_text( clist, row, ATTRIB_COL_VALUE, attrib->value );
509 edit_person_attrib_clear( NULL );
514 static void edit_person_attrib_add( gpointer data ) {
515 GtkCList *clist = GTK_CLIST(personeditdlg.clist_attrib);
516 gboolean errFlg = FALSE;
517 UserAttribute *attrib = NULL;
518 gint row = personeditdlg.rowIndAttrib;
519 if( gtk_clist_get_row_data( clist, row ) == NULL ) row = 0;
521 attrib = edit_person_attrib_edit( &errFlg, NULL );
523 gchar *text[ EMAIL_N_COLS ];
524 text[ ATTRIB_COL_NAME ] = attrib->name;
525 text[ ATTRIB_COL_VALUE ] = attrib->value;
527 row = gtk_clist_insert( clist, 1 + row, text );
528 gtk_clist_set_row_data( clist, row, attrib );
529 gtk_clist_select_row( clist, row, 0 );
530 edit_person_attrib_clear( NULL );
534 static void addressbook_edit_person_dialog_create( gboolean *cancelled ) {
541 GtkWidget *cancel_btn;
543 GtkWidget *statusbar;
545 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
546 gtk_widget_set_size_request(window, EDITPERSON_WIDTH, EDITPERSON_HEIGHT );
547 /* gtk_container_set_border_width(GTK_CONTAINER(window), 0); */
548 gtk_window_set_title(GTK_WINDOW(window), _("Edit Person Data"));
549 gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
550 gtk_window_set_modal(GTK_WINDOW(window), TRUE);
551 g_signal_connect(G_OBJECT(window), "delete_event",
552 G_CALLBACK(edit_person_delete_event),
554 g_signal_connect(G_OBJECT(window), "key_press_event",
555 G_CALLBACK(edit_person_key_pressed),
558 vbox = gtk_vbox_new(FALSE, 4);
559 /* gtk_container_set_border_width(GTK_CONTAINER(vbox), BORDER_WIDTH); */
560 gtk_widget_show(vbox);
561 gtk_container_add(GTK_CONTAINER(window), vbox);
563 vnbox = gtk_vbox_new(FALSE, 4);
564 gtk_container_set_border_width(GTK_CONTAINER(vnbox), 4);
565 gtk_widget_show(vnbox);
566 gtk_box_pack_start(GTK_BOX(vbox), vnbox, TRUE, TRUE, 0);
569 notebook = gtk_notebook_new();
570 gtk_widget_show(notebook);
571 gtk_box_pack_start(GTK_BOX(vnbox), notebook, TRUE, TRUE, 0);
572 gtk_container_set_border_width(GTK_CONTAINER(notebook), 6);
575 hsbox = gtk_hbox_new(FALSE, 0);
576 gtk_box_pack_end(GTK_BOX(vbox), hsbox, FALSE, FALSE, BORDER_WIDTH);
577 statusbar = gtk_statusbar_new();
578 gtk_box_pack_start(GTK_BOX(hsbox), statusbar, TRUE, TRUE, BORDER_WIDTH);
581 gtkut_stock_button_set_create(&hbbox, &ok_btn, GTK_STOCK_OK,
582 &cancel_btn, GTK_STOCK_CANCEL,
584 gtk_box_pack_end(GTK_BOX(vnbox), hbbox, FALSE, FALSE, 0);
585 gtk_widget_grab_default(ok_btn);
587 g_signal_connect(G_OBJECT(ok_btn), "clicked",
588 G_CALLBACK(edit_person_ok), cancelled);
589 g_signal_connect(G_OBJECT(cancel_btn), "clicked",
590 G_CALLBACK(edit_person_cancel), cancelled);
591 g_signal_connect(G_OBJECT(notebook), "switch_page",
592 G_CALLBACK(edit_person_switch_page), NULL );
594 gtk_widget_show_all(vbox);
596 personeditdlg.window = window;
597 personeditdlg.notebook = notebook;
598 personeditdlg.ok_btn = ok_btn;
599 personeditdlg.cancel_btn = cancel_btn;
600 personeditdlg.statusbar = statusbar;
601 personeditdlg.status_cid = gtk_statusbar_get_context_id( GTK_STATUSBAR(statusbar), "Edit Person Dialog" );
605 static void addressbook_edit_person_page_basic( gint pageNum, gchar *pageLbl ) {
609 GtkWidget *entry_name;
616 vbox = gtk_vbox_new( FALSE, 8 );
617 gtk_widget_show( vbox );
618 gtk_container_add( GTK_CONTAINER( personeditdlg.notebook ), vbox );
619 gtk_container_set_border_width( GTK_CONTAINER (vbox), BORDER_WIDTH );
621 label = gtk_label_new( pageLbl );
622 gtk_widget_show( label );
623 gtk_notebook_set_tab_label(
624 GTK_NOTEBOOK( personeditdlg.notebook ),
625 gtk_notebook_get_nth_page( GTK_NOTEBOOK( personeditdlg.notebook ), pageNum ), label );
627 table = gtk_table_new( 4, 3, FALSE);
628 gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
629 gtk_container_set_border_width( GTK_CONTAINER(table), 8 );
630 gtk_table_set_row_spacings(GTK_TABLE(table), 8);
631 gtk_table_set_col_spacings(GTK_TABLE(table), 8);
633 #define ATTACH_ROW(text, entry) \
635 label = gtk_label_new(text); \
636 gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), \
637 GTK_FILL, 0, 0, 0); \
638 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); \
640 entry = gtk_entry_new(); \
641 gtk_table_attach(GTK_TABLE(table), entry, 1, 2, top, (top + 1), \
642 GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0); \
646 ATTACH_ROW(_("Display Name"), entry_name);
647 locale = conv_get_current_locale();
649 (!g_ascii_strncasecmp(locale, "ja", 2) ||
650 !g_ascii_strncasecmp(locale, "ko", 2) ||
651 !g_ascii_strncasecmp(locale, "zh", 2))) {
652 ATTACH_ROW(_("Last Name"), entry_ln);
653 ATTACH_ROW(_("First Name"), entry_fn);
655 ATTACH_ROW(_("First Name"), entry_fn);
656 ATTACH_ROW(_("Last Name"), entry_ln);
658 ATTACH_ROW(_("Nickname"), entry_nn);
662 gtk_widget_show_all(vbox);
664 personeditdlg.entry_name = entry_name;
665 personeditdlg.entry_first = entry_fn;
666 personeditdlg.entry_last = entry_ln;
667 personeditdlg.entry_nick = entry_nn;
670 static gboolean email_adding = FALSE, email_saving = FALSE;
672 static void edit_person_entry_email_changed (GtkWidget *entry, gpointer data)
674 gboolean non_empty = gtk_clist_get_row_data(GTK_CLIST(personeditdlg.clist_email), 0) != NULL;
676 if (personeditdlg.read_only)
679 if (gtk_entry_get_text(GTK_ENTRY(personeditdlg.entry_email)) == NULL
680 || strlen(gtk_entry_get_text(GTK_ENTRY(personeditdlg.entry_email))) == 0) {
681 gtk_widget_set_sensitive(personeditdlg.email_add,FALSE);
682 gtk_widget_set_sensitive(personeditdlg.email_mod,FALSE);
683 email_adding = FALSE;
684 email_saving = FALSE;
685 } else if (list_find_email(gtk_entry_get_text(GTK_ENTRY(personeditdlg.entry_email)))) {
686 gtk_widget_set_sensitive(personeditdlg.email_add,FALSE);
687 gtk_widget_set_sensitive(personeditdlg.email_mod,non_empty);
688 email_adding = FALSE;
689 email_saving = non_empty;
691 gtk_widget_set_sensitive(personeditdlg.email_add,TRUE);
692 gtk_widget_set_sensitive(personeditdlg.email_mod,non_empty);
694 email_saving = non_empty;
698 static gboolean edit_person_entry_email_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data)
700 if (event && event->keyval == GDK_Return) {
702 edit_person_email_modify(NULL);
703 else if (email_adding)
704 edit_person_email_add(NULL);
710 static void addressbook_edit_person_page_email( gint pageNum, gchar *pageLbl ) {
715 GtkWidget *vbuttonbox;
717 GtkWidget *buttonDown;
718 GtkWidget *buttonDel;
719 GtkWidget *buttonMod;
720 GtkWidget *buttonAdd;
724 GtkWidget *clist_swin;
726 GtkWidget *entry_email;
727 GtkWidget *entry_alias;
728 GtkWidget *entry_remarks;
731 gchar *titles[ EMAIL_N_COLS ];
734 titles[ EMAIL_COL_EMAIL ] = _("E-Mail Address");
735 titles[ EMAIL_COL_ALIAS ] = _("Alias");
736 titles[ EMAIL_COL_REMARKS ] = _("Remarks");
738 vbox = gtk_vbox_new( FALSE, 8 );
739 gtk_widget_show( vbox );
740 gtk_container_add( GTK_CONTAINER( personeditdlg.notebook ), vbox );
741 gtk_container_set_border_width( GTK_CONTAINER (vbox), BORDER_WIDTH );
743 label = gtk_label_new( pageLbl );
744 gtk_widget_show( label );
745 gtk_notebook_set_tab_label(
746 GTK_NOTEBOOK( personeditdlg.notebook ),
747 gtk_notebook_get_nth_page( GTK_NOTEBOOK( personeditdlg.notebook ), pageNum ), label );
749 /* Split into two areas */
750 hbox = gtk_hbox_new( FALSE, 0 );
751 gtk_container_add( GTK_CONTAINER( vbox ), hbox );
754 vboxl = gtk_vbox_new( FALSE, 4 );
755 gtk_container_add( GTK_CONTAINER( hbox ), vboxl );
756 gtk_container_set_border_width( GTK_CONTAINER(vboxl), 4 );
758 clist_swin = gtk_scrolled_window_new( NULL, NULL );
759 gtk_container_add( GTK_CONTAINER(vboxl), clist_swin );
760 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(clist_swin),
761 GTK_POLICY_AUTOMATIC,
762 GTK_POLICY_AUTOMATIC);
764 clist = gtk_clist_new_with_titles( EMAIL_N_COLS, titles );
765 gtk_container_add( GTK_CONTAINER(clist_swin), clist );
766 gtk_clist_set_selection_mode( GTK_CLIST(clist), GTK_SELECTION_BROWSE );
767 gtk_clist_set_column_width( GTK_CLIST(clist), EMAIL_COL_EMAIL, EMAIL_COL_WIDTH_EMAIL );
768 gtk_clist_set_column_width( GTK_CLIST(clist), EMAIL_COL_ALIAS, EMAIL_COL_WIDTH_ALIAS );
770 for( i = 0; i < EMAIL_N_COLS; i++ )
771 GTK_WIDGET_UNSET_FLAGS(GTK_CLIST(clist)->column[i].button, GTK_CAN_FOCUS);
773 /* Data entry area */
774 table = gtk_table_new( 4, 2, FALSE);
775 gtk_box_pack_start(GTK_BOX(vboxl), table, FALSE, FALSE, 0);
776 gtk_container_set_border_width( GTK_CONTAINER(table), 4 );
777 gtk_table_set_row_spacings(GTK_TABLE(table), 4);
778 gtk_table_set_col_spacings(GTK_TABLE(table), 4);
782 label = gtk_label_new(_("E-Mail Address"));
783 gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0);
784 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
786 entry_email = gtk_entry_new();
787 gtk_table_attach(GTK_TABLE(table), entry_email, 1, 2, top, (top + 1), GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
791 label = gtk_label_new(_("Alias"));
792 gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0);
793 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
795 entry_alias = gtk_entry_new();
796 gtk_table_attach(GTK_TABLE(table), entry_alias, 1, 2, top, (top + 1), GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
800 label = gtk_label_new(_("Remarks"));
801 gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0);
802 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
804 entry_remarks = gtk_entry_new();
805 gtk_table_attach(GTK_TABLE(table), entry_remarks, 1, 2, top, (top + 1), GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
808 vboxb = gtk_vbox_new( FALSE, 4 );
809 gtk_box_pack_start(GTK_BOX(hbox), vboxb, FALSE, FALSE, 2);
811 vbuttonbox = gtk_vbutton_box_new();
812 gtk_button_box_set_layout( GTK_BUTTON_BOX(vbuttonbox), GTK_BUTTONBOX_START );
813 gtk_box_set_spacing( GTK_BOX(vbuttonbox), 8 );
814 gtk_container_set_border_width( GTK_CONTAINER(vbuttonbox), 4 );
815 gtk_container_add( GTK_CONTAINER(vboxb), vbuttonbox );
818 buttonUp = gtk_button_new_from_stock(GTK_STOCK_GO_UP);
819 gtk_container_add( GTK_CONTAINER(vbuttonbox), buttonUp );
821 buttonDown = gtk_button_new_from_stock(GTK_STOCK_GO_DOWN);
822 gtk_container_add( GTK_CONTAINER(vbuttonbox), buttonDown );
824 buttonDel = gtk_button_new_from_stock(GTK_STOCK_DELETE);
825 gtk_container_add( GTK_CONTAINER(vbuttonbox), buttonDel );
827 buttonMod = gtk_button_new_from_stock(GTK_STOCK_SAVE);
828 gtk_container_add( GTK_CONTAINER(vbuttonbox), buttonMod );
830 buttonAdd = gtk_button_new_from_stock(GTK_STOCK_ADD);
831 gtk_container_add( GTK_CONTAINER(vbuttonbox), buttonAdd );
833 gtk_widget_show_all(vbox);
836 g_signal_connect( G_OBJECT(clist), "select_row",
837 G_CALLBACK( edit_person_email_list_selected), NULL );
838 g_signal_connect( G_OBJECT(buttonUp), "clicked",
839 G_CALLBACK( edit_person_email_move_up ), NULL );
840 g_signal_connect( G_OBJECT(buttonDown), "clicked",
841 G_CALLBACK( edit_person_email_move_down ), NULL );
842 g_signal_connect( G_OBJECT(buttonDel), "clicked",
843 G_CALLBACK( edit_person_email_delete ), NULL );
844 g_signal_connect( G_OBJECT(buttonMod), "clicked",
845 G_CALLBACK( edit_person_email_modify ), NULL );
846 g_signal_connect( G_OBJECT(buttonAdd), "clicked",
847 G_CALLBACK( edit_person_email_add ), NULL );
848 g_signal_connect(G_OBJECT(entry_email), "changed",
849 G_CALLBACK(edit_person_entry_email_changed), NULL);
850 g_signal_connect(G_OBJECT(entry_email), "key_press_event",
851 G_CALLBACK(edit_person_entry_email_pressed), NULL);
852 g_signal_connect(G_OBJECT(entry_alias), "key_press_event",
853 G_CALLBACK(edit_person_entry_email_pressed), NULL);
854 g_signal_connect(G_OBJECT(entry_remarks), "key_press_event",
855 G_CALLBACK(edit_person_entry_email_pressed), NULL);
857 personeditdlg.clist_email = clist;
858 personeditdlg.entry_email = entry_email;
859 personeditdlg.entry_alias = entry_alias;
860 personeditdlg.entry_remarks = entry_remarks;
861 personeditdlg.email_up = buttonUp;
862 personeditdlg.email_down = buttonDown;
863 personeditdlg.email_del = buttonDel;
864 personeditdlg.email_mod = buttonMod;
865 personeditdlg.email_add = buttonAdd;
868 static gboolean attrib_adding = FALSE, attrib_saving = FALSE;
870 static void edit_person_entry_att_changed (GtkWidget *entry, gpointer data)
872 gboolean non_empty = gtk_clist_get_row_data(GTK_CLIST(personeditdlg.clist_attrib), 0) != NULL;
874 if (personeditdlg.read_only)
877 if (gtk_entry_get_text(GTK_ENTRY(personeditdlg.entry_atname)) == NULL
878 || strlen(gtk_entry_get_text(GTK_ENTRY(personeditdlg.entry_atname))) == 0) {
879 gtk_widget_set_sensitive(personeditdlg.attrib_add,FALSE);
880 gtk_widget_set_sensitive(personeditdlg.attrib_mod,FALSE);
881 attrib_adding = FALSE;
882 attrib_saving = FALSE;
883 } else if (list_find_attribute(gtk_entry_get_text(GTK_ENTRY(personeditdlg.entry_atname)))) {
884 gtk_widget_set_sensitive(personeditdlg.attrib_add,FALSE);
885 gtk_widget_set_sensitive(personeditdlg.attrib_mod,non_empty);
886 attrib_adding = FALSE;
887 attrib_saving = non_empty;
889 gtk_widget_set_sensitive(personeditdlg.attrib_add,TRUE);
890 gtk_widget_set_sensitive(personeditdlg.attrib_mod,non_empty);
891 attrib_adding = TRUE;
892 attrib_saving = non_empty;
896 static gboolean edit_person_entry_att_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data)
898 if (event && event->keyval == GDK_Return) {
900 edit_person_attrib_modify(NULL);
901 else if (attrib_adding)
902 edit_person_attrib_add(NULL);
907 static void addressbook_edit_person_page_attrib( gint pageNum, gchar *pageLbl ) {
912 GtkWidget *vbuttonbox;
913 GtkWidget *buttonDel;
914 GtkWidget *buttonMod;
915 GtkWidget *buttonAdd;
919 GtkWidget *clist_swin;
921 GtkWidget *entry_name;
922 GtkWidget *entry_value;
925 gchar *titles[ ATTRIB_N_COLS ];
928 titles[ ATTRIB_COL_NAME ] = _("Name");
929 titles[ ATTRIB_COL_VALUE ] = _("Value");
931 vbox = gtk_vbox_new( FALSE, 8 );
932 gtk_widget_show( vbox );
933 gtk_container_add( GTK_CONTAINER( personeditdlg.notebook ), vbox );
934 gtk_container_set_border_width( GTK_CONTAINER (vbox), BORDER_WIDTH );
936 label = gtk_label_new( pageLbl );
937 gtk_widget_show( label );
938 gtk_notebook_set_tab_label(
939 GTK_NOTEBOOK( personeditdlg.notebook ),
940 gtk_notebook_get_nth_page( GTK_NOTEBOOK( personeditdlg.notebook ), pageNum ), label );
942 /* Split into two areas */
943 hbox = gtk_hbox_new( FALSE, 0 );
944 gtk_container_add( GTK_CONTAINER( vbox ), hbox );
947 vboxl = gtk_vbox_new( FALSE, 4 );
948 gtk_container_add( GTK_CONTAINER( hbox ), vboxl );
949 gtk_container_set_border_width( GTK_CONTAINER(vboxl), 4 );
951 clist_swin = gtk_scrolled_window_new( NULL, NULL );
952 gtk_container_add( GTK_CONTAINER(vboxl), clist_swin );
953 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(clist_swin),
954 GTK_POLICY_AUTOMATIC,
955 GTK_POLICY_AUTOMATIC);
957 clist = gtk_clist_new_with_titles( ATTRIB_N_COLS, titles );
958 gtk_container_add( GTK_CONTAINER(clist_swin), clist );
959 gtk_clist_set_selection_mode( GTK_CLIST(clist), GTK_SELECTION_BROWSE );
960 gtk_clist_set_column_width( GTK_CLIST(clist), ATTRIB_COL_NAME, ATTRIB_COL_WIDTH_NAME );
961 gtk_clist_set_column_width( GTK_CLIST(clist), ATTRIB_COL_VALUE, ATTRIB_COL_WIDTH_VALUE );
962 gtk_clist_set_compare_func( GTK_CLIST(clist), edit_person_attrib_compare_func );
963 gtk_clist_set_auto_sort( GTK_CLIST(clist), TRUE );
965 for( i = 0; i < ATTRIB_N_COLS; i++ )
966 GTK_WIDGET_UNSET_FLAGS(GTK_CLIST(clist)->column[i].button, GTK_CAN_FOCUS);
968 /* Data entry area */
969 table = gtk_table_new( 4, 2, FALSE);
970 gtk_box_pack_start(GTK_BOX(vboxl), table, FALSE, FALSE, 0);
971 gtk_container_set_border_width( GTK_CONTAINER(table), 4 );
972 gtk_table_set_row_spacings(GTK_TABLE(table), 4);
973 gtk_table_set_col_spacings(GTK_TABLE(table), 4);
977 label = gtk_label_new(_("Name"));
978 gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0);
979 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
981 entry_name = gtk_entry_new();
982 gtk_table_attach(GTK_TABLE(table), entry_name, 1, 2, top, (top + 1), GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
986 label = gtk_label_new(_("Value"));
987 gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0);
988 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
990 entry_value = gtk_entry_new();
991 gtk_table_attach(GTK_TABLE(table), entry_value, 1, 2, top, (top + 1), GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
994 vboxb = gtk_vbox_new( FALSE, 4 );
995 gtk_box_pack_start(GTK_BOX(hbox), vboxb, FALSE, FALSE, 2);
997 vbuttonbox = gtk_vbutton_box_new();
998 gtk_button_box_set_layout( GTK_BUTTON_BOX(vbuttonbox), GTK_BUTTONBOX_START );
999 gtk_box_set_spacing( GTK_BOX(vbuttonbox), 8 );
1000 gtk_container_set_border_width( GTK_CONTAINER(vbuttonbox), 4 );
1001 gtk_container_add( GTK_CONTAINER(vboxb), vbuttonbox );
1004 buttonDel = gtk_button_new_from_stock(GTK_STOCK_DELETE);
1005 gtk_container_add( GTK_CONTAINER(vbuttonbox), buttonDel );
1007 buttonMod = gtk_button_new_from_stock(GTK_STOCK_SAVE);
1008 gtk_container_add( GTK_CONTAINER(vbuttonbox), buttonMod );
1010 buttonAdd = gtk_button_new_from_stock(GTK_STOCK_ADD);
1011 gtk_container_add( GTK_CONTAINER(vbuttonbox), buttonAdd );
1013 gtk_widget_set_sensitive(buttonDel,FALSE);
1014 gtk_widget_set_sensitive(buttonMod,FALSE);
1015 gtk_widget_set_sensitive(buttonAdd,FALSE);
1017 gtk_widget_show_all(vbox);
1019 /* Event handlers */
1020 g_signal_connect( G_OBJECT(clist), "select_row",
1021 G_CALLBACK( edit_person_attrib_list_selected), NULL );
1022 g_signal_connect( G_OBJECT(buttonDel), "clicked",
1023 G_CALLBACK( edit_person_attrib_delete ), NULL );
1024 g_signal_connect( G_OBJECT(buttonMod), "clicked",
1025 G_CALLBACK( edit_person_attrib_modify ), NULL );
1026 g_signal_connect( G_OBJECT(buttonAdd), "clicked",
1027 G_CALLBACK( edit_person_attrib_add ), NULL );
1028 g_signal_connect(G_OBJECT(entry_name), "changed",
1029 G_CALLBACK(edit_person_entry_att_changed), NULL);
1030 g_signal_connect(G_OBJECT(entry_name), "key_press_event",
1031 G_CALLBACK(edit_person_entry_att_pressed), NULL);
1032 g_signal_connect(G_OBJECT(entry_value), "key_press_event",
1033 G_CALLBACK(edit_person_entry_att_pressed), NULL);
1035 personeditdlg.clist_attrib = clist;
1036 personeditdlg.entry_atname = entry_name;
1037 personeditdlg.entry_atvalue = entry_value;
1038 personeditdlg.attrib_add = buttonAdd;
1039 personeditdlg.attrib_del = buttonDel;
1040 personeditdlg.attrib_mod = buttonMod;
1043 static void addressbook_edit_person_create( gboolean *cancelled ) {
1044 addressbook_edit_person_dialog_create( cancelled );
1045 addressbook_edit_person_page_basic( PAGE_BASIC, _( "User Data" ) );
1046 addressbook_edit_person_page_email( PAGE_EMAIL, _( "E-Mail Addresses" ) );
1047 addressbook_edit_person_page_attrib( PAGE_ATTRIBUTES, _( "Other Attributes" ) );
1048 gtk_widget_show_all( personeditdlg.window );
1052 * Return list of email items.
1054 static GList *edit_person_build_email_list() {
1055 GtkCList *clist = GTK_CLIST(personeditdlg.clist_email);
1056 GList *listEMail = NULL;
1059 while( (email = gtk_clist_get_row_data( clist, row )) ) {
1060 listEMail = g_list_append( listEMail, email );
1067 * Return list of attributes.
1069 static GList *edit_person_build_attrib_list() {
1070 GtkCList *clist = GTK_CLIST(personeditdlg.clist_attrib);
1071 GList *listAttrib = NULL;
1072 UserAttribute *attrib;
1074 while( (attrib = gtk_clist_get_row_data( clist, row )) ) {
1075 listAttrib = g_list_append( listAttrib, attrib );
1081 static void update_sensitivity(void)
1083 gtk_widget_set_sensitive(personeditdlg.entry_name, !personeditdlg.read_only);
1084 gtk_widget_set_sensitive(personeditdlg.entry_first, !personeditdlg.read_only);
1085 gtk_widget_set_sensitive(personeditdlg.entry_last, !personeditdlg.read_only);
1086 gtk_widget_set_sensitive(personeditdlg.entry_nick, !personeditdlg.read_only);
1087 gtk_widget_set_sensitive(personeditdlg.entry_email, !personeditdlg.read_only);
1088 gtk_widget_set_sensitive(personeditdlg.entry_alias, !personeditdlg.read_only);
1089 gtk_widget_set_sensitive(personeditdlg.entry_remarks, !personeditdlg.read_only);
1090 gtk_widget_set_sensitive(personeditdlg.email_up, !personeditdlg.read_only);
1091 gtk_widget_set_sensitive(personeditdlg.email_down, !personeditdlg.read_only);
1092 gtk_widget_set_sensitive(personeditdlg.email_del, !personeditdlg.read_only);
1093 gtk_widget_set_sensitive(personeditdlg.email_mod, !personeditdlg.read_only);
1094 gtk_widget_set_sensitive(personeditdlg.email_add, !personeditdlg.read_only);
1095 gtk_widget_set_sensitive(personeditdlg.entry_atname, !personeditdlg.read_only);
1096 gtk_widget_set_sensitive(personeditdlg.entry_atvalue, !personeditdlg.read_only);
1097 gtk_widget_set_sensitive(personeditdlg.attrib_add, !personeditdlg.read_only);
1098 gtk_widget_set_sensitive(personeditdlg.attrib_del, !personeditdlg.read_only);
1099 gtk_widget_set_sensitive(personeditdlg.attrib_mod, !personeditdlg.read_only);
1104 * Enter: abf Address book.
1105 * parent Parent folder for person (or NULL if adding to root folder). Argument is
1106 * only required for new objects).
1107 * person Person to edit, or NULL for a new person object.
1108 * pgMail If TRUE, E-Mail page will be activated.
1109 * Return: Edited object, or NULL if cancelled.
1111 ItemPerson *addressbook_edit_person( AddressBookFile *abf, ItemFolder *parent, ItemPerson *person, gboolean pgMail ) {
1112 static gboolean cancelled;
1113 GList *listEMail = NULL;
1114 GList *listAttrib = NULL;
1117 if (!personeditdlg.window)
1118 addressbook_edit_person_create(&cancelled);
1119 gtk_widget_grab_focus(personeditdlg.ok_btn);
1120 gtk_widget_grab_focus(personeditdlg.entry_name);
1122 personeditdlg.read_only = (abf == NULL);
1123 update_sensitivity();
1125 gtk_widget_show(personeditdlg.window);
1126 manage_window_set_transient(GTK_WINDOW(personeditdlg.window));
1128 /* Clear all fields */
1129 personeditdlg.rowIndEMail = -1;
1130 personeditdlg.rowIndAttrib = -1;
1131 edit_person_status_show( "" );
1132 gtk_clist_clear( GTK_CLIST(personeditdlg.clist_email) );
1133 gtk_clist_clear( GTK_CLIST(personeditdlg.clist_attrib) );
1134 gtk_entry_set_text(GTK_ENTRY(personeditdlg.entry_name), "" );
1135 gtk_entry_set_text(GTK_ENTRY(personeditdlg.entry_first), "" );
1136 gtk_entry_set_text(GTK_ENTRY(personeditdlg.entry_last), "" );
1137 gtk_entry_set_text(GTK_ENTRY(personeditdlg.entry_nick), "" );
1139 personeditdlg.editNew = FALSE;
1141 if( ADDRITEM_NAME(person) )
1142 gtk_entry_set_text(GTK_ENTRY(personeditdlg.entry_name), ADDRITEM_NAME(person) );
1143 if( person->firstName )
1144 gtk_entry_set_text(GTK_ENTRY(personeditdlg.entry_first), person->firstName );
1145 if( person->lastName )
1146 gtk_entry_set_text(GTK_ENTRY(personeditdlg.entry_last), person->lastName );
1147 if( person->nickName )
1148 gtk_entry_set_text(GTK_ENTRY(personeditdlg.entry_nick), person->nickName );
1149 edit_person_load_email( person );
1150 edit_person_load_attrib( person );
1153 personeditdlg.editNew = TRUE;
1156 /* Select appropriate start page */
1158 gtk_notebook_set_current_page( GTK_NOTEBOOK(personeditdlg.notebook), PAGE_EMAIL );
1161 gtk_notebook_set_current_page( GTK_NOTEBOOK(personeditdlg.notebook), PAGE_BASIC );
1164 gtk_clist_select_row( GTK_CLIST(personeditdlg.clist_email), 0, 0 );
1165 gtk_clist_select_row( GTK_CLIST(personeditdlg.clist_attrib), 0, 0 );
1166 edit_person_email_clear( NULL );
1168 edit_person_email_list_selected(GTK_CLIST(personeditdlg.clist_email), 0, 0, NULL, NULL);
1170 edit_person_attrib_clear( NULL );
1173 gtk_widget_hide( personeditdlg.window );
1175 listEMail = edit_person_build_email_list();
1176 listAttrib = edit_person_build_attrib_list();
1178 addritem_free_list_email( listEMail );
1179 addritem_free_list_attribute( listAttrib );
1180 gtk_clist_clear( GTK_CLIST(personeditdlg.clist_email) );
1181 gtk_clist_clear( GTK_CLIST(personeditdlg.clist_attrib) );
1185 cn = gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_name), 0, -1 );
1186 if( person && abf ) {
1187 /* Update email/attribute list for existing person */
1188 addrbook_update_address_list( abf, person, listEMail );
1189 addrbook_update_attrib_list( abf, person, listAttrib );
1192 /* Create new person and email/attribute list */
1193 if( cn == NULL || *cn == '\0' ) {
1194 /* Wasting our time */
1195 if( listEMail == NULL && listAttrib == NULL ) cancelled = TRUE;
1197 if( ! cancelled && abf ) {
1198 person = addrbook_add_address_list( abf, parent, listEMail );
1199 addrbook_add_attrib_list( abf, person, listAttrib );
1206 /* Set person stuff */
1208 addritem_person_set_common_name( person, cn );
1209 name = gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_first), 0, -1 );
1210 addritem_person_set_first_name( person, name );
1212 name = gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_last), 0, -1 );
1213 addritem_person_set_last_name( person, name );
1215 name = gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_nick), 0, -1 );
1216 addritem_person_set_nick_name( person, name );
1221 gtk_clist_clear( GTK_CLIST(personeditdlg.clist_email) );
1222 gtk_clist_clear( GTK_CLIST(personeditdlg.clist_attrib) );