Statistics
| Revision:

root / src / editaddress.c @ 92

History | View | Annotate | Download (36.6 kB)

1
/*
2
 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3
 * Copyright (C) 1999-2002 Hiroyuki Yamamoto
4
 *
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.
9
 *
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.
14
 *
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.
18
 */
19
20
#ifdef HAVE_CONFIG_H
21
#  include "config.h"
22
#endif
23
24
#include "defs.h"
25
26
#include <glib.h>
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>
35
36
#include "mgutils.h"
37
#include "addressbook.h"
38
#include "addressitem.h"
39
#include "addritem.h"
40
#include "addrbook.h"
41
#include "manage_window.h"
42
#include "gtkutils.h"
43
#include "codeconv.h"
44
45
#include "prefs_common.h"
46
47
/*
48
static struct _AddressEdit_dlg {
49
        GtkWidget *window;
50
        GtkWidget *name_entry;
51
        GtkWidget *addr_entry;
52
        GtkWidget *rem_entry;
53
        GtkWidget *ok_btn;
54
        GtkWidget *cancel_btn;
55
} addredit;
56
*/
57
58
static struct _PersonEdit_dlg {
59
        GtkWidget *window;
60
        GtkWidget *notebook;
61
        GtkWidget *ok_btn;
62
        GtkWidget *cancel_btn;
63
        GtkWidget *statusbar;
64
        gint status_cid;
65
66
        /* Basic data tab */
67
        GtkWidget *entry_name;
68
        GtkWidget *entry_first;
69
        GtkWidget *entry_last;
70
        GtkWidget *entry_nick;
71
72
        /* EMail data tab */
73
        GtkWidget *entry_email;
74
        GtkWidget *entry_alias;
75
        GtkWidget *entry_remarks;
76
        GtkWidget *clist_email;
77
78
        /* Attribute data tab */
79
        GtkWidget *entry_atname;
80
        GtkWidget *entry_atvalue;
81
        GtkWidget *clist_attrib;
82
83
        gint rowIndEMail;
84
        gint rowIndAttrib;
85
        gboolean editNew;
86
87
} personeditdlg;
88
89
typedef enum {
90
        EMAIL_COL_EMAIL   = 0,
91
        EMAIL_COL_ALIAS   = 1,
92
        EMAIL_COL_REMARKS = 2
93
} PersonEditEMailColumnPos;
94
95
typedef enum {
96
        ATTRIB_COL_NAME    = 0,
97
        ATTRIB_COL_VALUE   = 1
98
} PersonEditAttribColumnPos;
99
100
#define EDITPERSON_WIDTH      520
101
#define EDITPERSON_HEIGHT     340
102
103
#define EMAIL_N_COLS          3
104
#define EMAIL_COL_WIDTH_EMAIL 180
105
#define EMAIL_COL_WIDTH_ALIAS 80
106
107
#define ATTRIB_N_COLS          2
108
#define ATTRIB_COL_WIDTH_NAME  120
109
#define ATTRIB_COL_WIDTH_VALUE 180
110
111
#define PAGE_BASIC             0
112
#define PAGE_EMAIL             1
113
#define PAGE_ATTRIBUTES        2
114
115
#if 0
116
#define SET_LABEL_AND_ENTRY(str, entry, top) \
117
{ \
118
        label = gtk_label_new(str); \
119
        gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), \
120
                         GTK_FILL, 0, 0, 0); \
121
        gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); \
122
 \
123
        entry = gtk_entry_new(); \
124
        gtk_table_attach(GTK_TABLE(table), entry, 1, 2, top, (top + 1), \
125
                         GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0); \
126
}
127
128
static void edit_address_ok(GtkWidget *widget, gboolean *cancelled)
129
{
130
        *cancelled = FALSE;
131
        gtk_main_quit();
132
}
133
134
static void edit_address_cancel(GtkWidget *widget, gboolean *cancelled)
135
{
136
        *cancelled = TRUE;
137
        gtk_main_quit();
138
}
139
140
static gint edit_address_delete_event(GtkWidget *widget, GdkEventAny *event,
141
                                      gboolean *cancelled)
142
{
143
        *cancelled = TRUE;
144
        gtk_main_quit();
145
146
        return TRUE;
147
}
148
149
static gboolean edit_address_key_pressed(GtkWidget *widget, GdkEventKey *event,
150
                                         gboolean *cancelled)
