editgroup.c (18511B)
1 /* 2 * Claws Mail -- a GTK based, lightweight, and fast e-mail client 3 * Copyright (C) 1999-2022 the Claws Mail team and 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 3 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, see <http://www.gnu.org/licenses/>. 17 */ 18 19 #include "defs.h" 20 21 #include <glib.h> 22 #include <glib/gi18n.h> 23 #include <gdk/gdkkeysyms.h> 24 25 #include "addressbook.h" 26 #include "addressitem.h" 27 #include "addrbook.h" 28 #include "addritem.h" 29 30 #include "mgutils.h" 31 32 #include "prefs_common.h" 33 34 #include "alertpanel.h" 35 #include "inputdialog.h" 36 #include "manage_window.h" 37 #include "gtkutils.h" 38 39 #define ADDRESSBOOK_GUESS_FOLDER_NAME "NewFolder" 40 #define ADDRESSBOOK_GUESS_GROUP_NAME "NewGroup" 41 42 typedef enum { 43 GROUP_COL_NAME = 0, 44 GROUP_COL_EMAIL = 1, 45 GROUP_COL_REMARKS = 2 46 } GroupEditEMailColumnPos; 47 48 #define GROUP_N_COLS 3 49 #define GROUP_COL_WIDTH_NAME 140 50 #define GROUP_COL_WIDTH_EMAIL 120 51 52 static struct _GroupEdit_dlg { 53 GtkWidget *window; 54 GtkWidget *ok_btn; 55 GtkWidget *cancel_btn; 56 GtkWidget *statusbar; 57 gint status_cid; 58 59 /* Basic data tab */ 60 GtkWidget *entry_name; 61 GtkCMCList *clist_group; 62 GtkCMCList *clist_avail; 63 64 GHashTable *hashEMail; 65 66 } groupeditdlg; 67 68 static void edit_group_status_show( gchar *msg ) { 69 if( groupeditdlg.statusbar != NULL ) { 70 gtk_statusbar_pop( GTK_STATUSBAR(groupeditdlg.statusbar), groupeditdlg.status_cid ); 71 if( msg ) { 72 gtk_statusbar_push( GTK_STATUSBAR(groupeditdlg.statusbar), groupeditdlg.status_cid, msg ); 73 } 74 } 75 } 76 77 static void edit_group_ok(GtkWidget *widget, gboolean *cancelled) { 78 gchar *sName; 79 gboolean errFlag = TRUE; 80 81 sName = gtk_editable_get_chars( GTK_EDITABLE(groupeditdlg.entry_name), 0, -1 ); 82 if( sName ) { 83 g_strstrip( sName ); 84 if( *sName != '\0' ) { 85 gtk_entry_set_text(GTK_ENTRY(groupeditdlg.entry_name), sName ); 86 *cancelled = FALSE; 87 gtk_main_quit(); 88 errFlag = FALSE; 89 } 90 } 91 if( errFlag ) { 92 edit_group_status_show( _( "A Group Name must be supplied." ) ); 93 } 94 g_free( sName ); 95 } 96 97 static void edit_group_cancel(GtkWidget *widget, gboolean *cancelled) { 98 *cancelled = TRUE; 99 gtk_main_quit(); 100 } 101 102 static gint edit_group_delete_event(GtkWidget *widget, GdkEventAny *event, gboolean *cancelled) { 103 *cancelled = TRUE; 104 gtk_main_quit(); 105 return TRUE; 106 } 107 108 static gchar *edit_group_format_item_clist( ItemPerson *person, ItemEMail *email ) { 109 gchar *str = NULL; 110 gchar *aName = ADDRITEM_NAME(email); 111 if( aName == NULL || *aName == '\0' ) return str; 112 if( person ) { 113 str = g_strdup_printf( "%s - %s", ADDRITEM_NAME(person), aName ); 114 } 115 else { 116 str = g_strdup( aName ); 117 } 118 return str; 119 } 120 121 static gint edit_group_clist_add_email( GtkCMCList *clist, ItemEMail *email ) { 122 ItemPerson *person = ( ItemPerson * ) ADDRITEM_PARENT(email); 123 gchar *str = edit_group_format_item_clist( person, email ); 124 gchar *text[ GROUP_N_COLS ]; 125 gint row; 126 if( str ) { 127 text[ GROUP_COL_NAME ] = addressbook_set_col_name_guard(str); 128 } 129 else { 130 text[ GROUP_COL_NAME ] = addressbook_set_col_name_guard(ADDRITEM_NAME(person)); 131 } 132 text[ GROUP_COL_EMAIL ] = email->address; 133 text[ GROUP_COL_REMARKS ] = email->remarks; 134 135 row = gtk_cmclist_append( clist, text ); 136 gtk_cmclist_set_row_data( clist, row, email ); 137 return row; 138 } 139 140 static void edit_group_load_clist( GtkCMCList *clist, GList *listEMail ) { 141 GList *node = listEMail; 142 gtk_cmclist_freeze(clist); 143 while( node ) { 144 ItemEMail *email = node->data; 145 edit_group_clist_add_email( clist, email ); 146 node = g_list_next( node ); 147 } 148 gtk_cmclist_thaw(clist); 149 } 150 151 152 static void edit_group_move_email( GtkCMCList *clist_from, GtkCMCList *clist_to, GtkCMCTreeNode *node ) { 153 ItemEMail *email = gtk_cmctree_node_get_row_data( GTK_CMCTREE(clist_from), node ); 154 GtkCMCTreeNode *next = gtkut_ctree_node_next(GTK_CMCTREE(clist_from), node); 155 GtkCMCTreeNode *prev = gtkut_ctree_node_prev(GTK_CMCTREE(clist_from), node); 156 int rrow = 0; 157 if( email ) { 158 gtk_cmctree_remove_node(GTK_CMCTREE(clist_from), node); 159 rrow = edit_group_clist_add_email( clist_to, email ); 160 gtk_cmclist_select_row( clist_to, rrow, 0 ); 161 if (next) 162 gtk_cmctree_select(GTK_CMCTREE(clist_from), next); 163 else if (prev) 164 gtk_cmctree_select(GTK_CMCTREE(clist_from), prev); 165 } 166 } 167 168 static void edit_group_to_group( GtkWidget *widget, gpointer data ) { 169 GList *selected = g_list_copy(GTK_CMCLIST(groupeditdlg.clist_avail)->selection); 170 /* Clear the selected rows on destination clist */ 171 gtk_cmclist_freeze(groupeditdlg.clist_avail); 172 gtk_cmclist_freeze(groupeditdlg.clist_group); 173 gtk_cmclist_unselect_all(groupeditdlg.clist_group); 174 while (selected) { 175 edit_group_move_email( groupeditdlg.clist_avail, 176 groupeditdlg.clist_group, GTK_CMCTREE_NODE(selected->data) ); 177 selected = selected->next; 178 } 179 g_list_free(selected); 180 gtk_cmclist_thaw(groupeditdlg.clist_avail); 181 gtk_cmclist_thaw(groupeditdlg.clist_group); 182 } 183 184 static void edit_group_to_avail( GtkWidget *widget, gpointer data ) { 185 GList *selected = g_list_copy(GTK_CMCLIST(groupeditdlg.clist_group)->selection); 186 gtk_cmclist_freeze(groupeditdlg.clist_avail); 187 gtk_cmclist_freeze(groupeditdlg.clist_group); 188 gtk_cmclist_unselect_all(groupeditdlg.clist_avail); 189 while (selected) { 190 edit_group_move_email( groupeditdlg.clist_group, 191 groupeditdlg.clist_avail, GTK_CMCTREE_NODE(selected->data) ); 192 selected = selected->next; 193 } 194 g_list_free(selected); 195 gtk_cmclist_thaw(groupeditdlg.clist_avail); 196 gtk_cmclist_thaw(groupeditdlg.clist_group); 197 } 198 199 static gboolean edit_group_list_group_button( GtkCMCList *clist, GdkEventButton *event, gpointer data ) { 200 if( ! event ) return FALSE; 201 if( event->window != clist->clist_window ) return FALSE; 202 203 if( event->button == 1 ) { 204 if( event->type == GDK_2BUTTON_PRESS ) { 205 edit_group_to_avail( NULL, NULL ); 206 } 207 } 208 return FALSE; 209 } 210 211 static gboolean edit_group_list_avail_button( GtkCMCList *clist, GdkEventButton *event, gpointer data ) { 212 if( ! event ) return FALSE; 213 if( event->window != clist->clist_window ) return FALSE; 214 215 if( event->button == 1 ) { 216 if( event->type == GDK_2BUTTON_PRESS ) { 217 edit_group_to_group( NULL, NULL ); 218 } 219 } 220 return FALSE; 221 } 222 223 static gint edit_group_list_compare_func( GtkCMCList *clist, gconstpointer ptr1, gconstpointer ptr2 ) { 224 GtkCMCell *cell1 = ((GtkCMCListRow *)ptr1)->cell; 225 GtkCMCell *cell2 = ((GtkCMCListRow *)ptr2)->cell; 226 gchar *name1 = NULL, *name2 = NULL; 227 if( cell1 ) name1 = cell1->u.text; 228 if( cell2 ) name2 = cell2->u.text; 229 if( ! name1 ) return ( name2 != NULL ); 230 if( ! name2 ) return -1; 231 return g_utf8_collate( name1, name2 ); 232 } 233 234 static void addressbook_edit_group_size_allocate_cb(GtkWidget *widget, 235 GtkAllocation *allocation) 236 { 237 cm_return_if_fail(allocation != NULL); 238 239 gtk_window_get_size(GTK_WINDOW(widget), 240 &prefs_common.addressbookeditgroupwin_width, &prefs_common.addressbookeditgroupwin_height); 241 } 242 243 static void addressbook_edit_group_create(gboolean *cancelled) 244 { 245 GtkWidget *window; 246 GtkWidget *vbox; 247 GtkWidget *hbbox; 248 GtkWidget *ok_btn; 249 GtkWidget *cancel_btn; 250 GtkWidget *hsbox; 251 GtkWidget *statusbar; 252 253 GtkWidget *hboxg; 254 GtkWidget *table; 255 GtkWidget *label; 256 GtkWidget *entry_name; 257 GtkWidget *hboxl; 258 GtkWidget *vboxl; 259 GtkWidget *hboxh; 260 261 GtkWidget *clist_swin; 262 GtkWidget *clist_group; 263 GtkWidget *clist_avail; 264 265 GtkWidget *buttonGroup; 266 GtkWidget *buttonAvail; 267 268 gchar *titles[ GROUP_N_COLS ]; 269 gint i; 270 271 static GdkGeometry geometry; 272 273 titles[ GROUP_COL_NAME ] = _( "Name" ); 274 titles[ GROUP_COL_EMAIL ] = _("Email Address"); 275 titles[ GROUP_COL_REMARKS ] = _("Remarks"); 276 277 window = gtkut_window_new(GTK_WINDOW_TOPLEVEL, "editgroup"); 278 gtk_container_set_border_width(GTK_CONTAINER(window), 0); 279 gtk_window_set_title(GTK_WINDOW(window), _("Edit group data")); 280 gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); 281 gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_DIALOG); 282 g_signal_connect(G_OBJECT(window), "delete_event", 283 G_CALLBACK(edit_group_delete_event), 284 cancelled); 285 g_signal_connect(G_OBJECT(window), "size_allocate", 286 G_CALLBACK(addressbook_edit_group_size_allocate_cb), NULL); 287 288 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6 ); 289 gtk_container_set_border_width(GTK_CONTAINER(vbox), BORDER_WIDTH); 290 gtk_widget_show( vbox ); 291 gtk_container_add( GTK_CONTAINER( window ), vbox ); 292 293 /* Group area */ 294 hboxg = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0 ); 295 gtk_box_pack_start(GTK_BOX(vbox), hboxg, FALSE, FALSE, 0); 296 297 /* Data entry area */ 298 table = gtk_grid_new(); 299 gtk_box_pack_start(GTK_BOX(hboxg), table, TRUE, TRUE, 0); 300 gtk_container_set_border_width( GTK_CONTAINER(table), 4 ); 301 gtk_grid_set_row_spacing(GTK_GRID(table), 0); 302 gtk_grid_set_column_spacing(GTK_GRID(table), 4); 303 304 /* First row */ 305 label = gtk_label_new(_("Group Name")); 306 gtk_label_set_xalign(GTK_LABEL(label), 0.0); 307 gtk_grid_attach(GTK_GRID(table), label, 0, 0, 1, 1); 308 309 entry_name = gtk_entry_new(); 310 gtk_grid_attach(GTK_GRID(table), entry_name, 1, 0, 1, 1); 311 gtk_widget_set_hexpand(entry_name, TRUE); 312 gtk_widget_set_halign(entry_name, GTK_ALIGN_FILL); 313 314 /* List area */ 315 hboxl = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6 ); 316 gtk_container_set_border_width( GTK_CONTAINER(hboxl), 8 ); 317 gtk_box_pack_start(GTK_BOX(vbox), hboxl, TRUE, TRUE, 0); 318 319 /* Group list */ 320 vboxl = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0 ); 321 gtk_box_pack_start(GTK_BOX(hboxl), vboxl, TRUE, TRUE, 0); 322 323 hboxh = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0 ); 324 gtk_container_set_border_width( GTK_CONTAINER(hboxh), 4 ); 325 gtk_box_pack_start(GTK_BOX(vboxl), hboxh, FALSE, FALSE, 0); 326 label = gtk_label_new(_("Available Addresses")); 327 gtk_box_pack_start(GTK_BOX(hboxh), label, TRUE, TRUE, 0); 328 buttonGroup = gtkut_stock_button("list-add", _("_Add")); 329 gtk_box_pack_end(GTK_BOX(hboxh), buttonGroup, FALSE, FALSE, 0); 330 331 clist_swin = gtk_scrolled_window_new( NULL, NULL ); 332 gtk_box_pack_start(GTK_BOX(vboxl), clist_swin, TRUE, TRUE, 0); 333 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(clist_swin), 334 GTK_POLICY_AUTOMATIC, 335 GTK_POLICY_AUTOMATIC); 336 337 clist_avail = gtk_sctree_new_with_titles( GROUP_N_COLS, 0, titles ); 338 gtk_container_add( GTK_CONTAINER(clist_swin), clist_avail ); 339 gtk_cmctree_set_expander_style(GTK_CMCTREE(clist_avail), 340 GTK_CMCTREE_EXPANDER_TRIANGLE); 341 gtk_cmclist_set_selection_mode( GTK_CMCLIST(clist_avail), GTK_SELECTION_MULTIPLE ); 342 gtk_cmclist_set_column_width( GTK_CMCLIST(clist_avail), GROUP_COL_NAME, GROUP_COL_WIDTH_NAME ); 343 gtk_cmclist_set_column_width( GTK_CMCLIST(clist_avail), GROUP_COL_EMAIL, GROUP_COL_WIDTH_EMAIL ); 344 gtk_cmclist_set_compare_func( GTK_CMCLIST(clist_avail), edit_group_list_compare_func ); 345 gtk_cmclist_set_auto_sort( GTK_CMCLIST(clist_avail), TRUE ); 346 347 for( i = 0; i < GROUP_N_COLS; i++ ) 348 gtk_widget_set_can_focus(GTK_CMCLIST(clist_avail)->column[i].button, FALSE); 349 350 /* Available list */ 351 vboxl = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); 352 gtk_box_pack_start(GTK_BOX(hboxl), vboxl, TRUE, TRUE, 0); 353 354 hboxh = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); 355 gtk_container_set_border_width( GTK_CONTAINER(hboxh), 4); 356 gtk_box_pack_start(GTK_BOX(vboxl), hboxh, FALSE, FALSE, 0); 357 buttonAvail = gtkut_stock_button("list-remove", _("_Remove")); 358 gtk_box_pack_start(GTK_BOX(hboxh), buttonAvail, FALSE, FALSE, 0); 359 label = gtk_label_new(_("Addresses in Group")); 360 gtk_box_pack_end(GTK_BOX(hboxh), label, TRUE, TRUE, 0); 361 362 clist_swin = gtk_scrolled_window_new( NULL, NULL ); 363 gtk_box_pack_start(GTK_BOX(vboxl), clist_swin, TRUE, TRUE, 0); 364 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(clist_swin), 365 GTK_POLICY_AUTOMATIC, 366 GTK_POLICY_AUTOMATIC); 367 368 clist_group = gtk_sctree_new_with_titles(GROUP_N_COLS, 0, titles); 369 gtk_container_add(GTK_CONTAINER(clist_swin), clist_group); 370 gtk_cmctree_set_expander_style(GTK_CMCTREE(clist_group), 371 GTK_CMCTREE_EXPANDER_TRIANGLE); 372 gtk_sctree_set_stripes(GTK_SCTREE(clist_group), prefs_common.use_stripes_in_summaries); 373 gtk_cmclist_set_selection_mode( GTK_CMCLIST(clist_group), GTK_SELECTION_MULTIPLE ); 374 gtk_cmclist_set_column_width( GTK_CMCLIST(clist_group), GROUP_COL_NAME, GROUP_COL_WIDTH_NAME ); 375 gtk_cmclist_set_column_width( GTK_CMCLIST(clist_group), GROUP_COL_EMAIL, GROUP_COL_WIDTH_EMAIL ); 376 gtk_cmclist_set_compare_func( GTK_CMCLIST(clist_group), edit_group_list_compare_func ); 377 gtk_cmclist_set_auto_sort( GTK_CMCLIST(clist_group), TRUE ); 378 379 for( i = 0; i < GROUP_N_COLS; i++ ) 380 gtk_widget_set_can_focus(GTK_CMCLIST(clist_group)->column[i].button, FALSE); 381 382 /* Status line */ 383 hsbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); 384 gtk_box_pack_end(GTK_BOX(vbox), hsbox, FALSE, FALSE, BORDER_WIDTH); 385 statusbar = gtk_statusbar_new(); 386 gtk_box_pack_start(GTK_BOX(hsbox), statusbar, TRUE, TRUE, BORDER_WIDTH); 387 388 /* Button panel */ 389 gtkut_stock_button_set_create(&hbbox, &cancel_btn, NULL, _("_Cancel"), 390 &ok_btn, NULL, _("_OK"), 391 NULL, NULL, NULL); 392 gtk_box_pack_end(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0); 393 gtk_widget_grab_default(ok_btn); 394 395 g_signal_connect(G_OBJECT(ok_btn), "clicked", 396 G_CALLBACK(edit_group_ok), cancelled); 397 g_signal_connect(G_OBJECT(cancel_btn), "clicked", 398 G_CALLBACK(edit_group_cancel), cancelled); 399 400 gtk_widget_show_all(vbox); 401 402 /* Event handlers */ 403 g_signal_connect( G_OBJECT(buttonGroup), "clicked", 404 G_CALLBACK( edit_group_to_group ), NULL ); 405 g_signal_connect( G_OBJECT(buttonAvail), "clicked", 406 G_CALLBACK( edit_group_to_avail ), NULL ); 407 g_signal_connect(G_OBJECT(clist_avail), "button_press_event", 408 G_CALLBACK(edit_group_list_avail_button), NULL); 409 g_signal_connect(G_OBJECT(clist_group), "button_press_event", 410 G_CALLBACK(edit_group_list_group_button), NULL); 411 412 if (!geometry.min_height) { 413 geometry.min_width = 580; 414 geometry.min_height = 340; 415 } 416 417 gtk_window_set_geometry_hints(GTK_WINDOW(window), NULL, &geometry, 418 GDK_HINT_MIN_SIZE); 419 gtk_window_set_default_size(GTK_WINDOW(window), 420 prefs_common.addressbookeditgroupwin_width, 421 prefs_common.addressbookeditgroupwin_height); 422 423 groupeditdlg.window = window; 424 groupeditdlg.ok_btn = ok_btn; 425 groupeditdlg.cancel_btn = cancel_btn; 426 groupeditdlg.statusbar = statusbar; 427 groupeditdlg.status_cid = gtk_statusbar_get_context_id( GTK_STATUSBAR(statusbar), "Edit group dialog" ); 428 429 groupeditdlg.entry_name = entry_name; 430 groupeditdlg.clist_group = GTK_CMCLIST( clist_group ); 431 groupeditdlg.clist_avail = GTK_CMCLIST( clist_avail ); 432 } 433 434 /* 435 * Return list of email items. 436 */ 437 static GList *edit_group_build_email_list() { 438 GtkCMCList *clist = GTK_CMCLIST(groupeditdlg.clist_group); 439 GList *listEMail = NULL; 440 ItemEMail *email; 441 gint row = 0; 442 while( (email = gtk_cmclist_get_row_data( clist, row )) ) { 443 listEMail = g_list_append( listEMail, email ); 444 row++; 445 } 446 return listEMail; 447 } 448 449 /* 450 * Edit group. 451 * Enter: abf Address book. 452 * folder Parent folder for group (or NULL if adding to root folder). Argument is 453 * only required for new objects). 454 * group Group to edit, or NULL for a new group object. 455 * Return: Edited object, or NULL if cancelled. 456 */ 457 ItemGroup *addressbook_edit_group( AddressBookFile *abf, ItemFolder *parent, ItemGroup *group ) { 458 static gboolean cancelled; 459 GList *listEMail = NULL; 460 gchar *name; 461 462 if (!groupeditdlg.window) 463 addressbook_edit_group_create(&cancelled); 464 gtk_widget_grab_focus(groupeditdlg.ok_btn); 465 gtk_widget_grab_focus(groupeditdlg.entry_name); 466 gtk_widget_show(groupeditdlg.window); 467 manage_window_set_transient(GTK_WINDOW(groupeditdlg.window)); 468 gtk_window_set_modal(GTK_WINDOW(groupeditdlg.window), TRUE); 469 /* Clear all fields */ 470 edit_group_status_show( "" ); 471 gtk_cmclist_clear( GTK_CMCLIST(groupeditdlg.clist_group) ); 472 gtk_cmclist_clear( GTK_CMCLIST(groupeditdlg.clist_avail) ); 473 474 if (group) { 475 if (ADDRITEM_NAME(group)) 476 gtk_entry_set_text(GTK_ENTRY(groupeditdlg.entry_name), ADDRITEM_NAME(group)); 477 edit_group_load_clist(groupeditdlg.clist_group, group->listEMail); 478 gtk_window_set_title(GTK_WINDOW(groupeditdlg.window), _("Edit group details")); 479 } else { 480 gtk_window_set_title(GTK_WINDOW(groupeditdlg.window), _("Add new group")); 481 gtk_entry_set_text(GTK_ENTRY(groupeditdlg.entry_name), ADDRESSBOOK_GUESS_GROUP_NAME); 482 } 483 484 listEMail = addrbook_get_available_email_list( abf, group ); 485 edit_group_load_clist( groupeditdlg.clist_avail, listEMail ); 486 g_list_free( listEMail ); 487 gtk_cmclist_select_row( groupeditdlg.clist_group, 0, 0 ); 488 gtk_cmclist_select_row( groupeditdlg.clist_avail, 0, 0 ); 489 490 gtk_main(); 491 gtk_widget_hide( groupeditdlg.window ); 492 gtk_window_set_modal(GTK_WINDOW(groupeditdlg.window), FALSE); 493 if( cancelled ) { 494 return NULL; 495 } 496 497 listEMail = edit_group_build_email_list(); 498 if( group ) { 499 /* Update email list */ 500 addrbook_update_group_list( abf, group, listEMail ); 501 } 502 else { 503 /* Create new person and email list */ 504 group = addrbook_add_group_list( abf, parent, listEMail ); 505 } 506 name = gtk_editable_get_chars( GTK_EDITABLE(groupeditdlg.entry_name), 0, -1 ); 507 addritem_group_set_name( group, name ); 508 g_free( name ); 509 510 listEMail = NULL; 511 return group; 512 } 513 514 /* 515 * Edit folder. 516 * Enter: abf Address book. 517 * parent Parent folder for folder (or NULL if adding to root folder). Argument is 518 * only required for new objects). 519 * folder Folder to edit, or NULL for a new folder object. 520 * Return: Edited object, or NULL if cancelled. 521 */ 522 ItemFolder *addressbook_edit_folder( AddressBookFile *abf, ItemFolder *parent, ItemFolder *folder ) { 523 gchar *name = NULL; 524 525 if( folder ) { 526 name = g_strdup( ADDRITEM_NAME(folder) ); 527 name = input_dialog( _("Edit folder"), _("Input the new name of folder:"), name ); 528 } 529 else { 530 name = input_dialog( _("New folder"), 531 _("Input the name of new folder:"), 532 _(ADDRESSBOOK_GUESS_FOLDER_NAME) ); 533 } 534 if( ! name ) return NULL; 535 g_strstrip( name ); 536 if( *name == '\0' ) { 537 g_free( name ); 538 return NULL; 539 } 540 if( folder ) { 541 if( strcmp( name, ADDRITEM_NAME(folder) ) == 0 ) { 542 g_free( name ); 543 return NULL; 544 } 545 } 546 547 if( ! folder ) { 548 folder = addrbook_add_new_folder( abf, parent ); 549 } 550 addritem_folder_set_name( folder, name ); 551 g_free( name ); 552 return folder; 553 }