diff options
| author | Simeon Simeonov | 2018-02-26 11:23:00 +0100 |
|---|---|---|
| committer | Simeon Simeonov | 2018-02-26 11:23:00 +0100 |
| commit | 0b3cbf57875fd692e4ba0b336fefa4bee1ed00dc (patch) | |
| tree | af916a30553c78ce9d4f2d8658656a175c5b6921 /src/editaddress.c | |
Initial commit for sylpheed 3.7.0
Diffstat (limited to 'src/editaddress.c')
| -rw-r--r-- | src/editaddress.c | 1044 |
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 | /* | ||
| 52 | static 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 | |||
| 62 | static 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 | |||
| 94 | typedef enum { | ||
| 95 | EMAIL_COL_EMAIL = 0, | ||
| 96 | EMAIL_COL_ALIAS = 1, | ||
| 97 | EMAIL_COL_REMARKS = 2 | ||
| 98 | } PersonEditEMailColumnPos; | ||
| 99 | |||
| 100 | typedef 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 | |||
| 121 | static 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 | |||
| 130 | static void edit_person_ok(GtkWidget *widget, gboolean *cancelled) { | ||
| 131 | *cancelled = FALSE; | ||
| 132 | gtk_main_quit(); | ||
| 133 | } | ||
| 134 | |||
| 135 | static void edit_person_cancel(GtkWidget *widget, gboolean *cancelled) { | ||
| 136 | *cancelled = TRUE; | ||
| 137 | gtk_main_quit(); | ||
| 138 | } | ||
| 139 | |||
| 140 | static gint edit_person_delete_event(GtkWidget *widget, GdkEventAny *event, gboolean *cancelled) { | ||
| 141 | *cancelled = TRUE; | ||
| 142 | gtk_main_quit(); | ||
| 143 | return TRUE; | ||
| 144 | } | ||
| 145 | |||
| 146 | static 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 | |||
| 154 | static gchar *_title_new_ = NULL; | ||
| 155 | static gchar *_title_edit_ = NULL; | ||
| 156 | |||
| 157 | static 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 | |||
| 188 | static 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 | |||
| 194 | static 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 | |||
| 199 | static 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 | */ | ||
| 209 | void 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 | |||
| 227 | static 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 | |||
| 241 | static 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 | |||
| 253 | static void edit_person_email_move_up( gpointer data ) { | ||
| 254 | edit_person_email_move( -1 ); | ||
| 255 | } | ||
| 256 | |||
| 257 | static void edit_person_email_move_down( gpointer data ) { | ||
| 258 | edit_person_email_move( +1 ); | ||
| 259 | } | ||
| 260 | |||
| 261 | static 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 | |||
| 281 | static 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 | |||
| 313 | static 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 | |||
| 329 | static 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 | */ | ||
| 353 | void 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 | |||
| 370 | static 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 | |||
| 380 | static 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 | |||
| 400 | static 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 | |||
| 431 | static 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 | |||
| 446 | static 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 | |||
| 466 | static 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 | |||
| 537 | void 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 | |||
| 602 | void 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 | |||
| 755 | void 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 | |||
| 884 | static 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 | */ | ||
| 895 | static 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 | */ | ||
| 910 | static 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 | */ | ||
| 931 | ItemPerson *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 | |||