151
{
152
        if (event && event->keyval == GDK_Escape) {
153
                *cancelled = TRUE;
154
                gtk_main_quit();
155
        }
156
        return FALSE;
157
}
158
159
static void addressbook_edit_address_create(gboolean *cancelled)
160
{
161
        GtkWidget *window;
162
        GtkWidget *vbox;
163
        GtkWidget *table;
164
        GtkWidget *label;
165
        GtkWidget *name_entry;
166
        GtkWidget *addr_entry;
167
        GtkWidget *rem_entry;
168
        GtkWidget *hbbox;
169
        GtkWidget *ok_btn;
170
        GtkWidget *cancel_btn;
171
172
        debug_print("Creating edit_address window...\n");
173
174
        window = gtk_window_new(GTK_WINDOW_DIALOG);
175
        gtk_widget_set_size_request(window, 400, -1);
176
        /* gtk_container_set_border_width(GTK_CONTAINER(window), 8); */
177
        gtk_window_set_title(GTK_WINDOW(window), _("Edit address"));
178
        gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
179
        gtk_window_set_modal(GTK_WINDOW(window), TRUE);        
180
        g_signal_connect(G_OBJECT(window), "delete_event",
181
                         G_CALLBACK(edit_address_delete_event),
182
                         cancelled);
183
        g_signal_connect(G_OBJECT(window), "key_press_event",
184
                         G_CALLBACK(edit_address_key_pressed),
185
                         cancelled);
186
187
        vbox = gtk_vbox_new(FALSE, 8);
188
        gtk_container_add(GTK_CONTAINER(window), vbox);
189
190
        table = gtk_table_new(3, 2, FALSE);
191
        gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
192
        gtk_table_set_row_spacings(GTK_TABLE(table), 8);
193
        gtk_table_set_col_spacings(GTK_TABLE(table), 8);
194
195
        SET_LABEL_AND_ENTRY(_("Name"),    name_entry, 0);
196
        SET_LABEL_AND_ENTRY(_("Address"), addr_entry, 1);
197
        SET_LABEL_AND_ENTRY(_("Remarks"), rem_entry,  2);
198
199
        gtkut_stock_button_set_create(&hbbox, &ok_btn, GTK_STOCK_OK,
200
                                      &cancel_btn, GTK_STOCK_CANCEL,
201
                                      NULL, NULL);
202
        gtk_box_pack_end(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0);
203
        gtk_widget_grab_default(ok_btn);
204
205
        g_signal_connect(G_OBJECT(ok_btn), "clicked",
206
                         G_CALLBACK(edit_address_ok), cancelled);
207
        g_signal_connect(G_OBJECT(cancel_btn), "clicked",
208
                         G_CALLBACK(edit_address_cancel), cancelled);
209
210
        gtk_widget_show_all(vbox);
211
212
        addredit.window     = window;
213
        addredit.name_entry = name_entry;
214
        addredit.addr_entry = addr_entry;
215
        addredit.rem_entry  = rem_entry;
216
        addredit.ok_btn     = ok_btn;
217
        addredit.cancel_btn = cancel_btn;
218
}
219
220
AddressItem *addressbook_edit_address(AddressItem *item)
221
{
222
        static gboolean cancelled;
223
        const gchar *str;
224
225
        if (!addredit.window)
226
                addressbook_edit_address_create(&cancelled);
227
        gtk_widget_grab_focus(addredit.ok_btn);
228
        gtk_widget_grab_focus(addredit.name_entry);
229
        gtk_widget_show(addredit.window);
230
        manage_window_set_transient(GTK_WINDOW(addredit.window));
231
232
        gtk_entry_set_text(GTK_ENTRY(addredit.name_entry), "");
233
        gtk_entry_set_text(GTK_ENTRY(addredit.addr_entry), "");
234
        gtk_entry_set_text(GTK_ENTRY(addredit.rem_entry),  "");
235
236
        if (item) {
237
                if (ADDRESS_OBJECT_NAME(item))
238
                        gtk_entry_set_text(GTK_ENTRY(addredit.name_entry),
239
                                           ADDRESS_OBJECT_NAME(item));
240
                if (item->address)
241
                        gtk_entry_set_text(GTK_ENTRY(addredit.addr_entry),
242
                                           item->address);
243
                if (item->remarks)
244
                        gtk_entry_set_text(GTK_ENTRY(addredit.rem_entry),
245
                                           item->remarks);
246
        }
247
248
        gtk_main();
249
        gtk_widget_hide(addredit.window);
250
        if (cancelled == TRUE) return NULL;
251
252
        str = gtk_entry_get_text(GTK_ENTRY(addredit.name_entry));
253
        if (*str == '\0') return NULL;
254
255
        if (!item) {
256
                item = mgu_create_address();
257
                ADDRESS_OBJECT_TYPE(item) = ADDR_ITEM;
258
        }
259
260
        g_free(ADDRESS_OBJECT_NAME(item));
261
        ADDRESS_OBJECT_NAME(item) = g_strdup(str);
262
263
        str = gtk_entry_get_text(GTK_ENTRY(addredit.addr_entry));
264
        g_free(item->address);
265
        if (*str == '\0')
266
                item->address = NULL;
267
        else
268
                item->address = g_strdup(str);
269
270
        str = gtk_entry_get_text(GTK_ENTRY(addredit.rem_entry));
271
        g_free(item->remarks);
272
        if (*str == '\0')
273
                item->remarks = NULL;
274
        else
275
                item->remarks = g_strdup(str);
276
277
        return item;
278
}
279
#endif /* 0 */
280
281
static void edit_person_status_show( gchar *msg ) {
282
        if( personeditdlg.statusbar != NULL ) {
283
                gtk_statusbar_pop( GTK_STATUSBAR(personeditdlg.statusbar), personeditdlg.status_cid );
284
                if( msg ) {
285
                        gtk_statusbar_push( GTK_STATUSBAR(personeditdlg.statusbar), personeditdlg.status_cid, msg );
286
                }
287
        }
288
}
289
290
static void edit_person_ok(GtkWidget *widget, gboolean *cancelled) {
291
        *cancelled = FALSE;
292
        gtk_main_quit();
293
}
294
295
static void edit_person_cancel(GtkWidget *widget, gboolean *cancelled) {
296
        *cancelled = TRUE;
297
        gtk_main_quit();
298
}
299
300
static gint edit_person_delete_event(GtkWidget *widget, GdkEventAny *event, gboolean *cancelled) {
301
        *cancelled = TRUE;
302
        gtk_main_quit();
303
        return TRUE;
304
}
305
306
static gboolean edit_person_key_pressed(GtkWidget *widget, GdkEventKey *event, gboolean *cancelled) {
307
        if (event && event->keyval == GDK_Escape) {
308
                *cancelled = TRUE;
309
                gtk_main_quit();
310
        }
311
        return FALSE;
312
}
313
314
static gchar *_title_new_ = NULL;
315
static gchar *_title_edit_ = NULL;
316
317
static void edit_person_set_window_title( gint pageNum ) {
318
        gchar *sTitle;
319
320
        if( _title_new_ == NULL ) {
321
                _title_new_ = g_strdup( _("Add New Person") );
322
                _title_edit_ = g_strdup( _("Edit Person Details") );
323
        }
324
325
        if( pageNum == PAGE_BASIC ) {
326
                if( personeditdlg.editNew ) {
327
                        gtk_window_set_title( GTK_WINDOW(personeditdlg.window), _title_new_ );
328
                }
329
                else {
330
                        gtk_window_set_title( GTK_WINDOW(personeditdlg.window), _title_edit_ );
331
                }
332
        }
333
        else {
334
                if( personeditdlg.entry_name == NULL ) {
335
                        sTitle = g_strdup( _title_edit_ );
336
                }
337
                else {
338
                        gchar *name;
339
                        name = gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_name), 0, -1 );
340
                        sTitle = g_strdup_printf( "%s - %s", _title_edit_, name );
341
                        g_free( name );
342
                }
343
                gtk_window_set_title( GTK_WINDOW(personeditdlg.window), sTitle );
344
                g_free( sTitle );
345
        }
346
}
347
348
static void edit_person_email_clear( gpointer data ) {
349
        gtk_entry_set_text( GTK_ENTRY(personeditdlg.entry_email), "" );
350
        gtk_entry_set_text( GTK_ENTRY(personeditdlg.entry_alias), "" );
351
        gtk_entry_set_text( GTK_ENTRY(personeditdlg.entry_remarks), "" );
352
}
353
354
static void edit_person_attrib_clear( gpointer data ) {
355
        gtk_entry_set_text( GTK_ENTRY(personeditdlg.entry_atname), "" );
356
        gtk_entry_set_text( GTK_ENTRY(personeditdlg.entry_atvalue), "" );
357
}
358
359
static void edit_person_switch_page( GtkNotebook *notebook, GtkNotebookPage *page,
360
                                        gint pageNum, gpointer user_data)
