32 #include <glib/gi18n.h>
38 #include "dialog-utils.h"
40 #include "gnc-component-manager.h"
43 #include "assistant-utils.h"
51 #include "gnc-csv-gnumeric-popup.h"
52 #include <goffice/gtk/go-charmap-sel.h>
54 #define MIN_COL_WIDTH 70
55 #define GNC_PREFS_GROUP "dialogs.import.csv"
56 #define ASSISTANT_CSV_IMPORT_TRANS_CM_CLASS "assistant-csv-trans-import"
85 GtkCheckButton *sep_buttons[SEP_NUM_OF_TYPES];
132 void csv_import_trans_assistant_prepare (GtkAssistant *assistant, GtkWidget *page, gpointer user_data);
133 void csv_import_trans_assistant_finish (GtkAssistant *gtkassistant, gpointer user_data);
134 void csv_import_trans_assistant_cancel (GtkAssistant *gtkassistant, gpointer user_data);
135 void csv_import_trans_assistant_close (GtkAssistant *gtkassistant, gpointer user_data);
137 void csv_import_trans_assistant_start_page_prepare (GtkAssistant *gtkassistant, gpointer user_data);
138 void csv_import_trans_assistant_file_page_prepare (GtkAssistant *assistant, gpointer user_data);
139 void csv_import_trans_assistant_preview_page_prepare (GtkAssistant *gtkassistant, gpointer user_data);
140 void csv_import_trans_assistant_account_page_prepare (GtkAssistant *assistant, gpointer user_data);
141 void csv_import_trans_assistant_doc_page_prepare (GtkAssistant *assistant, gpointer user_data);
142 void csv_import_trans_assistant_match_page_prepare (GtkAssistant *assistant, gpointer user_data);
143 void csv_import_trans_assistant_finish_page_prepare (GtkAssistant *assistant, gpointer user_data);
144 void csv_import_trans_assistant_summary_page_prepare (GtkAssistant *assistant, gpointer user_data);
146 void csv_import_trans_srow_cb (GtkWidget *spin, gpointer user_data);
147 void csv_import_trans_erow_cb (GtkWidget *spin, gpointer user_data);
148 void csv_import_trans_skiprows_cb (GtkWidget *checkbox, gpointer user_data);
149 void csv_import_trans_auto_cb (GtkWidget *cb, gpointer user_data);
150 void csv_import_trans_file_chooser_confirm_cb (GtkWidget *button,
CsvImportTrans *info);
152 void csv_import_trans_delete_settings_cb (GtkWidget *button,
CsvImportTrans *info);
153 void csv_import_trans_save_settings_cb (GtkWidget *button,
CsvImportTrans *info);
154 void csv_import_trans_changed_settings_cb (GtkWidget *button,
CsvImportTrans *info);
158 void gnc_csv_reset_preview_setting (
CsvImportTrans* info, gboolean block);
160 static gboolean delete_column (
CsvImportTrans* info,
int col, gboolean test_only);
174 gchar *group = NULL, *name = NULL;
177 if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX(info->
settings_combo), &iter))
183 model = gtk_combo_box_get_model (GTK_COMBO_BOX(info->
settings_combo));
184 gtk_tree_model_get (model, &iter, SET_GROUP, &group, SET_NAME, &name, -1);
187 if (g_strcmp0 (group, NULL) == 0)
194 const gchar *title = _(
"Load the Import Settings.");
196 dialog = gtk_message_dialog_new (GTK_WINDOW(info->window),
201 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
202 "%s", _(
"There were problems reading some saved settings, continuing to load.\n Please review and save again."));
203 gtk_dialog_run (GTK_DIALOG (dialog));
204 gtk_widget_destroy (dialog);
208 adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON(info->
start_row_spin));
212 adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON(info->
end_row_spin));
226 for (i = 0; i < SEP_NUM_OF_TYPES; i++)
245 GError *error = NULL;
248 int colcount = stf_parse_options_fixed_splitpositions_count (info->
parse_data->
options);
253 for (i = colcount; i >= 0; i--)
255 delete_column (info, i, FALSE);
259 widths = g_strsplit (info->
settings_data->column_widths,
",", -1);
262 for (i=0; widths[i] != NULL; i++)
266 if (widths[i] != NULL)
267 charindex = atoi (widths[i]);
269 if (max_line > charindex)
270 stf_parse_options_fixed_splitpositions_add (info->
parse_data->
options, charindex);
272 gnc_error_dialog (NULL,
"%s", _(
"There was a problem with the column widths, please review."));
276 gnc_error_dialog (NULL,
"%s", _(
"There was a problem with the column widths, please review."));
277 g_error_free (error);
282 gnc_csv_preview_update_assist (info);
288 if (!g_strcmp0 (info->
settings_data->column_types, NULL) == 0)
294 gboolean error = FALSE;
296 columns = g_strsplit (info->
settings_data->column_types,
",", -1);
299 store = gtk_tree_view_get_model (info->
ctreeview);
302 gtk_tree_model_get_iter_first (store, &iter);
305 for (i=0; columns[i] != NULL; i++)
308 gboolean found = FALSE;
310 for (t = 0; t < GNC_CSV_NUM_COL_TYPES; t++)
312 gchar *type = gnc_csv_column_type_strs[t];
315 if (g_strcmp0 (type, columns[i]) == 0)
321 if (s < gtk_tree_model_get_n_columns (store))
322 gtk_list_store_set (GTK_LIST_STORE(store), &iter, s, columns[i], -1);
330 gnc_error_dialog (NULL,
"%s", _(
"There was a problem with the column types, please review."));
332 g_strfreev (columns);
346 csv_import_trans_delete_settings_cb (GtkWidget *button,
CsvImportTrans *info)
352 gchar *group = NULL, *name = NULL;
353 const gchar *title = _(
"Delete the Import Settings.");
359 if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX(info->
settings_combo), &iter))
362 model = gtk_combo_box_get_model (GTK_COMBO_BOX(info->
settings_combo));
363 gtk_tree_model_get (model, &iter, SET_GROUP, &group, SET_NAME, &name, -1);
365 if (g_strcmp0 (group, NULL) == 0)
367 dialog = gtk_message_dialog_new (GTK_WINDOW(info->window),
372 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
373 "%s", _(
"You can not Delete the 'No Settings' entry."));
374 gtk_dialog_run (GTK_DIALOG (dialog));
375 gtk_widget_destroy (dialog);
379 dialog = gtk_message_dialog_new (GTK_WINDOW(info->window),
381 GTK_MESSAGE_QUESTION,
382 GTK_BUTTONS_OK_CANCEL,
384 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
385 "%s", _(
"Do you really want to delete the selection."));
386 response = gtk_dialog_run (GTK_DIALOG (dialog));
387 gtk_widget_destroy (dialog);
389 if (response == GTK_RESPONSE_OK)
391 g_key_file_remove_group (keyfile, group, NULL);
393 gtk_combo_box_set_active (GTK_COMBO_BOX(info->
settings_combo), 0);
394 gnc_csv_reset_preview_setting (info, FALSE);
409 csv_import_trans_changed_settings_cb (GtkWidget *button,
CsvImportTrans *info)
411 csv_import_trans_load_settings (info);
421 csv_import_trans_save_settings_cb (GtkWidget *button,
CsvImportTrans *info)
426 gchar *group = NULL, *name = NULL;
427 const gchar *title = _(
"Save the Import Settings.");
428 gboolean error = FALSE;
429 const gchar *entry_text;
433 entry_text = gtk_entry_get_text (GTK_ENTRY(entry));
436 if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX(info->
settings_combo), &iter))
439 model = gtk_combo_box_get_model (GTK_COMBO_BOX(info->
settings_combo));
440 gtk_tree_model_get (model, &iter, SET_GROUP, &group, SET_NAME, &name, -1);
442 if (g_strcmp0 (group, NULL) == 0)
444 dialog = gtk_message_dialog_new (GTK_WINDOW(info->window),
449 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
450 "%s", _(
"You can not save to 'No Settings'."));
451 gtk_dialog_run (GTK_DIALOG (dialog));
452 gtk_widget_destroy (dialog);
460 if (strlen (entry_text) == 0 || g_strcmp0 (entry_text, NULL) == 0)
462 dialog = gtk_message_dialog_new (GTK_WINDOW(info->window),
467 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
468 "%s", _(
"The settings name is blank."));
469 gtk_dialog_run (GTK_DIALOG (dialog));
470 gtk_widget_destroy (dialog);
477 gboolean valid = FALSE;
478 gboolean found = FALSE;
481 model = gtk_combo_box_get_model (GTK_COMBO_BOX(info->
settings_combo));
483 valid = gtk_tree_model_get_iter_first (model, &iter);
490 gtk_tree_model_get (model, &iter, SET_NAME, &name, -1);
492 if (g_strcmp0 (name, entry_text) == 0)
497 valid = gtk_tree_model_iter_next (model, &iter);
502 dialog = gtk_message_dialog_new (GTK_WINDOW(info->window),
504 GTK_MESSAGE_QUESTION,
505 GTK_BUTTONS_OK_CANCEL,
507 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
508 "%s", _(
"Setting name already exists, over write."));
509 response = gtk_dialog_run (GTK_DIALOG (dialog));
510 gtk_widget_destroy (dialog);
512 if (response != GTK_RESPONSE_OK)
526 gchar *details = NULL;
535 for (i = 0; i < SEP_NUM_OF_TYPES; i++)
548 columns = gtk_tree_view_get_columns (GTK_TREE_VIEW(info->
ctreeview));
550 store = gtk_tree_view_get_model (info->
ctreeview);
552 gtk_tree_model_get_iter_first (store, &iter);
554 for (column = columns, i = 1; column; column = g_list_next (column), i = i + 2)
556 gchar *contents = NULL;
562 gtk_tree_model_get (store, &iter, i, &contents, -1);
565 details = g_strdup (contents);
568 gchar *details_prev = details;
569 details = g_strjoin (
",", details_prev, contents, NULL);
570 g_free (details_prev);
574 g_list_free (columns);
584 gchar *details = NULL;
586 int number_of_splits = stf_parse_options_fixed_splitpositions_count (info->
parse_data->
options);
588 for (i = 0; i < number_of_splits - 1; i++)
590 gchar *str_width = g_strdup_printf (
"%d", stf_parse_options_fixed_splitpositions_nth (info->
parse_data->
options, i));
593 details = g_strdup (str_width);
596 gchar *details_prev = details;
597 details = g_strjoin (
",", details_prev, str_width, NULL);
598 g_free (details_prev);
611 gboolean valid = FALSE;
613 dialog = gtk_message_dialog_new (GTK_WINDOW(info->window),
618 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
619 "%s", _(
"The settings have been saved."));
620 gtk_dialog_run (GTK_DIALOG (dialog));
621 gtk_widget_destroy (dialog);
624 model = gtk_combo_box_get_model (GTK_COMBO_BOX(info->
settings_combo));
628 valid = gtk_tree_model_get_iter_first (model, &iter);
634 gtk_tree_model_get (model, &iter, SET_NAME, &name, -1);
636 if (g_strcmp0 (name, entry_text) == 0)
637 gtk_combo_box_set_active_iter (GTK_COMBO_BOX(info->
settings_combo), &iter);
641 valid = gtk_tree_model_iter_next (model, &iter);
646 dialog = gtk_message_dialog_new (GTK_WINDOW(info->window),
651 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
652 "%s", _(
"There was a problem saving the settings, please try again."));
653 gtk_dialog_run (GTK_DIALOG (dialog));
654 gtk_widget_destroy (dialog);
666 csv_import_trans_file_chooser_confirm_cb (GtkWidget *button,
CsvImportTrans *info)
668 GtkAssistant *assistant = GTK_ASSISTANT(info->window);
669 gint num = gtk_assistant_get_current_page (assistant);
670 GtkWidget *page = gtk_assistant_get_nth_page (assistant, num);
675 gtk_assistant_set_page_complete (assistant, page, FALSE);
677 file_name = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(info->
file_chooser));
682 gchar *filedir = g_path_get_dirname (filepath);
698 gnc_error_dialog (NULL,
"%s", error->message);
699 if (error->code == GNC_CSV_FILE_OPEN_ERR)
715 gnc_error_dialog (NULL,
"%s", error->message);
723 gnc_csv_reset_preview_setting (info, TRUE);
728 gtk_assistant_set_page_complete (assistant, page, TRUE);
738 if(gtk_assistant_get_page_complete (assistant, page))
739 gtk_assistant_set_current_page (assistant, num + 1);
756 store = GTK_LIST_STORE(gtk_tree_view_get_model (info->
treeview));
764 valid = gtk_tree_model_iter_nth_child (GTK_TREE_MODEL(store), &iter, NULL, i);
766 gtk_list_store_set (store, &iter, 0, NULL, -1);
770 valid = gtk_tree_model_iter_nth_child (GTK_TREE_MODEL(store), &iter, NULL, i);
772 gtk_list_store_set (store, &iter, 0,
"pink", -1);
773 valid = gtk_tree_model_iter_next (GTK_TREE_MODEL(store), &iter);
775 gtk_list_store_set (store, &iter, 0, NULL, -1);
785 valid = gtk_tree_model_iter_nth_child (GTK_TREE_MODEL(store), &iter, NULL, i);
787 gtk_list_store_set (store, &iter, 0, NULL, -1);
791 valid = gtk_tree_model_iter_nth_child (GTK_TREE_MODEL(store), &iter, NULL, i);
793 gtk_list_store_set (store, &iter, 0,
"pink", -1);
794 valid = gtk_tree_model_iter_nth_child (GTK_TREE_MODEL(store), &iter, NULL, i - 1);
796 gtk_list_store_set (store, &iter, 0, NULL, -1);
801 for ( i = info->
start_row + 1; i <= info->end_row; i++)
803 valid = gtk_tree_model_iter_nth_child (GTK_TREE_MODEL(store), &iter, NULL, i);
805 gtk_list_store_set (store, &iter, 0, NULL, -1);
811 for ( i = info->
start_row + 1; i <= info->end_row; i = i + 2)
814 valid = gtk_tree_model_iter_nth_child (GTK_TREE_MODEL(store), &iter, NULL, i);
816 gtk_list_store_set (store, &iter, 0,
"pink", -1);
827 void csv_import_trans_srow_cb (GtkWidget *spin, gpointer user_data)
833 info->
start_row = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(spin)) - 1;
837 adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON(info->
end_row_spin));
838 gtk_adjustment_set_lower (adj, info->
start_row + 1);
841 row_selection_update (info);
850 void csv_import_trans_erow_cb (GtkWidget *spin, gpointer user_data)
856 info->
end_row = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(spin)) - 1;
860 adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON(info->
start_row_spin));
861 gtk_adjustment_set_upper (adj, info->
end_row + 1);
864 row_selection_update (info);
873 void csv_import_trans_auto_cb (GtkWidget *cb, gpointer user_data)
877 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(cb)))
899 void csv_import_trans_skiprows_cb (GtkWidget *checkbox, gpointer user_data)
907 row_selection_update (info);
916 static GtkCellRenderer* gnc_csv_preview_get_cell_renderer (
CsvImportTrans* info,
int col)
918 GList* renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT(gtk_tree_view_get_column (info->
treeview, col)));
920 GtkCellRenderer* cell = GTK_CELL_RENDERER(renderers->data);
921 g_list_free (renderers);
933 static void sep_button_clicked (GtkWidget* widget,
CsvImportTrans* info)
936 char* stock_separator_characters[] = {
" ",
"\t",
",",
":",
";",
"-"};
937 GSList* checked_separators = NULL;
942 for (i = 0; i < SEP_NUM_OF_TYPES; i++)
944 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(info->
sep_buttons[i])))
945 checked_separators = g_slist_append (checked_separators, stock_separator_characters[i]);
949 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(info->
custom_cbutton)))
951 char* custom_sep = (
char*)gtk_entry_get_text (info->
custom_entry);
952 if (custom_sep[0] !=
'\0')
953 checked_separators = g_slist_append (checked_separators, custom_sep);
957 stf_parse_options_csv_set_separators (info->
parse_data->
options, NULL, checked_separators);
958 g_slist_free (checked_separators);
968 gnc_error_dialog (NULL,
"Error in parsing");
972 gtk_entry_set_text (GTK_ENTRY(widget),
"");
977 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(widget),
978 !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget)));
984 gnc_csv_preview_update_assist (info);
987 row_selection_update (info);
996 static void separated_or_fixed_selected (GtkToggleButton* csv_button,
CsvImportTrans* info)
998 GError* error = NULL;
1000 if (gtk_toggle_button_get_active (csv_button))
1013 gnc_error_dialog (NULL,
"%s", error->message);
1018 gnc_csv_preview_update_assist (info);
1021 row_selection_update (info);
1032 static void encoding_selected (GOCharmapSel* selector,
const char* encoding,
1049 const char* previous_encoding = info->
parse_data->encoding;
1050 GError* error = NULL;
1056 gnc_error_dialog (NULL,
"%s", _(
"Invalid encoding selected"));
1058 go_charmap_sel_set_encoding (selector, previous_encoding);
1062 gnc_csv_preview_update_assist (info);
1065 row_selection_update (info);
1080 static void date_format_selected (GtkComboBoxText* format_selector,
CsvImportTrans* info)
1090 static void currency_format_selected (GtkComboBoxText* currency_selector,
CsvImportTrans* info)
1125 CONTEXT_STF_IMPORT_MERGE_LEFT = 1,
1126 CONTEXT_STF_IMPORT_MERGE_RIGHT = 2,
1127 CONTEXT_STF_IMPORT_SPLIT = 3,
1128 CONTEXT_STF_IMPORT_WIDEN = 4,
1129 CONTEXT_STF_IMPORT_NARROW = 5
1135 N_(
"Merge with column on _left"), GTK_STOCK_REMOVE,
1136 0, 1 << CONTEXT_STF_IMPORT_MERGE_LEFT, CONTEXT_STF_IMPORT_MERGE_LEFT
1139 N_(
"Merge with column on _right"), GTK_STOCK_REMOVE,
1140 0, 1 << CONTEXT_STF_IMPORT_MERGE_RIGHT, CONTEXT_STF_IMPORT_MERGE_RIGHT
1142 {
"", NULL, 0, 0, 0 },
1144 N_(
"_Split this column"), NULL,
1145 0, 1 << CONTEXT_STF_IMPORT_SPLIT, CONTEXT_STF_IMPORT_SPLIT
1147 {
"", NULL, 0, 0, 0 },
1149 N_(
"_Widen this column"), GTK_STOCK_GO_FORWARD,
1150 0, 1 << CONTEXT_STF_IMPORT_WIDEN, CONTEXT_STF_IMPORT_WIDEN
1153 N_(
"_Narrow this column"), GTK_STOCK_GO_BACK,
1154 0, 1 << CONTEXT_STF_IMPORT_NARROW, CONTEXT_STF_IMPORT_NARROW
1156 { NULL, NULL, 0, 0, 0 },
1160 make_new_column (
CsvImportTrans* info,
int col,
int dx, gboolean test_only)
1162 PangoLayout *layout;
1163 PangoFontDescription *font_desc;
1164 int charindex, width;
1165 GtkCellRenderer *cell = gnc_csv_preview_get_cell_renderer (info, col);
1166 int colstart, colend;
1167 GError* error = NULL;
1169 colstart = (col == 0)
1171 : stf_parse_options_fixed_splitpositions_nth (info->
parse_data->
options, col - 1);
1172 colend = stf_parse_options_fixed_splitpositions_nth (info->
parse_data->
options, col);
1174 g_object_get (G_OBJECT(cell),
"font_desc", &font_desc, NULL);
1175 layout = gtk_widget_create_pango_layout (GTK_WIDGET(info->
treeview),
"x");
1176 pango_layout_set_font_description (layout, font_desc);
1177 pango_layout_get_pixel_size (layout, &width, NULL);
1178 if (width < 1) width = 1;
1179 charindex = colstart + (dx + width / 2) / width;
1180 g_object_unref (layout);
1181 pango_font_description_free (font_desc);
1183 if (charindex <= colstart || (colend != -1 && charindex >= colend))
1188 stf_parse_options_fixed_splitpositions_add (info->
parse_data->
options, charindex);
1191 gnc_error_dialog (NULL,
"%s", error->message);
1194 gnc_csv_preview_update_assist (info);
1197 row_selection_update (info);
1206 int colcount = stf_parse_options_fixed_splitpositions_count (info->
parse_data->
options);
1207 int nextstart, nextnextstart;
1208 GError* error = NULL;
1210 if (col >= colcount - 1)
1213 nextstart = stf_parse_options_fixed_splitpositions_nth (info->
parse_data->
options, col);
1215 nextnextstart = (col == colcount - 2)
1217 : stf_parse_options_fixed_splitpositions_nth (info->
parse_data->
options, col + 1);
1219 if (nextstart + 1 >= nextnextstart)
1224 stf_parse_options_fixed_splitpositions_remove (info->
parse_data->
options, nextstart);
1225 stf_parse_options_fixed_splitpositions_add (info->
parse_data->
options, nextstart + 1);
1228 gnc_error_dialog (NULL,
"%s", error->message);
1231 gnc_csv_preview_update_assist (info);
1234 row_selection_update (info);
1240 narrow_column (
CsvImportTrans* info,
int col, gboolean test_only)
1242 int colcount = stf_parse_options_fixed_splitpositions_count (info->
parse_data->
options);
1243 int thisstart, nextstart;
1244 GError* error = NULL;
1246 if (col >= colcount - 1)
1249 thisstart = (col == 0)
1251 : stf_parse_options_fixed_splitpositions_nth (info->
parse_data->
options, col - 1);
1252 nextstart = stf_parse_options_fixed_splitpositions_nth (info->
parse_data->
options, col);
1254 if (nextstart - 1 <= thisstart)
1259 stf_parse_options_fixed_splitpositions_remove (info->
parse_data->
options, nextstart);
1260 stf_parse_options_fixed_splitpositions_add (info->
parse_data->
options, nextstart - 1);
1263 gnc_error_dialog (NULL,
"%s", error->message);
1266 gnc_csv_preview_update_assist (info);
1269 row_selection_update (info);
1275 delete_column (
CsvImportTrans* info,
int col, gboolean test_only)
1277 GError* error = NULL;
1278 int colcount = stf_parse_options_fixed_splitpositions_count (info->
parse_data->
options);
1279 if (col < 0 || col >= colcount - 1)
1284 int nextstart = stf_parse_options_fixed_splitpositions_nth (info->
parse_data->
options, col);
1285 stf_parse_options_fixed_splitpositions_remove (info->
parse_data->
options, nextstart);
1288 gnc_error_dialog (NULL,
"%s", error->message);
1291 gnc_csv_preview_update_assist (info);
1294 row_selection_update (info);
1302 int colcount = stf_parse_options_fixed_splitpositions_count (info->
parse_data->
options);
1303 GtkTreeViewColumn *column;
1305 if (col < 0 || col >= colcount)
1308 column = gtk_tree_view_get_column (info->
treeview, col);
1309 gtk_widget_grab_focus (column->button);
1319 switch (element->index)
1321 case CONTEXT_STF_IMPORT_MERGE_LEFT:
1322 delete_column (info, col - 1, FALSE);
1324 case CONTEXT_STF_IMPORT_MERGE_RIGHT:
1325 delete_column (info, col, FALSE);
1327 case CONTEXT_STF_IMPORT_SPLIT:
1330 case CONTEXT_STF_IMPORT_WIDEN:
1331 widen_column (info, col, FALSE);
1333 case CONTEXT_STF_IMPORT_NARROW:
1334 narrow_column (info, col, FALSE);
1346 int sensitivity_filter = 0;
1351 if (!delete_column (info, col - 1, TRUE))
1352 sensitivity_filter |= (1 << CONTEXT_STF_IMPORT_MERGE_LEFT);
1353 if (!delete_column (info, col, TRUE))
1354 sensitivity_filter |= (1 << CONTEXT_STF_IMPORT_MERGE_RIGHT);
1355 if (!make_new_column (info, col, dx, TRUE))
1356 sensitivity_filter |= (1 << CONTEXT_STF_IMPORT_SPLIT);
1357 if (!widen_column (info, col, TRUE))
1358 sensitivity_filter |= (1 << CONTEXT_STF_IMPORT_WIDEN);
1359 if (!narrow_column (info, col, TRUE))
1360 sensitivity_filter |= (1 << CONTEXT_STF_IMPORT_NARROW);
1362 select_column (info, col);
1363 gnumeric_create_popup_menu (popup_elements, &fixed_context_menu_handler,
1365 sensitivity_filter, event);
1379 static void treeview_resized (GtkWidget* widget, GtkAllocation* allocation,
CsvImportTrans* info)
1388 for (i = 0; i < ncols - 1; i++)
1391 GtkTreeViewColumn* pcol;
1392 GtkTreeViewColumn* ccol;
1395 col_width = gtk_tree_view_column_get_width (gtk_tree_view_get_column (info->
treeview, i));
1397 if (col_width < MIN_COL_WIDTH)
1399 col_width = MIN_COL_WIDTH;
1401 pcol = gtk_tree_view_get_column (info->
treeview, i);
1402 gtk_tree_view_column_set_min_width (pcol, col_width);
1404 ccol = gtk_tree_view_get_column (info->
ctreeview, i);
1405 gtk_tree_view_column_set_min_width (ccol, col_width);
1406 gtk_tree_view_column_set_max_width (ccol, col_width);
1420 static void column_type_changed (GtkCellRenderer* renderer, gchar* path,
1426 GtkTreeModel* store = gtk_tree_view_get_model (info->
ctreeview);
1427 GtkTreeModel* model;
1433 g_object_get (renderer,
"model", &model,
"text-column", &textColumn, NULL);
1434 gtk_tree_model_get (model, new_text_iter, textColumn, &new_text, -1);
1437 gtk_tree_model_get_iter_first (store, &iter);
1440 for (i = 0; i < ncols; i++)
1444 GtkCellRenderer* col_renderer;
1446 GtkTreeViewColumn* col = gtk_tree_view_get_column (info->
ctreeview, i);
1448 GList* rend_list = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT(col));
1450 col_renderer = rend_list->data;
1451 g_list_free (rend_list);
1454 if (col_renderer != renderer)
1457 gchar* contents = NULL;
1462 gtk_tree_model_get(store, &iter, 2 * i + 1, &contents, -1);
1464 if (!g_strcmp0 (contents, new_text))
1467 gtk_list_store_set (GTK_LIST_STORE(store), &iter, 2 * i + 1,
1468 _(gnc_csv_column_type_strs[GNC_CSV_NONE]), -1);
1477 gtk_list_store_set (GTK_LIST_STORE(store), &iter, 2 * i + 1, new_text, -1);
1490 static void header_button_press_handler (GtkWidget* button, GdkEventButton* event,
1495 int i, col = 0, offset = GTK_BIN(button)->child->allocation.x - button->allocation.x,
1498 for (i = 0; i < ncols; i++)
1514 if (event->type == GDK_2BUTTON_PRESS && event->button == 1)
1516 make_new_column (info, col, (
int)event->x - offset, FALSE);
1519 else if (event->type == GDK_BUTTON_PRESS && event->button == 3)
1521 fixed_context_menu (info, event, col, (
int)event->x - offset);
1536 int i, ncols = column_types->len;
1538 gboolean valid = TRUE;
1540 GtkTreeModel* store = gtk_tree_view_get_model (info->
ctreeview);
1542 GtkTreeModel* datastore = gtk_tree_view_get_model (info->
treeview);
1543 GtkTreeIter iter, iter2;
1545 gtk_tree_model_get_iter_first (store, &iter);
1548 gtk_tree_model_iter_nth_child (GTK_TREE_MODEL(datastore), &iter2, NULL, info->
start_row);
1551 for (i = 0; i < ncols; i++)
1554 gchar* contents = NULL;
1555 gchar* prevstr = NULL;
1556 gchar* accstr = NULL;
1561 gtk_tree_model_get (store, &iter, 2 * i + 1, &contents, -1);
1564 for (type = 0; type < GNC_CSV_NUM_COL_TYPES; type++)
1567 if (!g_strcmp0 (contents, _(gnc_csv_column_type_strs[type])))
1570 column_types->data[i] = type;
1575 weight = weight + 1000;
1576 gtk_tree_model_get (datastore, &iter2, i + 1, &prevstr, -1);
1582 case GNC_CSV_DESCRIPTION:
1584 weight = weight + 100;
1587 case GNC_CSV_BALANCE:
1588 case GNC_CSV_DEPOSIT:
1589 case GNC_CSV_WITHDRAWAL:
1590 weight = weight + 10;
1594 weight = weight + 1;
1596 case GNC_CSV_ACCOUNT:
1597 weight = weight + 1;
1598 gtk_tree_model_get (datastore, &iter2, i + 1, &accstr, -1);
1610 if (weight < 1109 || valid == FALSE)
1628 GtkListStore *store, **cstores, *ctstore;
1630 GtkTreeSelection *selection;
1636 GType* types = g_new (GType, 2 * ncols);
1637 for (i = 0; i < ncols + 1; i++)
1638 types[i] = G_TYPE_STRING;
1639 store = gtk_list_store_newv (ncols + 1, types);
1643 for (i = 0; i < 2 * ncols; i += 2)
1645 types[i] = GTK_TYPE_TREE_MODEL;
1646 types[i+1] = G_TYPE_STRING;
1648 ctstore = gtk_list_store_newv (2 * ncols, types);
1653 cstores = g_new (GtkListStore*, ncols);
1654 for (i = 0; i < ncols; i++)
1656 cstores[i] = gtk_list_store_new (1, G_TYPE_STRING);
1658 for (j = 0; j < GNC_CSV_NUM_COL_TYPES; j++)
1660 gtk_list_store_append (cstores[i], &iter);
1661 gtk_list_store_set (cstores[i], &iter, 0, _(gnc_csv_column_type_strs[j]), -1);
1667 GList *tv_columns, *tv_columns_begin, *ctv_columns, *ctv_columns_begin;
1668 tv_columns = tv_columns_begin = gtk_tree_view_get_columns (info->
treeview);
1669 ctv_columns = ctv_columns_begin = gtk_tree_view_get_columns (info->
ctreeview);
1671 while (tv_columns != NULL)
1673 gtk_tree_view_remove_column (info->
treeview, GTK_TREE_VIEW_COLUMN(tv_columns->data));
1674 tv_columns = g_list_next (tv_columns);
1677 while (ctv_columns != NULL)
1679 gtk_tree_view_remove_column (info->
ctreeview, GTK_TREE_VIEW_COLUMN(ctv_columns->data));
1680 ctv_columns = g_list_next (ctv_columns);
1682 g_list_free (tv_columns_begin);
1683 g_list_free (ctv_columns_begin);
1694 while (error_lines != NULL)
1696 int this_line_length = 0;
1697 i = GPOINTER_TO_INT(error_lines->data);
1698 gtk_list_store_append (store, &iter);
1701 gtk_list_store_set (store, &iter, 0, NULL, -1);
1707 this_line_length += g_utf8_strlen(cell_string, max_str_len);
1708 gtk_list_store_set (store, &iter, j + 1, cell_string, -1);
1714 error_lines = g_list_next (error_lines);
1721 int this_line_length = 0;
1722 gtk_list_store_append (store, &iter);
1725 gtk_list_store_set (store, &iter, 0, NULL, -1);
1731 this_line_length += g_utf8_strlen(cell_string, max_str_len);
1732 gtk_list_store_set (store, &iter, j + 1, cell_string, -1);
1744 gtk_list_store_append (ctstore, &iter);
1745 gtk_list_store_set (ctstore, &iter, 0, NULL, -1);
1746 for (i = 0; i < ncols; i++)
1748 gtk_list_store_set (ctstore, &iter, 2 * i, cstores[i], 2 * i + 1,
1755 for (i = 0; i < ncols ; i++)
1757 GtkTreeViewColumn* col;
1760 GtkCellRenderer* renderer = gtk_cell_renderer_text_new(),
1761 *crenderer = gtk_cell_renderer_combo_new();
1763 g_object_set (G_OBJECT(renderer),
"family",
"monospace", NULL);
1767 g_object_set (G_OBJECT(crenderer),
"model", cstores[i],
"text-column", 0,
1768 "editable", TRUE,
"has-entry", FALSE, NULL);
1769 g_signal_connect (G_OBJECT(crenderer),
"changed",
1770 G_CALLBACK(column_type_changed), (gpointer)info);
1773 col = gtk_tree_view_column_new_with_attributes (
"", renderer,
"text", i + 1, NULL);
1776 gtk_tree_view_column_add_attribute (col, renderer,
"background", 0);
1778 gtk_tree_view_insert_column (info->
treeview, col, -1);
1780 gtk_tree_view_column_set_resizable (col, TRUE);
1783 gtk_tree_view_insert_column_with_attributes (info->
ctreeview,
1784 -1,
"", crenderer,
"model", 2 * i,
1785 "text", 2 * i + 1, NULL);
1789 g_object_set (G_OBJECT(col),
"clickable", TRUE, NULL);
1790 g_signal_connect (G_OBJECT(col->button),
"button_press_event",
1791 G_CALLBACK(header_button_press_handler), (gpointer)info);
1796 gtk_tree_view_set_model (info->
treeview, GTK_TREE_MODEL(store));
1797 gtk_tree_view_set_model (info->
ctreeview, GTK_TREE_MODEL(ctstore));
1800 gtk_tree_model_get_iter_first (GTK_TREE_MODEL(ctstore), &iter);
1801 selection = gtk_tree_view_get_selection (info->
ctreeview);
1802 gtk_tree_selection_select_iter (selection, &iter);
1805 g_object_unref (GTK_TREE_MODEL(store));
1806 g_object_unref (GTK_TREE_MODEL(ctstore));
1807 for (i = 0; i < ncols; i++)
1808 g_object_unref (GTK_TREE_MODEL(cstores[i]));
1811 gtk_widget_show_all (GTK_WIDGET(info->
treeview));
1812 gtk_widget_show_all (GTK_WIDGET(info->
ctreeview));
1832 void gnc_csv_reset_preview_setting (
CsvImportTrans *info, gboolean block)
1836 int colcount = stf_parse_options_fixed_splitpositions_count (info->
parse_data->
options);
1841 for (i = colcount; i >= 0; i--)
1843 delete_column (info, i, FALSE);
1848 adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON(info->
start_row_spin));
1849 gtk_spin_button_set_value (GTK_SPIN_BUTTON(info->
start_row_spin), 1);
1852 adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON(info->
end_row_spin));
1853 gtk_adjustment_set_upper (adj, info->
num_of_rows);
1857 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(info->
skip_rows), FALSE);
1860 g_signal_handlers_block_by_func (info->
csv_button, separated_or_fixed_selected, info);
1861 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(info->
csv_button), TRUE);
1862 g_signal_handlers_unblock_by_func (info->
csv_button, separated_or_fixed_selected, info);
1866 g_signal_handlers_block_by_func (info->
custom_cbutton, sep_button_clicked, info);
1867 g_signal_handlers_block_by_func (info->
custom_entry, sep_button_clicked, info);
1871 for (i = 0; i < SEP_NUM_OF_TYPES; i++)
1874 g_signal_handlers_block_by_func (info->
sep_buttons[i], sep_button_clicked, info);
1876 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(info->
sep_buttons[i]), TRUE);
1878 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(info->
sep_buttons[i]), FALSE);
1880 g_signal_handlers_unblock_by_func (info->
sep_buttons[i], sep_button_clicked, info);
1882 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(info->
custom_cbutton), FALSE);
1883 gtk_entry_set_text (GTK_ENTRY(info->
custom_entry),
"");
1887 g_signal_handlers_unblock_by_func (info->
custom_cbutton, sep_button_clicked, info);
1888 g_signal_handlers_unblock_by_func (info->
custom_entry, sep_button_clicked, info);
1894 go_charmap_sel_set_encoding (info->
encselector,
"UTF-8");
1916 info->
starting_dir = gnc_get_default_directory (GNC_PREFS_GROUP);
1926 csv_import_trans_assistant_start_page_prepare (GtkAssistant *assistant,
1931 gint num = gtk_assistant_get_current_page (assistant);
1932 GtkWidget *page = gtk_assistant_get_nth_page (assistant, num);
1935 gtk_assistant_set_page_complete (assistant, page, TRUE);
1940 csv_import_trans_assistant_file_page_prepare (GtkAssistant *assistant,
1945 GtkTreeModel *settings_store;
1946 gint num = gtk_assistant_get_current_page (assistant);
1947 GtkWidget *page = gtk_assistant_get_nth_page (assistant, num);
1958 adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON(info->
start_row_spin));
1959 gtk_spin_button_set_value (GTK_SPIN_BUTTON(info->
start_row_spin), 1);
1962 adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON(info->
end_row_spin));
1963 gtk_adjustment_set_upper (adj, 999);
1966 settings_store = gtk_combo_box_get_model (GTK_COMBO_BOX(info->
settings_combo));
1968 gtk_combo_box_set_active (GTK_COMBO_BOX(info->
settings_combo), 0);
1971 gtk_assistant_set_page_complete (assistant, page, FALSE);
1976 csv_import_trans_assistant_preview_page_prepare (GtkAssistant *assistant,
1982 g_signal_connect (G_OBJECT(info->
treeview),
"size-allocate",
1983 G_CALLBACK(treeview_resized), (gpointer)info);
1991 gtk_assistant_commit (GTK_ASSISTANT(info->window));
1996 _(
"The rows displayed below had errors which are in the last column. You can attempt to correct them by changing the configuration."));
2001 adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON(info->
start_row_spin));
2002 gtk_spin_button_set_value (GTK_SPIN_BUTTON(info->
start_row_spin), 1);
2005 gtk_widget_set_sensitive (info->
combo_hbox, FALSE);
2008 gtk_widget_set_sensitive (info->
skip_rows, FALSE);
2012 gtk_label_set_text (GTK_LABEL(info->
check_label), _(
"Skip Errors"));
2013 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(info->
check_butt), FALSE);
2017 gnc_csv_preview_update_assist (info);
2020 adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON(info->
end_row_spin));
2021 if (gtk_adjustment_get_upper (adj) != info->
num_of_rows)
2023 gtk_adjustment_set_upper (adj, info->
num_of_rows);
2028 row_selection_update (info);
2033 csv_import_trans_assistant_account_page_prepare (GtkAssistant *assistant,
2037 gint num = gtk_assistant_get_current_page (assistant);
2038 GtkWidget *page = gtk_assistant_get_nth_page (assistant, num);
2039 gchar *text, *mtext;
2042 if (!preview_settings_valid (info) && (info->
approved == FALSE))
2044 text = g_strdup_printf (gettext (
"There are problems with the import settings!\nThe date format could be wrong "
2045 "or there are not enough columns set..."));
2046 mtext = g_strdup_printf (
"<span size=\"medium\" color=\"red\"><b>%s</b></span>", text);
2047 gtk_label_set_markup (GTK_LABEL(info->
account_label), mtext);
2055 text = g_strdup_printf (gettext (
"To Change the account, double click on the required account, click Forward to proceed."));
2056 mtext = g_strdup_printf (
"<span size=\"medium\" color=\"red\"><b>%s</b></span>", text);
2057 gtk_label_set_markup (GTK_LABEL(info->
account_label), mtext);
2067 if (!(account == NULL) && (info->
account_picker->auto_create == TRUE))
2068 gtk_assistant_set_current_page (assistant, num + 1);
2072 if (account == NULL)
2073 gtk_assistant_set_page_complete (assistant, page, FALSE);
2075 gtk_assistant_set_page_complete (assistant, page, TRUE);
2080 csv_import_trans_assistant_doc_page_prepare (GtkAssistant *assistant,
2086 gtk_assistant_commit (GTK_ASSISTANT(info->window));
2091 info->
cancel_button = gtk_button_new_with_mnemonic (_(
"_Cancel"));
2092 gtk_assistant_add_action_widget (assistant, info->
cancel_button);
2094 G_CALLBACK(csv_import_trans_assistant_cancel), info);
2101 csv_import_trans_assistant_match_page_prepare (GtkAssistant *assistant,
2105 gint num = gtk_assistant_get_current_page (assistant);
2106 GtkWidget *page = gtk_assistant_get_nth_page (assistant, num);
2107 gchar *text, *mtext;
2110 gtk_assistant_commit (GTK_ASSISTANT(info->window));
2115 info->
new_book = gnc_new_book_option_display (info->window);
2131 gtk_assistant_set_current_page (assistant, 2);
2136 GList* transactions;
2138 text = _(
"Double click on rows to change, then click on Apply to Import");
2139 mtext = g_strdup_printf (
"<span size=\"medium\" color=\"red\"><b>%s</b></span>", text);
2140 gtk_label_set_markup (GTK_LABEL(info->
match_label), mtext);
2149 info->
help_button = gtk_button_new_with_mnemonic (_(
"_Help"));
2150 gtk_assistant_add_action_widget (assistant, info->
help_button);
2158 while (transactions != NULL)
2162 transactions = g_list_next (transactions);
2164 g_list_free (transactions);
2168 gtk_assistant_set_page_complete (assistant, page, TRUE);
2173 csv_import_trans_assistant_summary_page_prepare (GtkAssistant *assistant,
2177 gchar *text, *mtext;
2180 gnc_set_default_directory (GNC_PREFS_GROUP, info->
starting_dir);
2183 gtk_assistant_remove_action_widget (assistant, info->
help_button);
2184 gtk_assistant_remove_action_widget (assistant, info->
cancel_button);
2186 text = g_strdup_printf (gettext (
"The transactions were imported from the file '%s'."), info->
file_name);
2187 mtext = g_strdup_printf (
"<span size=\"medium\"><b>%s</b></span>", text);
2188 gtk_label_set_markup (GTK_LABEL(info->
summary_label), mtext);
2195 csv_import_trans_assistant_prepare (GtkAssistant *assistant, GtkWidget *page,
2198 gint currentpage = gtk_assistant_get_current_page (assistant);
2200 switch (currentpage)
2204 csv_import_trans_assistant_start_page_prepare (assistant, user_data);
2208 csv_import_trans_assistant_file_page_prepare (assistant, user_data);
2212 csv_import_trans_assistant_preview_page_prepare (assistant, user_data);
2216 csv_import_trans_assistant_account_page_prepare (assistant, user_data);
2220 csv_import_trans_assistant_doc_page_prepare (assistant, user_data);
2224 csv_import_trans_assistant_match_page_prepare (assistant, user_data);
2228 csv_import_trans_assistant_summary_page_prepare (assistant, user_data);
2238 csv_import_trans_assistant_destroy_cb (GtkObject *
object, gpointer user_data)
2241 gnc_unregister_gui_component_by_data (ASSISTANT_CSV_IMPORT_TRANS_CM_CLASS, info);
2246 csv_import_trans_assistant_cancel (GtkAssistant *assistant, gpointer user_data)
2249 gnc_close_gui_component_by_data (ASSISTANT_CSV_IMPORT_TRANS_CM_CLASS, info);
2253 csv_import_trans_assistant_close (GtkAssistant *assistant, gpointer user_data)
2256 gnc_close_gui_component_by_data (ASSISTANT_CSV_IMPORT_TRANS_CM_CLASS, info);
2260 csv_import_trans_assistant_finish (GtkAssistant *assistant, gpointer user_data)
2272 csv_import_trans_close_handler (gpointer user_data)
2292 gnc_save_window_size (GNC_PREFS_GROUP, GTK_WINDOW(info->window));
2293 gtk_widget_destroy (info->window);
2302 GtkBuilder *builder;
2305 GtkWidget *button, *h_box;
2306 GtkWidget *save_button, *del_button;
2308 builder = gtk_builder_new();
2309 gnc_builder_add_from_file (builder ,
"assistant-csv-trans-import.glade",
"start_row_adj");
2310 gnc_builder_add_from_file (builder ,
"assistant-csv-trans-import.glade",
"end_row_adj");
2311 gnc_builder_add_from_file (builder ,
"assistant-csv-trans-import.glade",
"CSV Transaction Assistant");
2312 window = GTK_WIDGET(gtk_builder_get_object (builder,
"CSV Transaction Assistant"));
2313 info->window = window;
2316 gnc_assistant_set_colors (GTK_ASSISTANT (info->window));
2319 load_settings (info);
2322 gtk_assistant_set_page_complete (GTK_ASSISTANT(window),
2323 GTK_WIDGET(gtk_builder_get_object (builder,
"start_page")),
2325 gtk_assistant_set_page_complete (GTK_ASSISTANT(window),
2326 GTK_WIDGET(gtk_builder_get_object (builder,
"file_page")),
2328 gtk_assistant_set_page_complete (GTK_ASSISTANT(window),
2329 GTK_WIDGET(gtk_builder_get_object (builder,
"preview_page")),
2331 gtk_assistant_set_page_complete (GTK_ASSISTANT(window),
2332 GTK_WIDGET(gtk_builder_get_object (builder,
"account_page")),
2334 gtk_assistant_set_page_complete (GTK_ASSISTANT(window),
2335 GTK_WIDGET(gtk_builder_get_object (builder,
"doc_page")),
2337 gtk_assistant_set_page_complete (GTK_ASSISTANT(window),
2338 GTK_WIDGET(gtk_builder_get_object (builder,
"match_page")),
2340 gtk_assistant_set_page_complete (GTK_ASSISTANT(window),
2341 GTK_WIDGET(gtk_builder_get_object (builder,
"summary_page")),
2347 info->
file_chooser = gtk_file_chooser_widget_new (GTK_FILE_CHOOSER_ACTION_OPEN);
2348 g_signal_connect (G_OBJECT(info->
file_chooser),
"file-activated",
2349 G_CALLBACK(csv_import_trans_file_chooser_confirm_cb), info);
2350 button = gtk_button_new_from_stock (GTK_STOCK_OK);
2351 gtk_widget_set_size_request (button, 100, -1);
2352 gtk_widget_show (button);
2353 h_box = gtk_hbox_new (TRUE, 0);
2354 gtk_box_pack_start (GTK_BOX(h_box), button, FALSE, FALSE, 0);
2355 gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER(info->
file_chooser), h_box);
2356 g_signal_connect (G_OBJECT(button),
"clicked",
2357 G_CALLBACK(csv_import_trans_file_chooser_confirm_cb), info);
2359 box = GTK_WIDGET(gtk_builder_get_object (builder,
"file_page"));
2360 gtk_box_pack_start (GTK_BOX(box), info->
file_chooser, TRUE, TRUE, 6);
2365 char* sep_button_names[] = {
"space_cbutton",
2369 "semicolon_cbutton",
2372 GtkContainer *date_format_container, *currency_format_container;
2375 GtkListStore *settings_store;
2378 settings_store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
2379 info->
settings_combo = gtk_combo_box_new_with_model_and_entry (GTK_TREE_MODEL(settings_store));
2380 gtk_combo_box_set_entry_text_column (GTK_COMBO_BOX(info->
settings_combo), SET_NAME);
2381 gtk_combo_box_set_active (GTK_COMBO_BOX(info->
settings_combo), 0);
2383 info->
combo_hbox = GTK_WIDGET(gtk_builder_get_object (builder,
"combo_hbox"));
2388 G_CALLBACK(csv_import_trans_changed_settings_cb), (gpointer)info);
2391 save_button = gtk_button_new_with_label (_(
"Save Settings"));
2392 gtk_box_pack_start (GTK_BOX(info->
combo_hbox), save_button, FALSE, FALSE, 6);
2393 gtk_widget_show (save_button);
2395 g_signal_connect (G_OBJECT(save_button),
"clicked",
2396 G_CALLBACK(csv_import_trans_save_settings_cb), (gpointer)info);
2399 del_button = gtk_button_new_with_label (_(
"Delete Settings"));
2400 gtk_box_pack_start (GTK_BOX(info->
combo_hbox), del_button, FALSE, FALSE, 6);
2401 gtk_widget_show (del_button);
2403 g_signal_connect (G_OBJECT(del_button),
"clicked",
2404 G_CALLBACK(csv_import_trans_delete_settings_cb), (gpointer)info);
2407 info->
start_row_spin = GTK_WIDGET(gtk_builder_get_object (builder,
"start_row"));
2408 info->
end_row_spin = GTK_WIDGET(gtk_builder_get_object (builder,
"end_row"));
2409 info->
skip_rows = GTK_WIDGET(gtk_builder_get_object (builder,
"skip_rows"));
2410 info->
check_label = GTK_WIDGET(gtk_builder_get_object (builder,
"check_label"));
2411 info->
check_butt = GTK_WIDGET(gtk_builder_get_object (builder,
"check_butt"));
2413 info->
encselector = GO_CHARMAP_SEL(go_charmap_sel_new(GO_CHARMAP_SEL_TO_UTF8));
2415 g_signal_connect (G_OBJECT(info->
encselector),
"charmap_changed",
2416 G_CALLBACK(encoding_selected), (gpointer)info);
2420 for (i = 0; i < SEP_NUM_OF_TYPES; i++)
2423 = (GtkCheckButton*)GTK_WIDGET(gtk_builder_get_object (builder, sep_button_names[i]));
2425 g_signal_connect (G_OBJECT(info->
sep_buttons[i]),
"toggled",
2426 G_CALLBACK(sep_button_clicked), (gpointer)info);
2432 = (GtkCheckButton*)GTK_WIDGET(gtk_builder_get_object (builder,
"custom_cbutton"));
2434 G_CALLBACK(sep_button_clicked), (gpointer)info);
2438 info->
custom_entry = (GtkEntry*)GTK_WIDGET(gtk_builder_get_object (builder,
"custom_entry"));
2439 g_signal_connect (G_OBJECT(info->
custom_entry),
"changed",
2440 G_CALLBACK(sep_button_clicked), (gpointer)info);
2443 enctable = GTK_TABLE(gtk_builder_get_object (builder,
"enctable"));
2445 gtk_table_attach_defaults (enctable, GTK_WIDGET(info->
encselector), 1, 2, 0, 1);
2447 gtk_widget_show_all (GTK_WIDGET(enctable));
2450 info->
instructions_label = GTK_LABEL(gtk_builder_get_object (builder,
"instructions_label"));
2451 info->
instructions_image = GTK_IMAGE(gtk_builder_get_object (builder,
"instructions_image"));
2455 for (i = 0; i < num_date_formats; i++)
2457 gtk_combo_box_text_append_text (info->
date_format_combo, _(date_format_user[i]));
2461 G_CALLBACK(date_format_selected), (gpointer)info);
2464 date_format_container = GTK_CONTAINER(gtk_builder_get_object (builder,
"date_format_container"));
2466 gtk_widget_show_all (GTK_WIDGET(date_format_container));
2470 for (i = 0; i < num_currency_formats; i++)
2477 G_CALLBACK(currency_format_selected), (gpointer)info);
2480 currency_format_container = GTK_CONTAINER(gtk_builder_get_object (builder,
"currency_format_container"));
2482 gtk_widget_show_all (GTK_WIDGET(currency_format_container));
2485 info->
csv_button = GTK_WIDGET(gtk_builder_get_object (builder,
"csv_button"));
2486 info->
fixed_button = GTK_WIDGET(gtk_builder_get_object (builder,
"fixed_button"));
2487 g_signal_connect (info->
csv_button,
"toggled",
2488 G_CALLBACK(separated_or_fixed_selected), (gpointer)info);
2491 info->
treeview = (GtkTreeView*)GTK_WIDGET(gtk_builder_get_object (builder,
"treeview"));
2494 info->
ctreeview = (GtkTreeView*)GTK_WIDGET(gtk_builder_get_object (builder,
"ctreeview"));
2506 info->
account_page = GTK_WIDGET(gtk_builder_get_object (builder,
"account_page"));
2508 info->
account_label = GTK_WIDGET(gtk_builder_get_object (builder,
"account_label"));
2511 info->
match_page = GTK_WIDGET(gtk_builder_get_object (builder,
"match_page"));
2512 info->
match_label = GTK_WIDGET(gtk_builder_get_object (builder,
"match_label"));
2515 info->
summary_label = GTK_WIDGET(gtk_builder_get_object (builder,
"summary_label"));
2517 g_signal_connect (G_OBJECT(window),
"destroy",
2518 G_CALLBACK (csv_import_trans_assistant_destroy_cb), info);
2520 gnc_restore_window_size (GNC_PREFS_GROUP, GTK_WINDOW(info->window));
2522 gtk_builder_connect_signals (builder, info);
2523 g_object_unref (G_OBJECT(builder));
2544 info->
new_book = gnc_is_new_book();
2546 csv_import_trans_assistant_create (info);
2548 gnc_register_gui_component (ASSISTANT_CSV_IMPORT_TRANS_CM_CLASS,
2549 NULL, csv_import_trans_close_handler,
2552 gtk_widget_show_all (info->window);
2554 gnc_window_adjust_for_screen (GTK_WINDOW(info->window));
Functions to load, save and get gui state.
int gnc_csv_convert_encoding(GncCsvParseData *parse_data, const char *encoding, GError **error)
utility functions for the GnuCash UI
GtkCheckButton * sep_buttons[SEP_NUM_OF_TYPES]
int gnc_csv_parse_to_trans(GncCsvParseData *parse_data, Account *account, gboolean redo_errors)
#define DEBUG(format, args...)
GncCsvParseData * parse_data
void on_matcher_help_clicked(GtkButton *button, gpointer user_data)
Transaction matcher main window.
gchar * gnc_uri_get_path(const gchar *uri)
CsvSettings * gnc_csv_trans_new_settings_data(void)
Generic and very flexible account matcher/picker.
void gnc_csv_trans_settings_data_free(CsvSettings *settings_data)
time64 parse_date(const char *date_str, int format)
GKeyFile * gnc_state_get_current(void)
void gnc_gen_trans_list_add_trans(GNCImportMainMatcher *gui, Transaction *trans)
GtkImage * instructions_image
GtkWidget * account_label
GtkWidget * start_row_spin
void gnc_csv_parse_data_free(GncCsvParseData *parse_data)
gboolean encoding_selected_called
GtkComboBoxText * date_format_combo
GNCImportMainMatcher * gnc_csv_importer_gui
GtkWidget * cancel_button
void gnc_gen_trans_assist_start(GNCImportMainMatcher *info)
GtkComboBoxText * currency_format_combo
gboolean previewing_errors
AccountPickerDialog * account_picker
StfParseOptions_t * options
GncCsvParseData * gnc_csv_new_parse_data(void)
GtkWidget * summary_label
GtkLabel * instructions_label
int gnc_csv_parse(GncCsvParseData *parse_data, gboolean guessColTypes, GError **error)
gboolean gnc_csv_trans_save_settings(CsvSettings *settings_data, gchar *settings_name)
GtkWidget * settings_combo
CsvSettings * settings_data
void gnc_csv_trans_find_settings(GtkTreeModel *settings_store)
GtkCheckButton * custom_cbutton
gboolean account_page_step
void gnc_gen_trans_list_delete(GNCImportMainMatcher *info)
AccountPickerDialog * gnc_import_account_assist_setup(GtkWidget *parent)
Utility functions for convert uri in separate components and back.
GOCharmapSel * encselector
Account * gnc_import_account_assist_update(AccountPickerDialog *picker)
void gnc_file_csv_trans_import(void)
gboolean gnc_csv_trans_load_settings(CsvSettings *settings_data, gchar *group)
GtkWidget ** treeview_buttons
int gnc_csv_load_file(GncCsvParseData *parse_data, const char *filename, GError **error)
GNCImportMainMatcher * gnc_gen_trans_assist_new(GtkWidget *parent, const gchar *heading, gboolean all_from_same_account, gint match_date_hardlimit)
const gchar * QofLogModule