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