361
{
362
        edit_person_set_window_title( pageNum );
363
        edit_person_status_show( "" );
364
}
365
366
/*
367
* Load clist with a copy of person's email addresses.
368
*/
369
void edit_person_load_email( ItemPerson *person ) {
370
        GList *node = person->listEMail;
371
        GtkCList *clist = GTK_CLIST(personeditdlg.clist_email);
372
        gchar *text[ EMAIL_N_COLS ];
373
        while( node ) {
374
                ItemEMail *emorig = ( ItemEMail * ) node->data;
375
                ItemEMail *email = addritem_copy_item_email( emorig );
376
                gint row;
377
                text[ EMAIL_COL_EMAIL   ] = email->address;
378
                text[ EMAIL_COL_ALIAS   ] = email->obj.name;
379
                text[ EMAIL_COL_REMARKS ] = email->remarks;
380
381
                row = gtk_clist_append( clist, text );
382
                gtk_clist_set_row_data( clist, row, email );
383
                node = g_list_next( node );
384
        }
385
}
386
387
static void edit_person_email_list_selected( GtkCList *clist, gint row, gint column, GdkEvent *event, gpointer data ) {
388
        ItemEMail *email = gtk_clist_get_row_data( clist, row );
389
        if( email ) {
390
                if( email->address )
391
                        gtk_entry_set_text( GTK_ENTRY(personeditdlg.entry_email), email->address );
392
                if( ADDRITEM_NAME(email) )
393
                        gtk_entry_set_text( GTK_ENTRY(personeditdlg.entry_alias), ADDRITEM_NAME(email) );
394
                if( email->remarks )
395
                        gtk_entry_set_text( GTK_ENTRY(personeditdlg.entry_remarks), email->remarks );
396
        }
397
        personeditdlg.rowIndEMail = row;
398
        edit_person_status_show( NULL );
399
}
400
401
static void edit_person_email_move( gint dir ) {
402
        GtkCList *clist = GTK_CLIST(personeditdlg.clist_email);
403
        gint row = personeditdlg.rowIndEMail + dir;
404
        ItemEMail *email = gtk_clist_get_row_data( clist, row );
405
        if( email ) {
406
                gtk_clist_row_move( clist, personeditdlg.rowIndEMail, row );
407
                personeditdlg.rowIndEMail = row;
408
        }
409
        edit_person_email_clear( NULL );
410
        edit_person_status_show( NULL );
411
}
412
413
static void edit_person_email_move_up( gpointer data ) {
414
        edit_person_email_move( -1 );
415
}
416
417
static void edit_person_email_move_down( gpointer data ) {
418
        edit_person_email_move( +1 );
419
}
420
421
static void edit_person_email_delete( gpointer data ) {
422
        GtkCList *clist = GTK_CLIST(personeditdlg.clist_email);
423
        gint row = personeditdlg.rowIndEMail;
424
        ItemEMail *email = gtk_clist_get_row_data( clist, row );
425
        edit_person_email_clear( NULL );
426
        if( email ) {
427
                /* Remove list entry */
428
                gtk_clist_remove( clist, row );
429
                addritem_free_item_email( email );
430
                email = NULL;
431
        }
432
433
        /* Position hilite bar */
434
        email = gtk_clist_get_row_data( clist, row );
435
        if( ! email ) {
436
                personeditdlg.rowIndEMail = -1 + row;
437
        }
438
        edit_person_status_show( NULL );
439
}
440
441
static ItemEMail *edit_person_email_edit( gboolean *error, ItemEMail *email ) {
442
        ItemEMail *retVal = NULL;
443
        gchar *sEmail, *sAlias, *sRemarks, *sEmail_;
444
445
        *error = TRUE;
446
        sEmail_ = gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_email), 0, -1 );
447
        sAlias = gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_alias), 0, -1 );
448
        sRemarks = gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_remarks), 0, -1 );
449
        sEmail = mgu_email_check_empty( sEmail_ );
450
        g_free( sEmail_ );
451
452
        if( sEmail ) {
453
                if( email == NULL ) {
454
                        email = addritem_create_item_email();
455
                }
456
                addritem_email_set_address( email, sEmail );
457
                addritem_email_set_alias( email, sAlias );
458
                addritem_email_set_remarks( email, sRemarks );
459
                retVal = email;
460
                *error = FALSE;
461
        }
462
        else {
463
                edit_person_status_show( _( "An E-Mail address must be supplied." ) );
464
        }
465
466
        g_free( sEmail );
467
        g_free( sAlias );
468
        g_free( sRemarks );
469
470
        return retVal;
471
}
472
473
static void edit_person_email_modify( gpointer data ) {
474
        gboolean errFlg = FALSE;
475
        GtkCList *clist = GTK_CLIST(personeditdlg.clist_email);
476
        gint row = personeditdlg.rowIndEMail;
477
        ItemEMail *email = gtk_clist_get_row_data( clist, row );
478
        if( email ) {
479
                edit_person_email_edit( &errFlg, email );
480
                if( ! errFlg ) {
481
                        gtk_clist_set_text( clist, row, EMAIL_COL_EMAIL, email->address );
482
                        gtk_clist_set_text( clist, row, EMAIL_COL_ALIAS, email->obj.name );
483
                        gtk_clist_set_text( clist, row, EMAIL_COL_REMARKS, email->remarks );
484
                        edit_person_email_clear( NULL );
485
                }
486
        }
487
}
488
489
static void edit_person_email_add( gpointer data ) {
490
        GtkCList *clist = GTK_CLIST(personeditdlg.clist_email);
491
        gboolean errFlg = FALSE;
492
        ItemEMail *email = NULL;
493
        gint row = personeditdlg.rowIndEMail;
494
        if( gtk_clist_get_row_data( clist, row ) == NULL ) row = 0;
495
496
        email = edit_person_email_edit( &errFlg, NULL );
497
        if( ! errFlg ) {
498
                gchar *text[ EMAIL_N_COLS ];
499
                text[ EMAIL_COL_EMAIL   ] = email->address;
500
                text[ EMAIL_COL_ALIAS   ] = email->obj.name;
501
                text[ EMAIL_COL_REMARKS ] = email->remarks;
502
503
                row = gtk_clist_insert( clist, 1 + row, text );
504
                gtk_clist_set_row_data( clist, row, email );
505
                gtk_clist_select_row( clist, row, 0 );
506
                edit_person_email_clear( NULL );
507
        }
508
}
509
510
/*
511
* Load clist with a copy of person's email addresses.
512
*/
513
void edit_person_load_attrib( ItemPerson *person ) {
514
        GList *node = person->listAttrib;
515
        GtkCList *clist = GTK_CLIST(personeditdlg.clist_attrib);
516
        gchar *text[ ATTRIB_N_COLS ];
517
        while( node ) {
518
                UserAttribute *atorig = ( UserAttribute * ) node->data;
519
                UserAttribute *attrib = addritem_copy_attribute( atorig );
520
                gint row;
521
                text[ ATTRIB_COL_NAME  ] = attrib->name;
522
                text[ ATTRIB_COL_VALUE ] = attrib->value;
523
524
                row = gtk_clist_append( clist, text );
525
                gtk_clist_set_row_data( clist, row, attrib );
526
                node = g_list_next( node );
527
        }
528
}
529
530
static void edit_person_attrib_list_selected( GtkCList *clist, gint row, gint column, GdkEvent *event, gpointer data ) {
531
        UserAttribute *attrib = gtk_clist_get_row_data( clist, row );
532
        if( attrib ) {
533
                gtk_entry_set_text( GTK_ENTRY(personeditdlg.entry_atname), attrib->name );
534
                gtk_entry_set_text( GTK_ENTRY(personeditdlg.entry_atvalue), attrib->value );
535
        }
536
        personeditdlg.rowIndAttrib = row;
537
        edit_person_status_show( NULL );
538
}
539
540
static void edit_person_attrib_delete( gpointer data ) {
541
        GtkCList *clist = GTK_CLIST(personeditdlg.clist_attrib);
542
        gint row = personeditdlg.rowIndAttrib;
543
        UserAttribute *attrib = gtk_clist_get_row_data( clist, row );
544
        edit_person_attrib_clear( NULL );
545
        if( attrib ) {
546
                /* Remove list entry */
547
                gtk_clist_remove( clist, row );
548
                addritem_free_attribute( attrib );
549
                attrib = NULL;
550
        }
551
552
        /* Position hilite bar */
553
        attrib = gtk_clist_get_row_data( clist, row );
554
        if( ! attrib ) {
555
                personeditdlg.rowIndAttrib = -1 + row;
556
        }
557
        edit_person_status_show( NULL );
558
}
559
560
static UserAttribute *edit_person_attrib_edit( gboolean *error, UserAttribute *attrib ) {
561
        UserAttribute *retVal = NULL;
562
        gchar *sName, *sValue, *sName_, *sValue_;
563
564
        *error = TRUE;
565
        sName_ = gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_atname), 0, -1 );
