From 143ac56f1ced3b3d2cbb8d5c7e2238f0e0f1003e Mon Sep 17 00:00:00 2001 From: hiro Date: Tue, 10 Apr 2007 09:26:42 +0000 Subject: implemented reorder of items in CSV import. git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@1607 ee746299-78ed-0310-b773-934348b2243d --- ChangeLog | 5 ++ ChangeLog.ja | 5 ++ src/importcsv.c | 175 +++++++++++++++++++++++++++++++++++++++++++++---------- src/importldif.c | 13 +++-- 4 files changed, 160 insertions(+), 38 deletions(-) diff --git a/ChangeLog b/ChangeLog index cb4d21e7..96c8eec7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2007-04-10 + + * src/importldif.c: modified the navigate buttons. + * src/importcsv.c: implemented reorder of items. + 2007-04-10 * src/addressbook.c: also delete physical files when deleting data diff --git a/ChangeLog.ja b/ChangeLog.ja index 38fa8a7d..6f94be9c 100644 --- a/ChangeLog.ja +++ b/ChangeLog.ja @@ -1,3 +1,8 @@ +2007-04-10 + + * src/importldif.c: ナビゲートボタンを修正。 + * src/importcsv.c: 項目の順序変更を実装。 + 2007-04-10 * src/addressbook.c: データソース削除時に物理ファイルも削除する diff --git a/src/importcsv.c b/src/importcsv.c index 8c1a53dc..b723843b 100644 --- a/src/importcsv.c +++ b/src/importcsv.c @@ -79,7 +79,7 @@ typedef enum { FIELD_COL_ATTRIB = 2 } ImpCSV_FieldColPos; -static struct _ImpCSV_Dlg { +static struct _ImpCSVDlg { GtkWidget *window; GtkWidget *notebook; GtkWidget *file_entry; @@ -113,14 +113,15 @@ typedef enum { static struct _ImpCSVAttrib { gchar *name; + gchar *value; gint col; gboolean enabled; } imp_csv_attrib[] = { - {N_("First Name"), 0, TRUE}, - {N_("Last Name"), 1, TRUE}, - {N_("Display Name"), 2, TRUE}, - {N_("Nick Name"), 3, TRUE}, - {N_("E-Mail Address"), 4, TRUE} + {N_("First Name"), NULL, 0, TRUE}, + {N_("Last Name"), NULL, 1, TRUE}, + {N_("Display Name"), NULL, 2, TRUE}, + {N_("Nick Name"), NULL, 3, TRUE}, + {N_("E-Mail Address"), NULL, 4, TRUE} }; static AddressBookFile *_importedBook_; @@ -197,13 +198,13 @@ static gboolean imp_csv_load_fields( gchar *sFile ) { guint fields_len; guint data_len = 0; guint len; + gint row; strretchomp(buf); if (enc == C_UTF_8) str = g_strdup(buf); else str = conv_localetodisp(buf, NULL); - g_print("%s\n", str); strv = g_strsplit(str, ",", 0); fields_len = sizeof(imp_csv_attrib) / sizeof(imp_csv_attrib[0]); while (strv[data_len]) @@ -221,7 +222,13 @@ static gboolean imp_csv_load_fields( gchar *sFile ) { gettext(imp_csv_attrib[i].name); else text[ FIELD_COL_ATTRIB ] = ""; - gtk_clist_append( clist, text ); + row = gtk_clist_append(clist, text); + if (i < fields_len) { + imp_csv_attrib[i].value = NULL; + imp_csv_attrib[i].col = row; + gtk_clist_set_row_data + (clist, row, &imp_csv_attrib[i]); + } } g_strfreev(strv); g_free(str); @@ -239,12 +246,89 @@ static gboolean imp_csv_field_list_toggle( GtkCList *clist, GdkEventButton *even return FALSE; } +static void imp_csv_field_list_up( GtkWidget *button, gpointer data ) { + GtkCList *clist = GTK_CLIST(impcsv_dlg.clist_field); + gchar *text; + gint row; + struct _ImpCSVAttrib *src_attr; + struct _ImpCSVAttrib *dest_attr; + gchar *src_text; + gchar *dest_text; + + if (!clist->selection) return; + + row = GPOINTER_TO_INT( clist->selection->data ); + if (row > 0 && row < clist->rows - 1 ) { + gtk_clist_freeze( clist ); + + src_attr = gtk_clist_get_row_data( clist, row ); + dest_attr = gtk_clist_get_row_data( clist, row - 1 ); + + gtk_clist_row_move( clist, row, row - 1 ); + + gtk_clist_get_text( clist, row, FIELD_COL_FIELD, &text ); + src_text = g_strdup( text ); + gtk_clist_get_text( clist, row - 1, FIELD_COL_FIELD, &text ); + dest_text = g_strdup( text ); + gtk_clist_set_text( clist, row - 1, FIELD_COL_FIELD, src_text ); + gtk_clist_set_text( clist, row, FIELD_COL_FIELD, dest_text ); + g_free( dest_text ); + g_free( src_text ); + + if ( src_attr ) + src_attr->col = row - 1; + if ( dest_attr ) + dest_attr->col = row; + + gtk_clist_thaw( clist ); + } +} + +static void imp_csv_field_list_down( GtkWidget *button, gpointer data ) { + GtkCList *clist = GTK_CLIST(impcsv_dlg.clist_field); + gchar *text; + gint row; + struct _ImpCSVAttrib *src_attr; + struct _ImpCSVAttrib *dest_attr; + gchar *src_text; + gchar *dest_text; + + if (!clist->selection) return; + + row = GPOINTER_TO_INT( clist->selection->data ); + if (row >= 0 && row < clist->rows - 2 ) { + gtk_clist_freeze( clist ); + + src_attr = gtk_clist_get_row_data( clist, row ); + dest_attr = gtk_clist_get_row_data( clist, row + 1 ); + + gtk_clist_row_move( clist, row, row + 1 ); + + gtk_clist_get_text( clist, row, FIELD_COL_FIELD, &text ); + src_text = g_strdup( text ); + gtk_clist_get_text( clist, row + 1, FIELD_COL_FIELD, &text ); + dest_text = g_strdup( text ); + gtk_clist_set_text( clist, row + 1, FIELD_COL_FIELD, src_text ); + gtk_clist_set_text( clist, row, FIELD_COL_FIELD, dest_text ); + g_free( dest_text ); + g_free( src_text ); + + if ( src_attr ) + src_attr->col = row + 1; + if ( dest_attr ) + dest_attr->col = row; + + gtk_clist_thaw( clist ); + } +} + static gint imp_csv_import_data( gchar *csvFile, AddressCache *cache ) { FILE *fp; gchar buf[BUFFSIZE]; gint i; gchar **strv; CharSet enc; + guint fields_len; gchar *firstName = NULL; gchar *lastName = NULL; gchar *fullName = NULL; @@ -265,30 +349,39 @@ static gint imp_csv_import_data( gchar *csvFile, AddressCache *cache ) { return; } + fields_len = sizeof(imp_csv_attrib) / sizeof(imp_csv_attrib[0]); + while (fgets(buf, sizeof(buf), fp) != NULL) { gchar *str; + guint col, cols = 0; strretchomp(buf); if (enc == C_UTF_8) str = g_strdup(buf); else str = conv_localetodisp(buf, NULL); - g_print("%s\n", str); strv = g_strsplit(str, ",", 0); - - for (i = 0; strv[i] != NULL; i++) { - if (i == imp_csv_attrib[ATTR_FIRST_NAME].col) - firstName = strv[i]; - else if (i == imp_csv_attrib[ATTR_LAST_NAME].col) - lastName = strv[i]; - else if (i == imp_csv_attrib[ATTR_DISPLAY_NAME].col) - fullName = strv[i]; - else if (i == imp_csv_attrib[ATTR_NICK_NAME].col) - nickName = strv[i]; - else if (i == imp_csv_attrib[ATTR_EMAIL_ADDRESS].col) - address = strv[i]; + while (strv[cols]) + ++cols; + + for (i = 0; i < fields_len; i++) { + if (!imp_csv_attrib[i].enabled) + continue; + col = imp_csv_attrib[i].col; + if (col >= cols || !*strv[col]) + continue; + imp_csv_attrib[i].value = strv[col]; } + firstName = imp_csv_attrib[ATTR_FIRST_NAME].value; + lastName = imp_csv_attrib[ATTR_LAST_NAME].value; + fullName = imp_csv_attrib[ATTR_DISPLAY_NAME].value; + nickName = imp_csv_attrib[ATTR_NICK_NAME].value; + address = imp_csv_attrib[ATTR_EMAIL_ADDRESS].value; + + if (!fullName && !firstName && !lastName && address) + fullName = address; + person = addritem_create_item_person(); addritem_person_set_common_name( person, fullName); addritem_person_set_first_name( person, firstName); @@ -297,14 +390,15 @@ static gint imp_csv_import_data( gchar *csvFile, AddressCache *cache ) { addrcache_id_person( cache, person ); addrcache_add_person( cache, person ); - if (address && *address) { + if (address) { email = addritem_create_item_email(); addritem_email_set_address( email, address ); addrcache_id_email( cache, email ); addrcache_person_add_email( cache, person, email ); } - firstName = lastName = fullName = nickName = address = NULL; + for (i = 0; i < fields_len; i++) + imp_csv_attrib[i].value = NULL; g_strfreev(strv); g_free(str); @@ -481,13 +575,10 @@ static void imp_csv_cancel( GtkWidget *widget, gpointer data ) { } static void imp_csv_file_select( void ) { - gchar *sFile; gchar *sSelFile; - sFile = gtk_editable_get_chars( GTK_EDITABLE(impcsv_dlg.file_entry), 0, -1 ); - sSelFile = filesel_select_file( _("Select CSV File"), sFile, + sSelFile = filesel_select_file( _("Select CSV File"), NULL, GTK_FILE_CHOOSER_ACTION_OPEN ); - g_free( sFile ); if (sSelFile) { gchar *sUTF8File; sUTF8File = conv_filename_to_utf8( sSelFile ); @@ -574,13 +665,17 @@ static void imp_csv_page_file( gint pageNum, gchar *pageLbl ) { static void imp_csv_page_fields( gint pageNum, gchar *pageLbl ) { GtkWidget *vbox; - GtkWidget *vboxt; + GtkWidget *hbox; - GtkWidget *table; GtkWidget *label; GtkWidget *clist_swin; GtkWidget *clist_field; + GtkWidget *btn_vbox; + GtkWidget *btn_vbox1; + GtkWidget *up_btn; + GtkWidget *down_btn; + gchar *titles[ FIELDS_N_COLS ]; gint i; @@ -599,11 +694,11 @@ static void imp_csv_page_fields( gint pageNum, gchar *pageLbl ) { gtk_notebook_get_nth_page(GTK_NOTEBOOK( impcsv_dlg.notebook ), pageNum ), label ); - vboxt = gtk_vbox_new( FALSE, 4 ); - gtk_container_add( GTK_CONTAINER( vbox ), vboxt ); + hbox = gtk_hbox_new( FALSE, 4 ); + gtk_box_pack_start( GTK_BOX( vbox ), hbox, TRUE, TRUE, 0 ); clist_swin = gtk_scrolled_window_new( NULL, NULL ); - gtk_container_add( GTK_CONTAINER(vboxt), clist_swin ); + gtk_box_pack_start( GTK_BOX(hbox), clist_swin, TRUE, TRUE, 0 ); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(clist_swin), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); @@ -622,12 +717,28 @@ static void imp_csv_page_fields( gint pageNum, gchar *pageLbl ) { for( i = 0; i < FIELDS_N_COLS; i++ ) GTK_WIDGET_UNSET_FLAGS(GTK_CLIST(clist_field)->column[i].button, GTK_CAN_FOCUS); + btn_vbox = gtk_vbox_new( FALSE, 0 ); + gtk_box_pack_start( GTK_BOX( hbox ), btn_vbox, FALSE, FALSE, 0 ); + gtk_container_set_border_width( GTK_CONTAINER (btn_vbox), 4 ); + + btn_vbox1 = gtk_vbox_new( FALSE, 8 ); + gtk_box_pack_start( GTK_BOX( btn_vbox ), btn_vbox1, TRUE, FALSE, 0 ); + + up_btn = gtk_button_new_with_label( _("Up") ); + gtk_box_pack_start( GTK_BOX( btn_vbox1 ), up_btn, FALSE, FALSE, 0 ); + down_btn = gtk_button_new_with_label( _("Down") ); + gtk_box_pack_start( GTK_BOX( btn_vbox1 ), down_btn, FALSE, FALSE, 0 ); + gtk_widget_show_all(vbox); g_signal_connect( G_OBJECT(clist_field), "select_row", G_CALLBACK(imp_csv_field_list_selected), NULL ); g_signal_connect( G_OBJECT(clist_field), "button_press_event", G_CALLBACK(imp_csv_field_list_toggle), NULL ); + g_signal_connect( G_OBJECT(up_btn), "clicked", + G_CALLBACK(imp_csv_field_list_up), NULL ); + g_signal_connect( G_OBJECT(down_btn), "clicked", + G_CALLBACK(imp_csv_field_list_down), NULL ); impcsv_dlg.clist_field = clist_field; } diff --git a/src/importldif.c b/src/importldif.c index 01379589..59be79ed 100644 --- a/src/importldif.c +++ b/src/importldif.c @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -424,13 +425,10 @@ static void imp_ldif_cancel( GtkWidget *widget, gpointer data ) { } static void imp_ldif_file_select( void ) { - gchar *sFile; gchar *sSelFile; - sFile = gtk_editable_get_chars( GTK_EDITABLE(impldif_dlg.file_entry), 0, -1 ); - sSelFile = filesel_select_file( _("Select LDIF File"), sFile, + sSelFile = filesel_select_file( _("Select LDIF File"), NULL, GTK_FILE_CHOOSER_ACTION_OPEN ); - g_free( sFile ); if ( sSelFile ) { gchar *sUTF8File; sUTF8File = conv_filename_to_utf8( sSelFile ); @@ -735,9 +733,12 @@ static void imp_ldif_dialog_create() { gtk_box_pack_start(GTK_BOX(hsbox), statusbar, TRUE, TRUE, 0); /* Button panel */ - gtkut_stock_button_set_create(&hbbox, &btnPrev, _("Prev"), - &btnNext, _("Next"), + gtkut_stock_button_set_create(&hbbox, &btnNext, _("Next"), + &btnPrev, _("Prev"), &btnCancel, GTK_STOCK_CANCEL); + gtk_button_box_set_child_secondary(GTK_BUTTON_BOX(hbbox), btnCancel, + TRUE); + gtkut_box_set_reverse_order(GTK_BOX(hbbox), FALSE); gtk_box_pack_end(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(hbbox), 2); gtk_widget_grab_default(btnNext); -- cgit v1.2.3