diff options
Diffstat (limited to 'src/exportcsv.c')
| -rw-r--r-- | src/exportcsv.c | 607 |
1 files changed, 607 insertions, 0 deletions
diff --git a/src/exportcsv.c b/src/exportcsv.c new file mode 100644 index 0000000..3fa35ee --- /dev/null +++ b/src/exportcsv.c | |||
| @@ -0,0 +1,607 @@ | |||
| 1 | /* | ||
| 2 | * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client | ||
| 3 | * Copyright (C) 1999-2017 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/gtkvbox.h> | ||
| 32 | #include <gtk/gtklabel.h> | ||
| 33 | #include <gtk/gtkentry.h> | ||
| 34 | #include <gtk/gtktable.h> | ||
| 35 | #include <gtk/gtkbutton.h> | ||
| 36 | #include <gtk/gtkradiobutton.h> | ||
| 37 | #include <gtk/gtkhbbox.h> | ||
| 38 | #include <gtk/gtkcheckbutton.h> | ||
| 39 | #include <gtk/gtktogglebutton.h> | ||
| 40 | #include <gtk/gtkstatusbar.h> | ||
| 41 | #include <gtk/gtknotebook.h> | ||
| 42 | #include <gtk/gtkstock.h> | ||
| 43 | |||
| 44 | #include <stdio.h> | ||
| 45 | |||
| 46 | #include "addrbook.h" | ||
| 47 | #include "addressbook.h" | ||
| 48 | #include "addressitem.h" | ||
| 49 | #include "filesel.h" | ||
| 50 | #include "gtkutils.h" | ||
| 51 | #include "stock_pixmap.h" | ||
| 52 | #include "prefs_common.h" | ||
| 53 | #include "manage_window.h" | ||
| 54 | #include "mgutils.h" | ||
| 55 | #include "exportcsv.h" | ||
| 56 | #include "utils.h" | ||
| 57 | |||
| 58 | #define PAGE_FILE_INFO 0 | ||
| 59 | #define PAGE_FINISH 1 | ||
| 60 | |||
| 61 | #define EXPORTCSV_WIDTH 480 | ||
| 62 | #define EXPORTCSV_HEIGHT 320 | ||
| 63 | |||
| 64 | static struct _ExpCSVDlg { | ||
| 65 | GtkWidget *window; | ||
| 66 | GtkWidget *notebook; | ||
| 67 | GtkWidget *file_entry; | ||
| 68 | GtkWidget *comma_radiobtn; | ||
| 69 | GtkWidget *tab_radiobtn; | ||
| 70 | GtkWidget *labelFile; | ||
| 71 | GtkWidget *labelRecords; | ||
| 72 | GtkWidget *btnNext; | ||
| 73 | GtkWidget *btnCancel; | ||
| 74 | GtkWidget *statusbar; | ||
| 75 | gint status_cid; | ||
| 76 | gint rowCount; | ||
| 77 | gchar *fileName; | ||
| 78 | gchar delimiter; | ||
| 79 | gboolean cancelled; | ||
| 80 | } expcsv_dlg; | ||
| 81 | |||
| 82 | static AddressObject *_exp_object_; | ||
| 83 | static gint exportCount = 0; | ||
| 84 | static gint result; | ||
| 85 | |||
| 86 | static void exp_csv_status_show( gchar *msg ) { | ||
| 87 | if( expcsv_dlg.statusbar != NULL ) { | ||
| 88 | gtk_statusbar_pop( GTK_STATUSBAR(expcsv_dlg.statusbar), expcsv_dlg.status_cid ); | ||
| 89 | if( msg ) { | ||
| 90 | gtk_statusbar_push( GTK_STATUSBAR(expcsv_dlg.statusbar), expcsv_dlg.status_cid, msg ); | ||
| 91 | } | ||
| 92 | } | ||
| 93 | } | ||
| 94 | |||
| 95 | static void exp_csv_message( void ) { | ||
| 96 | gchar *sMsg = NULL; | ||
| 97 | gint pageNum; | ||
| 98 | |||
| 99 | pageNum = gtk_notebook_get_current_page( GTK_NOTEBOOK(expcsv_dlg.notebook) ); | ||
| 100 | if( pageNum == PAGE_FILE_INFO ) { | ||
| 101 | sMsg = _( "Please specify file to export." ); | ||
| 102 | } | ||
| 103 | else if( pageNum == PAGE_FINISH ) { | ||
| 104 | sMsg = _( "File exported." ); | ||
| 105 | } | ||
| 106 | exp_csv_status_show( sMsg ); | ||
| 107 | } | ||
| 108 | |||
| 109 | static gint exp_csv_write_email_record( ItemPerson *person, ItemEMail *email, FILE *fp ) { | ||
| 110 | gchar *sName, *sAddress, *sAlias, *sNickName; | ||
| 111 | gchar *sFirstName, *sLastName; | ||
| 112 | gchar *sRemarks; | ||
| 113 | gchar *csv; | ||
| 114 | |||
| 115 | g_return_val_if_fail(person != NULL, MGU_BAD_ARGS); | ||
| 116 | |||
| 117 | sName = ADDRITEM_NAME(person) ? ADDRITEM_NAME(person) : ""; | ||
| 118 | sFirstName = person->firstName ? person->firstName : ""; | ||
| 119 | sLastName = person->lastName ? person->lastName : ""; | ||
| 120 | sNickName = person->nickName ? person->nickName : ""; | ||
| 121 | |||
| 122 | if (email) { | ||
| 123 | sAddress = email->address ? email->address : ""; | ||
| 124 | sRemarks = email->remarks ? email->remarks : ""; | ||
| 125 | sAlias = ADDRITEM_NAME(email) ? ADDRITEM_NAME(email) : ""; | ||
| 126 | } else { | ||
| 127 | sAddress = ""; | ||
| 128 | sRemarks = ""; | ||
| 129 | sAlias = ""; | ||
| 130 | } | ||
| 131 | |||
| 132 | csv = strconcat_csv(expcsv_dlg.delimiter, sFirstName, sLastName, sName, sNickName, sAddress, sRemarks, sAlias, NULL); | ||
| 133 | debug_print("%s\n", csv); | ||
| 134 | fputs(csv, fp); | ||
| 135 | fputc('\n', fp); | ||
| 136 | g_free(csv); | ||
| 137 | |||
| 138 | return MGU_SUCCESS; | ||
| 139 | } | ||
| 140 | |||
| 141 | static gint exp_csv_export_folder_recursive( ItemFolder *itemFolder, FILE *fp ) { | ||
| 142 | GList *items; | ||
| 143 | GList *cur; | ||
| 144 | gint count = 0; | ||
| 145 | |||
| 146 | g_return_val_if_fail(itemFolder != NULL, MGU_BAD_ARGS); | ||
| 147 | |||
| 148 | debug_print("exp_csv_export_folder_recursive: export folder: %s\n", ADDRITEM_NAME(itemFolder) ? ADDRITEM_NAME(itemFolder) : "(root)"); | ||
| 149 | |||
| 150 | items = addritem_folder_get_person_list(itemFolder); | ||
| 151 | for (cur = items; cur != NULL; cur = cur->next) { | ||
| 152 | ItemPerson *person; | ||
| 153 | ItemEMail *email; | ||
| 154 | GList *node; | ||
| 155 | |||
| 156 | person = (ItemPerson *)cur->data; | ||
| 157 | if (!person) { | ||
| 158 | continue; | ||
| 159 | } | ||
| 160 | |||
| 161 | node = person->listEMail; | ||
| 162 | if (!node) { | ||
| 163 | if (exp_csv_write_email_record(person, NULL, fp) == MGU_SUCCESS) { | ||
| 164 | count++; | ||
| 165 | } | ||
| 166 | } else { | ||
| 167 | while (node) { | ||
| 168 | email = node->data; | ||
| 169 | node = g_list_next(node); | ||
| 170 | if (exp_csv_write_email_record(person, email, fp) == MGU_SUCCESS) { | ||
| 171 | count++; | ||
| 172 | } | ||
| 173 | } | ||
| 174 | } | ||
| 175 | } | ||
| 176 | g_list_free(items); | ||
| 177 | |||
| 178 | exportCount += count; | ||
| 179 | |||
| 180 | /* Export subfolders */ | ||
| 181 | items = itemFolder->listFolder; | ||
| 182 | for (cur = items; cur != NULL; cur = cur->next) { | ||
| 183 | ItemFolder *item = cur->data; | ||
| 184 | exp_csv_export_folder_recursive(item, fp); | ||
| 185 | } | ||
| 186 | |||
| 187 | return MGU_SUCCESS; | ||
| 188 | } | ||
| 189 | |||
| 190 | static gint exp_csv_export_data( gchar *csvFile ) { | ||
| 191 | FILE *fp; | ||
| 192 | ItemFolder *itemFolder = NULL; | ||
| 193 | ItemGroup *itemGroup = NULL; | ||
| 194 | GList *items; | ||
| 195 | GList *cur; | ||
| 196 | gchar *csv; | ||
| 197 | gint count = 0; | ||
| 198 | |||
| 199 | g_return_val_if_fail(csvFile != NULL, MGU_BAD_ARGS); | ||
| 200 | |||
| 201 | if (_exp_object_->type == ADDR_INTERFACE) { | ||
| 202 | return MGU_BAD_ARGS; | ||
| 203 | } | ||
| 204 | |||
| 205 | if ((fp = g_fopen(csvFile, "w")) == NULL) { | ||
| 206 | return MGU_OPEN_FILE; | ||
| 207 | } | ||
| 208 | |||
| 209 | if (_exp_object_->type == ADDR_DATASOURCE) { | ||
| 210 | AddressDataSource *ds = ADAPTER_DSOURCE(_exp_object_)->dataSource; | ||
| 211 | |||
| 212 | if (ds) { | ||
| 213 | itemFolder = addrindex_ds_get_root_folder(ds); | ||
| 214 | } | ||
| 215 | } else if (_exp_object_->type == ADDR_ITEM_FOLDER) { | ||
| 216 | itemFolder = ADAPTER_FOLDER(_exp_object_)->itemFolder; | ||
| 217 | } else if (_exp_object_->type == ADDR_ITEM_GROUP) { | ||
| 218 | itemGroup = ADAPTER_GROUP(_exp_object_)->itemGroup; | ||
| 219 | } | ||
| 220 | |||
| 221 | csv = strconcat_csv(expcsv_dlg.delimiter, _("First Name"), _("Last Name"), _("Display Name"), _("Nick Name"), _("E-Mail Address"), _("Remarks"), _("Alias"), NULL); | ||
| 222 | debug_print("%s\n", csv); | ||
| 223 | fputs(csv, fp); | ||
| 224 | fputc('\n', fp); | ||
| 225 | g_free(csv); | ||
| 226 | |||
| 227 | if (itemFolder) { | ||
| 228 | exp_csv_export_folder_recursive(itemFolder, fp); | ||
| 229 | } else if (itemGroup) { | ||
| 230 | items = itemGroup->listEMail; | ||
| 231 | for (cur = items; cur != NULL; cur = cur->next) { | ||
| 232 | ItemEMail *email = (ItemEMail *)cur->data; | ||
| 233 | ItemPerson *person; | ||
| 234 | |||
| 235 | if (!email) { | ||
| 236 | continue; | ||
| 237 | } | ||
| 238 | person = (ItemPerson *)ADDRITEM_PARENT(email); | ||
| 239 | if (!person) { | ||
| 240 | continue; | ||
| 241 | } | ||
| 242 | |||
| 243 | if (exp_csv_write_email_record(person, email, fp) == MGU_SUCCESS) { | ||
| 244 | count++; | ||
| 245 | } | ||
| 246 | } | ||
| 247 | exportCount = count; | ||
| 248 | } | ||
| 249 | |||
| 250 | fclose(fp); | ||
| 251 | |||
| 252 | return MGU_SUCCESS; | ||
| 253 | } | ||
| 254 | |||
| 255 | /* | ||
| 256 | * Move off file page. | ||
| 257 | * return: TRUE if OK to move off page. | ||
| 258 | */ | ||
| 259 | static gboolean exp_csv_file_move() { | ||
| 260 | gboolean retVal = FALSE; | ||
| 261 | gchar *sFile; | ||
| 262 | gchar *sMsg = NULL; | ||
| 263 | gboolean errFlag = FALSE; | ||
| 264 | |||
| 265 | sFile = gtk_editable_get_chars( GTK_EDITABLE(expcsv_dlg.file_entry), 0, -1 ); | ||
| 266 | g_strchug( sFile ); g_strchomp( sFile ); | ||
| 267 | |||
| 268 | g_free( expcsv_dlg.fileName ); | ||
| 269 | expcsv_dlg.fileName = sFile; | ||
| 270 | |||
| 271 | gtk_entry_set_text( GTK_ENTRY(expcsv_dlg.file_entry), sFile ); | ||
| 272 | |||
| 273 | if (gtk_toggle_button_get_active | ||
| 274 | (GTK_TOGGLE_BUTTON(expcsv_dlg.comma_radiobtn))) { | ||
| 275 | expcsv_dlg.delimiter = ','; | ||
| 276 | } else { | ||
| 277 | expcsv_dlg.delimiter = '\t'; | ||
| 278 | } | ||
| 279 | |||
| 280 | if( *sFile == '\0'|| strlen( sFile ) < 1 ) { | ||
| 281 | sMsg = _( "Please select a file." ); | ||
| 282 | gtk_widget_grab_focus(expcsv_dlg.file_entry); | ||
| 283 | errFlag = TRUE; | ||
| 284 | } | ||
| 285 | |||
| 286 | if( ! errFlag ) { | ||
| 287 | if( exp_csv_export_data( sFile ) == MGU_SUCCESS ) { | ||
| 288 | retVal = TRUE; | ||
| 289 | } else { | ||
| 290 | sMsg = _( "Cannot write to file." ); | ||
| 291 | } | ||
| 292 | } | ||
| 293 | exp_csv_status_show( sMsg ); | ||
| 294 | |||
| 295 | return retVal; | ||
| 296 | } | ||
| 297 | |||
| 298 | /* | ||
| 299 | * Display finish page. | ||
| 300 | */ | ||
| 301 | static void exp_csv_finish_show() { | ||
| 302 | gchar *sMsg; | ||
| 303 | |||
| 304 | gtk_label_set_text( GTK_LABEL(expcsv_dlg.labelFile), expcsv_dlg.fileName ); | ||
| 305 | gtk_label_set_text( GTK_LABEL(expcsv_dlg.labelRecords), itos( exportCount ) ); | ||
| 306 | gtk_widget_set_sensitive( expcsv_dlg.btnNext, FALSE ); | ||
| 307 | if( result == MGU_SUCCESS ) { | ||
| 308 | sMsg = _( "CSV file exported successfully." ); | ||
| 309 | } | ||
| 310 | else { | ||
| 311 | sMsg = mgu_error2string( result ); | ||
| 312 | } | ||
| 313 | exp_csv_status_show( sMsg ); | ||
| 314 | gtk_button_set_label(GTK_BUTTON(expcsv_dlg.btnCancel), GTK_STOCK_CLOSE); | ||
| 315 | gtk_widget_grab_focus(expcsv_dlg.btnCancel); | ||
| 316 | } | ||
| 317 | |||
| 318 | static void exp_csv_next( GtkWidget *widget ) { | ||
| 319 | gint pageNum; | ||
| 320 | |||
| 321 | pageNum = gtk_notebook_get_current_page( GTK_NOTEBOOK(expcsv_dlg.notebook) ); | ||
| 322 | if( pageNum == PAGE_FILE_INFO ) { | ||
| 323 | if( exp_csv_file_move() ) { | ||
| 324 | gtk_notebook_set_current_page( | ||
| 325 | GTK_NOTEBOOK(expcsv_dlg.notebook), PAGE_FINISH ); | ||
| 326 | exp_csv_finish_show(); | ||
| 327 | } | ||
| 328 | } | ||
| 329 | } | ||
| 330 | |||
| 331 | static void exp_csv_cancel( GtkWidget *widget, gpointer data ) { | ||
| 332 | gint pageNum; | ||
| 333 | |||
| 334 | pageNum = gtk_notebook_get_current_page( GTK_NOTEBOOK(expcsv_dlg.notebook) ); | ||
| 335 | if( pageNum != PAGE_FINISH ) { | ||
| 336 | expcsv_dlg.cancelled = TRUE; | ||
| 337 | } | ||
| 338 | gtk_main_quit(); | ||
| 339 | } | ||
| 340 | |||
| 341 | static void exp_csv_file_select( void ) { | ||
| 342 | gchar *sSelFile; | ||
| 343 | |||
| 344 | sSelFile = filesel_select_file( _("Enter CSV File Name"), NULL, | ||
| 345 | GTK_FILE_CHOOSER_ACTION_SAVE ); | ||
| 346 | if (sSelFile) { | ||
| 347 | gchar *sUTF8File; | ||
| 348 | sUTF8File = conv_filename_to_utf8( sSelFile ); | ||
| 349 | gtk_entry_set_text( GTK_ENTRY(expcsv_dlg.file_entry), sUTF8File ); | ||
| 350 | g_free( sUTF8File ); | ||
| 351 | g_free( sSelFile ); | ||
| 352 | } | ||
| 353 | } | ||
| 354 | |||
| 355 | static gint exp_csv_delete_event( GtkWidget *widget, GdkEventAny *event, gpointer data ) { | ||
| 356 | exp_csv_cancel( widget, data ); | ||
| 357 | return TRUE; | ||
| 358 | } | ||
| 359 | |||
| 360 | static gboolean exp_csv_key_pressed( GtkWidget *widget, GdkEventKey *event, gpointer data ) { | ||
| 361 | if (event && event->keyval == GDK_Escape) { | ||
| 362 | exp_csv_cancel( widget, data ); | ||
| 363 | } | ||
| 364 | return FALSE; | ||
| 365 | } | ||
| 366 | |||
| 367 | static void exp_csv_page_file( gint pageNum, gchar *pageLbl ) { | ||
| 368 | GtkWidget *vbox; | ||
| 369 | GtkWidget *table; | ||
| 370 | GtkWidget *label; | ||
| 371 | GtkWidget *file_entry; | ||
| 372 | GtkWidget *file_btn; | ||
| 373 | GtkWidget *hbox; | ||
| 374 | GtkWidget *comma_radiobtn; | ||
| 375 | GtkWidget *tab_radiobtn; | ||
| 376 | gint top; | ||
| 377 | |||
| 378 | vbox = gtk_vbox_new(FALSE, 4); | ||
| 379 | gtk_container_add( GTK_CONTAINER( expcsv_dlg.notebook ), vbox ); | ||
| 380 | gtk_container_set_border_width( GTK_CONTAINER (vbox), 4 ); | ||
| 381 | |||
| 382 | label = gtk_label_new( pageLbl ); | ||
| 383 | gtk_widget_show( label ); | ||
| 384 | gtk_notebook_set_tab_label( | ||
| 385 | GTK_NOTEBOOK( expcsv_dlg.notebook ), | ||
| 386 | gtk_notebook_get_nth_page( | ||
| 387 | GTK_NOTEBOOK( expcsv_dlg.notebook ), pageNum ), | ||
| 388 | label ); | ||
| 389 | |||
| 390 | table = gtk_table_new(2, 3, FALSE); | ||
| 391 | gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); | ||
| 392 | gtk_container_set_border_width( GTK_CONTAINER(table), 6 ); | ||
| 393 | gtk_table_set_row_spacings(GTK_TABLE(table), 8); | ||
| 394 | gtk_table_set_col_spacings(GTK_TABLE(table), 8); | ||
| 395 | |||
| 396 | /* First row */ | ||
| 397 | top = 0; | ||
| 398 | label = gtk_label_new(_("File Name")); | ||
| 399 | gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), | ||
| 400 | GTK_FILL, 0, 0, 0); | ||
| 401 | gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | ||
| 402 | |||
| 403 | file_entry = gtk_entry_new(); | ||
| 404 | gtk_table_attach(GTK_TABLE(table), file_entry, 1, 2, top, (top + 1), | ||
| 405 | GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0); | ||
| 406 | |||
| 407 | file_btn = gtk_button_new_with_label(_(" ... ")); | ||
| 408 | gtk_table_attach(GTK_TABLE(table), file_btn, 2, 3, top, (top + 1), | ||
| 409 | GTK_FILL, 0, 3, 0); | ||
| 410 | |||
| 411 | hbox = gtk_hbox_new(FALSE, 8); | ||
| 412 | gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | ||
| 413 | gtk_container_set_border_width( GTK_CONTAINER (hbox), 4 ); | ||
| 414 | |||
| 415 | comma_radiobtn = gtk_radio_button_new_with_label | ||
| 416 | (NULL, _("Comma-separated")); | ||
| 417 | gtk_box_pack_start(GTK_BOX(hbox), comma_radiobtn, FALSE, FALSE, 0); | ||
| 418 | |||
| 419 | tab_radiobtn = gtk_radio_button_new_with_label_from_widget | ||
| 420 | (GTK_RADIO_BUTTON(comma_radiobtn), _("Tab-separated")); | ||
| 421 | gtk_box_pack_start(GTK_BOX(hbox), tab_radiobtn, FALSE, FALSE, 0); | ||
| 422 | |||
| 423 | gtk_widget_show_all(vbox); | ||
| 424 | |||
| 425 | /* Button handler */ | ||
| 426 | g_signal_connect(G_OBJECT(file_btn), "clicked", | ||
| 427 | G_CALLBACK(exp_csv_file_select), NULL); | ||
| 428 | |||
| 429 | expcsv_dlg.file_entry = file_entry; | ||
| 430 | expcsv_dlg.comma_radiobtn = comma_radiobtn; | ||
| 431 | expcsv_dlg.tab_radiobtn = tab_radiobtn; | ||
| 432 | } | ||
| 433 | |||
| 434 | static void exp_csv_page_finish( gint pageNum, gchar *pageLbl ) { | ||
| 435 | GtkWidget *vbox; | ||
| 436 | GtkWidget *table; | ||
| 437 | GtkWidget *label; | ||
| 438 | GtkWidget *labelFile; | ||
| 439 | GtkWidget *labelRecs; | ||
| 440 | gint top; | ||
| 441 | |||
| 442 | vbox = gtk_vbox_new(FALSE, 8); | ||
| 443 | gtk_container_add( GTK_CONTAINER( expcsv_dlg.notebook ), vbox ); | ||
| 444 | gtk_container_set_border_width( GTK_CONTAINER (vbox), BORDER_WIDTH ); | ||
| 445 | |||
| 446 | label = gtk_label_new( pageLbl ); | ||
| 447 | gtk_widget_show( label ); | ||
| 448 | gtk_notebook_set_tab_label( | ||
| 449 | GTK_NOTEBOOK( expcsv_dlg.notebook ), | ||
| 450 | gtk_notebook_get_nth_page( GTK_NOTEBOOK( expcsv_dlg.notebook ), pageNum ), label ); | ||
| 451 | |||
| 452 | table = gtk_table_new(3, 2, FALSE); | ||
| 453 | gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); | ||
| 454 | gtk_container_set_border_width( GTK_CONTAINER(table), 8 ); | ||
| 455 | gtk_table_set_row_spacings(GTK_TABLE(table), 8); | ||
| 456 | gtk_table_set_col_spacings(GTK_TABLE(table), 8 ); | ||
| 457 | |||
| 458 | /* First row */ | ||
| 459 | top = 0; | ||
| 460 | label = gtk_label_new(_("File Name :")); | ||
| 461 | gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0); | ||
| 462 | gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); | ||
| 463 | |||
| 464 | labelFile = gtk_label_new(""); | ||
| 465 | gtk_table_attach(GTK_TABLE(table), labelFile, 1, 2, top, (top + 1), GTK_FILL, 0, 0, 0); | ||
| 466 | gtk_misc_set_alignment(GTK_MISC(labelFile), 0, 0.5); | ||
| 467 | gtk_label_set_line_wrap(GTK_LABEL(labelFile), TRUE); | ||
| 468 | |||
| 469 | /* Secondrow */ | ||
| 470 | top++; | ||
| 471 | label = gtk_label_new(_("Records :")); | ||
| 472 | gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0); | ||
| 473 | gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); | ||
| 474 | |||
| 475 | labelRecs = gtk_label_new(""); | ||
| 476 | gtk_table_attach(GTK_TABLE(table), labelRecs, 1, 2, top, (top + 1), GTK_FILL, 0, 0, 0); | ||
| 477 | gtk_misc_set_alignment(GTK_MISC(labelRecs), 0, 0.5); | ||
| 478 | |||
| 479 | expcsv_dlg.labelFile = labelFile; | ||
| 480 | expcsv_dlg.labelRecords = labelRecs; | ||
| 481 | } | ||
| 482 | |||
| 483 | static void exp_csv_dialog_create() { | ||
| 484 | GtkWidget *window; | ||
| 485 | GtkWidget *vbox; | ||
| 486 | GtkWidget *vnbox; | ||
| 487 | GtkWidget *notebook; | ||
| 488 | GtkWidget *hbbox; | ||
| 489 | GtkWidget *btnNext; | ||
| 490 | GtkWidget *btnCancel; | ||
| 491 | GtkWidget *hsbox; | ||
| 492 | GtkWidget *statusbar; | ||
| 493 | |||
| 494 | window = gtk_window_new(GTK_WINDOW_TOPLEVEL); | ||
| 495 | gtk_widget_set_size_request(window, EXPORTCSV_WIDTH, EXPORTCSV_HEIGHT ); | ||
| 496 | gtk_window_set_title( GTK_WINDOW(window), _("Export Address Book into CSV file") ); | ||
| 497 | gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); | ||
| 498 | gtk_window_set_modal(GTK_WINDOW(window), TRUE); | ||
| 499 | g_signal_connect(G_OBJECT(window), "delete_event", | ||
| 500 | G_CALLBACK(exp_csv_delete_event), NULL); | ||
| 501 | g_signal_connect(G_OBJECT(window), "key_press_event", | ||
| 502 | G_CALLBACK(exp_csv_key_pressed), NULL); | ||
| 503 | MANAGE_WINDOW_SIGNALS_CONNECT(window); | ||
| 504 | |||
| 505 | vbox = gtk_vbox_new(FALSE, 4); | ||
| 506 | gtk_widget_show(vbox); | ||
| 507 | gtk_container_add(GTK_CONTAINER(window), vbox); | ||
| 508 | |||
| 509 | vnbox = gtk_vbox_new(FALSE, 4); | ||
| 510 | gtk_container_set_border_width(GTK_CONTAINER(vnbox), 4); | ||
| 511 | gtk_widget_show(vnbox); | ||
| 512 | gtk_box_pack_start(GTK_BOX(vbox), vnbox, TRUE, TRUE, 0); | ||
| 513 | |||
| 514 | /* Notebook */ | ||
| 515 | notebook = gtk_notebook_new(); | ||
| 516 | gtk_notebook_set_show_tabs( GTK_NOTEBOOK(notebook), FALSE ); | ||
| 517 | gtk_widget_show(notebook); | ||
| 518 | gtk_box_pack_start(GTK_BOX(vnbox), notebook, TRUE, TRUE, 0); | ||
| 519 | gtk_container_set_border_width(GTK_CONTAINER(notebook), 6); | ||
| 520 | |||
| 521 | /* Status line */ | ||
| 522 | hsbox = gtk_hbox_new(FALSE, 0); | ||
| 523 | gtk_box_pack_end(GTK_BOX(vbox), hsbox, FALSE, FALSE, 0); | ||
| 524 | statusbar = gtk_statusbar_new(); | ||
| 525 | gtk_box_pack_start(GTK_BOX(hsbox), statusbar, TRUE, TRUE, 0); | ||
| 526 | |||
| 527 | /* Button panel */ | ||
| 528 | gtkut_stock_button_set_create(&hbbox, &btnNext, _("Next"), | ||
| 529 | &btnCancel, GTK_STOCK_CANCEL, | ||
| 530 | NULL, NULL); | ||
| 531 | gtk_box_pack_end(GTK_BOX(vnbox), hbbox, FALSE, FALSE, 0); | ||
| 532 | gtk_widget_grab_default(btnNext); | ||
| 533 | |||
| 534 | /* Button handlers */ | ||
| 535 | g_signal_connect(G_OBJECT(btnNext), "clicked", | ||
| 536 | G_CALLBACK(exp_csv_next), NULL); | ||
| 537 | g_signal_connect(G_OBJECT(btnCancel), "clicked", | ||
| 538 | G_CALLBACK(exp_csv_cancel), NULL); | ||
| 539 | |||
| 540 | gtk_widget_show_all(vbox); | ||
| 541 | |||
| 542 | expcsv_dlg.window = window; | ||
| 543 | expcsv_dlg.notebook = notebook; | ||
| 544 | expcsv_dlg.btnNext = btnNext; | ||
| 545 | expcsv_dlg.btnCancel = btnCancel; | ||
| 546 | expcsv_dlg.statusbar = statusbar; | ||
| 547 | expcsv_dlg.status_cid = gtk_statusbar_get_context_id( | ||
| 548 | GTK_STATUSBAR(statusbar), "Export CSV Dialog" ); | ||
| 549 | |||
| 550 | } | ||
| 551 | |||
| 552 | static void exp_csv_create() { | ||
| 553 | exp_csv_dialog_create(); | ||
| 554 | exp_csv_page_file( PAGE_FILE_INFO, _( "File Info" ) ); | ||
| 555 | exp_csv_page_finish( PAGE_FINISH, _( "Finish" ) ); | ||
| 556 | gtk_widget_show_all( expcsv_dlg.window ); | ||
| 557 | } | ||
| 558 | |||
| 559 | gint addressbook_exp_csv( AddressObject *obj ) { | ||
| 560 | g_return_val_if_fail(obj != NULL, -1); | ||
| 561 | |||
| 562 | if (obj->type == ADDR_INTERFACE) | ||
| 563 | return -1; | ||
| 564 | |||
| 565 | _exp_object_ = obj; | ||
| 566 | |||
| 567 | if( ! expcsv_dlg.window ) | ||
| 568 | exp_csv_create(); | ||
| 569 | expcsv_dlg.cancelled = FALSE; | ||
| 570 | manage_window_set_transient(GTK_WINDOW(expcsv_dlg.window)); | ||
| 571 | gtk_widget_grab_default(expcsv_dlg.btnNext); | ||
| 572 | |||
| 573 | gtk_entry_set_text( GTK_ENTRY(expcsv_dlg.file_entry), "" ); | ||
| 574 | gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(expcsv_dlg.comma_radiobtn), TRUE ); | ||
| 575 | gtk_notebook_set_current_page( GTK_NOTEBOOK(expcsv_dlg.notebook), PAGE_FILE_INFO ); | ||
| 576 | gtk_widget_set_sensitive( expcsv_dlg.btnNext, TRUE ); | ||
| 577 | gtk_button_set_label( GTK_BUTTON(expcsv_dlg.btnCancel), GTK_STOCK_CANCEL ); | ||
| 578 | exp_csv_message(); | ||
| 579 | gtk_widget_grab_focus(expcsv_dlg.file_entry); | ||
| 580 | |||
| 581 | expcsv_dlg.rowCount = 0; | ||
| 582 | g_free( expcsv_dlg.fileName ); | ||
| 583 | expcsv_dlg.fileName = NULL; | ||
| 584 | expcsv_dlg.delimiter = ','; | ||
| 585 | exportCount = 0; | ||
| 586 | |||
| 587 | gtk_widget_show(expcsv_dlg.window); | ||
| 588 | |||
| 589 | gtk_main(); | ||
| 590 | gtk_widget_hide(expcsv_dlg.window); | ||
| 591 | |||
| 592 | if (expcsv_dlg.cancelled == FALSE && expcsv_dlg.fileName) { | ||
| 593 | debug_print("addressbook_exp_csv: exported to %s\n", expcsv_dlg.fileName); | ||
| 594 | } | ||
| 595 | |||
| 596 | g_free( expcsv_dlg.fileName ); | ||
| 597 | expcsv_dlg.fileName = NULL; | ||
| 598 | _exp_object_ = NULL; | ||
| 599 | |||
| 600 | if( expcsv_dlg.cancelled == TRUE ) return -1; | ||
| 601 | return 0; | ||
| 602 | } | ||
| 603 | |||
| 604 | /* | ||
| 605 | * End of Source. | ||
| 606 | */ | ||
| 607 | |||