566
        sValue_ = gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_atvalue), 0, -1 );
567
        sName = mgu_email_check_empty( sName_ );
568
        sValue = mgu_email_check_empty( sValue_ );
569
        g_free( sName_ );
570
        g_free( sValue_ );
571
572
        if( sName && sValue ) {
573
                if( attrib == NULL ) {
574
                        attrib = addritem_create_attribute();
575
                }
576
                addritem_attrib_set_name( attrib, sName );
577
                addritem_attrib_set_value( attrib, sValue );
578
                retVal = attrib;
579
                *error = FALSE;
580
        }
581
        else {
582
                edit_person_status_show( _( "A Name and Value must be supplied." ) );
583
        }
584
585
        g_free( sName );
586
        g_free( sValue );
587
588
        return retVal;
589
}
590
591
static void edit_person_attrib_modify( gpointer data ) {
592
        gboolean errFlg = FALSE;
593
        GtkCList *clist = GTK_CLIST(personeditdlg.clist_attrib);
594
        gint row = personeditdlg.rowIndAttrib;
595
        UserAttribute *attrib = gtk_clist_get_row_data( clist, row );
596
        if( attrib ) {
597
                edit_person_attrib_edit( &errFlg, attrib );
598
                if( ! errFlg ) {
599
                        gtk_clist_set_text( clist, row, ATTRIB_COL_NAME, attrib->name );
600
                        gtk_clist_set_text( clist, row, ATTRIB_COL_VALUE, attrib->value );
601
                        edit_person_attrib_clear( NULL );
602
                }
603
        }
604
}
605
606
static void edit_person_attrib_add( gpointer data ) {
607
        GtkCList *clist = GTK_CLIST(personeditdlg.clist_attrib);
608
        gboolean errFlg = FALSE;
609
        UserAttribute *attrib = NULL;
610
        gint row = personeditdlg.rowIndAttrib;
611
        if( gtk_clist_get_row_data( clist, row ) == NULL ) row = 0;
612
613
        attrib = edit_person_attrib_edit( &errFlg, NULL );
614
        if( ! errFlg ) {
615
                gchar *text[ EMAIL_N_COLS ];
616
                text[ ATTRIB_COL_NAME  ] = attrib->name;
617
                text[ ATTRIB_COL_VALUE ] = attrib->value;
618
619
                row = gtk_clist_insert( clist, 1 + row, text );
620
                gtk_clist_set_row_data( clist, row, attrib );
621
                gtk_clist_select_row( clist, row, 0 );
622
                edit_person_attrib_clear( NULL );
623
        }
624
}
625
626
static void addressbook_edit_person_dialog_create( gboolean *cancelled ) {
627
        GtkWidget *window;
628
        GtkWidget *vbox;
629
        GtkWidget *vnbox;
630
        GtkWidget *notebook;
631
        GtkWidget *hbbox;
632
        GtkWidget *ok_btn;
633
        GtkWidget *cancel_btn;
634
        GtkWidget *hsbox;
635
        GtkWidget *statusbar;
636
637
        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
638
        gtk_widget_set_size_request(window, EDITPERSON_WIDTH, EDITPERSON_HEIGHT );
639
        /* gtk_container_set_border_width(GTK_CONTAINER(window), 0); */
640
        gtk_window_set_title(GTK_WINDOW(window), _("Edit Person Data"));
641
        gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
642
        gtk_window_set_modal(GTK_WINDOW(window), TRUE);        
643
        g_signal_connect(G_OBJECT(window), "delete_event",
644
                         G_CALLBACK(edit_person_delete_event),
645
                         cancelled);
646
        g_signal_connect(G_OBJECT(window), "key_press_event",
647
                         G_CALLBACK(edit_person_key_pressed),
648
                         cancelled);
649
650
        vbox = gtk_vbox_new(FALSE, 4);
651
        /* gtk_container_set_border_width(GTK_CONTAINER(vbox), BORDER_WIDTH); */
652
        gtk_widget_show(vbox);
653
        gtk_container_add(GTK_CONTAINER(window), vbox);
654
655
        vnbox = gtk_vbox_new(FALSE, 4);
656
        gtk_container_set_border_width(GTK_CONTAINER(vnbox), 4);
657
        gtk_widget_show(vnbox);
658
        gtk_box_pack_start(GTK_BOX(vbox), vnbox, TRUE, TRUE, 0);
659
660
        /* Notebook */
661
        notebook = gtk_notebook_new();
662
        gtk_widget_show(notebook);
663
        gtk_box_pack_start(GTK_BOX(vnbox), notebook, TRUE, TRUE, 0);
664
        gtk_container_set_border_width(GTK_CONTAINER(notebook), 6);
665
666
        /* Status line */
667
        hsbox = gtk_hbox_new(FALSE, 0);
668
        gtk_box_pack_end(GTK_BOX(vbox), hsbox, FALSE, FALSE, BORDER_WIDTH);
669
        statusbar = gtk_statusbar_new();
670
        gtk_box_pack_start(GTK_BOX(hsbox), statusbar, TRUE, TRUE, BORDER_WIDTH);
671
672
        /* Button panel */
673
        gtkut_stock_button_set_create(&hbbox, &ok_btn, GTK_STOCK_OK,
674
                                      &cancel_btn, GTK_STOCK_CANCEL,
675
                                      NULL, NULL);
676
        gtk_box_pack_end(GTK_BOX(vnbox), hbbox, FALSE, FALSE, 0);
677
        gtk_widget_grab_default(ok_btn);
678
679
        g_signal_connect(G_OBJECT(ok_btn), "clicked",
680
                         G_CALLBACK(edit_person_ok), cancelled);
681
        g_signal_connect(G_OBJECT(cancel_btn), "clicked",
682
                         G_CALLBACK(edit_person_cancel), cancelled);
683
        g_signal_connect(G_OBJECT(notebook), "switch_page",
684
                         G_CALLBACK(edit_person_switch_page), NULL);
685
686
        gtk_widget_show_all(vbox);
687
688
        personeditdlg.window     = window;
689
        personeditdlg.notebook   = notebook;
690
        personeditdlg.ok_btn     = ok_btn;
691
        personeditdlg.cancel_btn = cancel_btn;
692
        personeditdlg.statusbar  = statusbar;
693
        personeditdlg.status_cid = gtk_statusbar_get_context_id( GTK_STATUSBAR(statusbar), "Edit Person Dialog" );
694
695
}
696
697
void addressbook_edit_person_page_basic( gint pageNum, gchar *pageLbl ) {
698
        GtkWidget *vbox;
699
        GtkWidget *table;
700
        GtkWidget *label;
701
        GtkWidget *entry_name;
702
        GtkWidget *entry_fn;
703
        GtkWidget *entry_ln;
704
        GtkWidget *entry_nn;
705
        const gchar *locale;
706
        gint top = 0;
707
708
        vbox = gtk_vbox_new( FALSE, 8 );
709
        gtk_widget_show( vbox );
710
        gtk_container_add( GTK_CONTAINER( personeditdlg.notebook ), vbox );
711
        gtk_container_set_border_width( GTK_CONTAINER (vbox), BORDER_WIDTH );
712
713
        label = gtk_label_new( pageLbl );
714
        gtk_widget_show( label );
715
        gtk_notebook_set_tab_label(
716
                GTK_NOTEBOOK( personeditdlg.notebook ),
717
                gtk_notebook_get_nth_page( GTK_NOTEBOOK( personeditdlg.notebook ), pageNum ), label );
718
719
        table = gtk_table_new( 4, 3, FALSE);
720
        gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
721
        gtk_container_set_border_width( GTK_CONTAINER(table), 8 );
722
        gtk_table_set_row_spacings(GTK_TABLE(table), 8);
723
        gtk_table_set_col_spacings(GTK_TABLE(table), 8);
724
725
#define ATTACH_ROW(text, entry) \
726
{ \
727
        label = gtk_label_new(text); \
728
        gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), \
729
                         GTK_FILL, 0, 0, 0); \
730
        gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); \
731
 \
732
        entry = gtk_entry_new(); \
733
        gtk_table_attach(GTK_TABLE(table), entry, 1, 2, top, (top + 1), \
734
                         GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0); \
735
        top++; \
736
}
737
738
        ATTACH_ROW(_("Display Name"), entry_name);
739
        locale = conv_get_current_locale();
740
        if (locale &&
741
            (!g_strncasecmp(locale, "ja", 2) ||
742
             !g_strncasecmp(locale, "ko", 2) ||
743
             !g_strncasecmp(locale, "zh", 2))) {
744
                ATTACH_ROW(_("Last Name"), entry_ln);
745
                ATTACH_ROW(_("First Name"), entry_fn);
746
        } else {
747
                ATTACH_ROW(_("First Name"), entry_fn);
748
                ATTACH_ROW(_("Last Name"), entry_ln);
749
        }
750
        ATTACH_ROW(_("Nick Name"), entry_nn);
751
752
#undef ATTACH_ROW
753
754
        gtk_widget_show_all(vbox);
755
756
        personeditdlg.entry_name  = entry_name;
757
        personeditdlg.entry_first = entry_fn;
758
        personeditdlg.entry_last  = entry_ln;
759
        personeditdlg.entry_nick  = entry_nn;
760
}
761
762
void addressbook_edit_person_page_email( gint pageNum, gchar *pageLbl ) {
763
        GtkWidget *vbox;
764
        GtkWidget *hbox;
765
        GtkWidget *vboxl;
766
        GtkWidget *vboxb;
767
        GtkWidget *vbuttonbox;
768
        GtkWidget *buttonUp;
769
        GtkWidget *buttonDown;
770
        GtkWidget *buttonDel;
771
        GtkWidget *buttonMod;
772
        GtkWidget *buttonAdd;
773
        GtkWidget *buttonClr;
774
775
        GtkWidget *table;
776
        GtkWidget *label;
777
        GtkWidget *clist_swin;
778
        GtkWidget *clist;
779
        GtkWidget *entry_email;
780
        GtkWidget *entry_alias;
781
        GtkWidget *entry_remarks;
782
        gint top;
783
784
        gchar *titles[ EMAIL_N_COLS ];
785
        gint i;
786
787
        titles[ EMAIL_COL_EMAIL   ] = _("E-Mail Address");
788
        titles[ EMAIL_COL_ALIAS   ] = _("Alias");
789
        titles[ EMAIL_COL_REMARKS ] = _("Remarks");
790
791
        vbox = gtk_vbox_new( FALSE, 8 );
792
        gtk_widget_show( vbox );
793
        gtk_container_add( GTK_CONTAINER( personeditdlg.notebook ), vbox );
794
        gtk_container_set_border_width( GTK_CONTAINER (vbox), BORDER_WIDTH );
795
796
        label = gtk_label_new( pageLbl );
797
        gtk_widget_show( label );
798
        gtk_notebook_set_tab_label(
799
                GTK_NOTEBOOK( personeditdlg.notebook ),
800
                gtk_notebook_get_nth_page( GTK_NOTEBOOK( personeditdlg.notebook ), pageNum ), label );
801
802
        /* Split into two areas */
803
        hbox = gtk_hbox_new( FALSE, 0 );
804
        gtk_container_add( GTK_CONTAINER( vbox ), hbox );
805
806
        /* EMail list */
807
        vboxl = gtk_vbox_new( FALSE, 4 );
808
        gtk_container_add( GTK_CONTAINER( hbox ), vboxl );
809
        gtk_container_set_border_width( GTK_CONTAINER(vboxl), 4 );
810
811
        /* Address list */
812
        clist_swin = gtk_scrolled_window_new( NULL, NULL );
813
        gtk_container_add( GTK_CONTAINER(vboxl), clist_swin );
814
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(clist_swin),
815
                                       GTK_POLICY_AUTOMATIC,
816
                                       GTK_POLICY_ALWAYS);
817
818
        clist = gtk_clist_new_with_titles( EMAIL_N_COLS, titles );
819
        gtk_container_add( GTK_CONTAINER(clist_swin), clist );
820
        gtk_clist_set_selection_mode( GTK_CLIST(clist), GTK_SELECTION_BROWSE );
821
        gtk_clist_set_column_width( GTK_CLIST(clist), EMAIL_COL_EMAIL, EMAIL_COL_WIDTH_EMAIL );
822
        gtk_clist_set_column_width( GTK_CLIST(clist), EMAIL_COL_ALIAS, EMAIL_COL_WIDTH_ALIAS );
823
824
        for( i = 0; i < EMAIL_N_COLS; i++ )
825
                GTK_WIDGET_UNSET_FLAGS(GTK_CLIST(clist)->column[i].button, GTK_CAN_FOCUS);
826
827
        /* Data entry area */
828
        table = gtk_table_new( 4, 2, FALSE);
829
        gtk_box_pack_start(GTK_BOX(vboxl), table, FALSE, FALSE, 0);
830
        gtk_container_set_border_width( GTK_CONTAINER(table), 4 );
831
        gtk_table_set_row_spacings(GTK_TABLE(table), 4);
832
        gtk_table_set_col_spacings(GTK_TABLE(table), 4);
833
834
        /* First row */
835
        top = 0;
836
        label = gtk_label_new(_("E-Mail Address"));
837
        gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0);
838
        gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
839
840
        entry_email = gtk_entry_new();
841
        gtk_table_attach(GTK_TABLE(table), entry_email, 1, 2, top, (top + 1), GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
842
843
        /* Next row */
844
        ++top;
845
        label = gtk_label_new(_("Alias"));
846
        gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0);
847
        gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
848
849
        entry_alias = gtk_entry_new();
850
        gtk_table_attach(GTK_TABLE(table), entry_alias, 1, 2, top, (top + 1), GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
851
852
        /* Next row */
853
        ++top;
854
        label = gtk_label_new(_("Remarks"));
855
        gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0);
856
        gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
857
858
        entry_remarks = gtk_entry_new();
859
        gtk_table_attach(GTK_TABLE(table), entry_remarks, 1, 2, top, (top + 1), GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
860
861
        /* Button box */
862
        vboxb = gtk_vbox_new( FALSE, 4 );
863
        gtk_box_pack_start(GTK_BOX(hbox), vboxb, FALSE, FALSE, 2);
864
865
        vbuttonbox = gtk_vbutton_box_new();
866
        gtk_button_box_set_layout( GTK_BUTTON_BOX(vbuttonbox), GTK_BUTTONBOX_START );
867
        gtk_box_set_spacing( GTK_BOX(vbuttonbox), 8 );
868
        gtk_container_set_border_width( GTK_CONTAINER(vbuttonbox), 4 );
869
        gtk_container_add( GTK_CONTAINER(vboxb), vbuttonbox );
870
871
        /* Buttons */
872
        buttonUp = gtk_button_new_with_label( _( "Move Up" ) );
873
        gtk_container_add( GTK_CONTAINER(vbuttonbox), buttonUp );
874
875
        buttonDown = gtk_button_new_with_label( _( "Move Down" ) );
876
        gtk_container_add( GTK_CONTAINER(vbuttonbox), buttonDown );
877
878
        buttonDel = gtk_button_new_with_label( _( "Delete" ) );
879
        gtk_container_add( GTK_CONTAINER(vbuttonbox), buttonDel );
880
881
        buttonMod = gtk_button_new_with_label( _( "Modify" ) );
882
        gtk_container_add( GTK_CONTAINER(vbuttonbox), buttonMod );
883
884
        buttonAdd = gtk_button_new_with_label( _( "Add" ) );
885
        gtk_container_add( GTK_CONTAINER(vbuttonbox), buttonAdd );
886
887
        buttonClr = gtk_button_new_with_label( _( "Clear" ) );
888
        gtk_container_add( GTK_CONTAINER(vbuttonbox), buttonClr );
889
890
        gtk_widget_show_all(vbox);
891
892
        /* Event handlers */
893
        g_signal_connect( G_OBJECT(clist), "select_row",
894
                          G_CALLBACK( edit_person_email_list_selected), NULL );
895
        g_signal_connect( G_OBJECT(buttonUp), "clicked",
896
                          G_CALLBACK( edit_person_email_move_up ), NULL );
897
        g_signal_connect( G_OBJECT(buttonDown), "clicked",
898
                          G_CALLBACK( edit_person_email_move_down ), NULL );
899
        g_signal_connect( G_OBJECT(buttonDel), "clicked",
900
                          G_CALLBACK( edit_person_email_delete ), NULL );
901
        g_signal_connect( G_OBJECT(buttonMod), "clicked",
902
                          G_CALLBACK( edit_person_email_modify ), NULL );
903
        g_signal_connect( G_OBJECT(buttonAdd), "clicked",
904
                          G_CALLBACK( edit_person_email_add ), NULL );
905
        g_signal_connect( G_OBJECT(buttonClr), "clicked",
906
                          G_CALLBACK( edit_person_email_clear ), NULL );
907
908
        personeditdlg.clist_email   = clist;
909
        personeditdlg.entry_email   = entry_email;
910
        personeditdlg.entry_alias   = entry_alias;
911
        personeditdlg.entry_remarks = entry_remarks;
912
}
913
914
void addressbook_edit_person_page_attrib( gint pageNum, gchar *pageLbl ) {
915
        GtkWidget *vbox;
916
        GtkWidget *hbox;
917
        GtkWidget *vboxl;
918
        GtkWidget *vboxb;
919
        GtkWidget *vbuttonbox;
920
        GtkWidget *buttonDel;
921
        GtkWidget *buttonMod;
922
        GtkWidget *buttonAdd;
923
        GtkWidget *buttonClr;
924
925
        GtkWidget *table;
926
        GtkWidget *label;
927
        GtkWidget *clist_swin;
928
        GtkWidget *clist;
929
        GtkWidget *entry_name;
930
        GtkWidget *entry_value;
931
        gint top;
932
933
        gchar *titles[ ATTRIB_N_COLS ];
934
        gint i;
935
936
        titles[ ATTRIB_COL_NAME  ] = _("Name");
937
        titles[ ATTRIB_COL_VALUE ] = _("Value");
938
939
        vbox = gtk_vbox_new( FALSE, 8 );
940
        gtk_widget_show( vbox );
941
        gtk_container_add( GTK_CONTAINER( personeditdlg.notebook ), vbox );
942
        gtk_container_set_border_width( GTK_CONTAINER (vbox), BORDER_WIDTH );
943
944
        label = gtk_label_new( pageLbl );
945
        gtk_widget_show( label );
946
        gtk_notebook_set_tab_label(
947
                GTK_NOTEBOOK( personeditdlg.notebook ),
948
                gtk_notebook_get_nth_page( GTK_NOTEBOOK( personeditdlg.notebook ), pageNum ), label );
949
950
        /* Split into two areas */
951
        hbox = gtk_hbox_new( FALSE, 0 );
952
        gtk_container_add( GTK_CONTAINER( vbox ), hbox );
953
954
        /* Attribute list */
955
        vboxl = gtk_vbox_new( FALSE, 4 );
956
        gtk_container_add( GTK_CONTAINER( hbox ), vboxl );
957
        gtk_container_set_border_width( GTK_CONTAINER(vboxl), 4 );
958
959
        /* Address list */
960
        clist_swin = gtk_scrolled_window_new( NULL, NULL );
961
        gtk_container_add( GTK_CONTAINER(vboxl), clist_swin );
962
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(clist_swin),
963
                                       GTK_POLICY_AUTOMATIC,
964
                                       GTK_POLICY_ALWAYS);
965
966
        clist = gtk_clist_new_with_titles( ATTRIB_N_COLS, titles );
967
        gtk_container_add( GTK_CONTAINER(clist_swin), clist );
968
        gtk_clist_set_selection_mode( GTK_CLIST(clist), GTK_SELECTION_BROWSE );
969
        gtk_clist_set_column_width( GTK_CLIST(clist), ATTRIB_COL_NAME, ATTRIB_COL_WIDTH_NAME );
970
        gtk_clist_set_column_width( GTK_CLIST(clist), ATTRIB_COL_VALUE, ATTRIB_COL_WIDTH_VALUE );
971
972
        for( i = 0; i < ATTRIB_N_COLS; i++ )
973
                GTK_WIDGET_UNSET_FLAGS(GTK_CLIST(clist)->column[i].button, GTK_CAN_FOCUS);
974
975
        /* Data entry area */
976
        table = gtk_table_new( 4, 2, FALSE);
977
        gtk_box_pack_start(GTK_BOX(vboxl), table, FALSE, FALSE, 0);
978
        gtk_container_set_border_width( GTK_CONTAINER(table), 4 );
979
        gtk_table_set_row_spacings(GTK_TABLE(table), 4);
980
        gtk_table_set_col_spacings(GTK_TABLE(table), 4);
981
982
        /* First row */
983
        top = 0;
984
        label = gtk_label_new(_("Name"));
985
        gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0);
986
        gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
987
988
        entry_name = gtk_entry_new();
989
        gtk_table_attach(GTK_TABLE(table), entry_name, 1, 2, top, (top + 1), GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
990
991
        /* Next row */
992
        ++top;
993
        label = gtk_label_new(_("Value"));
994
        gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0);
995
        gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
996
997
        entry_value = gtk_entry_new();
998
        gtk_table_attach(GTK_TABLE(table), entry_value, 1, 2, top, (top + 1), GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
999
1000
        /* Button box */
1001
        vboxb = gtk_vbox_new( FALSE, 4 );
1002
        gtk_box_pack_start(GTK_BOX(hbox), vboxb, FALSE, FALSE, 2);
1003
1004
        vbuttonbox = gtk_vbutton_box_new();
1005
        gtk_button_box_set_layout( GTK_BUTTON_BOX(vbuttonbox), GTK_BUTTONBOX_START );
1006
        gtk_box_set_spacing( GTK_BOX(vbuttonbox), 8 );
1007
        gtk_container_set_border_width( GTK_CONTAINER(vbuttonbox), 4 );
1008
        gtk_container_add( GTK_CONTAINER(vboxb), vbuttonbox );
1009
1010
        /* Buttons */
1011
        buttonDel = gtk_button_new_with_label( _( "Delete" ) );
1012
        gtk_container_add( GTK_CONTAINER(vbuttonbox), buttonDel );
1013
1014
        buttonMod = gtk_button_new_with_label( _( "Modify" ) );
1015
        gtk_container_add( GTK_CONTAINER(vbuttonbox), buttonMod );
1016
1017
        buttonAdd = gtk_button_new_with_label( _( "Add" ) );
1018
        gtk_container_add( GTK_CONTAINER(vbuttonbox), buttonAdd );
1019
1020
        buttonClr = gtk_button_new_with_label( _( "Clear" ) );
1021
        gtk_container_add( GTK_CONTAINER(vbuttonbox), buttonClr );
1022
1023
        gtk_widget_show_all(vbox);
1024
1025
        /* Event handlers */
1026
        g_signal_connect( G_OBJECT(clist), "select_row",
1027
                          G_CALLBACK( edit_person_attrib_list_selected), NULL );
1028
        g_signal_connect( G_OBJECT(buttonDel), "clicked",
1029
                          G_CALLBACK( edit_person_attrib_delete ), NULL );
1030
        g_signal_connect( G_OBJECT(buttonMod), "clicked",
1031
                          G_CALLBACK( edit_person_attrib_modify ), NULL );
1032
        g_signal_connect( G_OBJECT(buttonAdd), "clicked",
1033
                          G_CALLBACK( edit_person_attrib_add ), NULL );
1034
        g_signal_connect( G_OBJECT(buttonClr), "clicked",
1035
                          G_CALLBACK( edit_person_attrib_clear ), NULL );
1036
1037
        personeditdlg.clist_attrib  = clist;
1038
        personeditdlg.entry_atname  = entry_name;
1039
        personeditdlg.entry_atvalue = entry_value;
1040
}
1041
1042
static void addressbook_edit_person_create( gboolean *cancelled ) {
1043
        addressbook_edit_person_dialog_create( cancelled );
1044
        addressbook_edit_person_page_basic( PAGE_BASIC, _( "Basic Data" ) );
1045
        addressbook_edit_person_page_email( PAGE_EMAIL, _( "E-Mail Address" ) );
1046
        addressbook_edit_person_page_attrib( PAGE_ATTRIBUTES, _( "User Attributes" ) );
1047
        gtk_widget_show_all( personeditdlg.window );
1048
}
1049
1050
/*
1051
* Return list of email items.
1052
*/
1053
static GList *edit_person_build_email_list() {
1054
        GtkCList *clist = GTK_CLIST(personeditdlg.clist_email);
1055
        GList *listEMail = NULL;
1056
        ItemEMail *email;
1057
        gint row = 0;
1058
        while( (email = gtk_clist_get_row_data( clist, row )) ) {
1059
                listEMail = g_list_append( listEMail, email );
1060
                row++;
1061
        }
1062
        return listEMail;
1063
}
1064
1065
/*
1066
* Return list of attributes.
1067
*/
1068
static GList *edit_person_build_attrib_list() {
1069
        GtkCList *clist = GTK_CLIST(personeditdlg.clist_attrib);
1070
        GList *listAttrib = NULL;
1071
        UserAttribute *attrib;
1072
        gint row = 0;
1073
        while( (attrib = gtk_clist_get_row_data( clist, row )) ) {
1074
                listAttrib = g_list_append( listAttrib, attrib );
1075
                row++;
1076
        }
1077
        return listAttrib;
1078
}
1079
1080
/*
1081
* Edit person.
1082
* Enter: abf    Address book.
1083
*        parent Parent folder for person (or NULL if adding to root folder). Argument is
1084
*               only required for new objects).
1085
*        person Person to edit, or NULL for a new person object.
1086
*        pgMail If TRUE, E-Mail page will be activated.
1087
* Return: Edited object, or NULL if cancelled.
1088
*/
1089
ItemPerson *addressbook_edit_person( AddressBookFile *abf, ItemFolder *parent, ItemPerson *person, gboolean pgMail ) {
1090
        static gboolean cancelled;
1091
        GList *listEMail = NULL;
1092
        GList *listAttrib = NULL;
1093
        gchar *cn = NULL;
1094
1095
        if (!personeditdlg.window)
1096
                addressbook_edit_person_create(&cancelled);
1097
        gtk_widget_grab_focus(personeditdlg.ok_btn);
1098
        gtk_widget_grab_focus(personeditdlg.entry_name);
1099
        gtk_widget_show(personeditdlg.window);
1100
        manage_window_set_transient(GTK_WINDOW(personeditdlg.window));
1101
1102
        /* Clear all fields */
1103
        personeditdlg.rowIndEMail = -1;
1104
        personeditdlg.rowIndAttrib = -1;
1105
        edit_person_status_show( "" );
1106
        gtk_clist_clear( GTK_CLIST(personeditdlg.clist_email) );
1107
        gtk_clist_clear( GTK_CLIST(personeditdlg.clist_attrib) );
1108
        gtk_entry_set_text(GTK_ENTRY(personeditdlg.entry_name), "" );
1109
        gtk_entry_set_text(GTK_ENTRY(personeditdlg.entry_first), "" );
1110
        gtk_entry_set_text(GTK_ENTRY(personeditdlg.entry_last), "" );
1111
        gtk_entry_set_text(GTK_ENTRY(personeditdlg.entry_nick), "" );
1112
1113
        personeditdlg.editNew = FALSE;
1114
        if( person ) {
1115
                if( ADDRITEM_NAME(person) )
1116
                        gtk_entry_set_text(GTK_ENTRY(personeditdlg.entry_name), ADDRITEM_NAME(person) );
1117
                if( person->firstName )
1118
                        gtk_entry_set_text(GTK_ENTRY(personeditdlg.entry_first), person->firstName );
1119
                if( person->lastName )
1120
                        gtk_entry_set_text(GTK_ENTRY(personeditdlg.entry_last), person->lastName );
1121
                if( person->nickName )
1122
                        gtk_entry_set_text(GTK_ENTRY(personeditdlg.entry_nick), person->nickName );
1123
                edit_person_load_email( person );
1124
                edit_person_load_attrib( person );
1125
        }
1126
        else {
1127
                personeditdlg.editNew = TRUE;
1128
        }
1129
1130
        /* Select appropriate start page */
1131
        if( pgMail ) {
1132
                gtk_notebook_set_current_page( GTK_NOTEBOOK(personeditdlg.notebook), PAGE_EMAIL );
1133
        }
1134
        else {
1135
                gtk_notebook_set_current_page( GTK_NOTEBOOK(personeditdlg.notebook), PAGE_BASIC );
1136
        }
1137
1138
        gtk_clist_select_row( GTK_CLIST(personeditdlg.clist_email), 0, 0 );
1139
        gtk_clist_select_row( GTK_CLIST(personeditdlg.clist_attrib), 0, 0 );
1140
        edit_person_email_clear( NULL );
1141
        edit_person_attrib_clear( NULL );
1142
1143
        gtk_main();
1144
        gtk_widget_hide( personeditdlg.window );
1145
1146
        listEMail = edit_person_build_email_list();
1147
        listAttrib = edit_person_build_attrib_list();
1148
        if( cancelled ) {
1149
                addritem_free_list_email( listEMail );
1150
                gtk_clist_clear( GTK_CLIST(personeditdlg.clist_email) );
1151
                gtk_clist_clear( GTK_CLIST(personeditdlg.clist_attrib) );
1152
                return NULL;
1153
        }
1154
1155
        cn = gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_name), 0, -1 );
1156
        if( person ) {
1157
                /* Update email/attribute list */
1158
                addrbook_update_address_list( abf, person, listEMail );
1159
                addrbook_update_attrib_list( abf, person, listAttrib );
1160
        }
1161
        else {
1162
                /* Create new person and email/attribute list */
1163
                if( cn == NULL || *cn == '\0' ) {
1164
                        /* Wasting our time */
1165
                        if( listEMail == NULL && listAttrib == NULL ) cancelled = TRUE;
1166
                }
1167
                if( ! cancelled ) {
1168
                        person = addrbook_add_address_list( abf, parent, listEMail );
1169
                        addrbook_add_attrib_list( abf, person, listAttrib );
1170
                }
1171
        }
1172
1173
        if( !cancelled ) {
1174
                /* Set person stuff */
1175
                gchar *name;
1176
                addritem_person_set_common_name( person, cn );
1177
                name = gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_first), 0, -1 );
1178
                addritem_person_set_first_name( person, name );
1179
                g_free( name );
1180
                name = gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_last), 0, -1 );
1181
                addritem_person_set_last_name( person, name );
1182
                g_free( name );
1183
                name = gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_nick), 0, -1 );
1184
                addritem_person_set_nick_name( person, name );
1185
                g_free( name );
1186
        }
1187
        g_free( cn );
1188
1189
        listEMail = NULL;
1190
1191
        gtk_clist_clear( GTK_CLIST(personeditdlg.clist_email) );
1192
        gtk_clist_clear( GTK_CLIST(personeditdlg.clist_attrib) );
1193
1194
        return person;
1195
}
1196
1197
/*
1198
* End of Source.
1199
*/
1200